1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright © 2021 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 "anv_private.h"
25*61046927SAndroid Build Coastguard Worker #include "anv_internal_kernels.h"
26*61046927SAndroid Build Coastguard Worker
27*61046927SAndroid Build Coastguard Worker #include "common/intel_debug_identifier.h"
28*61046927SAndroid Build Coastguard Worker #include "ds/intel_tracepoints.h"
29*61046927SAndroid Build Coastguard Worker #include "genxml/gen9_pack.h"
30*61046927SAndroid Build Coastguard Worker #include "perf/intel_perf.h"
31*61046927SAndroid Build Coastguard Worker #include "util/perf/cpu_trace.h"
32*61046927SAndroid Build Coastguard Worker
33*61046927SAndroid Build Coastguard Worker #include "vk_common_entrypoints.h"
34*61046927SAndroid Build Coastguard Worker
35*61046927SAndroid Build Coastguard Worker /** Timestamp structure format */
36*61046927SAndroid Build Coastguard Worker union anv_utrace_timestamp {
37*61046927SAndroid Build Coastguard Worker /* Timestamp writtem by either 2 * MI_STORE_REGISTER_MEM or
38*61046927SAndroid Build Coastguard Worker * PIPE_CONTROL.
39*61046927SAndroid Build Coastguard Worker */
40*61046927SAndroid Build Coastguard Worker uint64_t timestamp;
41*61046927SAndroid Build Coastguard Worker
42*61046927SAndroid Build Coastguard Worker /* Timestamp written by COMPUTE_WALKER::PostSync
43*61046927SAndroid Build Coastguard Worker *
44*61046927SAndroid Build Coastguard Worker * Layout is described in PRMs.
45*61046927SAndroid Build Coastguard Worker * ATSM PRMs, Volume 2d: Command Reference: Structures, POSTSYNC_DATA:
46*61046927SAndroid Build Coastguard Worker *
47*61046927SAndroid Build Coastguard Worker * "The timestamp layout :
48*61046927SAndroid Build Coastguard Worker * [0] = 32b Context Timestamp Start
49*61046927SAndroid Build Coastguard Worker * [1] = 32b Global Timestamp Start
50*61046927SAndroid Build Coastguard Worker * [2] = 32b Context Timestamp End
51*61046927SAndroid Build Coastguard Worker * [3] = 32b Global Timestamp End"
52*61046927SAndroid Build Coastguard Worker */
53*61046927SAndroid Build Coastguard Worker uint32_t gfx125_postsync_data[4];
54*61046927SAndroid Build Coastguard Worker
55*61046927SAndroid Build Coastguard Worker /* Timestamp written by COMPUTE_WALKER::PostSync
56*61046927SAndroid Build Coastguard Worker *
57*61046927SAndroid Build Coastguard Worker * BSpec 56591:
58*61046927SAndroid Build Coastguard Worker *
59*61046927SAndroid Build Coastguard Worker * "The timestamp layout :
60*61046927SAndroid Build Coastguard Worker * [0] = 64b Context Timestamp Start
61*61046927SAndroid Build Coastguard Worker * [1] = 64b Global Timestamp Start
62*61046927SAndroid Build Coastguard Worker * [2] = 64b Context Timestamp End
63*61046927SAndroid Build Coastguard Worker * [3] = 64b Global Timestamp End"
64*61046927SAndroid Build Coastguard Worker */
65*61046927SAndroid Build Coastguard Worker uint64_t gfx20_postsync_data[4];
66*61046927SAndroid Build Coastguard Worker };
67*61046927SAndroid Build Coastguard Worker
68*61046927SAndroid Build Coastguard Worker static uint32_t
command_buffers_count_utraces(struct anv_device * device,uint32_t cmd_buffer_count,struct anv_cmd_buffer ** cmd_buffers,uint32_t * utrace_copies)69*61046927SAndroid Build Coastguard Worker command_buffers_count_utraces(struct anv_device *device,
70*61046927SAndroid Build Coastguard Worker uint32_t cmd_buffer_count,
71*61046927SAndroid Build Coastguard Worker struct anv_cmd_buffer **cmd_buffers,
72*61046927SAndroid Build Coastguard Worker uint32_t *utrace_copies)
73*61046927SAndroid Build Coastguard Worker {
74*61046927SAndroid Build Coastguard Worker if (!u_trace_should_process(&device->ds.trace_context))
75*61046927SAndroid Build Coastguard Worker return 0;
76*61046927SAndroid Build Coastguard Worker
77*61046927SAndroid Build Coastguard Worker uint32_t utraces = 0;
78*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < cmd_buffer_count; i++) {
79*61046927SAndroid Build Coastguard Worker if (u_trace_has_points(&cmd_buffers[i]->trace)) {
80*61046927SAndroid Build Coastguard Worker utraces++;
81*61046927SAndroid Build Coastguard Worker if (!(cmd_buffers[i]->usage_flags & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT))
82*61046927SAndroid Build Coastguard Worker *utrace_copies += list_length(&cmd_buffers[i]->trace.trace_chunks);
83*61046927SAndroid Build Coastguard Worker }
84*61046927SAndroid Build Coastguard Worker }
85*61046927SAndroid Build Coastguard Worker
86*61046927SAndroid Build Coastguard Worker return utraces;
87*61046927SAndroid Build Coastguard Worker }
88*61046927SAndroid Build Coastguard Worker
89*61046927SAndroid Build Coastguard Worker static void
anv_utrace_delete_submit(struct u_trace_context * utctx,void * submit_data)90*61046927SAndroid Build Coastguard Worker anv_utrace_delete_submit(struct u_trace_context *utctx, void *submit_data)
91*61046927SAndroid Build Coastguard Worker {
92*61046927SAndroid Build Coastguard Worker struct anv_device *device =
93*61046927SAndroid Build Coastguard Worker container_of(utctx, struct anv_device, ds.trace_context);
94*61046927SAndroid Build Coastguard Worker struct anv_utrace_submit *submit =
95*61046927SAndroid Build Coastguard Worker container_of(submit_data, struct anv_utrace_submit, ds);
96*61046927SAndroid Build Coastguard Worker
97*61046927SAndroid Build Coastguard Worker intel_ds_flush_data_fini(&submit->ds);
98*61046927SAndroid Build Coastguard Worker
99*61046927SAndroid Build Coastguard Worker anv_state_stream_finish(&submit->dynamic_state_stream);
100*61046927SAndroid Build Coastguard Worker anv_state_stream_finish(&submit->general_state_stream);
101*61046927SAndroid Build Coastguard Worker
102*61046927SAndroid Build Coastguard Worker anv_async_submit_fini(&submit->base);
103*61046927SAndroid Build Coastguard Worker
104*61046927SAndroid Build Coastguard Worker vk_free(&device->vk.alloc, submit);
105*61046927SAndroid Build Coastguard Worker }
106*61046927SAndroid Build Coastguard Worker
107*61046927SAndroid Build Coastguard Worker void
anv_device_utrace_emit_gfx_copy_buffer(struct u_trace_context * utctx,void * cmdstream,void * ts_from,uint64_t from_offset_B,void * ts_to,uint64_t to_offset_B,uint64_t size_B)108*61046927SAndroid Build Coastguard Worker anv_device_utrace_emit_gfx_copy_buffer(struct u_trace_context *utctx,
109*61046927SAndroid Build Coastguard Worker void *cmdstream,
110*61046927SAndroid Build Coastguard Worker void *ts_from, uint64_t from_offset_B,
111*61046927SAndroid Build Coastguard Worker void *ts_to, uint64_t to_offset_B,
112*61046927SAndroid Build Coastguard Worker uint64_t size_B)
113*61046927SAndroid Build Coastguard Worker {
114*61046927SAndroid Build Coastguard Worker struct anv_device *device =
115*61046927SAndroid Build Coastguard Worker container_of(utctx, struct anv_device, ds.trace_context);
116*61046927SAndroid Build Coastguard Worker struct anv_memcpy_state *memcpy_state = cmdstream;
117*61046927SAndroid Build Coastguard Worker struct anv_address from_addr = (struct anv_address) {
118*61046927SAndroid Build Coastguard Worker .bo = ts_from, .offset = from_offset_B };
119*61046927SAndroid Build Coastguard Worker struct anv_address to_addr = (struct anv_address) {
120*61046927SAndroid Build Coastguard Worker .bo = ts_to, .offset = to_offset_B };
121*61046927SAndroid Build Coastguard Worker
122*61046927SAndroid Build Coastguard Worker anv_genX(device->info, emit_so_memcpy)(memcpy_state,
123*61046927SAndroid Build Coastguard Worker to_addr, from_addr, size_B);
124*61046927SAndroid Build Coastguard Worker }
125*61046927SAndroid Build Coastguard Worker
126*61046927SAndroid Build Coastguard Worker static void
anv_device_utrace_emit_cs_copy_buffer(struct u_trace_context * utctx,void * cmdstream,void * ts_from,uint64_t from_offset_B,void * ts_to,uint64_t to_offset_B,uint64_t size_B)127*61046927SAndroid Build Coastguard Worker anv_device_utrace_emit_cs_copy_buffer(struct u_trace_context *utctx,
128*61046927SAndroid Build Coastguard Worker void *cmdstream,
129*61046927SAndroid Build Coastguard Worker void *ts_from, uint64_t from_offset_B,
130*61046927SAndroid Build Coastguard Worker void *ts_to, uint64_t to_offset_B,
131*61046927SAndroid Build Coastguard Worker uint64_t size_B)
132*61046927SAndroid Build Coastguard Worker {
133*61046927SAndroid Build Coastguard Worker struct anv_device *device =
134*61046927SAndroid Build Coastguard Worker container_of(utctx, struct anv_device, ds.trace_context);
135*61046927SAndroid Build Coastguard Worker struct anv_simple_shader *simple_state = cmdstream;
136*61046927SAndroid Build Coastguard Worker struct anv_address from_addr = (struct anv_address) {
137*61046927SAndroid Build Coastguard Worker .bo = ts_from, .offset = from_offset_B };
138*61046927SAndroid Build Coastguard Worker struct anv_address to_addr = (struct anv_address) {
139*61046927SAndroid Build Coastguard Worker .bo = ts_to, .offset = to_offset_B };
140*61046927SAndroid Build Coastguard Worker
141*61046927SAndroid Build Coastguard Worker struct anv_state push_data_state =
142*61046927SAndroid Build Coastguard Worker anv_genX(device->info, simple_shader_alloc_push)(
143*61046927SAndroid Build Coastguard Worker simple_state, sizeof(struct anv_memcpy_params));
144*61046927SAndroid Build Coastguard Worker struct anv_memcpy_params *params = push_data_state.map;
145*61046927SAndroid Build Coastguard Worker
146*61046927SAndroid Build Coastguard Worker *params = (struct anv_memcpy_params) {
147*61046927SAndroid Build Coastguard Worker .num_dwords = size_B / 4,
148*61046927SAndroid Build Coastguard Worker .src_addr = anv_address_physical(from_addr),
149*61046927SAndroid Build Coastguard Worker .dst_addr = anv_address_physical(to_addr),
150*61046927SAndroid Build Coastguard Worker };
151*61046927SAndroid Build Coastguard Worker
152*61046927SAndroid Build Coastguard Worker anv_genX(device->info, emit_simple_shader_dispatch)(
153*61046927SAndroid Build Coastguard Worker simple_state, DIV_ROUND_UP(params->num_dwords, 4),
154*61046927SAndroid Build Coastguard Worker push_data_state);
155*61046927SAndroid Build Coastguard Worker }
156*61046927SAndroid Build Coastguard Worker
157*61046927SAndroid Build Coastguard Worker VkResult
anv_device_utrace_flush_cmd_buffers(struct anv_queue * queue,uint32_t cmd_buffer_count,struct anv_cmd_buffer ** cmd_buffers,struct anv_utrace_submit ** out_submit)158*61046927SAndroid Build Coastguard Worker anv_device_utrace_flush_cmd_buffers(struct anv_queue *queue,
159*61046927SAndroid Build Coastguard Worker uint32_t cmd_buffer_count,
160*61046927SAndroid Build Coastguard Worker struct anv_cmd_buffer **cmd_buffers,
161*61046927SAndroid Build Coastguard Worker struct anv_utrace_submit **out_submit)
162*61046927SAndroid Build Coastguard Worker {
163*61046927SAndroid Build Coastguard Worker struct anv_device *device = queue->device;
164*61046927SAndroid Build Coastguard Worker uint32_t utrace_copies = 0;
165*61046927SAndroid Build Coastguard Worker uint32_t utraces = command_buffers_count_utraces(device,
166*61046927SAndroid Build Coastguard Worker cmd_buffer_count,
167*61046927SAndroid Build Coastguard Worker cmd_buffers,
168*61046927SAndroid Build Coastguard Worker &utrace_copies);
169*61046927SAndroid Build Coastguard Worker if (!utraces) {
170*61046927SAndroid Build Coastguard Worker *out_submit = NULL;
171*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
172*61046927SAndroid Build Coastguard Worker }
173*61046927SAndroid Build Coastguard Worker
174*61046927SAndroid Build Coastguard Worker VkResult result;
175*61046927SAndroid Build Coastguard Worker struct anv_utrace_submit *submit =
176*61046927SAndroid Build Coastguard Worker vk_zalloc(&device->vk.alloc, sizeof(struct anv_utrace_submit),
177*61046927SAndroid Build Coastguard Worker 8, VK_SYSTEM_ALLOCATION_SCOPE_DEVICE);
178*61046927SAndroid Build Coastguard Worker if (!submit)
179*61046927SAndroid Build Coastguard Worker return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
180*61046927SAndroid Build Coastguard Worker
181*61046927SAndroid Build Coastguard Worker result = anv_async_submit_init(&submit->base, queue,
182*61046927SAndroid Build Coastguard Worker &device->batch_bo_pool,
183*61046927SAndroid Build Coastguard Worker false, true);
184*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS)
185*61046927SAndroid Build Coastguard Worker goto error_async;
186*61046927SAndroid Build Coastguard Worker
187*61046927SAndroid Build Coastguard Worker intel_ds_flush_data_init(&submit->ds, &queue->ds, queue->ds.submission_id);
188*61046927SAndroid Build Coastguard Worker
189*61046927SAndroid Build Coastguard Worker struct anv_batch *batch = &submit->base.batch;
190*61046927SAndroid Build Coastguard Worker if (utrace_copies > 0) {
191*61046927SAndroid Build Coastguard Worker anv_state_stream_init(&submit->dynamic_state_stream,
192*61046927SAndroid Build Coastguard Worker &device->dynamic_state_pool, 16384);
193*61046927SAndroid Build Coastguard Worker anv_state_stream_init(&submit->general_state_stream,
194*61046927SAndroid Build Coastguard Worker &device->general_state_pool, 16384);
195*61046927SAndroid Build Coastguard Worker
196*61046927SAndroid Build Coastguard Worker /* Only engine class where we support timestamp copies
197*61046927SAndroid Build Coastguard Worker *
198*61046927SAndroid Build Coastguard Worker * TODO: add INTEL_ENGINE_CLASS_COPY support (should be trivial ;)
199*61046927SAndroid Build Coastguard Worker */
200*61046927SAndroid Build Coastguard Worker assert(queue->family->engine_class == INTEL_ENGINE_CLASS_RENDER ||
201*61046927SAndroid Build Coastguard Worker queue->family->engine_class == INTEL_ENGINE_CLASS_COMPUTE);
202*61046927SAndroid Build Coastguard Worker if (queue->family->engine_class == INTEL_ENGINE_CLASS_RENDER) {
203*61046927SAndroid Build Coastguard Worker
204*61046927SAndroid Build Coastguard Worker trace_intel_begin_trace_copy_cb(&submit->ds.trace, batch);
205*61046927SAndroid Build Coastguard Worker
206*61046927SAndroid Build Coastguard Worker anv_genX(device->info, emit_so_memcpy_init)(&submit->memcpy_state,
207*61046927SAndroid Build Coastguard Worker device, NULL, batch);
208*61046927SAndroid Build Coastguard Worker uint32_t num_traces = 0;
209*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < cmd_buffer_count; i++) {
210*61046927SAndroid Build Coastguard Worker if (cmd_buffers[i]->usage_flags & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT) {
211*61046927SAndroid Build Coastguard Worker intel_ds_queue_flush_data(&queue->ds, &cmd_buffers[i]->trace,
212*61046927SAndroid Build Coastguard Worker &submit->ds, device->vk.current_frame, false);
213*61046927SAndroid Build Coastguard Worker } else {
214*61046927SAndroid Build Coastguard Worker num_traces += cmd_buffers[i]->trace.num_traces;
215*61046927SAndroid Build Coastguard Worker u_trace_clone_append(u_trace_begin_iterator(&cmd_buffers[i]->trace),
216*61046927SAndroid Build Coastguard Worker u_trace_end_iterator(&cmd_buffers[i]->trace),
217*61046927SAndroid Build Coastguard Worker &submit->ds.trace,
218*61046927SAndroid Build Coastguard Worker &submit->memcpy_state,
219*61046927SAndroid Build Coastguard Worker anv_device_utrace_emit_gfx_copy_buffer);
220*61046927SAndroid Build Coastguard Worker }
221*61046927SAndroid Build Coastguard Worker }
222*61046927SAndroid Build Coastguard Worker anv_genX(device->info, emit_so_memcpy_fini)(&submit->memcpy_state);
223*61046927SAndroid Build Coastguard Worker
224*61046927SAndroid Build Coastguard Worker trace_intel_end_trace_copy_cb(&submit->ds.trace, batch, num_traces);
225*61046927SAndroid Build Coastguard Worker
226*61046927SAndroid Build Coastguard Worker anv_genX(device->info, emit_so_memcpy_end)(&submit->memcpy_state);
227*61046927SAndroid Build Coastguard Worker } else {
228*61046927SAndroid Build Coastguard Worker struct anv_shader_bin *copy_kernel;
229*61046927SAndroid Build Coastguard Worker VkResult ret =
230*61046927SAndroid Build Coastguard Worker anv_device_get_internal_shader(device,
231*61046927SAndroid Build Coastguard Worker ANV_INTERNAL_KERNEL_MEMCPY_COMPUTE,
232*61046927SAndroid Build Coastguard Worker ©_kernel);
233*61046927SAndroid Build Coastguard Worker if (ret != VK_SUCCESS)
234*61046927SAndroid Build Coastguard Worker goto error_sync;
235*61046927SAndroid Build Coastguard Worker
236*61046927SAndroid Build Coastguard Worker trace_intel_begin_trace_copy_cb(&submit->ds.trace, batch);
237*61046927SAndroid Build Coastguard Worker
238*61046927SAndroid Build Coastguard Worker submit->simple_state = (struct anv_simple_shader) {
239*61046927SAndroid Build Coastguard Worker .device = device,
240*61046927SAndroid Build Coastguard Worker .dynamic_state_stream = &submit->dynamic_state_stream,
241*61046927SAndroid Build Coastguard Worker .general_state_stream = &submit->general_state_stream,
242*61046927SAndroid Build Coastguard Worker .batch = batch,
243*61046927SAndroid Build Coastguard Worker .kernel = copy_kernel,
244*61046927SAndroid Build Coastguard Worker .l3_config = device->internal_kernels_l3_config,
245*61046927SAndroid Build Coastguard Worker };
246*61046927SAndroid Build Coastguard Worker anv_genX(device->info, emit_simple_shader_init)(&submit->simple_state);
247*61046927SAndroid Build Coastguard Worker
248*61046927SAndroid Build Coastguard Worker uint32_t num_traces = 0;
249*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < cmd_buffer_count; i++) {
250*61046927SAndroid Build Coastguard Worker num_traces += cmd_buffers[i]->trace.num_traces;
251*61046927SAndroid Build Coastguard Worker if (cmd_buffers[i]->usage_flags & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT) {
252*61046927SAndroid Build Coastguard Worker intel_ds_queue_flush_data(&queue->ds, &cmd_buffers[i]->trace,
253*61046927SAndroid Build Coastguard Worker &submit->ds, device->vk.current_frame, false);
254*61046927SAndroid Build Coastguard Worker } else {
255*61046927SAndroid Build Coastguard Worker num_traces += cmd_buffers[i]->trace.num_traces;
256*61046927SAndroid Build Coastguard Worker u_trace_clone_append(u_trace_begin_iterator(&cmd_buffers[i]->trace),
257*61046927SAndroid Build Coastguard Worker u_trace_end_iterator(&cmd_buffers[i]->trace),
258*61046927SAndroid Build Coastguard Worker &submit->ds.trace,
259*61046927SAndroid Build Coastguard Worker &submit->simple_state,
260*61046927SAndroid Build Coastguard Worker anv_device_utrace_emit_cs_copy_buffer);
261*61046927SAndroid Build Coastguard Worker }
262*61046927SAndroid Build Coastguard Worker }
263*61046927SAndroid Build Coastguard Worker
264*61046927SAndroid Build Coastguard Worker trace_intel_end_trace_copy_cb(&submit->ds.trace, batch, num_traces);
265*61046927SAndroid Build Coastguard Worker
266*61046927SAndroid Build Coastguard Worker anv_genX(device->info, emit_simple_shader_end)(&submit->simple_state);
267*61046927SAndroid Build Coastguard Worker }
268*61046927SAndroid Build Coastguard Worker
269*61046927SAndroid Build Coastguard Worker
270*61046927SAndroid Build Coastguard Worker if (batch->status != VK_SUCCESS) {
271*61046927SAndroid Build Coastguard Worker result = batch->status;
272*61046927SAndroid Build Coastguard Worker goto error_sync;
273*61046927SAndroid Build Coastguard Worker }
274*61046927SAndroid Build Coastguard Worker
275*61046927SAndroid Build Coastguard Worker intel_ds_queue_flush_data(&queue->ds, &submit->ds.trace, &submit->ds,
276*61046927SAndroid Build Coastguard Worker device->vk.current_frame, true);
277*61046927SAndroid Build Coastguard Worker } else {
278*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < cmd_buffer_count; i++) {
279*61046927SAndroid Build Coastguard Worker assert(cmd_buffers[i]->usage_flags & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT);
280*61046927SAndroid Build Coastguard Worker intel_ds_queue_flush_data(&queue->ds, &cmd_buffers[i]->trace,
281*61046927SAndroid Build Coastguard Worker &submit->ds, device->vk.current_frame,
282*61046927SAndroid Build Coastguard Worker i == (cmd_buffer_count - 1));
283*61046927SAndroid Build Coastguard Worker }
284*61046927SAndroid Build Coastguard Worker }
285*61046927SAndroid Build Coastguard Worker
286*61046927SAndroid Build Coastguard Worker *out_submit = submit;
287*61046927SAndroid Build Coastguard Worker
288*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
289*61046927SAndroid Build Coastguard Worker
290*61046927SAndroid Build Coastguard Worker error_sync:
291*61046927SAndroid Build Coastguard Worker intel_ds_flush_data_fini(&submit->ds);
292*61046927SAndroid Build Coastguard Worker anv_async_submit_fini(&submit->base);
293*61046927SAndroid Build Coastguard Worker error_async:
294*61046927SAndroid Build Coastguard Worker vk_free(&device->vk.alloc, submit);
295*61046927SAndroid Build Coastguard Worker return result;
296*61046927SAndroid Build Coastguard Worker }
297*61046927SAndroid Build Coastguard Worker
298*61046927SAndroid Build Coastguard Worker static void *
anv_utrace_create_buffer(struct u_trace_context * utctx,uint64_t size_B)299*61046927SAndroid Build Coastguard Worker anv_utrace_create_buffer(struct u_trace_context *utctx, uint64_t size_B)
300*61046927SAndroid Build Coastguard Worker {
301*61046927SAndroid Build Coastguard Worker struct anv_device *device =
302*61046927SAndroid Build Coastguard Worker container_of(utctx, struct anv_device, ds.trace_context);
303*61046927SAndroid Build Coastguard Worker
304*61046927SAndroid Build Coastguard Worker struct anv_bo *bo = NULL;
305*61046927SAndroid Build Coastguard Worker UNUSED VkResult result =
306*61046927SAndroid Build Coastguard Worker anv_bo_pool_alloc(&device->utrace_bo_pool,
307*61046927SAndroid Build Coastguard Worker align(size_B, 4096),
308*61046927SAndroid Build Coastguard Worker &bo);
309*61046927SAndroid Build Coastguard Worker assert(result == VK_SUCCESS);
310*61046927SAndroid Build Coastguard Worker
311*61046927SAndroid Build Coastguard Worker memset(bo->map, 0, bo->size);
312*61046927SAndroid Build Coastguard Worker #ifdef SUPPORT_INTEL_INTEGRATED_GPUS
313*61046927SAndroid Build Coastguard Worker if (device->physical->memory.need_flush &&
314*61046927SAndroid Build Coastguard Worker anv_bo_needs_host_cache_flush(bo->alloc_flags))
315*61046927SAndroid Build Coastguard Worker intel_flush_range(bo->map, bo->size);
316*61046927SAndroid Build Coastguard Worker #endif
317*61046927SAndroid Build Coastguard Worker
318*61046927SAndroid Build Coastguard Worker return bo;
319*61046927SAndroid Build Coastguard Worker }
320*61046927SAndroid Build Coastguard Worker
321*61046927SAndroid Build Coastguard Worker static void
anv_utrace_destroy_buffer(struct u_trace_context * utctx,void * timestamps)322*61046927SAndroid Build Coastguard Worker anv_utrace_destroy_buffer(struct u_trace_context *utctx, void *timestamps)
323*61046927SAndroid Build Coastguard Worker {
324*61046927SAndroid Build Coastguard Worker struct anv_device *device =
325*61046927SAndroid Build Coastguard Worker container_of(utctx, struct anv_device, ds.trace_context);
326*61046927SAndroid Build Coastguard Worker struct anv_bo *bo = timestamps;
327*61046927SAndroid Build Coastguard Worker
328*61046927SAndroid Build Coastguard Worker anv_bo_pool_free(&device->utrace_bo_pool, bo);
329*61046927SAndroid Build Coastguard Worker }
330*61046927SAndroid Build Coastguard Worker
331*61046927SAndroid Build Coastguard Worker static void
anv_utrace_record_ts(struct u_trace * ut,void * cs,void * timestamps,uint64_t offset_B,uint32_t flags)332*61046927SAndroid Build Coastguard Worker anv_utrace_record_ts(struct u_trace *ut, void *cs,
333*61046927SAndroid Build Coastguard Worker void *timestamps, uint64_t offset_B,
334*61046927SAndroid Build Coastguard Worker uint32_t flags)
335*61046927SAndroid Build Coastguard Worker {
336*61046927SAndroid Build Coastguard Worker struct anv_device *device =
337*61046927SAndroid Build Coastguard Worker container_of(ut->utctx, struct anv_device, ds.trace_context);
338*61046927SAndroid Build Coastguard Worker struct anv_cmd_buffer *cmd_buffer =
339*61046927SAndroid Build Coastguard Worker container_of(ut, struct anv_cmd_buffer, trace);
340*61046927SAndroid Build Coastguard Worker /* cmd_buffer is only valid if cs == NULL */
341*61046927SAndroid Build Coastguard Worker struct anv_batch *batch = cs != NULL ? cs : &cmd_buffer->batch;
342*61046927SAndroid Build Coastguard Worker struct anv_bo *bo = timestamps;
343*61046927SAndroid Build Coastguard Worker
344*61046927SAndroid Build Coastguard Worker assert(offset_B % sizeof(union anv_utrace_timestamp) == 0);
345*61046927SAndroid Build Coastguard Worker struct anv_address ts_address = (struct anv_address) {
346*61046927SAndroid Build Coastguard Worker .bo = bo,
347*61046927SAndroid Build Coastguard Worker .offset = offset_B,
348*61046927SAndroid Build Coastguard Worker };
349*61046927SAndroid Build Coastguard Worker
350*61046927SAndroid Build Coastguard Worker /* Is this a end of compute trace point? */
351*61046927SAndroid Build Coastguard Worker const bool is_end_compute =
352*61046927SAndroid Build Coastguard Worker cs == NULL &&
353*61046927SAndroid Build Coastguard Worker (flags & INTEL_DS_TRACEPOINT_FLAG_END_OF_PIPE_CS);
354*61046927SAndroid Build Coastguard Worker
355*61046927SAndroid Build Coastguard Worker assert(device->info->verx10 < 125 ||
356*61046927SAndroid Build Coastguard Worker !is_end_compute ||
357*61046927SAndroid Build Coastguard Worker cmd_buffer->state.last_indirect_dispatch != NULL ||
358*61046927SAndroid Build Coastguard Worker cmd_buffer->state.last_compute_walker != NULL);
359*61046927SAndroid Build Coastguard Worker
360*61046927SAndroid Build Coastguard Worker enum anv_timestamp_capture_type capture_type =
361*61046927SAndroid Build Coastguard Worker (device->info->verx10 >= 125 && is_end_compute) ?
362*61046927SAndroid Build Coastguard Worker (cmd_buffer->state.last_indirect_dispatch != NULL ?
363*61046927SAndroid Build Coastguard Worker ANV_TIMESTAMP_REWRITE_INDIRECT_DISPATCH : ANV_TIMESTAMP_REWRITE_COMPUTE_WALKER) :
364*61046927SAndroid Build Coastguard Worker (flags & (INTEL_DS_TRACEPOINT_FLAG_END_OF_PIPE |
365*61046927SAndroid Build Coastguard Worker INTEL_DS_TRACEPOINT_FLAG_END_OF_PIPE_CS)) ?
366*61046927SAndroid Build Coastguard Worker ANV_TIMESTAMP_CAPTURE_END_OF_PIPE : ANV_TIMESTAMP_CAPTURE_TOP_OF_PIPE;
367*61046927SAndroid Build Coastguard Worker
368*61046927SAndroid Build Coastguard Worker
369*61046927SAndroid Build Coastguard Worker void *addr = capture_type == ANV_TIMESTAMP_REWRITE_INDIRECT_DISPATCH ?
370*61046927SAndroid Build Coastguard Worker cmd_buffer->state.last_indirect_dispatch :
371*61046927SAndroid Build Coastguard Worker capture_type == ANV_TIMESTAMP_REWRITE_COMPUTE_WALKER ?
372*61046927SAndroid Build Coastguard Worker cmd_buffer->state.last_compute_walker : NULL;
373*61046927SAndroid Build Coastguard Worker
374*61046927SAndroid Build Coastguard Worker device->physical->cmd_emit_timestamp(batch, device, ts_address,
375*61046927SAndroid Build Coastguard Worker capture_type,
376*61046927SAndroid Build Coastguard Worker addr);
377*61046927SAndroid Build Coastguard Worker if (is_end_compute) {
378*61046927SAndroid Build Coastguard Worker cmd_buffer->state.last_compute_walker = NULL;
379*61046927SAndroid Build Coastguard Worker cmd_buffer->state.last_indirect_dispatch = NULL;
380*61046927SAndroid Build Coastguard Worker }
381*61046927SAndroid Build Coastguard Worker }
382*61046927SAndroid Build Coastguard Worker
383*61046927SAndroid Build Coastguard Worker static uint64_t
anv_utrace_read_ts(struct u_trace_context * utctx,void * timestamps,uint64_t offset_B,void * flush_data)384*61046927SAndroid Build Coastguard Worker anv_utrace_read_ts(struct u_trace_context *utctx,
385*61046927SAndroid Build Coastguard Worker void *timestamps, uint64_t offset_B,
386*61046927SAndroid Build Coastguard Worker void *flush_data)
387*61046927SAndroid Build Coastguard Worker {
388*61046927SAndroid Build Coastguard Worker struct anv_device *device =
389*61046927SAndroid Build Coastguard Worker container_of(utctx, struct anv_device, ds.trace_context);
390*61046927SAndroid Build Coastguard Worker struct anv_bo *bo = timestamps;
391*61046927SAndroid Build Coastguard Worker struct anv_utrace_submit *submit =
392*61046927SAndroid Build Coastguard Worker container_of(flush_data, struct anv_utrace_submit, ds);
393*61046927SAndroid Build Coastguard Worker
394*61046927SAndroid Build Coastguard Worker /* Only need to stall on results for the first entry: */
395*61046927SAndroid Build Coastguard Worker if (offset_B == 0) {
396*61046927SAndroid Build Coastguard Worker MESA_TRACE_SCOPE("anv utrace wait timestamps");
397*61046927SAndroid Build Coastguard Worker UNUSED VkResult result =
398*61046927SAndroid Build Coastguard Worker vk_sync_wait(&device->vk,
399*61046927SAndroid Build Coastguard Worker submit->base.signal.sync,
400*61046927SAndroid Build Coastguard Worker submit->base.signal.signal_value,
401*61046927SAndroid Build Coastguard Worker VK_SYNC_WAIT_COMPLETE,
402*61046927SAndroid Build Coastguard Worker os_time_get_absolute_timeout(OS_TIMEOUT_INFINITE));
403*61046927SAndroid Build Coastguard Worker assert(result == VK_SUCCESS);
404*61046927SAndroid Build Coastguard Worker }
405*61046927SAndroid Build Coastguard Worker
406*61046927SAndroid Build Coastguard Worker assert(offset_B % sizeof(union anv_utrace_timestamp) == 0);
407*61046927SAndroid Build Coastguard Worker union anv_utrace_timestamp *ts =
408*61046927SAndroid Build Coastguard Worker (union anv_utrace_timestamp *)(bo->map + offset_B);
409*61046927SAndroid Build Coastguard Worker
410*61046927SAndroid Build Coastguard Worker /* Don't translate the no-timestamp marker: */
411*61046927SAndroid Build Coastguard Worker if (ts->timestamp == U_TRACE_NO_TIMESTAMP)
412*61046927SAndroid Build Coastguard Worker return U_TRACE_NO_TIMESTAMP;
413*61046927SAndroid Build Coastguard Worker
414*61046927SAndroid Build Coastguard Worker /* Detect a 16/32 bytes timestamp write */
415*61046927SAndroid Build Coastguard Worker if (ts->gfx20_postsync_data[1] != 0 ||
416*61046927SAndroid Build Coastguard Worker ts->gfx20_postsync_data[2] != 0 ||
417*61046927SAndroid Build Coastguard Worker ts->gfx20_postsync_data[3] != 0) {
418*61046927SAndroid Build Coastguard Worker if (device->info->ver >= 20) {
419*61046927SAndroid Build Coastguard Worker return intel_device_info_timebase_scale(device->info,
420*61046927SAndroid Build Coastguard Worker ts->gfx20_postsync_data[3]);
421*61046927SAndroid Build Coastguard Worker }
422*61046927SAndroid Build Coastguard Worker
423*61046927SAndroid Build Coastguard Worker /* The timestamp written by COMPUTE_WALKER::PostSync only as 32bits. We
424*61046927SAndroid Build Coastguard Worker * need to rebuild the full 64bits using the previous timestamp. We
425*61046927SAndroid Build Coastguard Worker * assume that utrace is reading the timestamp in order. Anyway
426*61046927SAndroid Build Coastguard Worker * timestamp rollover on 32bits in a few minutes so in most cases that
427*61046927SAndroid Build Coastguard Worker * should be correct.
428*61046927SAndroid Build Coastguard Worker */
429*61046927SAndroid Build Coastguard Worker uint64_t timestamp =
430*61046927SAndroid Build Coastguard Worker (submit->last_full_timestamp & 0xffffffff00000000) |
431*61046927SAndroid Build Coastguard Worker (uint64_t) ts->gfx125_postsync_data[3];
432*61046927SAndroid Build Coastguard Worker
433*61046927SAndroid Build Coastguard Worker return intel_device_info_timebase_scale(device->info, timestamp);
434*61046927SAndroid Build Coastguard Worker }
435*61046927SAndroid Build Coastguard Worker
436*61046927SAndroid Build Coastguard Worker submit->last_full_timestamp = ts->timestamp;
437*61046927SAndroid Build Coastguard Worker
438*61046927SAndroid Build Coastguard Worker return intel_device_info_timebase_scale(device->info, ts->timestamp);
439*61046927SAndroid Build Coastguard Worker }
440*61046927SAndroid Build Coastguard Worker
441*61046927SAndroid Build Coastguard Worker static void
anv_utrace_capture_data(struct u_trace * ut,void * cs,void * dst_buffer,uint64_t dst_offset_B,void * src_buffer,uint64_t src_offset_B,uint32_t size_B)442*61046927SAndroid Build Coastguard Worker anv_utrace_capture_data(struct u_trace *ut,
443*61046927SAndroid Build Coastguard Worker void *cs,
444*61046927SAndroid Build Coastguard Worker void *dst_buffer,
445*61046927SAndroid Build Coastguard Worker uint64_t dst_offset_B,
446*61046927SAndroid Build Coastguard Worker void *src_buffer,
447*61046927SAndroid Build Coastguard Worker uint64_t src_offset_B,
448*61046927SAndroid Build Coastguard Worker uint32_t size_B)
449*61046927SAndroid Build Coastguard Worker {
450*61046927SAndroid Build Coastguard Worker struct anv_device *device =
451*61046927SAndroid Build Coastguard Worker container_of(ut->utctx, struct anv_device, ds.trace_context);
452*61046927SAndroid Build Coastguard Worker struct anv_cmd_buffer *cmd_buffer =
453*61046927SAndroid Build Coastguard Worker container_of(ut, struct anv_cmd_buffer, trace);
454*61046927SAndroid Build Coastguard Worker /* cmd_buffer is only valid if cs == NULL */
455*61046927SAndroid Build Coastguard Worker struct anv_batch *batch = cs != NULL ? cs : &cmd_buffer->batch;
456*61046927SAndroid Build Coastguard Worker struct anv_address dst_addr = {
457*61046927SAndroid Build Coastguard Worker .bo = dst_buffer,
458*61046927SAndroid Build Coastguard Worker .offset = dst_offset_B,
459*61046927SAndroid Build Coastguard Worker };
460*61046927SAndroid Build Coastguard Worker struct anv_address src_addr = {
461*61046927SAndroid Build Coastguard Worker .bo = src_buffer,
462*61046927SAndroid Build Coastguard Worker .offset = src_offset_B,
463*61046927SAndroid Build Coastguard Worker };
464*61046927SAndroid Build Coastguard Worker
465*61046927SAndroid Build Coastguard Worker device->physical->cmd_capture_data(batch, device, dst_addr, src_addr, size_B);
466*61046927SAndroid Build Coastguard Worker }
467*61046927SAndroid Build Coastguard Worker
468*61046927SAndroid Build Coastguard Worker static const void *
anv_utrace_get_data(struct u_trace_context * utctx,void * buffer,uint64_t offset_B,uint32_t size_B)469*61046927SAndroid Build Coastguard Worker anv_utrace_get_data(struct u_trace_context *utctx,
470*61046927SAndroid Build Coastguard Worker void *buffer, uint64_t offset_B, uint32_t size_B)
471*61046927SAndroid Build Coastguard Worker {
472*61046927SAndroid Build Coastguard Worker struct anv_bo *bo = buffer;
473*61046927SAndroid Build Coastguard Worker
474*61046927SAndroid Build Coastguard Worker return bo->map + offset_B;
475*61046927SAndroid Build Coastguard Worker }
476*61046927SAndroid Build Coastguard Worker
477*61046927SAndroid Build Coastguard Worker void
anv_device_utrace_init(struct anv_device * device)478*61046927SAndroid Build Coastguard Worker anv_device_utrace_init(struct anv_device *device)
479*61046927SAndroid Build Coastguard Worker {
480*61046927SAndroid Build Coastguard Worker device->utrace_timestamp_size = sizeof(union anv_utrace_timestamp);
481*61046927SAndroid Build Coastguard Worker
482*61046927SAndroid Build Coastguard Worker anv_bo_pool_init(&device->utrace_bo_pool, device, "utrace",
483*61046927SAndroid Build Coastguard Worker ANV_BO_ALLOC_MAPPED | ANV_BO_ALLOC_HOST_CACHED_COHERENT);
484*61046927SAndroid Build Coastguard Worker intel_ds_device_init(&device->ds, device->info, device->fd,
485*61046927SAndroid Build Coastguard Worker device->physical->local_minor,
486*61046927SAndroid Build Coastguard Worker INTEL_DS_API_VULKAN);
487*61046927SAndroid Build Coastguard Worker u_trace_context_init(&device->ds.trace_context,
488*61046927SAndroid Build Coastguard Worker &device->ds,
489*61046927SAndroid Build Coastguard Worker device->utrace_timestamp_size,
490*61046927SAndroid Build Coastguard Worker 12,
491*61046927SAndroid Build Coastguard Worker anv_utrace_create_buffer,
492*61046927SAndroid Build Coastguard Worker anv_utrace_destroy_buffer,
493*61046927SAndroid Build Coastguard Worker anv_utrace_record_ts,
494*61046927SAndroid Build Coastguard Worker anv_utrace_read_ts,
495*61046927SAndroid Build Coastguard Worker anv_utrace_capture_data,
496*61046927SAndroid Build Coastguard Worker anv_utrace_get_data,
497*61046927SAndroid Build Coastguard Worker anv_utrace_delete_submit);
498*61046927SAndroid Build Coastguard Worker
499*61046927SAndroid Build Coastguard Worker for (uint32_t q = 0; q < device->queue_count; q++) {
500*61046927SAndroid Build Coastguard Worker struct anv_queue *queue = &device->queues[q];
501*61046927SAndroid Build Coastguard Worker
502*61046927SAndroid Build Coastguard Worker intel_ds_device_init_queue(&device->ds, &queue->ds, "%s%u",
503*61046927SAndroid Build Coastguard Worker intel_engines_class_to_string(queue->family->engine_class),
504*61046927SAndroid Build Coastguard Worker queue->vk.index_in_family);
505*61046927SAndroid Build Coastguard Worker }
506*61046927SAndroid Build Coastguard Worker }
507*61046927SAndroid Build Coastguard Worker
508*61046927SAndroid Build Coastguard Worker void
anv_device_utrace_finish(struct anv_device * device)509*61046927SAndroid Build Coastguard Worker anv_device_utrace_finish(struct anv_device *device)
510*61046927SAndroid Build Coastguard Worker {
511*61046927SAndroid Build Coastguard Worker intel_ds_device_process(&device->ds, true);
512*61046927SAndroid Build Coastguard Worker intel_ds_device_fini(&device->ds);
513*61046927SAndroid Build Coastguard Worker anv_bo_pool_finish(&device->utrace_bo_pool);
514*61046927SAndroid Build Coastguard Worker }
515*61046927SAndroid Build Coastguard Worker
516*61046927SAndroid Build Coastguard Worker enum intel_ds_stall_flag
anv_pipe_flush_bit_to_ds_stall_flag(enum anv_pipe_bits bits)517*61046927SAndroid Build Coastguard Worker anv_pipe_flush_bit_to_ds_stall_flag(enum anv_pipe_bits bits)
518*61046927SAndroid Build Coastguard Worker {
519*61046927SAndroid Build Coastguard Worker static const struct {
520*61046927SAndroid Build Coastguard Worker enum anv_pipe_bits anv;
521*61046927SAndroid Build Coastguard Worker enum intel_ds_stall_flag ds;
522*61046927SAndroid Build Coastguard Worker } anv_to_ds_flags[] = {
523*61046927SAndroid Build Coastguard Worker { .anv = ANV_PIPE_DEPTH_CACHE_FLUSH_BIT, .ds = INTEL_DS_DEPTH_CACHE_FLUSH_BIT, },
524*61046927SAndroid Build Coastguard Worker { .anv = ANV_PIPE_DATA_CACHE_FLUSH_BIT, .ds = INTEL_DS_DATA_CACHE_FLUSH_BIT, },
525*61046927SAndroid Build Coastguard Worker { .anv = ANV_PIPE_TILE_CACHE_FLUSH_BIT, .ds = INTEL_DS_TILE_CACHE_FLUSH_BIT, },
526*61046927SAndroid Build Coastguard Worker { .anv = ANV_PIPE_RENDER_TARGET_CACHE_FLUSH_BIT, .ds = INTEL_DS_RENDER_TARGET_CACHE_FLUSH_BIT, },
527*61046927SAndroid Build Coastguard Worker { .anv = ANV_PIPE_STATE_CACHE_INVALIDATE_BIT, .ds = INTEL_DS_STATE_CACHE_INVALIDATE_BIT, },
528*61046927SAndroid Build Coastguard Worker { .anv = ANV_PIPE_CONSTANT_CACHE_INVALIDATE_BIT, .ds = INTEL_DS_CONST_CACHE_INVALIDATE_BIT, },
529*61046927SAndroid Build Coastguard Worker { .anv = ANV_PIPE_VF_CACHE_INVALIDATE_BIT, .ds = INTEL_DS_VF_CACHE_INVALIDATE_BIT, },
530*61046927SAndroid Build Coastguard Worker { .anv = ANV_PIPE_TEXTURE_CACHE_INVALIDATE_BIT, .ds = INTEL_DS_TEXTURE_CACHE_INVALIDATE_BIT, },
531*61046927SAndroid Build Coastguard Worker { .anv = ANV_PIPE_INSTRUCTION_CACHE_INVALIDATE_BIT, .ds = INTEL_DS_INST_CACHE_INVALIDATE_BIT, },
532*61046927SAndroid Build Coastguard Worker { .anv = ANV_PIPE_DEPTH_STALL_BIT, .ds = INTEL_DS_DEPTH_STALL_BIT, },
533*61046927SAndroid Build Coastguard Worker { .anv = ANV_PIPE_CS_STALL_BIT, .ds = INTEL_DS_CS_STALL_BIT, },
534*61046927SAndroid Build Coastguard Worker { .anv = ANV_PIPE_HDC_PIPELINE_FLUSH_BIT, .ds = INTEL_DS_HDC_PIPELINE_FLUSH_BIT, },
535*61046927SAndroid Build Coastguard Worker { .anv = ANV_PIPE_STALL_AT_SCOREBOARD_BIT, .ds = INTEL_DS_STALL_AT_SCOREBOARD_BIT, },
536*61046927SAndroid Build Coastguard Worker { .anv = ANV_PIPE_UNTYPED_DATAPORT_CACHE_FLUSH_BIT, .ds = INTEL_DS_UNTYPED_DATAPORT_CACHE_FLUSH_BIT, },
537*61046927SAndroid Build Coastguard Worker { .anv = ANV_PIPE_PSS_STALL_SYNC_BIT, .ds = INTEL_DS_PSS_STALL_SYNC_BIT, },
538*61046927SAndroid Build Coastguard Worker { .anv = ANV_PIPE_END_OF_PIPE_SYNC_BIT, .ds = INTEL_DS_END_OF_PIPE_BIT, },
539*61046927SAndroid Build Coastguard Worker { .anv = ANV_PIPE_CCS_CACHE_FLUSH_BIT, .ds = INTEL_DS_CCS_CACHE_FLUSH_BIT, },
540*61046927SAndroid Build Coastguard Worker };
541*61046927SAndroid Build Coastguard Worker
542*61046927SAndroid Build Coastguard Worker enum intel_ds_stall_flag ret = 0;
543*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < ARRAY_SIZE(anv_to_ds_flags); i++) {
544*61046927SAndroid Build Coastguard Worker if (anv_to_ds_flags[i].anv & bits)
545*61046927SAndroid Build Coastguard Worker ret |= anv_to_ds_flags[i].ds;
546*61046927SAndroid Build Coastguard Worker }
547*61046927SAndroid Build Coastguard Worker
548*61046927SAndroid Build Coastguard Worker return ret;
549*61046927SAndroid Build Coastguard Worker }
550*61046927SAndroid Build Coastguard Worker
anv_CmdBeginDebugUtilsLabelEXT(VkCommandBuffer _commandBuffer,const VkDebugUtilsLabelEXT * pLabelInfo)551*61046927SAndroid Build Coastguard Worker void anv_CmdBeginDebugUtilsLabelEXT(
552*61046927SAndroid Build Coastguard Worker VkCommandBuffer _commandBuffer,
553*61046927SAndroid Build Coastguard Worker const VkDebugUtilsLabelEXT *pLabelInfo)
554*61046927SAndroid Build Coastguard Worker {
555*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, _commandBuffer);
556*61046927SAndroid Build Coastguard Worker
557*61046927SAndroid Build Coastguard Worker vk_common_CmdBeginDebugUtilsLabelEXT(_commandBuffer, pLabelInfo);
558*61046927SAndroid Build Coastguard Worker
559*61046927SAndroid Build Coastguard Worker trace_intel_begin_cmd_buffer_annotation(&cmd_buffer->trace);
560*61046927SAndroid Build Coastguard Worker }
561*61046927SAndroid Build Coastguard Worker
anv_CmdEndDebugUtilsLabelEXT(VkCommandBuffer _commandBuffer)562*61046927SAndroid Build Coastguard Worker void anv_CmdEndDebugUtilsLabelEXT(VkCommandBuffer _commandBuffer)
563*61046927SAndroid Build Coastguard Worker {
564*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, _commandBuffer);
565*61046927SAndroid Build Coastguard Worker
566*61046927SAndroid Build Coastguard Worker if (cmd_buffer->vk.labels.size > 0) {
567*61046927SAndroid Build Coastguard Worker const VkDebugUtilsLabelEXT *label =
568*61046927SAndroid Build Coastguard Worker util_dynarray_top_ptr(&cmd_buffer->vk.labels, VkDebugUtilsLabelEXT);
569*61046927SAndroid Build Coastguard Worker
570*61046927SAndroid Build Coastguard Worker trace_intel_end_cmd_buffer_annotation(&cmd_buffer->trace,
571*61046927SAndroid Build Coastguard Worker strlen(label->pLabelName),
572*61046927SAndroid Build Coastguard Worker label->pLabelName);
573*61046927SAndroid Build Coastguard Worker }
574*61046927SAndroid Build Coastguard Worker
575*61046927SAndroid Build Coastguard Worker vk_common_CmdEndDebugUtilsLabelEXT(_commandBuffer);
576*61046927SAndroid Build Coastguard Worker }
577*61046927SAndroid Build Coastguard Worker
578*61046927SAndroid Build Coastguard Worker void
anv_queue_trace(struct anv_queue * queue,const char * label,bool frame,bool begin)579*61046927SAndroid Build Coastguard Worker anv_queue_trace(struct anv_queue *queue, const char *label, bool frame, bool begin)
580*61046927SAndroid Build Coastguard Worker {
581*61046927SAndroid Build Coastguard Worker struct anv_device *device = queue->device;
582*61046927SAndroid Build Coastguard Worker
583*61046927SAndroid Build Coastguard Worker VkResult result;
584*61046927SAndroid Build Coastguard Worker struct anv_utrace_submit *submit =
585*61046927SAndroid Build Coastguard Worker vk_zalloc(&device->vk.alloc, sizeof(struct anv_utrace_submit),
586*61046927SAndroid Build Coastguard Worker 8, VK_SYSTEM_ALLOCATION_SCOPE_DEVICE);
587*61046927SAndroid Build Coastguard Worker if (!submit)
588*61046927SAndroid Build Coastguard Worker return;
589*61046927SAndroid Build Coastguard Worker
590*61046927SAndroid Build Coastguard Worker result = anv_async_submit_init(&submit->base, queue,
591*61046927SAndroid Build Coastguard Worker &device->batch_bo_pool,
592*61046927SAndroid Build Coastguard Worker false, true);
593*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS)
594*61046927SAndroid Build Coastguard Worker goto error_async;
595*61046927SAndroid Build Coastguard Worker
596*61046927SAndroid Build Coastguard Worker intel_ds_flush_data_init(&submit->ds, &queue->ds, queue->ds.submission_id);
597*61046927SAndroid Build Coastguard Worker
598*61046927SAndroid Build Coastguard Worker struct anv_batch *batch = &submit->base.batch;
599*61046927SAndroid Build Coastguard Worker if (frame) {
600*61046927SAndroid Build Coastguard Worker if (begin)
601*61046927SAndroid Build Coastguard Worker trace_intel_begin_frame(&submit->ds.trace, batch);
602*61046927SAndroid Build Coastguard Worker else
603*61046927SAndroid Build Coastguard Worker trace_intel_end_frame(&submit->ds.trace, batch,
604*61046927SAndroid Build Coastguard Worker device->debug_frame_desc->frame_id);
605*61046927SAndroid Build Coastguard Worker } else {
606*61046927SAndroid Build Coastguard Worker if (begin) {
607*61046927SAndroid Build Coastguard Worker trace_intel_begin_queue_annotation(&submit->ds.trace, batch);
608*61046927SAndroid Build Coastguard Worker } else {
609*61046927SAndroid Build Coastguard Worker trace_intel_end_queue_annotation(&submit->ds.trace, batch,
610*61046927SAndroid Build Coastguard Worker strlen(label), label);
611*61046927SAndroid Build Coastguard Worker }
612*61046927SAndroid Build Coastguard Worker }
613*61046927SAndroid Build Coastguard Worker
614*61046927SAndroid Build Coastguard Worker anv_batch_emit(batch, GFX9_MI_BATCH_BUFFER_END, bbs);
615*61046927SAndroid Build Coastguard Worker anv_batch_emit(batch, GFX9_MI_NOOP, noop);
616*61046927SAndroid Build Coastguard Worker
617*61046927SAndroid Build Coastguard Worker if (batch->status != VK_SUCCESS) {
618*61046927SAndroid Build Coastguard Worker result = batch->status;
619*61046927SAndroid Build Coastguard Worker goto error_batch;
620*61046927SAndroid Build Coastguard Worker }
621*61046927SAndroid Build Coastguard Worker
622*61046927SAndroid Build Coastguard Worker intel_ds_queue_flush_data(&queue->ds, &submit->ds.trace, &submit->ds,
623*61046927SAndroid Build Coastguard Worker device->vk.current_frame, true);
624*61046927SAndroid Build Coastguard Worker
625*61046927SAndroid Build Coastguard Worker result =
626*61046927SAndroid Build Coastguard Worker device->kmd_backend->queue_exec_async(&submit->base,
627*61046927SAndroid Build Coastguard Worker 0, NULL, 0, NULL);
628*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS)
629*61046927SAndroid Build Coastguard Worker goto error_batch;
630*61046927SAndroid Build Coastguard Worker
631*61046927SAndroid Build Coastguard Worker if (frame && !begin)
632*61046927SAndroid Build Coastguard Worker intel_ds_device_process(&device->ds, true);
633*61046927SAndroid Build Coastguard Worker
634*61046927SAndroid Build Coastguard Worker return;
635*61046927SAndroid Build Coastguard Worker
636*61046927SAndroid Build Coastguard Worker error_batch:
637*61046927SAndroid Build Coastguard Worker intel_ds_flush_data_fini(&submit->ds);
638*61046927SAndroid Build Coastguard Worker anv_async_submit_fini(&submit->base);
639*61046927SAndroid Build Coastguard Worker error_async:
640*61046927SAndroid Build Coastguard Worker vk_free(&device->vk.alloc, submit);
641*61046927SAndroid Build Coastguard Worker }
642*61046927SAndroid Build Coastguard Worker
643*61046927SAndroid Build Coastguard Worker void
anv_QueueBeginDebugUtilsLabelEXT(VkQueue _queue,const VkDebugUtilsLabelEXT * pLabelInfo)644*61046927SAndroid Build Coastguard Worker anv_QueueBeginDebugUtilsLabelEXT(
645*61046927SAndroid Build Coastguard Worker VkQueue _queue,
646*61046927SAndroid Build Coastguard Worker const VkDebugUtilsLabelEXT *pLabelInfo)
647*61046927SAndroid Build Coastguard Worker {
648*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(anv_queue, queue, _queue);
649*61046927SAndroid Build Coastguard Worker
650*61046927SAndroid Build Coastguard Worker vk_common_QueueBeginDebugUtilsLabelEXT(_queue, pLabelInfo);
651*61046927SAndroid Build Coastguard Worker
652*61046927SAndroid Build Coastguard Worker anv_queue_trace(queue, pLabelInfo->pLabelName,
653*61046927SAndroid Build Coastguard Worker false /* frame */, true /* begin */);
654*61046927SAndroid Build Coastguard Worker }
655*61046927SAndroid Build Coastguard Worker
656*61046927SAndroid Build Coastguard Worker void
anv_QueueEndDebugUtilsLabelEXT(VkQueue _queue)657*61046927SAndroid Build Coastguard Worker anv_QueueEndDebugUtilsLabelEXT(VkQueue _queue)
658*61046927SAndroid Build Coastguard Worker {
659*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(anv_queue, queue, _queue);
660*61046927SAndroid Build Coastguard Worker
661*61046927SAndroid Build Coastguard Worker if (queue->vk.labels.size > 0) {
662*61046927SAndroid Build Coastguard Worker const VkDebugUtilsLabelEXT *label =
663*61046927SAndroid Build Coastguard Worker util_dynarray_top_ptr(&queue->vk.labels, VkDebugUtilsLabelEXT);
664*61046927SAndroid Build Coastguard Worker anv_queue_trace(queue, label->pLabelName,
665*61046927SAndroid Build Coastguard Worker false /* frame */, false /* begin */);
666*61046927SAndroid Build Coastguard Worker
667*61046927SAndroid Build Coastguard Worker intel_ds_device_process(&queue->device->ds, true);
668*61046927SAndroid Build Coastguard Worker }
669*61046927SAndroid Build Coastguard Worker
670*61046927SAndroid Build Coastguard Worker vk_common_QueueEndDebugUtilsLabelEXT(_queue);
671*61046927SAndroid Build Coastguard Worker }
672