xref: /aosp_15_r20/external/mesa3d/src/intel/vulkan/anv_rmv.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2023 Intel Corporation
3*61046927SAndroid Build Coastguard Worker  *
4*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*61046927SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*61046927SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*61046927SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*61046927SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*61046927SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*61046927SAndroid Build Coastguard Worker  *
11*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
12*61046927SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
13*61046927SAndroid Build Coastguard Worker  * Software.
14*61046927SAndroid Build Coastguard Worker  *
15*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*61046927SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*61046927SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*61046927SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*61046927SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*61046927SAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*61046927SAndroid Build Coastguard Worker  * IN THE SOFTWARE.
22*61046927SAndroid Build Coastguard Worker  */
23*61046927SAndroid Build Coastguard Worker 
24*61046927SAndroid Build Coastguard Worker #include <errno.h>
25*61046927SAndroid Build Coastguard Worker #include <fcntl.h>
26*61046927SAndroid Build Coastguard Worker #include <stdio.h>
27*61046927SAndroid Build Coastguard Worker #include <stdlib.h>
28*61046927SAndroid Build Coastguard Worker #include "anv_private.h"
29*61046927SAndroid Build Coastguard Worker 
30*61046927SAndroid Build Coastguard Worker static VkResult
capture_trace(VkQueue _queue)31*61046927SAndroid Build Coastguard Worker capture_trace(VkQueue _queue)
32*61046927SAndroid Build Coastguard Worker {
33*61046927SAndroid Build Coastguard Worker    ANV_FROM_HANDLE(anv_queue, queue, _queue);
34*61046927SAndroid Build Coastguard Worker 
35*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&queue->device->vk.memory_trace_data.token_mtx);
36*61046927SAndroid Build Coastguard Worker    vk_dump_rmv_capture(&queue->device->vk.memory_trace_data);
37*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&queue->device->vk.memory_trace_data.token_mtx);
38*61046927SAndroid Build Coastguard Worker 
39*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
40*61046927SAndroid Build Coastguard Worker }
41*61046927SAndroid Build Coastguard Worker 
42*61046927SAndroid Build Coastguard Worker void
anv_memory_trace_init(struct anv_device * device)43*61046927SAndroid Build Coastguard Worker anv_memory_trace_init(struct anv_device *device)
44*61046927SAndroid Build Coastguard Worker {
45*61046927SAndroid Build Coastguard Worker    struct vk_rmv_device_info info;
46*61046927SAndroid Build Coastguard Worker    memset(&info, 0, sizeof(info));
47*61046927SAndroid Build Coastguard Worker    anv_rmv_fill_device_info(device->physical, &info);
48*61046927SAndroid Build Coastguard Worker    vk_memory_trace_init(&device->vk, &info);
49*61046927SAndroid Build Coastguard Worker 
50*61046927SAndroid Build Coastguard Worker    if (!device->vk.memory_trace_data.is_enabled)
51*61046927SAndroid Build Coastguard Worker       return;
52*61046927SAndroid Build Coastguard Worker 
53*61046927SAndroid Build Coastguard Worker    device->vk.capture_trace = capture_trace;
54*61046927SAndroid Build Coastguard Worker }
55*61046927SAndroid Build Coastguard Worker 
56*61046927SAndroid Build Coastguard Worker static void
fill_memory_info(const struct anv_physical_device * device,struct vk_rmv_memory_info * out_info,int32_t index)57*61046927SAndroid Build Coastguard Worker fill_memory_info(const struct anv_physical_device *device,
58*61046927SAndroid Build Coastguard Worker                  struct vk_rmv_memory_info *out_info,
59*61046927SAndroid Build Coastguard Worker                  int32_t index)
60*61046927SAndroid Build Coastguard Worker {
61*61046927SAndroid Build Coastguard Worker    switch (index) {
62*61046927SAndroid Build Coastguard Worker    case VK_RMV_MEMORY_LOCATION_DEVICE:
63*61046927SAndroid Build Coastguard Worker       out_info->physical_base_address = 0;
64*61046927SAndroid Build Coastguard Worker       out_info->size = device->memory.heaps[0].size;
65*61046927SAndroid Build Coastguard Worker       break;
66*61046927SAndroid Build Coastguard Worker    case VK_RMV_MEMORY_LOCATION_DEVICE_INVISIBLE:
67*61046927SAndroid Build Coastguard Worker       out_info->physical_base_address = device->memory.heaps[0].size;
68*61046927SAndroid Build Coastguard Worker       out_info->size = device->vram_non_mappable.size;
69*61046927SAndroid Build Coastguard Worker       break;
70*61046927SAndroid Build Coastguard Worker    case VK_RMV_MEMORY_LOCATION_HOST:
71*61046927SAndroid Build Coastguard Worker       out_info->physical_base_address = 0;
72*61046927SAndroid Build Coastguard Worker       out_info->size = device->memory.heaps[1].size;
73*61046927SAndroid Build Coastguard Worker       break;
74*61046927SAndroid Build Coastguard Worker    default:
75*61046927SAndroid Build Coastguard Worker       unreachable("invalid memory index");
76*61046927SAndroid Build Coastguard Worker    }
77*61046927SAndroid Build Coastguard Worker }
78*61046927SAndroid Build Coastguard Worker 
79*61046927SAndroid Build Coastguard Worker void
anv_rmv_fill_device_info(const struct anv_physical_device * device,struct vk_rmv_device_info * info)80*61046927SAndroid Build Coastguard Worker anv_rmv_fill_device_info(const struct anv_physical_device *device,
81*61046927SAndroid Build Coastguard Worker                          struct vk_rmv_device_info *info)
82*61046927SAndroid Build Coastguard Worker {
83*61046927SAndroid Build Coastguard Worker    for (int32_t i = 0; i < VK_RMV_MEMORY_LOCATION_COUNT; ++i)
84*61046927SAndroid Build Coastguard Worker       fill_memory_info(device, &info->memory_infos[i], i);
85*61046927SAndroid Build Coastguard Worker 
86*61046927SAndroid Build Coastguard Worker    strncpy(info->device_name, device->info.name, sizeof(info->device_name) - 1);
87*61046927SAndroid Build Coastguard Worker    info->pcie_revision_id = device->info.pci_revision_id;
88*61046927SAndroid Build Coastguard Worker    info->pcie_device_id = device->info.pci_device_id;
89*61046927SAndroid Build Coastguard Worker    /* TODO: */
90*61046927SAndroid Build Coastguard Worker    info->pcie_family_id = 0;
91*61046927SAndroid Build Coastguard Worker    info->minimum_shader_clock = 0;
92*61046927SAndroid Build Coastguard Worker    info->maximum_shader_clock = 1 * 1024 * 1024 * 1024;
93*61046927SAndroid Build Coastguard Worker    info->vram_type = VK_RMV_MEMORY_TYPE_DDR4;
94*61046927SAndroid Build Coastguard Worker    info->vram_bus_width = 256;
95*61046927SAndroid Build Coastguard Worker    info->vram_operations_per_clock = 1;
96*61046927SAndroid Build Coastguard Worker    info->minimum_memory_clock = 0;
97*61046927SAndroid Build Coastguard Worker    info->maximum_memory_clock = 1;
98*61046927SAndroid Build Coastguard Worker    info->vram_bandwidth = 256;
99*61046927SAndroid Build Coastguard Worker }
100*61046927SAndroid Build Coastguard Worker 
101*61046927SAndroid Build Coastguard Worker void
anv_memory_trace_finish(struct anv_device * device)102*61046927SAndroid Build Coastguard Worker anv_memory_trace_finish(struct anv_device *device)
103*61046927SAndroid Build Coastguard Worker {
104*61046927SAndroid Build Coastguard Worker }
105*61046927SAndroid Build Coastguard Worker 
106*61046927SAndroid Build Coastguard Worker static uint32_t
resource_id_locked(struct anv_device * device,const void * obj)107*61046927SAndroid Build Coastguard Worker resource_id_locked(struct anv_device *device, const void *obj)
108*61046927SAndroid Build Coastguard Worker {
109*61046927SAndroid Build Coastguard Worker    return vk_rmv_get_resource_id_locked(&device->vk, (uint64_t)(uintptr_t)obj);
110*61046927SAndroid Build Coastguard Worker }
111*61046927SAndroid Build Coastguard Worker 
112*61046927SAndroid Build Coastguard Worker static void
resource_destroy_locked(struct anv_device * device,const void * obj)113*61046927SAndroid Build Coastguard Worker resource_destroy_locked(struct anv_device *device, const void *obj)
114*61046927SAndroid Build Coastguard Worker {
115*61046927SAndroid Build Coastguard Worker    vk_rmv_destroy_resource_id_locked(&device->vk, (uint64_t)(uintptr_t)obj);
116*61046927SAndroid Build Coastguard Worker }
117*61046927SAndroid Build Coastguard Worker 
118*61046927SAndroid Build Coastguard Worker /* The token lock must be held when entering _locked functions */
119*61046927SAndroid Build Coastguard Worker static void
log_resource_bind_locked(struct anv_device * device,uint64_t resource_id,struct anv_bo * bo,uint64_t offset,uint64_t size)120*61046927SAndroid Build Coastguard Worker log_resource_bind_locked(struct anv_device *device, uint64_t resource_id,
121*61046927SAndroid Build Coastguard Worker                          struct anv_bo *bo, uint64_t offset,
122*61046927SAndroid Build Coastguard Worker                          uint64_t size)
123*61046927SAndroid Build Coastguard Worker {
124*61046927SAndroid Build Coastguard Worker    struct vk_rmv_resource_bind_token token = {
125*61046927SAndroid Build Coastguard Worker       .resource_id      = resource_id,
126*61046927SAndroid Build Coastguard Worker       .is_system_memory = bo ? (bo->alloc_flags & ANV_BO_ALLOC_NO_LOCAL_MEM) : 0,
127*61046927SAndroid Build Coastguard Worker       .address          = (bo ? bo->offset : 0) + offset,
128*61046927SAndroid Build Coastguard Worker       .size             = size,
129*61046927SAndroid Build Coastguard Worker    };
130*61046927SAndroid Build Coastguard Worker 
131*61046927SAndroid Build Coastguard Worker    vk_rmv_emit_token(&device->vk.memory_trace_data, VK_RMV_TOKEN_TYPE_RESOURCE_BIND, &token);
132*61046927SAndroid Build Coastguard Worker }
133*61046927SAndroid Build Coastguard Worker 
134*61046927SAndroid Build Coastguard Worker static void
log_state_pool_bind_locked(struct anv_device * device,uint64_t resource_id,struct anv_state_pool * pool,struct anv_state * state)135*61046927SAndroid Build Coastguard Worker log_state_pool_bind_locked(struct anv_device *device, uint64_t resource_id,
136*61046927SAndroid Build Coastguard Worker                            struct anv_state_pool *pool, struct anv_state *state)
137*61046927SAndroid Build Coastguard Worker {
138*61046927SAndroid Build Coastguard Worker    struct vk_rmv_resource_bind_token token = {
139*61046927SAndroid Build Coastguard Worker       .resource_id      = resource_id,
140*61046927SAndroid Build Coastguard Worker       .is_system_memory = (pool->block_pool.bo_alloc_flags &
141*61046927SAndroid Build Coastguard Worker                            ANV_BO_ALLOC_NO_LOCAL_MEM) != 0,
142*61046927SAndroid Build Coastguard Worker       .address          = anv_address_physical(
143*61046927SAndroid Build Coastguard Worker          anv_state_pool_state_address(pool, *state)),
144*61046927SAndroid Build Coastguard Worker       .size             = state->alloc_size,
145*61046927SAndroid Build Coastguard Worker    };
146*61046927SAndroid Build Coastguard Worker 
147*61046927SAndroid Build Coastguard Worker    vk_rmv_emit_token(&device->vk.memory_trace_data, VK_RMV_TOKEN_TYPE_RESOURCE_BIND, &token);
148*61046927SAndroid Build Coastguard Worker }
149*61046927SAndroid Build Coastguard Worker 
150*61046927SAndroid Build Coastguard Worker static enum vk_rmv_memory_location
anv_heap_index_to_memory_location(struct anv_device * device,unsigned heap_index)151*61046927SAndroid Build Coastguard Worker anv_heap_index_to_memory_location(struct anv_device *device,
152*61046927SAndroid Build Coastguard Worker                                   unsigned heap_index)
153*61046927SAndroid Build Coastguard Worker {
154*61046927SAndroid Build Coastguard Worker    if (heap_index == 0)
155*61046927SAndroid Build Coastguard Worker       return device->physical->vram_non_mappable.size != 0 ?
156*61046927SAndroid Build Coastguard Worker              VK_RMV_MEMORY_LOCATION_DEVICE_INVISIBLE :
157*61046927SAndroid Build Coastguard Worker              VK_RMV_MEMORY_LOCATION_DEVICE;
158*61046927SAndroid Build Coastguard Worker    else if (heap_index == 1)
159*61046927SAndroid Build Coastguard Worker       return VK_RMV_MEMORY_LOCATION_HOST;
160*61046927SAndroid Build Coastguard Worker    else
161*61046927SAndroid Build Coastguard Worker       return VK_RMV_MEMORY_LOCATION_DEVICE;
162*61046927SAndroid Build Coastguard Worker }
163*61046927SAndroid Build Coastguard Worker 
164*61046927SAndroid Build Coastguard Worker static void
anv_rmv_log_bo_gtt_unmap_locked(struct anv_device * device,struct anv_bo * bo)165*61046927SAndroid Build Coastguard Worker anv_rmv_log_bo_gtt_unmap_locked(struct anv_device *device,
166*61046927SAndroid Build Coastguard Worker                                 struct anv_bo *bo)
167*61046927SAndroid Build Coastguard Worker {
168*61046927SAndroid Build Coastguard Worker    if (!bo->gtt_mapped)
169*61046927SAndroid Build Coastguard Worker       return;
170*61046927SAndroid Build Coastguard Worker 
171*61046927SAndroid Build Coastguard Worker    struct vk_rmv_token token = {
172*61046927SAndroid Build Coastguard Worker       .type      = VK_RMV_TOKEN_TYPE_PAGE_TABLE_UPDATE,
173*61046927SAndroid Build Coastguard Worker       .timestamp = (uint64_t)os_time_get_nano(),
174*61046927SAndroid Build Coastguard Worker       .data      = {
175*61046927SAndroid Build Coastguard Worker          .page_table_update = {
176*61046927SAndroid Build Coastguard Worker             .type             = VK_RMV_PAGE_TABLE_UPDATE_TYPE_UPDATE,
177*61046927SAndroid Build Coastguard Worker             .page_size        = device->info->mem_alignment,
178*61046927SAndroid Build Coastguard Worker             .page_count       = DIV_ROUND_UP(bo->size,
179*61046927SAndroid Build Coastguard Worker                                              device->info->mem_alignment),
180*61046927SAndroid Build Coastguard Worker             .pid              = getpid(),
181*61046927SAndroid Build Coastguard Worker             .virtual_address  = bo->offset,
182*61046927SAndroid Build Coastguard Worker             .physical_address = bo->offset,
183*61046927SAndroid Build Coastguard Worker             .is_unmap         = true,
184*61046927SAndroid Build Coastguard Worker          },
185*61046927SAndroid Build Coastguard Worker       },
186*61046927SAndroid Build Coastguard Worker    };
187*61046927SAndroid Build Coastguard Worker    util_dynarray_append(&device->vk.memory_trace_data.tokens,
188*61046927SAndroid Build Coastguard Worker                         struct vk_rmv_token, token);
189*61046927SAndroid Build Coastguard Worker 
190*61046927SAndroid Build Coastguard Worker    bo->gtt_mapped = false;
191*61046927SAndroid Build Coastguard Worker }
192*61046927SAndroid Build Coastguard Worker 
193*61046927SAndroid Build Coastguard Worker void
anv_rmv_log_bo_gtt_unmap(struct anv_device * device,struct anv_bo * bo)194*61046927SAndroid Build Coastguard Worker anv_rmv_log_bo_gtt_unmap(struct anv_device *device,
195*61046927SAndroid Build Coastguard Worker                          struct anv_bo *bo)
196*61046927SAndroid Build Coastguard Worker {
197*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&device->vk.memory_trace_data.token_mtx);
198*61046927SAndroid Build Coastguard Worker    anv_rmv_log_bo_gtt_unmap_locked(device, bo);
199*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&device->vk.memory_trace_data.token_mtx);
200*61046927SAndroid Build Coastguard Worker }
201*61046927SAndroid Build Coastguard Worker 
202*61046927SAndroid Build Coastguard Worker void
anv_rmv_log_bo_gtt_map(struct anv_device * device,struct anv_bo * bo)203*61046927SAndroid Build Coastguard Worker anv_rmv_log_bo_gtt_map(struct anv_device *device,
204*61046927SAndroid Build Coastguard Worker                        struct anv_bo *bo)
205*61046927SAndroid Build Coastguard Worker {
206*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&device->vk.memory_trace_data.token_mtx);
207*61046927SAndroid Build Coastguard Worker    struct vk_rmv_token token = {
208*61046927SAndroid Build Coastguard Worker       .type      = VK_RMV_TOKEN_TYPE_PAGE_TABLE_UPDATE,
209*61046927SAndroid Build Coastguard Worker       .timestamp = (uint64_t)os_time_get_nano(),
210*61046927SAndroid Build Coastguard Worker       .data      = {
211*61046927SAndroid Build Coastguard Worker          .page_table_update = {
212*61046927SAndroid Build Coastguard Worker             .type             = VK_RMV_PAGE_TABLE_UPDATE_TYPE_UPDATE,
213*61046927SAndroid Build Coastguard Worker             .page_size        = device->info->mem_alignment,
214*61046927SAndroid Build Coastguard Worker             .page_count       = DIV_ROUND_UP(bo->size,
215*61046927SAndroid Build Coastguard Worker                                                 device->info->mem_alignment),
216*61046927SAndroid Build Coastguard Worker             .pid              = getpid(),
217*61046927SAndroid Build Coastguard Worker             .virtual_address  = bo->offset,
218*61046927SAndroid Build Coastguard Worker             .physical_address = bo->offset,
219*61046927SAndroid Build Coastguard Worker             .is_unmap         = false,
220*61046927SAndroid Build Coastguard Worker             },
221*61046927SAndroid Build Coastguard Worker       },
222*61046927SAndroid Build Coastguard Worker    };
223*61046927SAndroid Build Coastguard Worker    util_dynarray_append(&device->vk.memory_trace_data.tokens,
224*61046927SAndroid Build Coastguard Worker                         struct vk_rmv_token, token);
225*61046927SAndroid Build Coastguard Worker 
226*61046927SAndroid Build Coastguard Worker    bo->gtt_mapped = true;
227*61046927SAndroid Build Coastguard Worker 
228*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&device->vk.memory_trace_data.token_mtx);
229*61046927SAndroid Build Coastguard Worker }
230*61046927SAndroid Build Coastguard Worker 
231*61046927SAndroid Build Coastguard Worker void
anv_rmv_log_bos_gtt_map(struct anv_device * device,struct anv_bo ** bos,uint32_t bo_count)232*61046927SAndroid Build Coastguard Worker anv_rmv_log_bos_gtt_map(struct anv_device *device,
233*61046927SAndroid Build Coastguard Worker                         struct anv_bo **bos,
234*61046927SAndroid Build Coastguard Worker                         uint32_t bo_count)
235*61046927SAndroid Build Coastguard Worker {
236*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&device->vk.memory_trace_data.token_mtx);
237*61046927SAndroid Build Coastguard Worker    for (uint32_t i = 0; i < bo_count; i++) {
238*61046927SAndroid Build Coastguard Worker       struct anv_bo *bo = bos[i];
239*61046927SAndroid Build Coastguard Worker 
240*61046927SAndroid Build Coastguard Worker       if (bo->gtt_mapped)
241*61046927SAndroid Build Coastguard Worker          continue;
242*61046927SAndroid Build Coastguard Worker 
243*61046927SAndroid Build Coastguard Worker       struct vk_rmv_token token = {
244*61046927SAndroid Build Coastguard Worker          .type      = VK_RMV_TOKEN_TYPE_PAGE_TABLE_UPDATE,
245*61046927SAndroid Build Coastguard Worker          .timestamp = (uint64_t)os_time_get_nano(),
246*61046927SAndroid Build Coastguard Worker          .data      = {
247*61046927SAndroid Build Coastguard Worker             .page_table_update = {
248*61046927SAndroid Build Coastguard Worker                .type             = VK_RMV_PAGE_TABLE_UPDATE_TYPE_UPDATE,
249*61046927SAndroid Build Coastguard Worker                .page_size        = device->info->mem_alignment,
250*61046927SAndroid Build Coastguard Worker                .page_count       = DIV_ROUND_UP(bo->size,
251*61046927SAndroid Build Coastguard Worker                                                 device->info->mem_alignment),
252*61046927SAndroid Build Coastguard Worker                .pid              = getpid(),
253*61046927SAndroid Build Coastguard Worker                .virtual_address  = bo->offset,
254*61046927SAndroid Build Coastguard Worker                .physical_address = bo->offset,
255*61046927SAndroid Build Coastguard Worker                .is_unmap         = false,
256*61046927SAndroid Build Coastguard Worker             },
257*61046927SAndroid Build Coastguard Worker          },
258*61046927SAndroid Build Coastguard Worker       };
259*61046927SAndroid Build Coastguard Worker       util_dynarray_append(&device->vk.memory_trace_data.tokens,
260*61046927SAndroid Build Coastguard Worker                            struct vk_rmv_token, token);
261*61046927SAndroid Build Coastguard Worker 
262*61046927SAndroid Build Coastguard Worker       bo->gtt_mapped = true;
263*61046927SAndroid Build Coastguard Worker    }
264*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&device->vk.memory_trace_data.token_mtx);
265*61046927SAndroid Build Coastguard Worker }
266*61046927SAndroid Build Coastguard Worker 
267*61046927SAndroid Build Coastguard Worker void
anv_rmv_log_vm_binds(struct anv_device * device,struct anv_vm_bind * binds,uint32_t bind_count)268*61046927SAndroid Build Coastguard Worker anv_rmv_log_vm_binds(struct anv_device *device,
269*61046927SAndroid Build Coastguard Worker                      struct anv_vm_bind *binds,
270*61046927SAndroid Build Coastguard Worker                      uint32_t bind_count)
271*61046927SAndroid Build Coastguard Worker {
272*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&device->vk.memory_trace_data.token_mtx);
273*61046927SAndroid Build Coastguard Worker    for (uint32_t i = 0; i < bind_count; i++) {
274*61046927SAndroid Build Coastguard Worker 
275*61046927SAndroid Build Coastguard Worker       struct vk_rmv_token token = {
276*61046927SAndroid Build Coastguard Worker          .type      = VK_RMV_TOKEN_TYPE_PAGE_TABLE_UPDATE,
277*61046927SAndroid Build Coastguard Worker          .timestamp = (uint64_t)os_time_get_nano(),
278*61046927SAndroid Build Coastguard Worker          .data      = {
279*61046927SAndroid Build Coastguard Worker             .page_table_update = {
280*61046927SAndroid Build Coastguard Worker                .type             = VK_RMV_PAGE_TABLE_UPDATE_TYPE_UPDATE,
281*61046927SAndroid Build Coastguard Worker                .page_size        = device->info->mem_alignment,
282*61046927SAndroid Build Coastguard Worker                .page_count       = DIV_ROUND_UP(binds[i].size,
283*61046927SAndroid Build Coastguard Worker                                                 device->info->mem_alignment),
284*61046927SAndroid Build Coastguard Worker                .pid              = getpid(),
285*61046927SAndroid Build Coastguard Worker                .virtual_address  = binds[i].address,
286*61046927SAndroid Build Coastguard Worker                .physical_address = binds[i].bo_offset,
287*61046927SAndroid Build Coastguard Worker                .is_unmap         = binds[i].op == ANV_VM_UNBIND,
288*61046927SAndroid Build Coastguard Worker             },
289*61046927SAndroid Build Coastguard Worker          },
290*61046927SAndroid Build Coastguard Worker       };
291*61046927SAndroid Build Coastguard Worker       util_dynarray_append(&device->vk.memory_trace_data.tokens,
292*61046927SAndroid Build Coastguard Worker                            struct vk_rmv_token, token);
293*61046927SAndroid Build Coastguard Worker    }
294*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&device->vk.memory_trace_data.token_mtx);
295*61046927SAndroid Build Coastguard Worker }
296*61046927SAndroid Build Coastguard Worker 
297*61046927SAndroid Build Coastguard Worker void
anv_rmv_log_heap_create(struct anv_device * device,struct anv_device_memory * memory,bool is_internal,VkMemoryAllocateFlags alloc_flags)298*61046927SAndroid Build Coastguard Worker anv_rmv_log_heap_create(struct anv_device *device,
299*61046927SAndroid Build Coastguard Worker                         struct anv_device_memory *memory,
300*61046927SAndroid Build Coastguard Worker                         bool is_internal,
301*61046927SAndroid Build Coastguard Worker                         VkMemoryAllocateFlags alloc_flags)
302*61046927SAndroid Build Coastguard Worker {
303*61046927SAndroid Build Coastguard Worker    /* Do not log zero-sized device memory objects. */
304*61046927SAndroid Build Coastguard Worker    if (!memory->vk.size)
305*61046927SAndroid Build Coastguard Worker       return;
306*61046927SAndroid Build Coastguard Worker 
307*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&device->vk.memory_trace_data.token_mtx);
308*61046927SAndroid Build Coastguard Worker 
309*61046927SAndroid Build Coastguard Worker    struct vk_rmv_resource_create_token token = {
310*61046927SAndroid Build Coastguard Worker       .type               = VK_RMV_RESOURCE_TYPE_HEAP,
311*61046927SAndroid Build Coastguard Worker       .resource_id        = resource_id_locked(device, memory),
312*61046927SAndroid Build Coastguard Worker       .is_driver_internal = is_internal,
313*61046927SAndroid Build Coastguard Worker       .heap = {
314*61046927SAndroid Build Coastguard Worker          .alignment   = device->info->mem_alignment,
315*61046927SAndroid Build Coastguard Worker          .size        = memory->vk.size,
316*61046927SAndroid Build Coastguard Worker          .heap_index  = anv_heap_index_to_memory_location(device,
317*61046927SAndroid Build Coastguard Worker                                                           memory->type->heapIndex),
318*61046927SAndroid Build Coastguard Worker          .alloc_flags = alloc_flags,
319*61046927SAndroid Build Coastguard Worker       },
320*61046927SAndroid Build Coastguard Worker    };
321*61046927SAndroid Build Coastguard Worker 
322*61046927SAndroid Build Coastguard Worker    vk_rmv_emit_token(&device->vk.memory_trace_data, VK_RMV_TOKEN_TYPE_RESOURCE_CREATE, &token);
323*61046927SAndroid Build Coastguard Worker    log_resource_bind_locked(device, token.resource_id, memory->bo, 0, memory->vk.size);
324*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&device->vk.memory_trace_data.token_mtx);
325*61046927SAndroid Build Coastguard Worker }
326*61046927SAndroid Build Coastguard Worker 
327*61046927SAndroid Build Coastguard Worker static void
anv_rmv_log_vma_locked(struct anv_device * device,uint64_t address,uint64_t size,bool internal,bool vram,bool in_invisible_vram)328*61046927SAndroid Build Coastguard Worker anv_rmv_log_vma_locked(struct anv_device *device, uint64_t address, uint64_t size,
329*61046927SAndroid Build Coastguard Worker                        bool internal, bool vram, bool in_invisible_vram)
330*61046927SAndroid Build Coastguard Worker {
331*61046927SAndroid Build Coastguard Worker    struct vk_rmv_virtual_allocate_token token = {
332*61046927SAndroid Build Coastguard Worker       .address              = address,
333*61046927SAndroid Build Coastguard Worker       /* If all VRAM is visible, no bo will be in invisible memory. */
334*61046927SAndroid Build Coastguard Worker       .is_in_invisible_vram = in_invisible_vram,
335*61046927SAndroid Build Coastguard Worker       .preferred_domains    = (vram ?
336*61046927SAndroid Build Coastguard Worker                                VK_RMV_KERNEL_MEMORY_DOMAIN_VRAM :
337*61046927SAndroid Build Coastguard Worker                                VK_RMV_KERNEL_MEMORY_DOMAIN_GTT),
338*61046927SAndroid Build Coastguard Worker       .is_driver_internal   = internal,
339*61046927SAndroid Build Coastguard Worker       .page_count           = DIV_ROUND_UP(size, 4096),
340*61046927SAndroid Build Coastguard Worker    };
341*61046927SAndroid Build Coastguard Worker 
342*61046927SAndroid Build Coastguard Worker 
343*61046927SAndroid Build Coastguard Worker    vk_rmv_emit_token(&device->vk.memory_trace_data, VK_RMV_TOKEN_TYPE_VIRTUAL_ALLOCATE, &token);
344*61046927SAndroid Build Coastguard Worker }
345*61046927SAndroid Build Coastguard Worker 
346*61046927SAndroid Build Coastguard Worker void
anv_rmv_log_bo_allocate(struct anv_device * device,struct anv_bo * bo)347*61046927SAndroid Build Coastguard Worker anv_rmv_log_bo_allocate(struct anv_device *device,
348*61046927SAndroid Build Coastguard Worker                         struct anv_bo *bo)
349*61046927SAndroid Build Coastguard Worker {
350*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&device->vk.memory_trace_data.token_mtx);
351*61046927SAndroid Build Coastguard Worker    anv_rmv_log_vma_locked(device, bo->offset, bo->size,
352*61046927SAndroid Build Coastguard Worker                           bo->alloc_flags & ANV_BO_ALLOC_INTERNAL,
353*61046927SAndroid Build Coastguard Worker                           (bo->alloc_flags & ANV_BO_ALLOC_NO_LOCAL_MEM) == 0,
354*61046927SAndroid Build Coastguard Worker                           device->physical->vram_non_mappable.size != 0 &&
355*61046927SAndroid Build Coastguard Worker                           (bo->alloc_flags & (ANV_BO_ALLOC_MAPPED |
356*61046927SAndroid Build Coastguard Worker                                               ANV_BO_ALLOC_HOST_CACHED_COHERENT |
357*61046927SAndroid Build Coastguard Worker                                               ANV_BO_ALLOC_LOCAL_MEM_CPU_VISIBLE |
358*61046927SAndroid Build Coastguard Worker                                               ANV_BO_ALLOC_NO_LOCAL_MEM)) == 0);
359*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&device->vk.memory_trace_data.token_mtx);
360*61046927SAndroid Build Coastguard Worker 
361*61046927SAndroid Build Coastguard Worker    if (bo->alloc_flags & ANV_BO_ALLOC_MAPPED)
362*61046927SAndroid Build Coastguard Worker       vk_rmv_log_cpu_map(&device->vk, bo->offset, false);
363*61046927SAndroid Build Coastguard Worker }
364*61046927SAndroid Build Coastguard Worker 
365*61046927SAndroid Build Coastguard Worker void
anv_rmv_log_bo_destroy(struct anv_device * device,struct anv_bo * bo)366*61046927SAndroid Build Coastguard Worker anv_rmv_log_bo_destroy(struct anv_device *device, struct anv_bo *bo)
367*61046927SAndroid Build Coastguard Worker {
368*61046927SAndroid Build Coastguard Worker    struct vk_rmv_virtual_free_token token = {
369*61046927SAndroid Build Coastguard Worker       .address = bo->offset,
370*61046927SAndroid Build Coastguard Worker    };
371*61046927SAndroid Build Coastguard Worker 
372*61046927SAndroid Build Coastguard Worker    if (bo->alloc_flags & ANV_BO_ALLOC_MAPPED)
373*61046927SAndroid Build Coastguard Worker       vk_rmv_log_cpu_map(&device->vk, bo->offset, true);
374*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&device->vk.memory_trace_data.token_mtx);
375*61046927SAndroid Build Coastguard Worker    anv_rmv_log_bo_gtt_unmap_locked(device, bo);
376*61046927SAndroid Build Coastguard Worker    vk_rmv_emit_token(&device->vk.memory_trace_data, VK_RMV_TOKEN_TYPE_VIRTUAL_FREE, &token);
377*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&device->vk.memory_trace_data.token_mtx);
378*61046927SAndroid Build Coastguard Worker }
379*61046927SAndroid Build Coastguard Worker 
380*61046927SAndroid Build Coastguard Worker void
anv_rmv_log_buffer_create(struct anv_device * device,bool is_internal,struct anv_buffer * buffer)381*61046927SAndroid Build Coastguard Worker anv_rmv_log_buffer_create(struct anv_device *device,
382*61046927SAndroid Build Coastguard Worker                           bool is_internal,
383*61046927SAndroid Build Coastguard Worker                           struct anv_buffer *buffer)
384*61046927SAndroid Build Coastguard Worker {
385*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&device->vk.memory_trace_data.token_mtx);
386*61046927SAndroid Build Coastguard Worker    struct vk_rmv_resource_create_token token = {
387*61046927SAndroid Build Coastguard Worker       .type               = VK_RMV_RESOURCE_TYPE_BUFFER,
388*61046927SAndroid Build Coastguard Worker       .is_driver_internal = is_internal,
389*61046927SAndroid Build Coastguard Worker       .resource_id        = resource_id_locked(device, buffer),
390*61046927SAndroid Build Coastguard Worker       .buffer             = {
391*61046927SAndroid Build Coastguard Worker          .create_flags = buffer->vk.create_flags,
392*61046927SAndroid Build Coastguard Worker          .size         = buffer->vk.size,
393*61046927SAndroid Build Coastguard Worker          .usage_flags  = buffer->vk.usage,
394*61046927SAndroid Build Coastguard Worker       },
395*61046927SAndroid Build Coastguard Worker    };
396*61046927SAndroid Build Coastguard Worker 
397*61046927SAndroid Build Coastguard Worker    vk_rmv_emit_token(&device->vk.memory_trace_data, VK_RMV_TOKEN_TYPE_RESOURCE_CREATE, &token);
398*61046927SAndroid Build Coastguard Worker    if (buffer->vk.create_flags & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) {
399*61046927SAndroid Build Coastguard Worker       assert(buffer->sparse_data.size != 0);
400*61046927SAndroid Build Coastguard Worker       anv_rmv_log_vma_locked(device,
401*61046927SAndroid Build Coastguard Worker                              buffer->sparse_data.address,
402*61046927SAndroid Build Coastguard Worker                              buffer->sparse_data.size,
403*61046927SAndroid Build Coastguard Worker                              false /* internal */, true /* TODO: vram */,
404*61046927SAndroid Build Coastguard Worker                              true /* in_invisible_vram */);
405*61046927SAndroid Build Coastguard Worker       log_resource_bind_locked(device,
406*61046927SAndroid Build Coastguard Worker                                resource_id_locked(device, buffer),
407*61046927SAndroid Build Coastguard Worker                                NULL,
408*61046927SAndroid Build Coastguard Worker                                buffer->sparse_data.address,
409*61046927SAndroid Build Coastguard Worker                                buffer->sparse_data.size);
410*61046927SAndroid Build Coastguard Worker    }
411*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&device->vk.memory_trace_data.token_mtx);
412*61046927SAndroid Build Coastguard Worker 
413*61046927SAndroid Build Coastguard Worker }
414*61046927SAndroid Build Coastguard Worker 
415*61046927SAndroid Build Coastguard Worker void
anv_rmv_log_buffer_destroy(struct anv_device * device,struct anv_buffer * buffer)416*61046927SAndroid Build Coastguard Worker anv_rmv_log_buffer_destroy(struct anv_device *device,
417*61046927SAndroid Build Coastguard Worker                            struct anv_buffer *buffer)
418*61046927SAndroid Build Coastguard Worker {
419*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&device->vk.memory_trace_data.token_mtx);
420*61046927SAndroid Build Coastguard Worker    if (buffer->vk.create_flags & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) {
421*61046927SAndroid Build Coastguard Worker       struct vk_rmv_virtual_free_token token = {
422*61046927SAndroid Build Coastguard Worker          .address = buffer->sparse_data.address,
423*61046927SAndroid Build Coastguard Worker       };
424*61046927SAndroid Build Coastguard Worker       vk_rmv_emit_token(&device->vk.memory_trace_data, VK_RMV_TOKEN_TYPE_VIRTUAL_FREE, &token);
425*61046927SAndroid Build Coastguard Worker    }
426*61046927SAndroid Build Coastguard Worker    resource_destroy_locked(device, buffer);
427*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&device->vk.memory_trace_data.token_mtx);
428*61046927SAndroid Build Coastguard Worker 
429*61046927SAndroid Build Coastguard Worker }
430*61046927SAndroid Build Coastguard Worker 
431*61046927SAndroid Build Coastguard Worker void
anv_rmv_log_buffer_bind(struct anv_device * device,struct anv_buffer * buffer)432*61046927SAndroid Build Coastguard Worker anv_rmv_log_buffer_bind(struct anv_device *device, struct anv_buffer *buffer)
433*61046927SAndroid Build Coastguard Worker {
434*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&device->vk.memory_trace_data.token_mtx);
435*61046927SAndroid Build Coastguard Worker    log_resource_bind_locked(device,
436*61046927SAndroid Build Coastguard Worker                             resource_id_locked(device, buffer),
437*61046927SAndroid Build Coastguard Worker                             buffer->address.bo,
438*61046927SAndroid Build Coastguard Worker                             buffer->address.offset, buffer->vk.size);
439*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&device->vk.memory_trace_data.token_mtx);
440*61046927SAndroid Build Coastguard Worker }
441*61046927SAndroid Build Coastguard Worker 
442*61046927SAndroid Build Coastguard Worker void
anv_rmv_log_image_create(struct anv_device * device,bool is_internal,struct anv_image * image)443*61046927SAndroid Build Coastguard Worker anv_rmv_log_image_create(struct anv_device *device,
444*61046927SAndroid Build Coastguard Worker                          bool is_internal,
445*61046927SAndroid Build Coastguard Worker                          struct anv_image *image)
446*61046927SAndroid Build Coastguard Worker {
447*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&device->vk.memory_trace_data.token_mtx);
448*61046927SAndroid Build Coastguard Worker    struct vk_rmv_resource_create_token token = {
449*61046927SAndroid Build Coastguard Worker       .type               = VK_RMV_RESOURCE_TYPE_IMAGE,
450*61046927SAndroid Build Coastguard Worker       .resource_id        = resource_id_locked(device, image),
451*61046927SAndroid Build Coastguard Worker       .is_driver_internal = is_internal,
452*61046927SAndroid Build Coastguard Worker       .image              = {
453*61046927SAndroid Build Coastguard Worker          .create_flags            = image->vk.create_flags,
454*61046927SAndroid Build Coastguard Worker          .usage_flags             = image->vk.usage,
455*61046927SAndroid Build Coastguard Worker          .type                    = image->vk.image_type,
456*61046927SAndroid Build Coastguard Worker          .extent                  = image->vk.extent,
457*61046927SAndroid Build Coastguard Worker          .format                  = image->vk.format,
458*61046927SAndroid Build Coastguard Worker          .num_mips                = image->vk.mip_levels,
459*61046927SAndroid Build Coastguard Worker          .num_slices              = image->vk.array_layers,
460*61046927SAndroid Build Coastguard Worker          .tiling                  = image->vk.tiling,
461*61046927SAndroid Build Coastguard Worker          .alignment_log2          = util_logbase2(
462*61046927SAndroid Build Coastguard Worker             image->bindings[ANV_IMAGE_MEMORY_BINDING_MAIN].memory_range.alignment),
463*61046927SAndroid Build Coastguard Worker          .log2_samples            = util_logbase2(image->vk.samples),
464*61046927SAndroid Build Coastguard Worker          .metadata_alignment_log2 = util_logbase2(
465*61046927SAndroid Build Coastguard Worker             image->planes[0].aux_surface.isl.alignment_B),
466*61046927SAndroid Build Coastguard Worker          .image_alignment_log2    = util_logbase2(
467*61046927SAndroid Build Coastguard Worker             image->planes[0].primary_surface.isl.alignment_B),
468*61046927SAndroid Build Coastguard Worker          .size                    = image->planes[0].primary_surface.memory_range.size,
469*61046927SAndroid Build Coastguard Worker          .metadata_size           = image->planes[0].aux_surface.memory_range.size,
470*61046927SAndroid Build Coastguard Worker          .metadata_header_size    = 0,
471*61046927SAndroid Build Coastguard Worker          .metadata_offset         = image->planes[0].aux_surface.memory_range.offset,
472*61046927SAndroid Build Coastguard Worker          .metadata_header_offset  = image->planes[0].aux_surface.memory_range.offset,
473*61046927SAndroid Build Coastguard Worker          .presentable             = (image->planes[0].primary_surface.isl.usage &
474*61046927SAndroid Build Coastguard Worker                                      ISL_SURF_USAGE_DISPLAY_BIT) != 0,
475*61046927SAndroid Build Coastguard Worker       },
476*61046927SAndroid Build Coastguard Worker    };
477*61046927SAndroid Build Coastguard Worker 
478*61046927SAndroid Build Coastguard Worker    vk_rmv_emit_token(&device->vk.memory_trace_data, VK_RMV_TOKEN_TYPE_RESOURCE_CREATE, &token);
479*61046927SAndroid Build Coastguard Worker    if (image->vk.create_flags & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) {
480*61046927SAndroid Build Coastguard Worker       for (uint32_t b = 0; b < ARRAY_SIZE(image->bindings); b++) {
481*61046927SAndroid Build Coastguard Worker          if (image->bindings[b].sparse_data.size != 0) {
482*61046927SAndroid Build Coastguard Worker             anv_rmv_log_vma_locked(device,
483*61046927SAndroid Build Coastguard Worker                                    image->bindings[b].sparse_data.address,
484*61046927SAndroid Build Coastguard Worker                                    image->bindings[b].sparse_data.size,
485*61046927SAndroid Build Coastguard Worker                                    false /* internal */, true /* TODO: vram */,
486*61046927SAndroid Build Coastguard Worker                                    true /* in_invisible_vram */);
487*61046927SAndroid Build Coastguard Worker             log_resource_bind_locked(device,
488*61046927SAndroid Build Coastguard Worker                                      resource_id_locked(device, image),
489*61046927SAndroid Build Coastguard Worker                                      NULL,
490*61046927SAndroid Build Coastguard Worker                                      image->bindings[b].sparse_data.address,
491*61046927SAndroid Build Coastguard Worker                                      image->bindings[b].sparse_data.size);
492*61046927SAndroid Build Coastguard Worker          }
493*61046927SAndroid Build Coastguard Worker       }
494*61046927SAndroid Build Coastguard Worker    }
495*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&device->vk.memory_trace_data.token_mtx);
496*61046927SAndroid Build Coastguard Worker }
497*61046927SAndroid Build Coastguard Worker 
498*61046927SAndroid Build Coastguard Worker void
anv_rmv_log_image_destroy(struct anv_device * device,struct anv_image * image)499*61046927SAndroid Build Coastguard Worker anv_rmv_log_image_destroy(struct anv_device *device,
500*61046927SAndroid Build Coastguard Worker                           struct anv_image *image)
501*61046927SAndroid Build Coastguard Worker {
502*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&device->vk.memory_trace_data.token_mtx);
503*61046927SAndroid Build Coastguard Worker    if (image->vk.create_flags & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) {
504*61046927SAndroid Build Coastguard Worker       for (uint32_t b = 0; b < ARRAY_SIZE(image->bindings); b++) {
505*61046927SAndroid Build Coastguard Worker          if (image->bindings[b].sparse_data.size != 0) {
506*61046927SAndroid Build Coastguard Worker             struct vk_rmv_virtual_free_token token = {
507*61046927SAndroid Build Coastguard Worker                .address = image->bindings[b].sparse_data.address,
508*61046927SAndroid Build Coastguard Worker             };
509*61046927SAndroid Build Coastguard Worker 
510*61046927SAndroid Build Coastguard Worker             vk_rmv_emit_token(&device->vk.memory_trace_data, VK_RMV_TOKEN_TYPE_VIRTUAL_FREE, &token);
511*61046927SAndroid Build Coastguard Worker          }
512*61046927SAndroid Build Coastguard Worker       }
513*61046927SAndroid Build Coastguard Worker    }
514*61046927SAndroid Build Coastguard Worker    resource_destroy_locked(device, image);
515*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&device->vk.memory_trace_data.token_mtx);
516*61046927SAndroid Build Coastguard Worker }
517*61046927SAndroid Build Coastguard Worker 
518*61046927SAndroid Build Coastguard Worker void
anv_rmv_log_image_bind(struct anv_device * device,struct anv_image * image,enum anv_image_memory_binding binding)519*61046927SAndroid Build Coastguard Worker anv_rmv_log_image_bind(struct anv_device *device,
520*61046927SAndroid Build Coastguard Worker                        struct anv_image *image,
521*61046927SAndroid Build Coastguard Worker                        enum anv_image_memory_binding binding)
522*61046927SAndroid Build Coastguard Worker {
523*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&device->vk.memory_trace_data.token_mtx);
524*61046927SAndroid Build Coastguard Worker    log_resource_bind_locked(device,
525*61046927SAndroid Build Coastguard Worker                             resource_id_locked(device, image),
526*61046927SAndroid Build Coastguard Worker                             image->bindings[binding].address.bo,
527*61046927SAndroid Build Coastguard Worker                             image->bindings[binding].address.offset,
528*61046927SAndroid Build Coastguard Worker                             image->bindings[binding].memory_range.size);
529*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&device->vk.memory_trace_data.token_mtx);
530*61046927SAndroid Build Coastguard Worker }
531*61046927SAndroid Build Coastguard Worker 
532*61046927SAndroid Build Coastguard Worker void
anv_rmv_log_query_pool_create(struct anv_device * device,struct anv_query_pool * pool,bool is_internal)533*61046927SAndroid Build Coastguard Worker anv_rmv_log_query_pool_create(struct anv_device *device,
534*61046927SAndroid Build Coastguard Worker                               struct anv_query_pool *pool,
535*61046927SAndroid Build Coastguard Worker                               bool is_internal)
536*61046927SAndroid Build Coastguard Worker {
537*61046927SAndroid Build Coastguard Worker    if (pool->vk.query_type != VK_QUERY_TYPE_OCCLUSION &&
538*61046927SAndroid Build Coastguard Worker        pool->vk.query_type != VK_QUERY_TYPE_PIPELINE_STATISTICS &&
539*61046927SAndroid Build Coastguard Worker        pool->vk.query_type != VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT)
540*61046927SAndroid Build Coastguard Worker       return;
541*61046927SAndroid Build Coastguard Worker 
542*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&device->vk.memory_trace_data.token_mtx);
543*61046927SAndroid Build Coastguard Worker    struct vk_rmv_resource_create_token create_token = {
544*61046927SAndroid Build Coastguard Worker       .type               = VK_RMV_RESOURCE_TYPE_QUERY_HEAP,
545*61046927SAndroid Build Coastguard Worker       .resource_id        = resource_id_locked(device, pool),
546*61046927SAndroid Build Coastguard Worker       .is_driver_internal = is_internal,
547*61046927SAndroid Build Coastguard Worker       .query_pool = {
548*61046927SAndroid Build Coastguard Worker          .type           = pool->vk.query_type,
549*61046927SAndroid Build Coastguard Worker          .has_cpu_access = true,
550*61046927SAndroid Build Coastguard Worker       },
551*61046927SAndroid Build Coastguard Worker    };
552*61046927SAndroid Build Coastguard Worker 
553*61046927SAndroid Build Coastguard Worker    vk_rmv_emit_token(&device->vk.memory_trace_data,
554*61046927SAndroid Build Coastguard Worker                      VK_RMV_TOKEN_TYPE_RESOURCE_CREATE, &create_token);
555*61046927SAndroid Build Coastguard Worker    log_resource_bind_locked(device, create_token.resource_id,
556*61046927SAndroid Build Coastguard Worker                             pool->bo, 0, pool->bo->size);
557*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&device->vk.memory_trace_data.token_mtx);
558*61046927SAndroid Build Coastguard Worker }
559*61046927SAndroid Build Coastguard Worker 
560*61046927SAndroid Build Coastguard Worker static void
bind_cmd_buffer_state_stream_locked(struct anv_device * device,uint64_t resource_id,struct anv_state_stream * stream)561*61046927SAndroid Build Coastguard Worker bind_cmd_buffer_state_stream_locked(struct anv_device *device,
562*61046927SAndroid Build Coastguard Worker                                     uint64_t resource_id,
563*61046927SAndroid Build Coastguard Worker                                     struct anv_state_stream *stream)
564*61046927SAndroid Build Coastguard Worker {
565*61046927SAndroid Build Coastguard Worker    util_dynarray_foreach(&stream->all_blocks, struct anv_state, block)
566*61046927SAndroid Build Coastguard Worker       log_state_pool_bind_locked(device, resource_id, stream->state_pool, block);
567*61046927SAndroid Build Coastguard Worker }
568*61046927SAndroid Build Coastguard Worker 
569*61046927SAndroid Build Coastguard Worker void
anv_rmv_log_cmd_buffer_create(struct anv_device * device,struct anv_cmd_buffer * cmd_buffer)570*61046927SAndroid Build Coastguard Worker anv_rmv_log_cmd_buffer_create(struct anv_device *device,
571*61046927SAndroid Build Coastguard Worker                               struct anv_cmd_buffer *cmd_buffer)
572*61046927SAndroid Build Coastguard Worker {
573*61046927SAndroid Build Coastguard Worker    uint64_t data_size =
574*61046927SAndroid Build Coastguard Worker       cmd_buffer->surface_state_stream.total_size +
575*61046927SAndroid Build Coastguard Worker       cmd_buffer->dynamic_state_stream.total_size +
576*61046927SAndroid Build Coastguard Worker       cmd_buffer->general_state_stream.total_size +
577*61046927SAndroid Build Coastguard Worker       cmd_buffer->indirect_push_descriptor_stream.total_size;
578*61046927SAndroid Build Coastguard Worker 
579*61046927SAndroid Build Coastguard Worker    uint64_t executable_size = 0;
580*61046927SAndroid Build Coastguard Worker    list_for_each_entry(struct anv_batch_bo, bbo, &cmd_buffer->batch_bos, link)
581*61046927SAndroid Build Coastguard Worker       executable_size += bbo->length;
582*61046927SAndroid Build Coastguard Worker 
583*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&device->vk.memory_trace_data.token_mtx);
584*61046927SAndroid Build Coastguard Worker    struct vk_rmv_resource_create_token create_token = {
585*61046927SAndroid Build Coastguard Worker       .type               = VK_RMV_RESOURCE_TYPE_COMMAND_ALLOCATOR,
586*61046927SAndroid Build Coastguard Worker       .resource_id        = resource_id_locked(device, cmd_buffer),
587*61046927SAndroid Build Coastguard Worker       .is_driver_internal = true,
588*61046927SAndroid Build Coastguard Worker       .command_buffer     = {
589*61046927SAndroid Build Coastguard Worker          .preferred_domain                 = VK_RMV_KERNEL_MEMORY_DOMAIN_GTT /* TODO */,
590*61046927SAndroid Build Coastguard Worker          .executable_size                  = executable_size,
591*61046927SAndroid Build Coastguard Worker          .app_available_executable_size    = executable_size,
592*61046927SAndroid Build Coastguard Worker          .embedded_data_size               = data_size,
593*61046927SAndroid Build Coastguard Worker          .app_available_embedded_data_size = data_size,
594*61046927SAndroid Build Coastguard Worker          .scratch_size                     = 0,
595*61046927SAndroid Build Coastguard Worker          .app_available_scratch_size       = 0,
596*61046927SAndroid Build Coastguard Worker       },
597*61046927SAndroid Build Coastguard Worker    };
598*61046927SAndroid Build Coastguard Worker 
599*61046927SAndroid Build Coastguard Worker    vk_rmv_emit_token(&device->vk.memory_trace_data,
600*61046927SAndroid Build Coastguard Worker                      VK_RMV_TOKEN_TYPE_RESOURCE_CREATE,
601*61046927SAndroid Build Coastguard Worker                      &create_token);
602*61046927SAndroid Build Coastguard Worker    list_for_each_entry(struct anv_batch_bo, bbo, &cmd_buffer->batch_bos, link) {
603*61046927SAndroid Build Coastguard Worker       log_resource_bind_locked(device, create_token.resource_id,
604*61046927SAndroid Build Coastguard Worker                                bbo->bo, 0, bbo->length);
605*61046927SAndroid Build Coastguard Worker    }
606*61046927SAndroid Build Coastguard Worker    bind_cmd_buffer_state_stream_locked(device, create_token.resource_id,
607*61046927SAndroid Build Coastguard Worker                                        &cmd_buffer->surface_state_stream);
608*61046927SAndroid Build Coastguard Worker    bind_cmd_buffer_state_stream_locked(device, create_token.resource_id,
609*61046927SAndroid Build Coastguard Worker                                        &cmd_buffer->dynamic_state_stream);
610*61046927SAndroid Build Coastguard Worker    bind_cmd_buffer_state_stream_locked(device, create_token.resource_id,
611*61046927SAndroid Build Coastguard Worker                                        &cmd_buffer->general_state_stream);
612*61046927SAndroid Build Coastguard Worker    bind_cmd_buffer_state_stream_locked(device, create_token.resource_id,
613*61046927SAndroid Build Coastguard Worker                                        &cmd_buffer->indirect_push_descriptor_stream);
614*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&device->vk.memory_trace_data.token_mtx);
615*61046927SAndroid Build Coastguard Worker }
616*61046927SAndroid Build Coastguard Worker 
617*61046927SAndroid Build Coastguard Worker void
anv_rmv_log_cmd_buffer_destroy(struct anv_device * device,struct anv_cmd_buffer * cmd_buffer)618*61046927SAndroid Build Coastguard Worker anv_rmv_log_cmd_buffer_destroy(struct anv_device *device,
619*61046927SAndroid Build Coastguard Worker                                struct anv_cmd_buffer *cmd_buffer)
620*61046927SAndroid Build Coastguard Worker {
621*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&device->vk.memory_trace_data.token_mtx);
622*61046927SAndroid Build Coastguard Worker    struct vk_rmv_resource_destroy_token destroy_token = {
623*61046927SAndroid Build Coastguard Worker       .resource_id = resource_id_locked(device, cmd_buffer),
624*61046927SAndroid Build Coastguard Worker    };
625*61046927SAndroid Build Coastguard Worker 
626*61046927SAndroid Build Coastguard Worker    vk_rmv_emit_token(&device->vk.memory_trace_data,
627*61046927SAndroid Build Coastguard Worker                      VK_RMV_TOKEN_TYPE_RESOURCE_DESTROY, &destroy_token);
628*61046927SAndroid Build Coastguard Worker    resource_destroy_locked(device, cmd_buffer);
629*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&device->vk.memory_trace_data.token_mtx);
630*61046927SAndroid Build Coastguard Worker }
631*61046927SAndroid Build Coastguard Worker 
632*61046927SAndroid Build Coastguard Worker void
anv_rmv_log_sparse_add_residency(struct anv_device * device,struct anv_bo * src_bo,uint64_t offset)633*61046927SAndroid Build Coastguard Worker anv_rmv_log_sparse_add_residency(struct anv_device *device,
634*61046927SAndroid Build Coastguard Worker                                  struct anv_bo *src_bo,
635*61046927SAndroid Build Coastguard Worker                                  uint64_t offset)
636*61046927SAndroid Build Coastguard Worker {
637*61046927SAndroid Build Coastguard Worker    struct vk_rmv_resource_reference_token token = {
638*61046927SAndroid Build Coastguard Worker       .virtual_address   = src_bo->offset + offset,
639*61046927SAndroid Build Coastguard Worker       .residency_removed = false,
640*61046927SAndroid Build Coastguard Worker    };
641*61046927SAndroid Build Coastguard Worker 
642*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&device->vk.memory_trace_data.token_mtx);
643*61046927SAndroid Build Coastguard Worker    vk_rmv_emit_token(&device->vk.memory_trace_data,
644*61046927SAndroid Build Coastguard Worker                      VK_RMV_TOKEN_TYPE_RESOURCE_REFERENCE, &token);
645*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&device->vk.memory_trace_data.token_mtx);
646*61046927SAndroid Build Coastguard Worker }
647*61046927SAndroid Build Coastguard Worker 
648*61046927SAndroid Build Coastguard Worker void
anv_rmv_log_sparse_remove_residency(struct anv_device * device,struct anv_bo * src_bo,uint64_t offset)649*61046927SAndroid Build Coastguard Worker anv_rmv_log_sparse_remove_residency(struct anv_device *device,
650*61046927SAndroid Build Coastguard Worker                                     struct anv_bo *src_bo,
651*61046927SAndroid Build Coastguard Worker                                     uint64_t offset)
652*61046927SAndroid Build Coastguard Worker {
653*61046927SAndroid Build Coastguard Worker    struct vk_rmv_resource_reference_token token = {
654*61046927SAndroid Build Coastguard Worker       .virtual_address   = src_bo->offset + offset,
655*61046927SAndroid Build Coastguard Worker       .residency_removed = true,
656*61046927SAndroid Build Coastguard Worker    };
657*61046927SAndroid Build Coastguard Worker 
658*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&device->vk.memory_trace_data.token_mtx);
659*61046927SAndroid Build Coastguard Worker    vk_rmv_emit_token(&device->vk.memory_trace_data,
660*61046927SAndroid Build Coastguard Worker                      VK_RMV_TOKEN_TYPE_RESOURCE_REFERENCE, &token);
661*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&device->vk.memory_trace_data.token_mtx);
662*61046927SAndroid Build Coastguard Worker }
663*61046927SAndroid Build Coastguard Worker 
664*61046927SAndroid Build Coastguard Worker void
anv_rmv_log_descriptor_pool_create(struct anv_device * device,const VkDescriptorPoolCreateInfo * create_info,struct anv_descriptor_pool * pool,bool is_internal)665*61046927SAndroid Build Coastguard Worker anv_rmv_log_descriptor_pool_create(struct anv_device *device,
666*61046927SAndroid Build Coastguard Worker                                    const VkDescriptorPoolCreateInfo *create_info,
667*61046927SAndroid Build Coastguard Worker                                    struct anv_descriptor_pool *pool,
668*61046927SAndroid Build Coastguard Worker                                    bool is_internal)
669*61046927SAndroid Build Coastguard Worker {
670*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&device->vk.memory_trace_data.token_mtx);
671*61046927SAndroid Build Coastguard Worker    struct vk_rmv_resource_create_token create_token = {
672*61046927SAndroid Build Coastguard Worker       .type               = VK_RMV_RESOURCE_TYPE_DESCRIPTOR_POOL,
673*61046927SAndroid Build Coastguard Worker       .resource_id        = resource_id_locked(device, pool),
674*61046927SAndroid Build Coastguard Worker       .is_driver_internal = false,
675*61046927SAndroid Build Coastguard Worker       .descriptor_pool    = {
676*61046927SAndroid Build Coastguard Worker          .max_sets        = create_info->maxSets,
677*61046927SAndroid Build Coastguard Worker          .pool_size_count = create_info->poolSizeCount,
678*61046927SAndroid Build Coastguard Worker          /* Using vk_rmv_token_pool_alloc frees the allocation automatically
679*61046927SAndroid Build Coastguard Worker           * when the trace is done. */
680*61046927SAndroid Build Coastguard Worker          .pool_sizes      = malloc(create_info->poolSizeCount *
681*61046927SAndroid Build Coastguard Worker                                    sizeof(VkDescriptorPoolSize)),
682*61046927SAndroid Build Coastguard Worker       },
683*61046927SAndroid Build Coastguard Worker    };
684*61046927SAndroid Build Coastguard Worker 
685*61046927SAndroid Build Coastguard Worker    if (!create_token.descriptor_pool.pool_sizes) {
686*61046927SAndroid Build Coastguard Worker       simple_mtx_unlock(&device->vk.memory_trace_data.token_mtx);
687*61046927SAndroid Build Coastguard Worker       return;
688*61046927SAndroid Build Coastguard Worker    }
689*61046927SAndroid Build Coastguard Worker 
690*61046927SAndroid Build Coastguard Worker    memcpy(create_token.descriptor_pool.pool_sizes, create_info->pPoolSizes,
691*61046927SAndroid Build Coastguard Worker           create_info->poolSizeCount * sizeof(VkDescriptorPoolSize));
692*61046927SAndroid Build Coastguard Worker 
693*61046927SAndroid Build Coastguard Worker    vk_rmv_emit_token(&device->vk.memory_trace_data,
694*61046927SAndroid Build Coastguard Worker                      VK_RMV_TOKEN_TYPE_RESOURCE_CREATE, &create_token);
695*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&device->vk.memory_trace_data.token_mtx);
696*61046927SAndroid Build Coastguard Worker 
697*61046927SAndroid Build Coastguard Worker    if (pool->surfaces.bo) {
698*61046927SAndroid Build Coastguard Worker       struct vk_rmv_resource_bind_token bind_token = {
699*61046927SAndroid Build Coastguard Worker          .resource_id      = create_token.resource_id,
700*61046927SAndroid Build Coastguard Worker          .is_system_memory = false,
701*61046927SAndroid Build Coastguard Worker          .address          = pool->surfaces.bo->offset,
702*61046927SAndroid Build Coastguard Worker          .size             = pool->surfaces.bo->size,
703*61046927SAndroid Build Coastguard Worker       };
704*61046927SAndroid Build Coastguard Worker 
705*61046927SAndroid Build Coastguard Worker       simple_mtx_lock(&device->vk.memory_trace_data.token_mtx);
706*61046927SAndroid Build Coastguard Worker       vk_rmv_emit_token(&device->vk.memory_trace_data, VK_RMV_TOKEN_TYPE_RESOURCE_BIND, &bind_token);
707*61046927SAndroid Build Coastguard Worker       simple_mtx_unlock(&device->vk.memory_trace_data.token_mtx);
708*61046927SAndroid Build Coastguard Worker    }
709*61046927SAndroid Build Coastguard Worker    if (pool->samplers.bo) {
710*61046927SAndroid Build Coastguard Worker       struct vk_rmv_resource_bind_token bind_token = {
711*61046927SAndroid Build Coastguard Worker          .resource_id      = create_token.resource_id,
712*61046927SAndroid Build Coastguard Worker          .is_system_memory = false,
713*61046927SAndroid Build Coastguard Worker          .address          = pool->samplers.bo->offset,
714*61046927SAndroid Build Coastguard Worker          .size             = pool->samplers.bo->size,
715*61046927SAndroid Build Coastguard Worker       };
716*61046927SAndroid Build Coastguard Worker 
717*61046927SAndroid Build Coastguard Worker       simple_mtx_lock(&device->vk.memory_trace_data.token_mtx);
718*61046927SAndroid Build Coastguard Worker       vk_rmv_emit_token(&device->vk.memory_trace_data, VK_RMV_TOKEN_TYPE_RESOURCE_BIND, &bind_token);
719*61046927SAndroid Build Coastguard Worker       simple_mtx_unlock(&device->vk.memory_trace_data.token_mtx);
720*61046927SAndroid Build Coastguard Worker    }
721*61046927SAndroid Build Coastguard Worker }
722*61046927SAndroid Build Coastguard Worker 
723*61046927SAndroid Build Coastguard Worker void
anv_rmv_log_graphics_pipeline_create(struct anv_device * device,struct anv_graphics_pipeline * pipeline,bool is_internal)724*61046927SAndroid Build Coastguard Worker anv_rmv_log_graphics_pipeline_create(struct anv_device *device,
725*61046927SAndroid Build Coastguard Worker                                      struct anv_graphics_pipeline *pipeline,
726*61046927SAndroid Build Coastguard Worker                                      bool is_internal)
727*61046927SAndroid Build Coastguard Worker {
728*61046927SAndroid Build Coastguard Worker    struct vk_rmv_resource_create_token create_token = {
729*61046927SAndroid Build Coastguard Worker       .type               = VK_RMV_RESOURCE_TYPE_PIPELINE,
730*61046927SAndroid Build Coastguard Worker       .resource_id        = resource_id_locked(device, pipeline),
731*61046927SAndroid Build Coastguard Worker       .is_driver_internal = is_internal,
732*61046927SAndroid Build Coastguard Worker       .pipeline           = {
733*61046927SAndroid Build Coastguard Worker          .is_internal   = is_internal,
734*61046927SAndroid Build Coastguard Worker          .hash_lo       = 0,/* TODO pipeline->pipeline_hash; */
735*61046927SAndroid Build Coastguard Worker          .shader_stages = pipeline->base.base.active_stages,
736*61046927SAndroid Build Coastguard Worker       },
737*61046927SAndroid Build Coastguard Worker    };
738*61046927SAndroid Build Coastguard Worker 
739*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&device->vk.memory_trace_data.token_mtx);
740*61046927SAndroid Build Coastguard Worker    vk_rmv_emit_token(&device->vk.memory_trace_data, VK_RMV_TOKEN_TYPE_RESOURCE_CREATE, &create_token);
741*61046927SAndroid Build Coastguard Worker    for (unsigned s = 0; s < ARRAY_SIZE(pipeline->base.shaders); s++) {
742*61046927SAndroid Build Coastguard Worker       struct anv_shader_bin *shader = pipeline->base.shaders[s];
743*61046927SAndroid Build Coastguard Worker 
744*61046927SAndroid Build Coastguard Worker       if (!shader)
745*61046927SAndroid Build Coastguard Worker          continue;
746*61046927SAndroid Build Coastguard Worker 
747*61046927SAndroid Build Coastguard Worker       log_state_pool_bind_locked(device, create_token.resource_id,
748*61046927SAndroid Build Coastguard Worker                                  &device->instruction_state_pool,
749*61046927SAndroid Build Coastguard Worker                                  &shader->kernel);
750*61046927SAndroid Build Coastguard Worker    }
751*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&device->vk.memory_trace_data.token_mtx);
752*61046927SAndroid Build Coastguard Worker }
753*61046927SAndroid Build Coastguard Worker 
754*61046927SAndroid Build Coastguard Worker void
anv_rmv_log_compute_pipeline_create(struct anv_device * device,struct anv_compute_pipeline * pipeline,bool is_internal)755*61046927SAndroid Build Coastguard Worker anv_rmv_log_compute_pipeline_create(struct anv_device *device,
756*61046927SAndroid Build Coastguard Worker                                     struct anv_compute_pipeline *pipeline,
757*61046927SAndroid Build Coastguard Worker                                     bool is_internal)
758*61046927SAndroid Build Coastguard Worker {
759*61046927SAndroid Build Coastguard Worker    VkShaderStageFlagBits active_stages =
760*61046927SAndroid Build Coastguard Worker       pipeline->base.type == ANV_PIPELINE_COMPUTE ?
761*61046927SAndroid Build Coastguard Worker       VK_SHADER_STAGE_COMPUTE_BIT : VK_SHADER_STAGE_RAYGEN_BIT_KHR;
762*61046927SAndroid Build Coastguard Worker 
763*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&device->vk.memory_trace_data.token_mtx);
764*61046927SAndroid Build Coastguard Worker    struct vk_rmv_resource_create_token create_token = {
765*61046927SAndroid Build Coastguard Worker       .type               = VK_RMV_RESOURCE_TYPE_PIPELINE,
766*61046927SAndroid Build Coastguard Worker       .resource_id        = resource_id_locked(device, pipeline),
767*61046927SAndroid Build Coastguard Worker       .is_driver_internal = is_internal,
768*61046927SAndroid Build Coastguard Worker       .pipeline           = {
769*61046927SAndroid Build Coastguard Worker          .is_internal   = is_internal,
770*61046927SAndroid Build Coastguard Worker          .hash_lo       = 0,/* TODO pipeline->pipeline_hash; */
771*61046927SAndroid Build Coastguard Worker          .shader_stages = active_stages,
772*61046927SAndroid Build Coastguard Worker       },
773*61046927SAndroid Build Coastguard Worker    };
774*61046927SAndroid Build Coastguard Worker 
775*61046927SAndroid Build Coastguard Worker    vk_rmv_emit_token(&device->vk.memory_trace_data, VK_RMV_TOKEN_TYPE_RESOURCE_CREATE, &create_token);
776*61046927SAndroid Build Coastguard Worker    struct anv_shader_bin *shader = pipeline->cs;
777*61046927SAndroid Build Coastguard Worker    log_state_pool_bind_locked(device, create_token.resource_id,
778*61046927SAndroid Build Coastguard Worker                               &device->instruction_state_pool,
779*61046927SAndroid Build Coastguard Worker                               &shader->kernel);
780*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&device->vk.memory_trace_data.token_mtx);
781*61046927SAndroid Build Coastguard Worker }
782*61046927SAndroid Build Coastguard Worker 
783*61046927SAndroid Build Coastguard Worker void
anv_rmv_log_rt_pipeline_create(struct anv_device * device,struct anv_ray_tracing_pipeline * pipeline,bool is_internal)784*61046927SAndroid Build Coastguard Worker anv_rmv_log_rt_pipeline_create(struct anv_device *device,
785*61046927SAndroid Build Coastguard Worker                                struct anv_ray_tracing_pipeline *pipeline,
786*61046927SAndroid Build Coastguard Worker                                bool is_internal)
787*61046927SAndroid Build Coastguard Worker {
788*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&device->vk.memory_trace_data.token_mtx);
789*61046927SAndroid Build Coastguard Worker 
790*61046927SAndroid Build Coastguard Worker    struct vk_rmv_resource_create_token create_token = {
791*61046927SAndroid Build Coastguard Worker       .resource_id        = resource_id_locked(device, pipeline),
792*61046927SAndroid Build Coastguard Worker       .type               = VK_RMV_RESOURCE_TYPE_PIPELINE,
793*61046927SAndroid Build Coastguard Worker       .is_driver_internal = is_internal,
794*61046927SAndroid Build Coastguard Worker       .pipeline           = {
795*61046927SAndroid Build Coastguard Worker          .is_internal   = is_internal,
796*61046927SAndroid Build Coastguard Worker          .hash_lo       = 0, /* TODO */
797*61046927SAndroid Build Coastguard Worker          .shader_stages = pipeline->base.active_stages,
798*61046927SAndroid Build Coastguard Worker       },
799*61046927SAndroid Build Coastguard Worker    };
800*61046927SAndroid Build Coastguard Worker    vk_rmv_emit_token(&device->vk.memory_trace_data, VK_RMV_TOKEN_TYPE_RESOURCE_CREATE, &create_token);
801*61046927SAndroid Build Coastguard Worker 
802*61046927SAndroid Build Coastguard Worker    struct anv_state_pool *state_pool = &device->instruction_state_pool;
803*61046927SAndroid Build Coastguard Worker    for (uint32_t i = 0; i < pipeline->group_count; i++) {
804*61046927SAndroid Build Coastguard Worker       struct anv_rt_shader_group *group = &pipeline->groups[i];
805*61046927SAndroid Build Coastguard Worker 
806*61046927SAndroid Build Coastguard Worker       if (group->imported)
807*61046927SAndroid Build Coastguard Worker          continue;
808*61046927SAndroid Build Coastguard Worker 
809*61046927SAndroid Build Coastguard Worker       if (group->general) {
810*61046927SAndroid Build Coastguard Worker          log_state_pool_bind_locked(device, create_token.resource_id, state_pool,
811*61046927SAndroid Build Coastguard Worker                                     &group->general->kernel);
812*61046927SAndroid Build Coastguard Worker       }
813*61046927SAndroid Build Coastguard Worker       if (group->closest_hit) {
814*61046927SAndroid Build Coastguard Worker          log_state_pool_bind_locked(device, create_token.resource_id, state_pool,
815*61046927SAndroid Build Coastguard Worker                                     &group->closest_hit->kernel);
816*61046927SAndroid Build Coastguard Worker       }
817*61046927SAndroid Build Coastguard Worker       if (group->any_hit) {
818*61046927SAndroid Build Coastguard Worker          log_state_pool_bind_locked(device, create_token.resource_id, state_pool,
819*61046927SAndroid Build Coastguard Worker                                     &group->any_hit->kernel);
820*61046927SAndroid Build Coastguard Worker       }
821*61046927SAndroid Build Coastguard Worker       if (group->intersection) {
822*61046927SAndroid Build Coastguard Worker          log_state_pool_bind_locked(device, create_token.resource_id, state_pool,
823*61046927SAndroid Build Coastguard Worker                                     &group->intersection->kernel);
824*61046927SAndroid Build Coastguard Worker       }
825*61046927SAndroid Build Coastguard Worker    }
826*61046927SAndroid Build Coastguard Worker 
827*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&device->vk.memory_trace_data.token_mtx);
828*61046927SAndroid Build Coastguard Worker }
829*61046927SAndroid Build Coastguard Worker 
830*61046927SAndroid Build Coastguard Worker void
anv_rmv_log_event_create(struct anv_device * device,struct anv_event * event,VkEventCreateFlags flags,bool is_internal)831*61046927SAndroid Build Coastguard Worker anv_rmv_log_event_create(struct anv_device *device,
832*61046927SAndroid Build Coastguard Worker                          struct anv_event *event,
833*61046927SAndroid Build Coastguard Worker                          VkEventCreateFlags flags,
834*61046927SAndroid Build Coastguard Worker                          bool is_internal)
835*61046927SAndroid Build Coastguard Worker {
836*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&device->vk.memory_trace_data.token_mtx);
837*61046927SAndroid Build Coastguard Worker    struct vk_rmv_resource_create_token create_token = {
838*61046927SAndroid Build Coastguard Worker       .type               = VK_RMV_RESOURCE_TYPE_GPU_EVENT,
839*61046927SAndroid Build Coastguard Worker       .resource_id        = resource_id_locked(device, event),
840*61046927SAndroid Build Coastguard Worker       .is_driver_internal = is_internal,
841*61046927SAndroid Build Coastguard Worker       .event              = {
842*61046927SAndroid Build Coastguard Worker          .flags = flags,
843*61046927SAndroid Build Coastguard Worker       },
844*61046927SAndroid Build Coastguard Worker    };
845*61046927SAndroid Build Coastguard Worker 
846*61046927SAndroid Build Coastguard Worker    vk_rmv_emit_token(&device->vk.memory_trace_data, VK_RMV_TOKEN_TYPE_RESOURCE_CREATE, &create_token);
847*61046927SAndroid Build Coastguard Worker    log_state_pool_bind_locked(device, create_token.resource_id,
848*61046927SAndroid Build Coastguard Worker                               &device->dynamic_state_pool,
849*61046927SAndroid Build Coastguard Worker                               &event->state);
850*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&device->vk.memory_trace_data.token_mtx);
851*61046927SAndroid Build Coastguard Worker }
852*61046927SAndroid Build Coastguard Worker 
853*61046927SAndroid Build Coastguard Worker void
anv_rmv_log_resource_destroy(struct anv_device * device,const void * obj)854*61046927SAndroid Build Coastguard Worker anv_rmv_log_resource_destroy(struct anv_device *device, const void *obj)
855*61046927SAndroid Build Coastguard Worker {
856*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&device->vk.memory_trace_data.token_mtx);
857*61046927SAndroid Build Coastguard Worker    struct vk_rmv_resource_destroy_token token = {
858*61046927SAndroid Build Coastguard Worker       .resource_id = resource_id_locked(device, obj),
859*61046927SAndroid Build Coastguard Worker    };
860*61046927SAndroid Build Coastguard Worker 
861*61046927SAndroid Build Coastguard Worker    vk_rmv_emit_token(&device->vk.memory_trace_data, VK_RMV_TOKEN_TYPE_RESOURCE_DESTROY, &token);
862*61046927SAndroid Build Coastguard Worker    resource_destroy_locked(device, obj);
863*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&device->vk.memory_trace_data.token_mtx);
864*61046927SAndroid Build Coastguard Worker }
865