1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright © 2015 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 #ifndef ANV_PRIVATE_H
25*61046927SAndroid Build Coastguard Worker #define ANV_PRIVATE_H
26*61046927SAndroid Build Coastguard Worker
27*61046927SAndroid Build Coastguard Worker #include <stdlib.h>
28*61046927SAndroid Build Coastguard Worker #include <stdio.h>
29*61046927SAndroid Build Coastguard Worker #include <stdbool.h>
30*61046927SAndroid Build Coastguard Worker #include <pthread.h>
31*61046927SAndroid Build Coastguard Worker #include <assert.h>
32*61046927SAndroid Build Coastguard Worker #include <stdint.h>
33*61046927SAndroid Build Coastguard Worker #include "drm-uapi/drm_fourcc.h"
34*61046927SAndroid Build Coastguard Worker
35*61046927SAndroid Build Coastguard Worker #ifdef HAVE_VALGRIND
36*61046927SAndroid Build Coastguard Worker #include <valgrind.h>
37*61046927SAndroid Build Coastguard Worker #include <memcheck.h>
38*61046927SAndroid Build Coastguard Worker #define VG(x) x
39*61046927SAndroid Build Coastguard Worker #else
40*61046927SAndroid Build Coastguard Worker #define VG(x) ((void)0)
41*61046927SAndroid Build Coastguard Worker #endif
42*61046927SAndroid Build Coastguard Worker
43*61046927SAndroid Build Coastguard Worker #include "common/intel_aux_map.h"
44*61046927SAndroid Build Coastguard Worker #include "common/intel_bind_timeline.h"
45*61046927SAndroid Build Coastguard Worker #include "common/intel_engine.h"
46*61046927SAndroid Build Coastguard Worker #include "common/intel_gem.h"
47*61046927SAndroid Build Coastguard Worker #include "common/intel_l3_config.h"
48*61046927SAndroid Build Coastguard Worker #include "common/intel_measure.h"
49*61046927SAndroid Build Coastguard Worker #include "common/intel_mem.h"
50*61046927SAndroid Build Coastguard Worker #include "common/intel_sample_positions.h"
51*61046927SAndroid Build Coastguard Worker #include "decoder/intel_decoder.h"
52*61046927SAndroid Build Coastguard Worker #include "dev/intel_device_info.h"
53*61046927SAndroid Build Coastguard Worker #include "blorp/blorp.h"
54*61046927SAndroid Build Coastguard Worker #include "compiler/brw_compiler.h"
55*61046927SAndroid Build Coastguard Worker #include "compiler/brw_kernel.h"
56*61046927SAndroid Build Coastguard Worker #include "compiler/brw_rt.h"
57*61046927SAndroid Build Coastguard Worker #include "ds/intel_driver_ds.h"
58*61046927SAndroid Build Coastguard Worker #include "util/bitset.h"
59*61046927SAndroid Build Coastguard Worker #include "util/bitscan.h"
60*61046927SAndroid Build Coastguard Worker #include "util/detect_os.h"
61*61046927SAndroid Build Coastguard Worker #include "util/macros.h"
62*61046927SAndroid Build Coastguard Worker #include "util/hash_table.h"
63*61046927SAndroid Build Coastguard Worker #include "util/list.h"
64*61046927SAndroid Build Coastguard Worker #include "util/perf/u_trace.h"
65*61046927SAndroid Build Coastguard Worker #include "util/set.h"
66*61046927SAndroid Build Coastguard Worker #include "util/sparse_array.h"
67*61046927SAndroid Build Coastguard Worker #include "util/u_atomic.h"
68*61046927SAndroid Build Coastguard Worker #if DETECT_OS_ANDROID
69*61046927SAndroid Build Coastguard Worker #include "util/u_gralloc/u_gralloc.h"
70*61046927SAndroid Build Coastguard Worker #endif
71*61046927SAndroid Build Coastguard Worker #include "util/u_vector.h"
72*61046927SAndroid Build Coastguard Worker #include "util/u_math.h"
73*61046927SAndroid Build Coastguard Worker #include "util/vma.h"
74*61046927SAndroid Build Coastguard Worker #include "util/xmlconfig.h"
75*61046927SAndroid Build Coastguard Worker #include "vk_acceleration_structure.h"
76*61046927SAndroid Build Coastguard Worker #include "vk_alloc.h"
77*61046927SAndroid Build Coastguard Worker #include "vk_buffer.h"
78*61046927SAndroid Build Coastguard Worker #include "vk_buffer_view.h"
79*61046927SAndroid Build Coastguard Worker #include "vk_command_buffer.h"
80*61046927SAndroid Build Coastguard Worker #include "vk_command_pool.h"
81*61046927SAndroid Build Coastguard Worker #include "vk_debug_report.h"
82*61046927SAndroid Build Coastguard Worker #include "vk_descriptor_update_template.h"
83*61046927SAndroid Build Coastguard Worker #include "vk_device.h"
84*61046927SAndroid Build Coastguard Worker #include "vk_device_memory.h"
85*61046927SAndroid Build Coastguard Worker #include "vk_drm_syncobj.h"
86*61046927SAndroid Build Coastguard Worker #include "vk_enum_defines.h"
87*61046927SAndroid Build Coastguard Worker #include "vk_format.h"
88*61046927SAndroid Build Coastguard Worker #include "vk_framebuffer.h"
89*61046927SAndroid Build Coastguard Worker #include "vk_graphics_state.h"
90*61046927SAndroid Build Coastguard Worker #include "vk_image.h"
91*61046927SAndroid Build Coastguard Worker #include "vk_instance.h"
92*61046927SAndroid Build Coastguard Worker #include "vk_pipeline_cache.h"
93*61046927SAndroid Build Coastguard Worker #include "vk_physical_device.h"
94*61046927SAndroid Build Coastguard Worker #include "vk_sampler.h"
95*61046927SAndroid Build Coastguard Worker #include "vk_shader_module.h"
96*61046927SAndroid Build Coastguard Worker #include "vk_sync.h"
97*61046927SAndroid Build Coastguard Worker #include "vk_sync_timeline.h"
98*61046927SAndroid Build Coastguard Worker #include "vk_texcompress_astc.h"
99*61046927SAndroid Build Coastguard Worker #include "vk_util.h"
100*61046927SAndroid Build Coastguard Worker #include "vk_query_pool.h"
101*61046927SAndroid Build Coastguard Worker #include "vk_queue.h"
102*61046927SAndroid Build Coastguard Worker #include "vk_log.h"
103*61046927SAndroid Build Coastguard Worker #include "vk_ycbcr_conversion.h"
104*61046927SAndroid Build Coastguard Worker #include "vk_video.h"
105*61046927SAndroid Build Coastguard Worker
106*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus
107*61046927SAndroid Build Coastguard Worker extern "C" {
108*61046927SAndroid Build Coastguard Worker #endif
109*61046927SAndroid Build Coastguard Worker
110*61046927SAndroid Build Coastguard Worker /* Pre-declarations needed for WSI entrypoints */
111*61046927SAndroid Build Coastguard Worker struct wl_surface;
112*61046927SAndroid Build Coastguard Worker struct wl_display;
113*61046927SAndroid Build Coastguard Worker typedef struct xcb_connection_t xcb_connection_t;
114*61046927SAndroid Build Coastguard Worker typedef uint32_t xcb_visualid_t;
115*61046927SAndroid Build Coastguard Worker typedef uint32_t xcb_window_t;
116*61046927SAndroid Build Coastguard Worker
117*61046927SAndroid Build Coastguard Worker struct anv_batch;
118*61046927SAndroid Build Coastguard Worker struct anv_buffer;
119*61046927SAndroid Build Coastguard Worker struct anv_buffer_view;
120*61046927SAndroid Build Coastguard Worker struct anv_image_view;
121*61046927SAndroid Build Coastguard Worker struct anv_instance;
122*61046927SAndroid Build Coastguard Worker
123*61046927SAndroid Build Coastguard Worker struct intel_aux_map_context;
124*61046927SAndroid Build Coastguard Worker struct intel_perf_config;
125*61046927SAndroid Build Coastguard Worker struct intel_perf_counter_pass;
126*61046927SAndroid Build Coastguard Worker struct intel_perf_query_result;
127*61046927SAndroid Build Coastguard Worker
128*61046927SAndroid Build Coastguard Worker #include <vulkan/vulkan.h>
129*61046927SAndroid Build Coastguard Worker #include <vulkan/vk_icd.h>
130*61046927SAndroid Build Coastguard Worker
131*61046927SAndroid Build Coastguard Worker #include "anv_android.h"
132*61046927SAndroid Build Coastguard Worker #include "anv_entrypoints.h"
133*61046927SAndroid Build Coastguard Worker #include "anv_kmd_backend.h"
134*61046927SAndroid Build Coastguard Worker #include "anv_rmv.h"
135*61046927SAndroid Build Coastguard Worker #include "isl/isl.h"
136*61046927SAndroid Build Coastguard Worker
137*61046927SAndroid Build Coastguard Worker #include "dev/intel_debug.h"
138*61046927SAndroid Build Coastguard Worker #undef MESA_LOG_TAG
139*61046927SAndroid Build Coastguard Worker #define MESA_LOG_TAG "MESA-INTEL"
140*61046927SAndroid Build Coastguard Worker #include "util/log.h"
141*61046927SAndroid Build Coastguard Worker #include "wsi_common.h"
142*61046927SAndroid Build Coastguard Worker
143*61046927SAndroid Build Coastguard Worker /* The "RAW" clocks on Linux are called "FAST" on FreeBSD */
144*61046927SAndroid Build Coastguard Worker #if !defined(CLOCK_MONOTONIC_RAW) && defined(CLOCK_MONOTONIC_FAST)
145*61046927SAndroid Build Coastguard Worker #define CLOCK_MONOTONIC_RAW CLOCK_MONOTONIC_FAST
146*61046927SAndroid Build Coastguard Worker #endif
147*61046927SAndroid Build Coastguard Worker
148*61046927SAndroid Build Coastguard Worker #define NSEC_PER_SEC 1000000000ull
149*61046927SAndroid Build Coastguard Worker
150*61046927SAndroid Build Coastguard Worker #define BINDING_TABLE_POOL_BLOCK_SIZE (65536)
151*61046927SAndroid Build Coastguard Worker
152*61046927SAndroid Build Coastguard Worker /* 3DSTATE_VERTEX_BUFFER supports 33 VBs, we use 2 for base & drawid SGVs */
153*61046927SAndroid Build Coastguard Worker #define MAX_VBS (33 - 2)
154*61046927SAndroid Build Coastguard Worker
155*61046927SAndroid Build Coastguard Worker /* 3DSTATE_VERTEX_ELEMENTS supports up to 34 VEs, but our backend compiler
156*61046927SAndroid Build Coastguard Worker * only supports the push model of VS inputs, and we only have 128 GRFs,
157*61046927SAndroid Build Coastguard Worker * minus the g0 and g1 payload, which gives us a maximum of 31 VEs. Plus,
158*61046927SAndroid Build Coastguard Worker * we use two of them for SGVs.
159*61046927SAndroid Build Coastguard Worker */
160*61046927SAndroid Build Coastguard Worker #define MAX_VES (31 - 2)
161*61046927SAndroid Build Coastguard Worker
162*61046927SAndroid Build Coastguard Worker #define MAX_XFB_BUFFERS 4
163*61046927SAndroid Build Coastguard Worker #define MAX_XFB_STREAMS 4
164*61046927SAndroid Build Coastguard Worker #define MAX_SETS 8
165*61046927SAndroid Build Coastguard Worker #define MAX_RTS 8
166*61046927SAndroid Build Coastguard Worker #define MAX_VIEWPORTS 16
167*61046927SAndroid Build Coastguard Worker #define MAX_SCISSORS 16
168*61046927SAndroid Build Coastguard Worker #define MAX_PUSH_CONSTANTS_SIZE 128
169*61046927SAndroid Build Coastguard Worker #define MAX_DYNAMIC_BUFFERS 16
170*61046927SAndroid Build Coastguard Worker #define MAX_PUSH_DESCRIPTORS 32 /* Minimum requirement */
171*61046927SAndroid Build Coastguard Worker #define MAX_INLINE_UNIFORM_BLOCK_SIZE 4096
172*61046927SAndroid Build Coastguard Worker #define MAX_INLINE_UNIFORM_BLOCK_DESCRIPTORS 32
173*61046927SAndroid Build Coastguard Worker #define MAX_EMBEDDED_SAMPLERS 2048
174*61046927SAndroid Build Coastguard Worker #define MAX_CUSTOM_BORDER_COLORS 4096
175*61046927SAndroid Build Coastguard Worker /* We need 16 for UBO block reads to work and 32 for push UBOs. However, we
176*61046927SAndroid Build Coastguard Worker * use 64 here to avoid cache issues. This could most likely bring it back to
177*61046927SAndroid Build Coastguard Worker * 32 if we had different virtual addresses for the different views on a given
178*61046927SAndroid Build Coastguard Worker * GEM object.
179*61046927SAndroid Build Coastguard Worker */
180*61046927SAndroid Build Coastguard Worker #define ANV_UBO_ALIGNMENT 64
181*61046927SAndroid Build Coastguard Worker #define ANV_SSBO_ALIGNMENT 4
182*61046927SAndroid Build Coastguard Worker #define ANV_SSBO_BOUNDS_CHECK_ALIGNMENT 4
183*61046927SAndroid Build Coastguard Worker #define MAX_VIEWS_FOR_PRIMITIVE_REPLICATION 16
184*61046927SAndroid Build Coastguard Worker #define MAX_SAMPLE_LOCATIONS 16
185*61046927SAndroid Build Coastguard Worker
186*61046927SAndroid Build Coastguard Worker /* RENDER_SURFACE_STATE is a bit smaller (48b) but since it is aligned to 64
187*61046927SAndroid Build Coastguard Worker * and we can't put anything else there we use 64b.
188*61046927SAndroid Build Coastguard Worker */
189*61046927SAndroid Build Coastguard Worker #define ANV_SURFACE_STATE_SIZE (64)
190*61046927SAndroid Build Coastguard Worker
191*61046927SAndroid Build Coastguard Worker /* From the Skylake PRM Vol. 7 "Binding Table Surface State Model":
192*61046927SAndroid Build Coastguard Worker *
193*61046927SAndroid Build Coastguard Worker * "The surface state model is used when a Binding Table Index (specified
194*61046927SAndroid Build Coastguard Worker * in the message descriptor) of less than 240 is specified. In this model,
195*61046927SAndroid Build Coastguard Worker * the Binding Table Index is used to index into the binding table, and the
196*61046927SAndroid Build Coastguard Worker * binding table entry contains a pointer to the SURFACE_STATE."
197*61046927SAndroid Build Coastguard Worker *
198*61046927SAndroid Build Coastguard Worker * Binding table values above 240 are used for various things in the hardware
199*61046927SAndroid Build Coastguard Worker * such as stateless, stateless with incoherent cache, SLM, and bindless.
200*61046927SAndroid Build Coastguard Worker */
201*61046927SAndroid Build Coastguard Worker #define MAX_BINDING_TABLE_SIZE 240
202*61046927SAndroid Build Coastguard Worker
203*61046927SAndroid Build Coastguard Worker #define ANV_SVGS_VB_INDEX MAX_VBS
204*61046927SAndroid Build Coastguard Worker #define ANV_DRAWID_VB_INDEX (MAX_VBS + 1)
205*61046927SAndroid Build Coastguard Worker
206*61046927SAndroid Build Coastguard Worker /* We reserve this MI ALU register for the purpose of handling predication.
207*61046927SAndroid Build Coastguard Worker * Other code which uses the MI ALU should leave it alone.
208*61046927SAndroid Build Coastguard Worker */
209*61046927SAndroid Build Coastguard Worker #define ANV_PREDICATE_RESULT_REG 0x2678 /* MI_ALU_REG15 */
210*61046927SAndroid Build Coastguard Worker
211*61046927SAndroid Build Coastguard Worker /* We reserve this MI ALU register to pass around an offset computed from
212*61046927SAndroid Build Coastguard Worker * VkPerformanceQuerySubmitInfoKHR::counterPassIndex VK_KHR_performance_query.
213*61046927SAndroid Build Coastguard Worker * Other code which uses the MI ALU should leave it alone.
214*61046927SAndroid Build Coastguard Worker */
215*61046927SAndroid Build Coastguard Worker #define ANV_PERF_QUERY_OFFSET_REG 0x2670 /* MI_ALU_REG14 */
216*61046927SAndroid Build Coastguard Worker
217*61046927SAndroid Build Coastguard Worker /* We reserve this MI ALU register to hold the last programmed bindless
218*61046927SAndroid Build Coastguard Worker * surface state base address so that we can predicate STATE_BASE_ADDRESS
219*61046927SAndroid Build Coastguard Worker * emissions if the address doesn't change.
220*61046927SAndroid Build Coastguard Worker */
221*61046927SAndroid Build Coastguard Worker #define ANV_BINDLESS_SURFACE_BASE_ADDR_REG 0x2668 /* MI_ALU_REG13 */
222*61046927SAndroid Build Coastguard Worker
223*61046927SAndroid Build Coastguard Worker #define ANV_GRAPHICS_SHADER_STAGE_COUNT (MESA_SHADER_MESH + 1)
224*61046927SAndroid Build Coastguard Worker
225*61046927SAndroid Build Coastguard Worker /* RENDER_SURFACE_STATE is a bit smaller (48b) but since it is aligned to 64
226*61046927SAndroid Build Coastguard Worker * and we can't put anything else there we use 64b.
227*61046927SAndroid Build Coastguard Worker */
228*61046927SAndroid Build Coastguard Worker #define ANV_SURFACE_STATE_SIZE (64)
229*61046927SAndroid Build Coastguard Worker #define ANV_SAMPLER_STATE_SIZE (32)
230*61046927SAndroid Build Coastguard Worker
231*61046927SAndroid Build Coastguard Worker /* For gfx12 we set the streamout buffers using 4 separate commands
232*61046927SAndroid Build Coastguard Worker * (3DSTATE_SO_BUFFER_INDEX_*) instead of 3DSTATE_SO_BUFFER. However the layout
233*61046927SAndroid Build Coastguard Worker * of the 3DSTATE_SO_BUFFER_INDEX_* commands is identical to that of
234*61046927SAndroid Build Coastguard Worker * 3DSTATE_SO_BUFFER apart from the SOBufferIndex field, so for now we use the
235*61046927SAndroid Build Coastguard Worker * 3DSTATE_SO_BUFFER command, but change the 3DCommandSubOpcode.
236*61046927SAndroid Build Coastguard Worker * SO_BUFFER_INDEX_0_CMD is actually the 3DCommandSubOpcode for
237*61046927SAndroid Build Coastguard Worker * 3DSTATE_SO_BUFFER_INDEX_0.
238*61046927SAndroid Build Coastguard Worker */
239*61046927SAndroid Build Coastguard Worker #define SO_BUFFER_INDEX_0_CMD 0x60
240*61046927SAndroid Build Coastguard Worker #define anv_printflike(a, b) __attribute__((__format__(__printf__, a, b)))
241*61046927SAndroid Build Coastguard Worker
242*61046927SAndroid Build Coastguard Worker /* The TR-TT L1 page table entries may contain these values instead of actual
243*61046927SAndroid Build Coastguard Worker * pointers to indicate the regions are either NULL or invalid. We program
244*61046927SAndroid Build Coastguard Worker * these values to TR-TT registers, so we could change them, but it's super
245*61046927SAndroid Build Coastguard Worker * convenient to have the NULL value be 0 because everything is
246*61046927SAndroid Build Coastguard Worker * zero-initialized when allocated.
247*61046927SAndroid Build Coastguard Worker *
248*61046927SAndroid Build Coastguard Worker * Since we reserve these values for NULL/INVALID, then we can't use them as
249*61046927SAndroid Build Coastguard Worker * destinations for TR-TT address translation. Both values are shifted by 16
250*61046927SAndroid Build Coastguard Worker * bits, wich results in graphic addresses 0 and 64k. On Anv the first vma
251*61046927SAndroid Build Coastguard Worker * starts at 2MB, so we already don't use 0 and 64k for anything, so there's
252*61046927SAndroid Build Coastguard Worker * nothing really to reserve. We could instead just reserve random 64kb
253*61046927SAndroid Build Coastguard Worker * ranges from any of the non-TR-TT vmas and use their addresses.
254*61046927SAndroid Build Coastguard Worker */
255*61046927SAndroid Build Coastguard Worker #define ANV_TRTT_L1_NULL_TILE_VAL 0
256*61046927SAndroid Build Coastguard Worker #define ANV_TRTT_L1_INVALID_TILE_VAL 1
257*61046927SAndroid Build Coastguard Worker
258*61046927SAndroid Build Coastguard Worker static inline uint32_t
align_down_npot_u32(uint32_t v,uint32_t a)259*61046927SAndroid Build Coastguard Worker align_down_npot_u32(uint32_t v, uint32_t a)
260*61046927SAndroid Build Coastguard Worker {
261*61046927SAndroid Build Coastguard Worker return v - (v % a);
262*61046927SAndroid Build Coastguard Worker }
263*61046927SAndroid Build Coastguard Worker
264*61046927SAndroid Build Coastguard Worker /** Alignment must be a power of 2. */
265*61046927SAndroid Build Coastguard Worker static inline bool
anv_is_aligned(uintmax_t n,uintmax_t a)266*61046927SAndroid Build Coastguard Worker anv_is_aligned(uintmax_t n, uintmax_t a)
267*61046927SAndroid Build Coastguard Worker {
268*61046927SAndroid Build Coastguard Worker assert(a == (a & -a));
269*61046927SAndroid Build Coastguard Worker return (n & (a - 1)) == 0;
270*61046927SAndroid Build Coastguard Worker }
271*61046927SAndroid Build Coastguard Worker
272*61046927SAndroid Build Coastguard Worker static inline union isl_color_value
vk_to_isl_color(VkClearColorValue color)273*61046927SAndroid Build Coastguard Worker vk_to_isl_color(VkClearColorValue color)
274*61046927SAndroid Build Coastguard Worker {
275*61046927SAndroid Build Coastguard Worker return (union isl_color_value) {
276*61046927SAndroid Build Coastguard Worker .u32 = {
277*61046927SAndroid Build Coastguard Worker color.uint32[0],
278*61046927SAndroid Build Coastguard Worker color.uint32[1],
279*61046927SAndroid Build Coastguard Worker color.uint32[2],
280*61046927SAndroid Build Coastguard Worker color.uint32[3],
281*61046927SAndroid Build Coastguard Worker },
282*61046927SAndroid Build Coastguard Worker };
283*61046927SAndroid Build Coastguard Worker }
284*61046927SAndroid Build Coastguard Worker
285*61046927SAndroid Build Coastguard Worker static inline union isl_color_value
vk_to_isl_color_with_format(VkClearColorValue color,enum isl_format format)286*61046927SAndroid Build Coastguard Worker vk_to_isl_color_with_format(VkClearColorValue color, enum isl_format format)
287*61046927SAndroid Build Coastguard Worker {
288*61046927SAndroid Build Coastguard Worker const struct isl_format_layout *fmtl = isl_format_get_layout(format);
289*61046927SAndroid Build Coastguard Worker union isl_color_value isl_color = { .u32 = {0, } };
290*61046927SAndroid Build Coastguard Worker
291*61046927SAndroid Build Coastguard Worker #define COPY_COLOR_CHANNEL(c, i) \
292*61046927SAndroid Build Coastguard Worker if (fmtl->channels.c.bits) \
293*61046927SAndroid Build Coastguard Worker isl_color.u32[i] = color.uint32[i]
294*61046927SAndroid Build Coastguard Worker
295*61046927SAndroid Build Coastguard Worker COPY_COLOR_CHANNEL(r, 0);
296*61046927SAndroid Build Coastguard Worker COPY_COLOR_CHANNEL(g, 1);
297*61046927SAndroid Build Coastguard Worker COPY_COLOR_CHANNEL(b, 2);
298*61046927SAndroid Build Coastguard Worker COPY_COLOR_CHANNEL(a, 3);
299*61046927SAndroid Build Coastguard Worker
300*61046927SAndroid Build Coastguard Worker #undef COPY_COLOR_CHANNEL
301*61046927SAndroid Build Coastguard Worker
302*61046927SAndroid Build Coastguard Worker return isl_color;
303*61046927SAndroid Build Coastguard Worker }
304*61046927SAndroid Build Coastguard Worker
305*61046927SAndroid Build Coastguard Worker void __anv_perf_warn(struct anv_device *device,
306*61046927SAndroid Build Coastguard Worker const struct vk_object_base *object,
307*61046927SAndroid Build Coastguard Worker const char *file, int line, const char *format, ...)
308*61046927SAndroid Build Coastguard Worker anv_printflike(5, 6);
309*61046927SAndroid Build Coastguard Worker
310*61046927SAndroid Build Coastguard Worker /**
311*61046927SAndroid Build Coastguard Worker * Print a FINISHME message, including its source location.
312*61046927SAndroid Build Coastguard Worker */
313*61046927SAndroid Build Coastguard Worker #define anv_finishme(format, ...) \
314*61046927SAndroid Build Coastguard Worker do { \
315*61046927SAndroid Build Coastguard Worker static bool reported = false; \
316*61046927SAndroid Build Coastguard Worker if (!reported) { \
317*61046927SAndroid Build Coastguard Worker mesa_logw("%s:%d: FINISHME: " format, __FILE__, __LINE__, \
318*61046927SAndroid Build Coastguard Worker ##__VA_ARGS__); \
319*61046927SAndroid Build Coastguard Worker reported = true; \
320*61046927SAndroid Build Coastguard Worker } \
321*61046927SAndroid Build Coastguard Worker } while (0)
322*61046927SAndroid Build Coastguard Worker
323*61046927SAndroid Build Coastguard Worker /**
324*61046927SAndroid Build Coastguard Worker * Print a perf warning message. Set INTEL_DEBUG=perf to see these.
325*61046927SAndroid Build Coastguard Worker */
326*61046927SAndroid Build Coastguard Worker #define anv_perf_warn(objects_macro, format, ...) \
327*61046927SAndroid Build Coastguard Worker do { \
328*61046927SAndroid Build Coastguard Worker static bool reported = false; \
329*61046927SAndroid Build Coastguard Worker if (!reported && INTEL_DEBUG(DEBUG_PERF)) { \
330*61046927SAndroid Build Coastguard Worker __vk_log(VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT, \
331*61046927SAndroid Build Coastguard Worker VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT, \
332*61046927SAndroid Build Coastguard Worker objects_macro, __FILE__, __LINE__, \
333*61046927SAndroid Build Coastguard Worker format, ## __VA_ARGS__); \
334*61046927SAndroid Build Coastguard Worker reported = true; \
335*61046927SAndroid Build Coastguard Worker } \
336*61046927SAndroid Build Coastguard Worker } while (0)
337*61046927SAndroid Build Coastguard Worker
338*61046927SAndroid Build Coastguard Worker /* A non-fatal assert. Useful for debugging. */
339*61046927SAndroid Build Coastguard Worker #if MESA_DEBUG
340*61046927SAndroid Build Coastguard Worker #define anv_assert(x) ({ \
341*61046927SAndroid Build Coastguard Worker if (unlikely(!(x))) \
342*61046927SAndroid Build Coastguard Worker mesa_loge("%s:%d ASSERT: %s", __FILE__, __LINE__, #x); \
343*61046927SAndroid Build Coastguard Worker })
344*61046927SAndroid Build Coastguard Worker #else
345*61046927SAndroid Build Coastguard Worker #define anv_assert(x)
346*61046927SAndroid Build Coastguard Worker #endif
347*61046927SAndroid Build Coastguard Worker
348*61046927SAndroid Build Coastguard Worker enum anv_bo_alloc_flags {
349*61046927SAndroid Build Coastguard Worker /** Specifies that the BO must have a 32-bit address
350*61046927SAndroid Build Coastguard Worker *
351*61046927SAndroid Build Coastguard Worker * This is the opposite of EXEC_OBJECT_SUPPORTS_48B_ADDRESS.
352*61046927SAndroid Build Coastguard Worker */
353*61046927SAndroid Build Coastguard Worker ANV_BO_ALLOC_32BIT_ADDRESS = (1 << 0),
354*61046927SAndroid Build Coastguard Worker
355*61046927SAndroid Build Coastguard Worker /** Specifies that the BO may be shared externally */
356*61046927SAndroid Build Coastguard Worker ANV_BO_ALLOC_EXTERNAL = (1 << 1),
357*61046927SAndroid Build Coastguard Worker
358*61046927SAndroid Build Coastguard Worker /** Specifies that the BO should be mapped */
359*61046927SAndroid Build Coastguard Worker ANV_BO_ALLOC_MAPPED = (1 << 2),
360*61046927SAndroid Build Coastguard Worker
361*61046927SAndroid Build Coastguard Worker /** Specifies that the BO should be coherent.
362*61046927SAndroid Build Coastguard Worker *
363*61046927SAndroid Build Coastguard Worker * Note: In platforms with LLC where HOST_CACHED + HOST_COHERENT is free,
364*61046927SAndroid Build Coastguard Worker * bo can get upgraded to HOST_CACHED_COHERENT
365*61046927SAndroid Build Coastguard Worker */
366*61046927SAndroid Build Coastguard Worker ANV_BO_ALLOC_HOST_COHERENT = (1 << 3),
367*61046927SAndroid Build Coastguard Worker
368*61046927SAndroid Build Coastguard Worker /** Specifies that the BO should be captured in error states */
369*61046927SAndroid Build Coastguard Worker ANV_BO_ALLOC_CAPTURE = (1 << 4),
370*61046927SAndroid Build Coastguard Worker
371*61046927SAndroid Build Coastguard Worker /** Specifies that the BO will have an address assigned by the caller
372*61046927SAndroid Build Coastguard Worker *
373*61046927SAndroid Build Coastguard Worker * Such BOs do not exist in any VMA heap.
374*61046927SAndroid Build Coastguard Worker */
375*61046927SAndroid Build Coastguard Worker ANV_BO_ALLOC_FIXED_ADDRESS = (1 << 5),
376*61046927SAndroid Build Coastguard Worker
377*61046927SAndroid Build Coastguard Worker /** Enables implicit synchronization on the BO
378*61046927SAndroid Build Coastguard Worker *
379*61046927SAndroid Build Coastguard Worker * This is the opposite of EXEC_OBJECT_ASYNC.
380*61046927SAndroid Build Coastguard Worker */
381*61046927SAndroid Build Coastguard Worker ANV_BO_ALLOC_IMPLICIT_SYNC = (1 << 6),
382*61046927SAndroid Build Coastguard Worker
383*61046927SAndroid Build Coastguard Worker /** Enables implicit synchronization on the BO
384*61046927SAndroid Build Coastguard Worker *
385*61046927SAndroid Build Coastguard Worker * This is equivalent to EXEC_OBJECT_WRITE.
386*61046927SAndroid Build Coastguard Worker */
387*61046927SAndroid Build Coastguard Worker ANV_BO_ALLOC_IMPLICIT_WRITE = (1 << 7),
388*61046927SAndroid Build Coastguard Worker
389*61046927SAndroid Build Coastguard Worker /** Has an address which is visible to the client */
390*61046927SAndroid Build Coastguard Worker ANV_BO_ALLOC_CLIENT_VISIBLE_ADDRESS = (1 << 8),
391*61046927SAndroid Build Coastguard Worker
392*61046927SAndroid Build Coastguard Worker /** Align the BO's virtual address to match AUX-TT requirements */
393*61046927SAndroid Build Coastguard Worker ANV_BO_ALLOC_AUX_TT_ALIGNED = (1 << 9),
394*61046927SAndroid Build Coastguard Worker
395*61046927SAndroid Build Coastguard Worker /** This buffer is allocated from local memory and should be cpu visible */
396*61046927SAndroid Build Coastguard Worker ANV_BO_ALLOC_LOCAL_MEM_CPU_VISIBLE = (1 << 10),
397*61046927SAndroid Build Coastguard Worker
398*61046927SAndroid Build Coastguard Worker /** For non device local allocations */
399*61046927SAndroid Build Coastguard Worker ANV_BO_ALLOC_NO_LOCAL_MEM = (1 << 11),
400*61046927SAndroid Build Coastguard Worker
401*61046927SAndroid Build Coastguard Worker /** This buffer will be scanout to display */
402*61046927SAndroid Build Coastguard Worker ANV_BO_ALLOC_SCANOUT = (1 << 12),
403*61046927SAndroid Build Coastguard Worker
404*61046927SAndroid Build Coastguard Worker /** For descriptor pools */
405*61046927SAndroid Build Coastguard Worker ANV_BO_ALLOC_DESCRIPTOR_POOL = (1 << 13),
406*61046927SAndroid Build Coastguard Worker
407*61046927SAndroid Build Coastguard Worker /** For buffers that will be bound using TR-TT.
408*61046927SAndroid Build Coastguard Worker *
409*61046927SAndroid Build Coastguard Worker * Not for buffers used as the TR-TT page tables.
410*61046927SAndroid Build Coastguard Worker */
411*61046927SAndroid Build Coastguard Worker ANV_BO_ALLOC_TRTT = (1 << 14),
412*61046927SAndroid Build Coastguard Worker
413*61046927SAndroid Build Coastguard Worker /** Protected buffer */
414*61046927SAndroid Build Coastguard Worker ANV_BO_ALLOC_PROTECTED = (1 << 15),
415*61046927SAndroid Build Coastguard Worker
416*61046927SAndroid Build Coastguard Worker /** Specifies that the BO should be cached and incoherent. */
417*61046927SAndroid Build Coastguard Worker ANV_BO_ALLOC_HOST_CACHED = (1 << 16),
418*61046927SAndroid Build Coastguard Worker
419*61046927SAndroid Build Coastguard Worker /** For buffer addressable from the dynamic state heap */
420*61046927SAndroid Build Coastguard Worker ANV_BO_ALLOC_DYNAMIC_VISIBLE_POOL = (1 << 17),
421*61046927SAndroid Build Coastguard Worker
422*61046927SAndroid Build Coastguard Worker /** Specifies that the BO is imported.
423*61046927SAndroid Build Coastguard Worker *
424*61046927SAndroid Build Coastguard Worker * Imported BOs must also be marked as ANV_BO_ALLOC_EXTERNAL
425*61046927SAndroid Build Coastguard Worker */
426*61046927SAndroid Build Coastguard Worker ANV_BO_ALLOC_IMPORTED = (1 << 18),
427*61046927SAndroid Build Coastguard Worker
428*61046927SAndroid Build Coastguard Worker /** Specify whether this BO is internal to the driver */
429*61046927SAndroid Build Coastguard Worker ANV_BO_ALLOC_INTERNAL = (1 << 19),
430*61046927SAndroid Build Coastguard Worker
431*61046927SAndroid Build Coastguard Worker /** Allocate with CCS AUX requirements
432*61046927SAndroid Build Coastguard Worker *
433*61046927SAndroid Build Coastguard Worker * This pads the BO include CCS data mapppable through the AUX-TT and
434*61046927SAndroid Build Coastguard Worker * aligned to the AUX-TT requirements.
435*61046927SAndroid Build Coastguard Worker */
436*61046927SAndroid Build Coastguard Worker ANV_BO_ALLOC_AUX_CCS = (1 << 20),
437*61046927SAndroid Build Coastguard Worker
438*61046927SAndroid Build Coastguard Worker /** Compressed buffer, only supported in Xe2+ */
439*61046927SAndroid Build Coastguard Worker ANV_BO_ALLOC_COMPRESSED = (1 << 21),
440*61046927SAndroid Build Coastguard Worker };
441*61046927SAndroid Build Coastguard Worker
442*61046927SAndroid Build Coastguard Worker /** Specifies that the BO should be cached and coherent. */
443*61046927SAndroid Build Coastguard Worker #define ANV_BO_ALLOC_HOST_CACHED_COHERENT (ANV_BO_ALLOC_HOST_COHERENT | \
444*61046927SAndroid Build Coastguard Worker ANV_BO_ALLOC_HOST_CACHED)
445*61046927SAndroid Build Coastguard Worker
446*61046927SAndroid Build Coastguard Worker
447*61046927SAndroid Build Coastguard Worker struct anv_bo {
448*61046927SAndroid Build Coastguard Worker const char *name;
449*61046927SAndroid Build Coastguard Worker
450*61046927SAndroid Build Coastguard Worker /* The VMA heap in anv_device from which this BO takes its offset.
451*61046927SAndroid Build Coastguard Worker *
452*61046927SAndroid Build Coastguard Worker * This can only be NULL when has_fixed_address is true.
453*61046927SAndroid Build Coastguard Worker */
454*61046927SAndroid Build Coastguard Worker struct util_vma_heap *vma_heap;
455*61046927SAndroid Build Coastguard Worker
456*61046927SAndroid Build Coastguard Worker /* All userptr bos in Xe KMD has gem_handle set to workaround_bo->gem_handle */
457*61046927SAndroid Build Coastguard Worker uint32_t gem_handle;
458*61046927SAndroid Build Coastguard Worker
459*61046927SAndroid Build Coastguard Worker uint32_t refcount;
460*61046927SAndroid Build Coastguard Worker
461*61046927SAndroid Build Coastguard Worker /* Index into the current validation list. This is used by the
462*61046927SAndroid Build Coastguard Worker * validation list building algorithm to track which buffers are already
463*61046927SAndroid Build Coastguard Worker * in the validation list so that we can ensure uniqueness.
464*61046927SAndroid Build Coastguard Worker */
465*61046927SAndroid Build Coastguard Worker uint32_t exec_obj_index;
466*61046927SAndroid Build Coastguard Worker
467*61046927SAndroid Build Coastguard Worker /* Index for use with util_sparse_array_free_list */
468*61046927SAndroid Build Coastguard Worker uint32_t free_index;
469*61046927SAndroid Build Coastguard Worker
470*61046927SAndroid Build Coastguard Worker /* Last known offset. This value is provided by the kernel when we
471*61046927SAndroid Build Coastguard Worker * execbuf and is used as the presumed offset for the next bunch of
472*61046927SAndroid Build Coastguard Worker * relocations, in canonical address format.
473*61046927SAndroid Build Coastguard Worker */
474*61046927SAndroid Build Coastguard Worker uint64_t offset;
475*61046927SAndroid Build Coastguard Worker
476*61046927SAndroid Build Coastguard Worker /** Size of the buffer */
477*61046927SAndroid Build Coastguard Worker uint64_t size;
478*61046927SAndroid Build Coastguard Worker
479*61046927SAndroid Build Coastguard Worker /** Offset at which the CCS data is stored */
480*61046927SAndroid Build Coastguard Worker uint64_t ccs_offset;
481*61046927SAndroid Build Coastguard Worker
482*61046927SAndroid Build Coastguard Worker /* Map for internally mapped BOs.
483*61046927SAndroid Build Coastguard Worker *
484*61046927SAndroid Build Coastguard Worker * If ANV_BO_ALLOC_MAPPED is set in flags, this is the map for the whole
485*61046927SAndroid Build Coastguard Worker * BO.
486*61046927SAndroid Build Coastguard Worker */
487*61046927SAndroid Build Coastguard Worker void *map;
488*61046927SAndroid Build Coastguard Worker
489*61046927SAndroid Build Coastguard Worker /* The actual size of bo allocated by kmd, basically:
490*61046927SAndroid Build Coastguard Worker * align(size, mem_alignment)
491*61046927SAndroid Build Coastguard Worker */
492*61046927SAndroid Build Coastguard Worker uint64_t actual_size;
493*61046927SAndroid Build Coastguard Worker
494*61046927SAndroid Build Coastguard Worker /** Flags to pass to the kernel through drm_i915_exec_object2::flags */
495*61046927SAndroid Build Coastguard Worker uint32_t flags;
496*61046927SAndroid Build Coastguard Worker
497*61046927SAndroid Build Coastguard Worker enum anv_bo_alloc_flags alloc_flags;
498*61046927SAndroid Build Coastguard Worker
499*61046927SAndroid Build Coastguard Worker /** True if this BO wraps a host pointer */
500*61046927SAndroid Build Coastguard Worker bool from_host_ptr:1;
501*61046927SAndroid Build Coastguard Worker
502*61046927SAndroid Build Coastguard Worker /** True if this BO is mapped in the GTT (only used for RMV) */
503*61046927SAndroid Build Coastguard Worker bool gtt_mapped:1;
504*61046927SAndroid Build Coastguard Worker };
505*61046927SAndroid Build Coastguard Worker
506*61046927SAndroid Build Coastguard Worker static inline bool
anv_bo_is_external(const struct anv_bo * bo)507*61046927SAndroid Build Coastguard Worker anv_bo_is_external(const struct anv_bo *bo)
508*61046927SAndroid Build Coastguard Worker {
509*61046927SAndroid Build Coastguard Worker return bo->alloc_flags & ANV_BO_ALLOC_EXTERNAL;
510*61046927SAndroid Build Coastguard Worker }
511*61046927SAndroid Build Coastguard Worker
512*61046927SAndroid Build Coastguard Worker static inline bool
anv_bo_is_vram_only(const struct anv_bo * bo)513*61046927SAndroid Build Coastguard Worker anv_bo_is_vram_only(const struct anv_bo *bo)
514*61046927SAndroid Build Coastguard Worker {
515*61046927SAndroid Build Coastguard Worker return !(bo->alloc_flags & (ANV_BO_ALLOC_NO_LOCAL_MEM |
516*61046927SAndroid Build Coastguard Worker ANV_BO_ALLOC_MAPPED |
517*61046927SAndroid Build Coastguard Worker ANV_BO_ALLOC_LOCAL_MEM_CPU_VISIBLE |
518*61046927SAndroid Build Coastguard Worker ANV_BO_ALLOC_IMPORTED));
519*61046927SAndroid Build Coastguard Worker }
520*61046927SAndroid Build Coastguard Worker
521*61046927SAndroid Build Coastguard Worker static inline struct anv_bo *
anv_bo_ref(struct anv_bo * bo)522*61046927SAndroid Build Coastguard Worker anv_bo_ref(struct anv_bo *bo)
523*61046927SAndroid Build Coastguard Worker {
524*61046927SAndroid Build Coastguard Worker p_atomic_inc(&bo->refcount);
525*61046927SAndroid Build Coastguard Worker return bo;
526*61046927SAndroid Build Coastguard Worker }
527*61046927SAndroid Build Coastguard Worker
528*61046927SAndroid Build Coastguard Worker enum intel_device_info_mmap_mode
529*61046927SAndroid Build Coastguard Worker anv_bo_get_mmap_mode(struct anv_device *device, struct anv_bo *bo);
530*61046927SAndroid Build Coastguard Worker
531*61046927SAndroid Build Coastguard Worker static inline bool
anv_bo_needs_host_cache_flush(enum anv_bo_alloc_flags alloc_flags)532*61046927SAndroid Build Coastguard Worker anv_bo_needs_host_cache_flush(enum anv_bo_alloc_flags alloc_flags)
533*61046927SAndroid Build Coastguard Worker {
534*61046927SAndroid Build Coastguard Worker return (alloc_flags & (ANV_BO_ALLOC_HOST_CACHED | ANV_BO_ALLOC_HOST_COHERENT)) ==
535*61046927SAndroid Build Coastguard Worker ANV_BO_ALLOC_HOST_CACHED;
536*61046927SAndroid Build Coastguard Worker }
537*61046927SAndroid Build Coastguard Worker
538*61046927SAndroid Build Coastguard Worker struct anv_address {
539*61046927SAndroid Build Coastguard Worker struct anv_bo *bo;
540*61046927SAndroid Build Coastguard Worker int64_t offset;
541*61046927SAndroid Build Coastguard Worker };
542*61046927SAndroid Build Coastguard Worker
543*61046927SAndroid Build Coastguard Worker #define ANV_NULL_ADDRESS ((struct anv_address) { NULL, 0 })
544*61046927SAndroid Build Coastguard Worker
545*61046927SAndroid Build Coastguard Worker static inline struct anv_address
anv_address_from_u64(uint64_t addr_u64)546*61046927SAndroid Build Coastguard Worker anv_address_from_u64(uint64_t addr_u64)
547*61046927SAndroid Build Coastguard Worker {
548*61046927SAndroid Build Coastguard Worker assert(addr_u64 == intel_canonical_address(addr_u64));
549*61046927SAndroid Build Coastguard Worker return (struct anv_address) {
550*61046927SAndroid Build Coastguard Worker .bo = NULL,
551*61046927SAndroid Build Coastguard Worker .offset = addr_u64,
552*61046927SAndroid Build Coastguard Worker };
553*61046927SAndroid Build Coastguard Worker }
554*61046927SAndroid Build Coastguard Worker
555*61046927SAndroid Build Coastguard Worker static inline bool
anv_address_is_null(struct anv_address addr)556*61046927SAndroid Build Coastguard Worker anv_address_is_null(struct anv_address addr)
557*61046927SAndroid Build Coastguard Worker {
558*61046927SAndroid Build Coastguard Worker return addr.bo == NULL && addr.offset == 0;
559*61046927SAndroid Build Coastguard Worker }
560*61046927SAndroid Build Coastguard Worker
561*61046927SAndroid Build Coastguard Worker static inline uint64_t
anv_address_physical(struct anv_address addr)562*61046927SAndroid Build Coastguard Worker anv_address_physical(struct anv_address addr)
563*61046927SAndroid Build Coastguard Worker {
564*61046927SAndroid Build Coastguard Worker uint64_t address = (addr.bo ? addr.bo->offset : 0ull) + addr.offset;
565*61046927SAndroid Build Coastguard Worker return intel_canonical_address(address);
566*61046927SAndroid Build Coastguard Worker }
567*61046927SAndroid Build Coastguard Worker
568*61046927SAndroid Build Coastguard Worker static inline struct u_trace_address
anv_address_utrace(struct anv_address addr)569*61046927SAndroid Build Coastguard Worker anv_address_utrace(struct anv_address addr)
570*61046927SAndroid Build Coastguard Worker {
571*61046927SAndroid Build Coastguard Worker return (struct u_trace_address) {
572*61046927SAndroid Build Coastguard Worker .bo = addr.bo,
573*61046927SAndroid Build Coastguard Worker .offset = addr.offset,
574*61046927SAndroid Build Coastguard Worker };
575*61046927SAndroid Build Coastguard Worker }
576*61046927SAndroid Build Coastguard Worker
577*61046927SAndroid Build Coastguard Worker static inline struct anv_address
anv_address_add(struct anv_address addr,uint64_t offset)578*61046927SAndroid Build Coastguard Worker anv_address_add(struct anv_address addr, uint64_t offset)
579*61046927SAndroid Build Coastguard Worker {
580*61046927SAndroid Build Coastguard Worker addr.offset += offset;
581*61046927SAndroid Build Coastguard Worker return addr;
582*61046927SAndroid Build Coastguard Worker }
583*61046927SAndroid Build Coastguard Worker
584*61046927SAndroid Build Coastguard Worker static inline struct anv_address
anv_address_add_aligned(struct anv_address addr,uint64_t offset,uint32_t alignment)585*61046927SAndroid Build Coastguard Worker anv_address_add_aligned(struct anv_address addr, uint64_t offset, uint32_t alignment)
586*61046927SAndroid Build Coastguard Worker {
587*61046927SAndroid Build Coastguard Worker addr.offset = align(addr.offset + offset, alignment);
588*61046927SAndroid Build Coastguard Worker return addr;
589*61046927SAndroid Build Coastguard Worker }
590*61046927SAndroid Build Coastguard Worker
591*61046927SAndroid Build Coastguard Worker static inline void *
anv_address_map(struct anv_address addr)592*61046927SAndroid Build Coastguard Worker anv_address_map(struct anv_address addr)
593*61046927SAndroid Build Coastguard Worker {
594*61046927SAndroid Build Coastguard Worker if (addr.bo == NULL)
595*61046927SAndroid Build Coastguard Worker return NULL;
596*61046927SAndroid Build Coastguard Worker
597*61046927SAndroid Build Coastguard Worker if (addr.bo->map == NULL)
598*61046927SAndroid Build Coastguard Worker return NULL;
599*61046927SAndroid Build Coastguard Worker
600*61046927SAndroid Build Coastguard Worker return addr.bo->map + addr.offset;
601*61046927SAndroid Build Coastguard Worker }
602*61046927SAndroid Build Coastguard Worker
603*61046927SAndroid Build Coastguard Worker /* Represent a virtual address range */
604*61046927SAndroid Build Coastguard Worker struct anv_va_range {
605*61046927SAndroid Build Coastguard Worker uint64_t addr;
606*61046927SAndroid Build Coastguard Worker uint64_t size;
607*61046927SAndroid Build Coastguard Worker };
608*61046927SAndroid Build Coastguard Worker
609*61046927SAndroid Build Coastguard Worker /* Represents a lock-free linked list of "free" things. This is used by
610*61046927SAndroid Build Coastguard Worker * both the block pool and the state pools. Unfortunately, in order to
611*61046927SAndroid Build Coastguard Worker * solve the ABA problem, we can't use a single uint32_t head.
612*61046927SAndroid Build Coastguard Worker */
613*61046927SAndroid Build Coastguard Worker union anv_free_list {
614*61046927SAndroid Build Coastguard Worker struct {
615*61046927SAndroid Build Coastguard Worker uint32_t offset;
616*61046927SAndroid Build Coastguard Worker
617*61046927SAndroid Build Coastguard Worker /* A simple count that is incremented every time the head changes. */
618*61046927SAndroid Build Coastguard Worker uint32_t count;
619*61046927SAndroid Build Coastguard Worker };
620*61046927SAndroid Build Coastguard Worker /* Make sure it's aligned to 64 bits. This will make atomic operations
621*61046927SAndroid Build Coastguard Worker * faster on 32 bit platforms.
622*61046927SAndroid Build Coastguard Worker */
623*61046927SAndroid Build Coastguard Worker alignas(8) uint64_t u64;
624*61046927SAndroid Build Coastguard Worker };
625*61046927SAndroid Build Coastguard Worker
626*61046927SAndroid Build Coastguard Worker #define ANV_FREE_LIST_EMPTY ((union anv_free_list) { { UINT32_MAX, 0 } })
627*61046927SAndroid Build Coastguard Worker
628*61046927SAndroid Build Coastguard Worker struct anv_block_state {
629*61046927SAndroid Build Coastguard Worker union {
630*61046927SAndroid Build Coastguard Worker struct {
631*61046927SAndroid Build Coastguard Worker uint32_t next;
632*61046927SAndroid Build Coastguard Worker uint32_t end;
633*61046927SAndroid Build Coastguard Worker };
634*61046927SAndroid Build Coastguard Worker /* Make sure it's aligned to 64 bits. This will make atomic operations
635*61046927SAndroid Build Coastguard Worker * faster on 32 bit platforms.
636*61046927SAndroid Build Coastguard Worker */
637*61046927SAndroid Build Coastguard Worker alignas(8) uint64_t u64;
638*61046927SAndroid Build Coastguard Worker };
639*61046927SAndroid Build Coastguard Worker };
640*61046927SAndroid Build Coastguard Worker
641*61046927SAndroid Build Coastguard Worker #define anv_block_pool_foreach_bo(bo, pool) \
642*61046927SAndroid Build Coastguard Worker for (struct anv_bo **_pp_bo = (pool)->bos, *bo; \
643*61046927SAndroid Build Coastguard Worker _pp_bo != &(pool)->bos[(pool)->nbos] && (bo = *_pp_bo, true); \
644*61046927SAndroid Build Coastguard Worker _pp_bo++)
645*61046927SAndroid Build Coastguard Worker
646*61046927SAndroid Build Coastguard Worker #define ANV_MAX_BLOCK_POOL_BOS 20
647*61046927SAndroid Build Coastguard Worker
648*61046927SAndroid Build Coastguard Worker struct anv_block_pool {
649*61046927SAndroid Build Coastguard Worker const char *name;
650*61046927SAndroid Build Coastguard Worker
651*61046927SAndroid Build Coastguard Worker struct anv_device *device;
652*61046927SAndroid Build Coastguard Worker
653*61046927SAndroid Build Coastguard Worker struct anv_bo *bos[ANV_MAX_BLOCK_POOL_BOS];
654*61046927SAndroid Build Coastguard Worker struct anv_bo *bo;
655*61046927SAndroid Build Coastguard Worker uint32_t nbos;
656*61046927SAndroid Build Coastguard Worker
657*61046927SAndroid Build Coastguard Worker /* Maximum size of the pool */
658*61046927SAndroid Build Coastguard Worker uint64_t max_size;
659*61046927SAndroid Build Coastguard Worker
660*61046927SAndroid Build Coastguard Worker /* Current size of the pool */
661*61046927SAndroid Build Coastguard Worker uint64_t size;
662*61046927SAndroid Build Coastguard Worker
663*61046927SAndroid Build Coastguard Worker /* The canonical address where the start of the pool is pinned. The various bos that
664*61046927SAndroid Build Coastguard Worker * are created as the pool grows will have addresses in the range
665*61046927SAndroid Build Coastguard Worker * [start_address, start_address + BLOCK_POOL_MEMFD_SIZE).
666*61046927SAndroid Build Coastguard Worker */
667*61046927SAndroid Build Coastguard Worker uint64_t start_address;
668*61046927SAndroid Build Coastguard Worker
669*61046927SAndroid Build Coastguard Worker /* The offset from the start of the bo to the "center" of the block
670*61046927SAndroid Build Coastguard Worker * pool. Pointers to allocated blocks are given by
671*61046927SAndroid Build Coastguard Worker * bo.map + center_bo_offset + offsets.
672*61046927SAndroid Build Coastguard Worker */
673*61046927SAndroid Build Coastguard Worker uint32_t center_bo_offset;
674*61046927SAndroid Build Coastguard Worker
675*61046927SAndroid Build Coastguard Worker struct anv_block_state state;
676*61046927SAndroid Build Coastguard Worker
677*61046927SAndroid Build Coastguard Worker enum anv_bo_alloc_flags bo_alloc_flags;
678*61046927SAndroid Build Coastguard Worker };
679*61046927SAndroid Build Coastguard Worker
680*61046927SAndroid Build Coastguard Worker /* Block pools are backed by a fixed-size 1GB memfd */
681*61046927SAndroid Build Coastguard Worker #define BLOCK_POOL_MEMFD_SIZE (1ul << 30)
682*61046927SAndroid Build Coastguard Worker
683*61046927SAndroid Build Coastguard Worker /* The center of the block pool is also the middle of the memfd. This may
684*61046927SAndroid Build Coastguard Worker * change in the future if we decide differently for some reason.
685*61046927SAndroid Build Coastguard Worker */
686*61046927SAndroid Build Coastguard Worker #define BLOCK_POOL_MEMFD_CENTER (BLOCK_POOL_MEMFD_SIZE / 2)
687*61046927SAndroid Build Coastguard Worker
688*61046927SAndroid Build Coastguard Worker static inline uint32_t
anv_block_pool_size(struct anv_block_pool * pool)689*61046927SAndroid Build Coastguard Worker anv_block_pool_size(struct anv_block_pool *pool)
690*61046927SAndroid Build Coastguard Worker {
691*61046927SAndroid Build Coastguard Worker return pool->state.end;
692*61046927SAndroid Build Coastguard Worker }
693*61046927SAndroid Build Coastguard Worker
694*61046927SAndroid Build Coastguard Worker struct anv_state {
695*61046927SAndroid Build Coastguard Worker int64_t offset;
696*61046927SAndroid Build Coastguard Worker uint32_t alloc_size;
697*61046927SAndroid Build Coastguard Worker uint32_t idx;
698*61046927SAndroid Build Coastguard Worker void *map;
699*61046927SAndroid Build Coastguard Worker };
700*61046927SAndroid Build Coastguard Worker
701*61046927SAndroid Build Coastguard Worker #define ANV_STATE_NULL ((struct anv_state) { .alloc_size = 0 })
702*61046927SAndroid Build Coastguard Worker
703*61046927SAndroid Build Coastguard Worker struct anv_fixed_size_state_pool {
704*61046927SAndroid Build Coastguard Worker union anv_free_list free_list;
705*61046927SAndroid Build Coastguard Worker struct anv_block_state block;
706*61046927SAndroid Build Coastguard Worker };
707*61046927SAndroid Build Coastguard Worker
708*61046927SAndroid Build Coastguard Worker #define ANV_MIN_STATE_SIZE_LOG2 6
709*61046927SAndroid Build Coastguard Worker #define ANV_MAX_STATE_SIZE_LOG2 24
710*61046927SAndroid Build Coastguard Worker
711*61046927SAndroid Build Coastguard Worker #define ANV_STATE_BUCKETS (ANV_MAX_STATE_SIZE_LOG2 - ANV_MIN_STATE_SIZE_LOG2 + 1)
712*61046927SAndroid Build Coastguard Worker
713*61046927SAndroid Build Coastguard Worker struct anv_free_entry {
714*61046927SAndroid Build Coastguard Worker uint32_t next;
715*61046927SAndroid Build Coastguard Worker struct anv_state state;
716*61046927SAndroid Build Coastguard Worker };
717*61046927SAndroid Build Coastguard Worker
718*61046927SAndroid Build Coastguard Worker struct anv_state_table {
719*61046927SAndroid Build Coastguard Worker struct anv_device *device;
720*61046927SAndroid Build Coastguard Worker int fd;
721*61046927SAndroid Build Coastguard Worker struct anv_free_entry *map;
722*61046927SAndroid Build Coastguard Worker uint32_t size;
723*61046927SAndroid Build Coastguard Worker uint64_t max_size;
724*61046927SAndroid Build Coastguard Worker struct anv_block_state state;
725*61046927SAndroid Build Coastguard Worker struct u_vector cleanups;
726*61046927SAndroid Build Coastguard Worker };
727*61046927SAndroid Build Coastguard Worker
728*61046927SAndroid Build Coastguard Worker struct anv_state_pool {
729*61046927SAndroid Build Coastguard Worker struct anv_block_pool block_pool;
730*61046927SAndroid Build Coastguard Worker
731*61046927SAndroid Build Coastguard Worker /* Offset into the relevant state base address where the state pool starts
732*61046927SAndroid Build Coastguard Worker * allocating memory.
733*61046927SAndroid Build Coastguard Worker */
734*61046927SAndroid Build Coastguard Worker int64_t start_offset;
735*61046927SAndroid Build Coastguard Worker
736*61046927SAndroid Build Coastguard Worker struct anv_state_table table;
737*61046927SAndroid Build Coastguard Worker
738*61046927SAndroid Build Coastguard Worker /* The size of blocks which will be allocated from the block pool */
739*61046927SAndroid Build Coastguard Worker uint32_t block_size;
740*61046927SAndroid Build Coastguard Worker
741*61046927SAndroid Build Coastguard Worker struct anv_fixed_size_state_pool buckets[ANV_STATE_BUCKETS];
742*61046927SAndroid Build Coastguard Worker };
743*61046927SAndroid Build Coastguard Worker
744*61046927SAndroid Build Coastguard Worker struct anv_state_reserved_pool {
745*61046927SAndroid Build Coastguard Worker struct anv_state_pool *pool;
746*61046927SAndroid Build Coastguard Worker union anv_free_list reserved_blocks;
747*61046927SAndroid Build Coastguard Worker uint32_t count;
748*61046927SAndroid Build Coastguard Worker };
749*61046927SAndroid Build Coastguard Worker
750*61046927SAndroid Build Coastguard Worker struct anv_state_reserved_array_pool {
751*61046927SAndroid Build Coastguard Worker struct anv_state_pool *pool;
752*61046927SAndroid Build Coastguard Worker simple_mtx_t mutex;
753*61046927SAndroid Build Coastguard Worker /* Bitfield of usable elements */
754*61046927SAndroid Build Coastguard Worker BITSET_WORD *states;
755*61046927SAndroid Build Coastguard Worker /* Backing store */
756*61046927SAndroid Build Coastguard Worker struct anv_state state;
757*61046927SAndroid Build Coastguard Worker /* Number of elements */
758*61046927SAndroid Build Coastguard Worker uint32_t count;
759*61046927SAndroid Build Coastguard Worker /* Stride between each element */
760*61046927SAndroid Build Coastguard Worker uint32_t stride;
761*61046927SAndroid Build Coastguard Worker /* Size of each element */
762*61046927SAndroid Build Coastguard Worker uint32_t size;
763*61046927SAndroid Build Coastguard Worker };
764*61046927SAndroid Build Coastguard Worker
765*61046927SAndroid Build Coastguard Worker struct anv_state_stream {
766*61046927SAndroid Build Coastguard Worker struct anv_state_pool *state_pool;
767*61046927SAndroid Build Coastguard Worker
768*61046927SAndroid Build Coastguard Worker /* The size of blocks to allocate from the state pool */
769*61046927SAndroid Build Coastguard Worker uint32_t block_size;
770*61046927SAndroid Build Coastguard Worker
771*61046927SAndroid Build Coastguard Worker /* Current block we're allocating from */
772*61046927SAndroid Build Coastguard Worker struct anv_state block;
773*61046927SAndroid Build Coastguard Worker
774*61046927SAndroid Build Coastguard Worker /* Offset into the current block at which to allocate the next state */
775*61046927SAndroid Build Coastguard Worker uint32_t next;
776*61046927SAndroid Build Coastguard Worker
777*61046927SAndroid Build Coastguard Worker /* Sum of all the blocks in all_blocks */
778*61046927SAndroid Build Coastguard Worker uint32_t total_size;
779*61046927SAndroid Build Coastguard Worker
780*61046927SAndroid Build Coastguard Worker /* List of all blocks allocated from this pool */
781*61046927SAndroid Build Coastguard Worker struct util_dynarray all_blocks;
782*61046927SAndroid Build Coastguard Worker };
783*61046927SAndroid Build Coastguard Worker
784*61046927SAndroid Build Coastguard Worker /* The block_pool functions exported for testing only. The block pool should
785*61046927SAndroid Build Coastguard Worker * only be used via a state pool (see below).
786*61046927SAndroid Build Coastguard Worker */
787*61046927SAndroid Build Coastguard Worker VkResult anv_block_pool_init(struct anv_block_pool *pool,
788*61046927SAndroid Build Coastguard Worker struct anv_device *device,
789*61046927SAndroid Build Coastguard Worker const char *name,
790*61046927SAndroid Build Coastguard Worker uint64_t start_address,
791*61046927SAndroid Build Coastguard Worker uint32_t initial_size,
792*61046927SAndroid Build Coastguard Worker uint32_t max_size);
793*61046927SAndroid Build Coastguard Worker void anv_block_pool_finish(struct anv_block_pool *pool);
794*61046927SAndroid Build Coastguard Worker VkResult anv_block_pool_alloc(struct anv_block_pool *pool,
795*61046927SAndroid Build Coastguard Worker uint32_t block_size,
796*61046927SAndroid Build Coastguard Worker int64_t *offset,
797*61046927SAndroid Build Coastguard Worker uint32_t *padding);
798*61046927SAndroid Build Coastguard Worker void* anv_block_pool_map(struct anv_block_pool *pool, int32_t offset, uint32_t
799*61046927SAndroid Build Coastguard Worker size);
800*61046927SAndroid Build Coastguard Worker
801*61046927SAndroid Build Coastguard Worker struct anv_state_pool_params {
802*61046927SAndroid Build Coastguard Worker const char *name;
803*61046927SAndroid Build Coastguard Worker uint64_t base_address;
804*61046927SAndroid Build Coastguard Worker int64_t start_offset;
805*61046927SAndroid Build Coastguard Worker uint32_t block_size;
806*61046927SAndroid Build Coastguard Worker uint32_t max_size;
807*61046927SAndroid Build Coastguard Worker };
808*61046927SAndroid Build Coastguard Worker
809*61046927SAndroid Build Coastguard Worker VkResult anv_state_pool_init(struct anv_state_pool *pool,
810*61046927SAndroid Build Coastguard Worker struct anv_device *device,
811*61046927SAndroid Build Coastguard Worker const struct anv_state_pool_params *params);
812*61046927SAndroid Build Coastguard Worker void anv_state_pool_finish(struct anv_state_pool *pool);
813*61046927SAndroid Build Coastguard Worker struct anv_state anv_state_pool_alloc(struct anv_state_pool *pool,
814*61046927SAndroid Build Coastguard Worker uint32_t state_size, uint32_t alignment);
815*61046927SAndroid Build Coastguard Worker void anv_state_pool_free(struct anv_state_pool *pool, struct anv_state state);
816*61046927SAndroid Build Coastguard Worker
817*61046927SAndroid Build Coastguard Worker static inline struct anv_address
anv_state_pool_state_address(struct anv_state_pool * pool,struct anv_state state)818*61046927SAndroid Build Coastguard Worker anv_state_pool_state_address(struct anv_state_pool *pool, struct anv_state state)
819*61046927SAndroid Build Coastguard Worker {
820*61046927SAndroid Build Coastguard Worker return (struct anv_address) {
821*61046927SAndroid Build Coastguard Worker .bo = pool->block_pool.bo,
822*61046927SAndroid Build Coastguard Worker .offset = state.offset - pool->start_offset,
823*61046927SAndroid Build Coastguard Worker };
824*61046927SAndroid Build Coastguard Worker }
825*61046927SAndroid Build Coastguard Worker
826*61046927SAndroid Build Coastguard Worker static inline struct anv_state
anv_state_pool_emit_data(struct anv_state_pool * pool,size_t size,size_t align,const void * p)827*61046927SAndroid Build Coastguard Worker anv_state_pool_emit_data(struct anv_state_pool *pool,
828*61046927SAndroid Build Coastguard Worker size_t size, size_t align,
829*61046927SAndroid Build Coastguard Worker const void *p)
830*61046927SAndroid Build Coastguard Worker {
831*61046927SAndroid Build Coastguard Worker struct anv_state state;
832*61046927SAndroid Build Coastguard Worker
833*61046927SAndroid Build Coastguard Worker state = anv_state_pool_alloc(pool, size, align);
834*61046927SAndroid Build Coastguard Worker memcpy(state.map, p, size);
835*61046927SAndroid Build Coastguard Worker
836*61046927SAndroid Build Coastguard Worker return state;
837*61046927SAndroid Build Coastguard Worker }
838*61046927SAndroid Build Coastguard Worker
839*61046927SAndroid Build Coastguard Worker void anv_state_stream_init(struct anv_state_stream *stream,
840*61046927SAndroid Build Coastguard Worker struct anv_state_pool *state_pool,
841*61046927SAndroid Build Coastguard Worker uint32_t block_size);
842*61046927SAndroid Build Coastguard Worker void anv_state_stream_finish(struct anv_state_stream *stream);
843*61046927SAndroid Build Coastguard Worker struct anv_state anv_state_stream_alloc(struct anv_state_stream *stream,
844*61046927SAndroid Build Coastguard Worker uint32_t size, uint32_t alignment);
845*61046927SAndroid Build Coastguard Worker
846*61046927SAndroid Build Coastguard Worker void anv_state_reserved_pool_init(struct anv_state_reserved_pool *pool,
847*61046927SAndroid Build Coastguard Worker struct anv_state_pool *parent,
848*61046927SAndroid Build Coastguard Worker uint32_t count, uint32_t size,
849*61046927SAndroid Build Coastguard Worker uint32_t alignment);
850*61046927SAndroid Build Coastguard Worker void anv_state_reserved_pool_finish(struct anv_state_reserved_pool *pool);
851*61046927SAndroid Build Coastguard Worker struct anv_state anv_state_reserved_pool_alloc(struct anv_state_reserved_pool *pool);
852*61046927SAndroid Build Coastguard Worker void anv_state_reserved_pool_free(struct anv_state_reserved_pool *pool,
853*61046927SAndroid Build Coastguard Worker struct anv_state state);
854*61046927SAndroid Build Coastguard Worker
855*61046927SAndroid Build Coastguard Worker VkResult anv_state_reserved_array_pool_init(struct anv_state_reserved_array_pool *pool,
856*61046927SAndroid Build Coastguard Worker struct anv_state_pool *parent,
857*61046927SAndroid Build Coastguard Worker uint32_t count, uint32_t size,
858*61046927SAndroid Build Coastguard Worker uint32_t alignment);
859*61046927SAndroid Build Coastguard Worker void anv_state_reserved_array_pool_finish(struct anv_state_reserved_array_pool *pool);
860*61046927SAndroid Build Coastguard Worker struct anv_state anv_state_reserved_array_pool_alloc(struct anv_state_reserved_array_pool *pool,
861*61046927SAndroid Build Coastguard Worker bool alloc_back);
862*61046927SAndroid Build Coastguard Worker struct anv_state anv_state_reserved_array_pool_alloc_index(struct anv_state_reserved_array_pool *pool,
863*61046927SAndroid Build Coastguard Worker unsigned idx);
864*61046927SAndroid Build Coastguard Worker uint32_t anv_state_reserved_array_pool_state_index(struct anv_state_reserved_array_pool *pool,
865*61046927SAndroid Build Coastguard Worker struct anv_state state);
866*61046927SAndroid Build Coastguard Worker void anv_state_reserved_array_pool_free(struct anv_state_reserved_array_pool *pool,
867*61046927SAndroid Build Coastguard Worker struct anv_state state);
868*61046927SAndroid Build Coastguard Worker
869*61046927SAndroid Build Coastguard Worker VkResult anv_state_table_init(struct anv_state_table *table,
870*61046927SAndroid Build Coastguard Worker struct anv_device *device,
871*61046927SAndroid Build Coastguard Worker uint32_t initial_entries);
872*61046927SAndroid Build Coastguard Worker void anv_state_table_finish(struct anv_state_table *table);
873*61046927SAndroid Build Coastguard Worker VkResult anv_state_table_add(struct anv_state_table *table, uint32_t *idx,
874*61046927SAndroid Build Coastguard Worker uint32_t count);
875*61046927SAndroid Build Coastguard Worker void anv_free_list_push(union anv_free_list *list,
876*61046927SAndroid Build Coastguard Worker struct anv_state_table *table,
877*61046927SAndroid Build Coastguard Worker uint32_t idx, uint32_t count);
878*61046927SAndroid Build Coastguard Worker struct anv_state* anv_free_list_pop(union anv_free_list *list,
879*61046927SAndroid Build Coastguard Worker struct anv_state_table *table);
880*61046927SAndroid Build Coastguard Worker
881*61046927SAndroid Build Coastguard Worker
882*61046927SAndroid Build Coastguard Worker static inline struct anv_state *
anv_state_table_get(struct anv_state_table * table,uint32_t idx)883*61046927SAndroid Build Coastguard Worker anv_state_table_get(struct anv_state_table *table, uint32_t idx)
884*61046927SAndroid Build Coastguard Worker {
885*61046927SAndroid Build Coastguard Worker return &table->map[idx].state;
886*61046927SAndroid Build Coastguard Worker }
887*61046927SAndroid Build Coastguard Worker /**
888*61046927SAndroid Build Coastguard Worker * Implements a pool of re-usable BOs. The interface is identical to that
889*61046927SAndroid Build Coastguard Worker * of block_pool except that each block is its own BO.
890*61046927SAndroid Build Coastguard Worker */
891*61046927SAndroid Build Coastguard Worker struct anv_bo_pool {
892*61046927SAndroid Build Coastguard Worker const char *name;
893*61046927SAndroid Build Coastguard Worker
894*61046927SAndroid Build Coastguard Worker struct anv_device *device;
895*61046927SAndroid Build Coastguard Worker
896*61046927SAndroid Build Coastguard Worker enum anv_bo_alloc_flags bo_alloc_flags;
897*61046927SAndroid Build Coastguard Worker
898*61046927SAndroid Build Coastguard Worker struct util_sparse_array_free_list free_list[16];
899*61046927SAndroid Build Coastguard Worker };
900*61046927SAndroid Build Coastguard Worker
901*61046927SAndroid Build Coastguard Worker void anv_bo_pool_init(struct anv_bo_pool *pool, struct anv_device *device,
902*61046927SAndroid Build Coastguard Worker const char *name, enum anv_bo_alloc_flags alloc_flags);
903*61046927SAndroid Build Coastguard Worker void anv_bo_pool_finish(struct anv_bo_pool *pool);
904*61046927SAndroid Build Coastguard Worker VkResult anv_bo_pool_alloc(struct anv_bo_pool *pool, uint32_t size,
905*61046927SAndroid Build Coastguard Worker struct anv_bo **bo_out);
906*61046927SAndroid Build Coastguard Worker void anv_bo_pool_free(struct anv_bo_pool *pool, struct anv_bo *bo);
907*61046927SAndroid Build Coastguard Worker
908*61046927SAndroid Build Coastguard Worker struct anv_scratch_pool {
909*61046927SAndroid Build Coastguard Worker enum anv_bo_alloc_flags alloc_flags;
910*61046927SAndroid Build Coastguard Worker /* Indexed by Per-Thread Scratch Space number (the hardware value) and stage */
911*61046927SAndroid Build Coastguard Worker struct anv_bo *bos[16][MESA_SHADER_STAGES];
912*61046927SAndroid Build Coastguard Worker uint32_t surfs[16];
913*61046927SAndroid Build Coastguard Worker struct anv_state surf_states[16];
914*61046927SAndroid Build Coastguard Worker };
915*61046927SAndroid Build Coastguard Worker
916*61046927SAndroid Build Coastguard Worker void anv_scratch_pool_init(struct anv_device *device,
917*61046927SAndroid Build Coastguard Worker struct anv_scratch_pool *pool,
918*61046927SAndroid Build Coastguard Worker bool protected);
919*61046927SAndroid Build Coastguard Worker void anv_scratch_pool_finish(struct anv_device *device,
920*61046927SAndroid Build Coastguard Worker struct anv_scratch_pool *pool);
921*61046927SAndroid Build Coastguard Worker struct anv_bo *anv_scratch_pool_alloc(struct anv_device *device,
922*61046927SAndroid Build Coastguard Worker struct anv_scratch_pool *pool,
923*61046927SAndroid Build Coastguard Worker gl_shader_stage stage,
924*61046927SAndroid Build Coastguard Worker unsigned per_thread_scratch);
925*61046927SAndroid Build Coastguard Worker uint32_t anv_scratch_pool_get_surf(struct anv_device *device,
926*61046927SAndroid Build Coastguard Worker struct anv_scratch_pool *pool,
927*61046927SAndroid Build Coastguard Worker unsigned per_thread_scratch);
928*61046927SAndroid Build Coastguard Worker
929*61046927SAndroid Build Coastguard Worker /* Note that on Gfx12HP we pass a scratch space surface state offset
930*61046927SAndroid Build Coastguard Worker * shifted by 2 relative to the value specified on the BSpec, since
931*61046927SAndroid Build Coastguard Worker * that allows the compiler to save a shift instruction while
932*61046927SAndroid Build Coastguard Worker * constructing the extended descriptor for SS addressing. That
933*61046927SAndroid Build Coastguard Worker * worked because we limit the scratch surface state pool to 8 MB and
934*61046927SAndroid Build Coastguard Worker * because we relied on the legacy (ExBSO=0) encoding of the extended
935*61046927SAndroid Build Coastguard Worker * descriptor in order to save the shift, which is no longer supported
936*61046927SAndroid Build Coastguard Worker * for the UGM shared function on Xe2 platforms, so we no longer
937*61046927SAndroid Build Coastguard Worker * attempt to do that trick.
938*61046927SAndroid Build Coastguard Worker */
939*61046927SAndroid Build Coastguard Worker #define ANV_SCRATCH_SPACE_SHIFT(ver) ((ver) >= 20 ? 6 : 4)
940*61046927SAndroid Build Coastguard Worker
941*61046927SAndroid Build Coastguard Worker /** Implements a BO cache that ensures a 1-1 mapping of GEM BOs to anv_bos */
942*61046927SAndroid Build Coastguard Worker struct anv_bo_cache {
943*61046927SAndroid Build Coastguard Worker struct util_sparse_array bo_map;
944*61046927SAndroid Build Coastguard Worker pthread_mutex_t mutex;
945*61046927SAndroid Build Coastguard Worker };
946*61046927SAndroid Build Coastguard Worker
947*61046927SAndroid Build Coastguard Worker VkResult anv_bo_cache_init(struct anv_bo_cache *cache,
948*61046927SAndroid Build Coastguard Worker struct anv_device *device);
949*61046927SAndroid Build Coastguard Worker void anv_bo_cache_finish(struct anv_bo_cache *cache);
950*61046927SAndroid Build Coastguard Worker
951*61046927SAndroid Build Coastguard Worker struct anv_queue_family {
952*61046927SAndroid Build Coastguard Worker /* Standard bits passed on to the client */
953*61046927SAndroid Build Coastguard Worker VkQueueFlags queueFlags;
954*61046927SAndroid Build Coastguard Worker uint32_t queueCount;
955*61046927SAndroid Build Coastguard Worker
956*61046927SAndroid Build Coastguard Worker enum intel_engine_class engine_class;
957*61046927SAndroid Build Coastguard Worker bool supports_perf;
958*61046927SAndroid Build Coastguard Worker };
959*61046927SAndroid Build Coastguard Worker
960*61046927SAndroid Build Coastguard Worker #define ANV_MAX_QUEUE_FAMILIES 5
961*61046927SAndroid Build Coastguard Worker
962*61046927SAndroid Build Coastguard Worker struct anv_memory_type {
963*61046927SAndroid Build Coastguard Worker /* Standard bits passed on to the client */
964*61046927SAndroid Build Coastguard Worker VkMemoryPropertyFlags propertyFlags;
965*61046927SAndroid Build Coastguard Worker uint32_t heapIndex;
966*61046927SAndroid Build Coastguard Worker /* Whether this is the dynamic visible memory type */
967*61046927SAndroid Build Coastguard Worker bool dynamic_visible;
968*61046927SAndroid Build Coastguard Worker bool compressed;
969*61046927SAndroid Build Coastguard Worker };
970*61046927SAndroid Build Coastguard Worker
971*61046927SAndroid Build Coastguard Worker struct anv_memory_heap {
972*61046927SAndroid Build Coastguard Worker /* Standard bits passed on to the client */
973*61046927SAndroid Build Coastguard Worker VkDeviceSize size;
974*61046927SAndroid Build Coastguard Worker VkMemoryHeapFlags flags;
975*61046927SAndroid Build Coastguard Worker
976*61046927SAndroid Build Coastguard Worker /** Driver-internal book-keeping.
977*61046927SAndroid Build Coastguard Worker *
978*61046927SAndroid Build Coastguard Worker * Align it to 64 bits to make atomic operations faster on 32 bit platforms.
979*61046927SAndroid Build Coastguard Worker */
980*61046927SAndroid Build Coastguard Worker alignas(8) VkDeviceSize used;
981*61046927SAndroid Build Coastguard Worker
982*61046927SAndroid Build Coastguard Worker bool is_local_mem;
983*61046927SAndroid Build Coastguard Worker };
984*61046927SAndroid Build Coastguard Worker
985*61046927SAndroid Build Coastguard Worker struct anv_memregion {
986*61046927SAndroid Build Coastguard Worker const struct intel_memory_class_instance *region;
987*61046927SAndroid Build Coastguard Worker uint64_t size;
988*61046927SAndroid Build Coastguard Worker uint64_t available;
989*61046927SAndroid Build Coastguard Worker };
990*61046927SAndroid Build Coastguard Worker
991*61046927SAndroid Build Coastguard Worker enum anv_timestamp_capture_type {
992*61046927SAndroid Build Coastguard Worker ANV_TIMESTAMP_CAPTURE_TOP_OF_PIPE,
993*61046927SAndroid Build Coastguard Worker ANV_TIMESTAMP_CAPTURE_END_OF_PIPE,
994*61046927SAndroid Build Coastguard Worker ANV_TIMESTAMP_CAPTURE_AT_CS_STALL,
995*61046927SAndroid Build Coastguard Worker ANV_TIMESTAMP_REWRITE_COMPUTE_WALKER,
996*61046927SAndroid Build Coastguard Worker ANV_TIMESTAMP_REWRITE_INDIRECT_DISPATCH,
997*61046927SAndroid Build Coastguard Worker };
998*61046927SAndroid Build Coastguard Worker
999*61046927SAndroid Build Coastguard Worker struct anv_physical_device {
1000*61046927SAndroid Build Coastguard Worker struct vk_physical_device vk;
1001*61046927SAndroid Build Coastguard Worker
1002*61046927SAndroid Build Coastguard Worker /* Link in anv_instance::physical_devices */
1003*61046927SAndroid Build Coastguard Worker struct list_head link;
1004*61046927SAndroid Build Coastguard Worker
1005*61046927SAndroid Build Coastguard Worker struct anv_instance * instance;
1006*61046927SAndroid Build Coastguard Worker char path[20];
1007*61046927SAndroid Build Coastguard Worker struct intel_device_info info;
1008*61046927SAndroid Build Coastguard Worker
1009*61046927SAndroid Build Coastguard Worker bool video_decode_enabled;
1010*61046927SAndroid Build Coastguard Worker bool video_encode_enabled;
1011*61046927SAndroid Build Coastguard Worker
1012*61046927SAndroid Build Coastguard Worker struct brw_compiler * compiler;
1013*61046927SAndroid Build Coastguard Worker struct isl_device isl_dev;
1014*61046927SAndroid Build Coastguard Worker struct intel_perf_config * perf;
1015*61046927SAndroid Build Coastguard Worker /*
1016*61046927SAndroid Build Coastguard Worker * Number of commands required to implement a performance query begin +
1017*61046927SAndroid Build Coastguard Worker * end.
1018*61046927SAndroid Build Coastguard Worker */
1019*61046927SAndroid Build Coastguard Worker uint32_t n_perf_query_commands;
1020*61046927SAndroid Build Coastguard Worker bool has_exec_async;
1021*61046927SAndroid Build Coastguard Worker bool has_exec_capture;
1022*61046927SAndroid Build Coastguard Worker VkQueueGlobalPriorityKHR max_context_priority;
1023*61046927SAndroid Build Coastguard Worker uint64_t gtt_size;
1024*61046927SAndroid Build Coastguard Worker
1025*61046927SAndroid Build Coastguard Worker bool always_use_bindless;
1026*61046927SAndroid Build Coastguard Worker bool use_call_secondary;
1027*61046927SAndroid Build Coastguard Worker
1028*61046927SAndroid Build Coastguard Worker /** True if we can use timeline semaphores through execbuf */
1029*61046927SAndroid Build Coastguard Worker bool has_exec_timeline;
1030*61046927SAndroid Build Coastguard Worker
1031*61046927SAndroid Build Coastguard Worker /** True if we can read the GPU timestamp register
1032*61046927SAndroid Build Coastguard Worker *
1033*61046927SAndroid Build Coastguard Worker * When running in a virtual context, the timestamp register is unreadable
1034*61046927SAndroid Build Coastguard Worker * on Gfx12+.
1035*61046927SAndroid Build Coastguard Worker */
1036*61046927SAndroid Build Coastguard Worker bool has_reg_timestamp;
1037*61046927SAndroid Build Coastguard Worker
1038*61046927SAndroid Build Coastguard Worker /** True if we can create protected contexts. */
1039*61046927SAndroid Build Coastguard Worker bool has_protected_contexts;
1040*61046927SAndroid Build Coastguard Worker
1041*61046927SAndroid Build Coastguard Worker /** Whether KMD has the ability to create VM objects */
1042*61046927SAndroid Build Coastguard Worker bool has_vm_control;
1043*61046927SAndroid Build Coastguard Worker
1044*61046927SAndroid Build Coastguard Worker /** True if we have the means to do sparse binding (e.g., a Kernel driver
1045*61046927SAndroid Build Coastguard Worker * a vm_bind ioctl).
1046*61046927SAndroid Build Coastguard Worker */
1047*61046927SAndroid Build Coastguard Worker enum anv_sparse_type {
1048*61046927SAndroid Build Coastguard Worker ANV_SPARSE_TYPE_NOT_SUPPORTED = 0,
1049*61046927SAndroid Build Coastguard Worker ANV_SPARSE_TYPE_VM_BIND,
1050*61046927SAndroid Build Coastguard Worker ANV_SPARSE_TYPE_TRTT,
1051*61046927SAndroid Build Coastguard Worker ANV_SPARSE_TYPE_FAKE,
1052*61046927SAndroid Build Coastguard Worker } sparse_type;
1053*61046927SAndroid Build Coastguard Worker
1054*61046927SAndroid Build Coastguard Worker /** True if HW supports ASTC LDR */
1055*61046927SAndroid Build Coastguard Worker bool has_astc_ldr;
1056*61046927SAndroid Build Coastguard Worker /** True if denorms in void extents should be flushed to zero */
1057*61046927SAndroid Build Coastguard Worker bool flush_astc_ldr_void_extent_denorms;
1058*61046927SAndroid Build Coastguard Worker /** True if ASTC LDR is supported via emulation */
1059*61046927SAndroid Build Coastguard Worker bool emu_astc_ldr;
1060*61046927SAndroid Build Coastguard Worker /* true if FCV optimization should be disabled. */
1061*61046927SAndroid Build Coastguard Worker bool disable_fcv;
1062*61046927SAndroid Build Coastguard Worker /**/
1063*61046927SAndroid Build Coastguard Worker bool uses_ex_bso;
1064*61046927SAndroid Build Coastguard Worker
1065*61046927SAndroid Build Coastguard Worker bool always_flush_cache;
1066*61046927SAndroid Build Coastguard Worker
1067*61046927SAndroid Build Coastguard Worker /** True if application memory is allocated with extra AUX memory
1068*61046927SAndroid Build Coastguard Worker *
1069*61046927SAndroid Build Coastguard Worker * Applications quite often pool image allocations together in a single
1070*61046927SAndroid Build Coastguard Worker * VkDeviceMemory object. On platforms like MTL, the alignment of images
1071*61046927SAndroid Build Coastguard Worker * with compression mapped through the AUX translation tables is large :
1072*61046927SAndroid Build Coastguard Worker * 1MB. This can create a lot of wasted space in the application memory
1073*61046927SAndroid Build Coastguard Worker * objects.
1074*61046927SAndroid Build Coastguard Worker *
1075*61046927SAndroid Build Coastguard Worker * To workaround this problem, we allocate CCS data at the end of
1076*61046927SAndroid Build Coastguard Worker * VkDeviceMemory objects. This would not work well for TGL-like platforms
1077*61046927SAndroid Build Coastguard Worker * because the AUX translation tables also contain the format of the
1078*61046927SAndroid Build Coastguard Worker * images, but on MTL the HW ignore those values. So we can share the AUX
1079*61046927SAndroid Build Coastguard Worker * TT entries between different images without problem.
1080*61046927SAndroid Build Coastguard Worker *
1081*61046927SAndroid Build Coastguard Worker * This should be only true for platforms with AUX TT.
1082*61046927SAndroid Build Coastguard Worker */
1083*61046927SAndroid Build Coastguard Worker bool alloc_aux_tt_mem;
1084*61046927SAndroid Build Coastguard Worker
1085*61046927SAndroid Build Coastguard Worker /**
1086*61046927SAndroid Build Coastguard Worker * True if the descriptors buffers are holding one of the following :
1087*61046927SAndroid Build Coastguard Worker * - anv_sampled_image_descriptor
1088*61046927SAndroid Build Coastguard Worker * - anv_storage_image_descriptor
1089*61046927SAndroid Build Coastguard Worker * - anv_address_range_descriptor
1090*61046927SAndroid Build Coastguard Worker *
1091*61046927SAndroid Build Coastguard Worker * Accessing the descriptors in a bindless fashion from the shader
1092*61046927SAndroid Build Coastguard Worker * requires an indirection in the shader, first fetch one of the structure
1093*61046927SAndroid Build Coastguard Worker * listed above from the descriptor buffer, then emit the send message to
1094*61046927SAndroid Build Coastguard Worker * the fixed function (sampler, dataport, etc...) with the handle fetched
1095*61046927SAndroid Build Coastguard Worker * above.
1096*61046927SAndroid Build Coastguard Worker *
1097*61046927SAndroid Build Coastguard Worker * We need to do things this way prior to DG2 because the bindless surface
1098*61046927SAndroid Build Coastguard Worker * state space is limited to 64Mb and some application will allocate more
1099*61046927SAndroid Build Coastguard Worker * than what HW can support. On DG2+ we get 4Gb of bindless surface state
1100*61046927SAndroid Build Coastguard Worker * and so we can reference directly RENDER_SURFACE_STATE/SAMPLER_STATE
1101*61046927SAndroid Build Coastguard Worker * structures instead.
1102*61046927SAndroid Build Coastguard Worker */
1103*61046927SAndroid Build Coastguard Worker bool indirect_descriptors;
1104*61046927SAndroid Build Coastguard Worker
1105*61046927SAndroid Build Coastguard Worker bool uses_relocs;
1106*61046927SAndroid Build Coastguard Worker
1107*61046927SAndroid Build Coastguard Worker /** Can the platform support cooperative matrices and is it enabled? */
1108*61046927SAndroid Build Coastguard Worker bool has_cooperative_matrix;
1109*61046927SAndroid Build Coastguard Worker
1110*61046927SAndroid Build Coastguard Worker struct {
1111*61046927SAndroid Build Coastguard Worker uint32_t family_count;
1112*61046927SAndroid Build Coastguard Worker struct anv_queue_family families[ANV_MAX_QUEUE_FAMILIES];
1113*61046927SAndroid Build Coastguard Worker } queue;
1114*61046927SAndroid Build Coastguard Worker
1115*61046927SAndroid Build Coastguard Worker struct {
1116*61046927SAndroid Build Coastguard Worker uint32_t type_count;
1117*61046927SAndroid Build Coastguard Worker struct anv_memory_type types[VK_MAX_MEMORY_TYPES];
1118*61046927SAndroid Build Coastguard Worker uint32_t heap_count;
1119*61046927SAndroid Build Coastguard Worker struct anv_memory_heap heaps[VK_MAX_MEMORY_HEAPS];
1120*61046927SAndroid Build Coastguard Worker #ifdef SUPPORT_INTEL_INTEGRATED_GPUS
1121*61046927SAndroid Build Coastguard Worker bool need_flush;
1122*61046927SAndroid Build Coastguard Worker #endif
1123*61046927SAndroid Build Coastguard Worker /** Mask of memory types of normal allocations */
1124*61046927SAndroid Build Coastguard Worker uint32_t default_buffer_mem_types;
1125*61046927SAndroid Build Coastguard Worker /** Mask of memory types of data indexable from the dynamic heap */
1126*61046927SAndroid Build Coastguard Worker uint32_t dynamic_visible_mem_types;
1127*61046927SAndroid Build Coastguard Worker /** Mask of memory types of protected buffers/images */
1128*61046927SAndroid Build Coastguard Worker uint32_t protected_mem_types;
1129*61046927SAndroid Build Coastguard Worker /** Mask of memory types of compressed buffers/images */
1130*61046927SAndroid Build Coastguard Worker uint32_t compressed_mem_types;
1131*61046927SAndroid Build Coastguard Worker } memory;
1132*61046927SAndroid Build Coastguard Worker
1133*61046927SAndroid Build Coastguard Worker struct {
1134*61046927SAndroid Build Coastguard Worker /**
1135*61046927SAndroid Build Coastguard Worker * General state pool
1136*61046927SAndroid Build Coastguard Worker */
1137*61046927SAndroid Build Coastguard Worker struct anv_va_range general_state_pool;
1138*61046927SAndroid Build Coastguard Worker /**
1139*61046927SAndroid Build Coastguard Worker * Low 32bit heap
1140*61046927SAndroid Build Coastguard Worker */
1141*61046927SAndroid Build Coastguard Worker struct anv_va_range low_heap;
1142*61046927SAndroid Build Coastguard Worker /**
1143*61046927SAndroid Build Coastguard Worker * Binding table pool
1144*61046927SAndroid Build Coastguard Worker */
1145*61046927SAndroid Build Coastguard Worker struct anv_va_range binding_table_pool;
1146*61046927SAndroid Build Coastguard Worker /**
1147*61046927SAndroid Build Coastguard Worker * Internal surface states for blorp & push descriptors.
1148*61046927SAndroid Build Coastguard Worker */
1149*61046927SAndroid Build Coastguard Worker struct anv_va_range internal_surface_state_pool;
1150*61046927SAndroid Build Coastguard Worker /**
1151*61046927SAndroid Build Coastguard Worker * Scratch surfaces (overlaps with internal_surface_state_pool).
1152*61046927SAndroid Build Coastguard Worker */
1153*61046927SAndroid Build Coastguard Worker struct anv_va_range scratch_surface_state_pool;
1154*61046927SAndroid Build Coastguard Worker /**
1155*61046927SAndroid Build Coastguard Worker * Bindless surface states (indirectly referred to by indirect
1156*61046927SAndroid Build Coastguard Worker * descriptors or for direct descriptors)
1157*61046927SAndroid Build Coastguard Worker */
1158*61046927SAndroid Build Coastguard Worker struct anv_va_range bindless_surface_state_pool;
1159*61046927SAndroid Build Coastguard Worker /**
1160*61046927SAndroid Build Coastguard Worker * Dynamic state pool
1161*61046927SAndroid Build Coastguard Worker */
1162*61046927SAndroid Build Coastguard Worker struct anv_va_range dynamic_state_pool;
1163*61046927SAndroid Build Coastguard Worker /**
1164*61046927SAndroid Build Coastguard Worker * Buffer pool that can be index from the dynamic state heap
1165*61046927SAndroid Build Coastguard Worker */
1166*61046927SAndroid Build Coastguard Worker struct anv_va_range dynamic_visible_pool;
1167*61046927SAndroid Build Coastguard Worker /**
1168*61046927SAndroid Build Coastguard Worker * Indirect descriptor pool
1169*61046927SAndroid Build Coastguard Worker */
1170*61046927SAndroid Build Coastguard Worker struct anv_va_range indirect_descriptor_pool;
1171*61046927SAndroid Build Coastguard Worker /**
1172*61046927SAndroid Build Coastguard Worker * Indirect push descriptor pool
1173*61046927SAndroid Build Coastguard Worker */
1174*61046927SAndroid Build Coastguard Worker struct anv_va_range indirect_push_descriptor_pool;
1175*61046927SAndroid Build Coastguard Worker /**
1176*61046927SAndroid Build Coastguard Worker * Instruction state pool
1177*61046927SAndroid Build Coastguard Worker */
1178*61046927SAndroid Build Coastguard Worker struct anv_va_range instruction_state_pool;
1179*61046927SAndroid Build Coastguard Worker /**
1180*61046927SAndroid Build Coastguard Worker * Push descriptor with descriptor buffers
1181*61046927SAndroid Build Coastguard Worker */
1182*61046927SAndroid Build Coastguard Worker struct anv_va_range push_descriptor_buffer_pool;
1183*61046927SAndroid Build Coastguard Worker /**
1184*61046927SAndroid Build Coastguard Worker * AUX-TT
1185*61046927SAndroid Build Coastguard Worker */
1186*61046927SAndroid Build Coastguard Worker struct anv_va_range aux_tt_pool;
1187*61046927SAndroid Build Coastguard Worker /**
1188*61046927SAndroid Build Coastguard Worker * Client heap
1189*61046927SAndroid Build Coastguard Worker */
1190*61046927SAndroid Build Coastguard Worker struct anv_va_range high_heap;
1191*61046927SAndroid Build Coastguard Worker struct anv_va_range trtt;
1192*61046927SAndroid Build Coastguard Worker } va;
1193*61046927SAndroid Build Coastguard Worker
1194*61046927SAndroid Build Coastguard Worker /* Either we have a single vram region and it's all mappable, or we have
1195*61046927SAndroid Build Coastguard Worker * both mappable & non-mappable parts. System memory is always available.
1196*61046927SAndroid Build Coastguard Worker */
1197*61046927SAndroid Build Coastguard Worker struct anv_memregion vram_mappable;
1198*61046927SAndroid Build Coastguard Worker struct anv_memregion vram_non_mappable;
1199*61046927SAndroid Build Coastguard Worker struct anv_memregion sys;
1200*61046927SAndroid Build Coastguard Worker uint8_t driver_build_sha1[20];
1201*61046927SAndroid Build Coastguard Worker uint8_t pipeline_cache_uuid[VK_UUID_SIZE];
1202*61046927SAndroid Build Coastguard Worker uint8_t driver_uuid[VK_UUID_SIZE];
1203*61046927SAndroid Build Coastguard Worker uint8_t device_uuid[VK_UUID_SIZE];
1204*61046927SAndroid Build Coastguard Worker uint8_t rt_uuid[VK_UUID_SIZE];
1205*61046927SAndroid Build Coastguard Worker
1206*61046927SAndroid Build Coastguard Worker /* Maximum amount of scratch space used by all the GRL kernels */
1207*61046927SAndroid Build Coastguard Worker uint32_t max_grl_scratch_size;
1208*61046927SAndroid Build Coastguard Worker
1209*61046927SAndroid Build Coastguard Worker struct vk_sync_type sync_syncobj_type;
1210*61046927SAndroid Build Coastguard Worker struct vk_sync_timeline_type sync_timeline_type;
1211*61046927SAndroid Build Coastguard Worker const struct vk_sync_type * sync_types[4];
1212*61046927SAndroid Build Coastguard Worker
1213*61046927SAndroid Build Coastguard Worker struct wsi_device wsi_device;
1214*61046927SAndroid Build Coastguard Worker int local_fd;
1215*61046927SAndroid Build Coastguard Worker bool has_local;
1216*61046927SAndroid Build Coastguard Worker int64_t local_major;
1217*61046927SAndroid Build Coastguard Worker int64_t local_minor;
1218*61046927SAndroid Build Coastguard Worker int master_fd;
1219*61046927SAndroid Build Coastguard Worker bool has_master;
1220*61046927SAndroid Build Coastguard Worker int64_t master_major;
1221*61046927SAndroid Build Coastguard Worker int64_t master_minor;
1222*61046927SAndroid Build Coastguard Worker struct intel_query_engine_info * engine_info;
1223*61046927SAndroid Build Coastguard Worker
1224*61046927SAndroid Build Coastguard Worker void (*cmd_emit_timestamp)(struct anv_batch *, struct anv_device *, struct anv_address,
1225*61046927SAndroid Build Coastguard Worker enum anv_timestamp_capture_type, void *);
1226*61046927SAndroid Build Coastguard Worker void (*cmd_capture_data)(struct anv_batch *, struct anv_device *,
1227*61046927SAndroid Build Coastguard Worker struct anv_address, struct anv_address,
1228*61046927SAndroid Build Coastguard Worker uint32_t);
1229*61046927SAndroid Build Coastguard Worker struct intel_measure_device measure_device;
1230*61046927SAndroid Build Coastguard Worker
1231*61046927SAndroid Build Coastguard Worker /* Value of PIPELINE_SELECT::PipelineSelection == GPGPU */
1232*61046927SAndroid Build Coastguard Worker uint32_t gpgpu_pipeline_value;
1233*61046927SAndroid Build Coastguard Worker
1234*61046927SAndroid Build Coastguard Worker /** A pre packed VERTEX_ELEMENT_STATE feeding 0s to the VS stage
1235*61046927SAndroid Build Coastguard Worker *
1236*61046927SAndroid Build Coastguard Worker * For use when a pipeline has no VS input
1237*61046927SAndroid Build Coastguard Worker */
1238*61046927SAndroid Build Coastguard Worker uint32_t empty_vs_input[2];
1239*61046927SAndroid Build Coastguard Worker };
1240*61046927SAndroid Build Coastguard Worker
1241*61046927SAndroid Build Coastguard Worker VkResult anv_physical_device_try_create(struct vk_instance *vk_instance,
1242*61046927SAndroid Build Coastguard Worker struct _drmDevice *drm_device,
1243*61046927SAndroid Build Coastguard Worker struct vk_physical_device **out);
1244*61046927SAndroid Build Coastguard Worker
1245*61046927SAndroid Build Coastguard Worker void anv_physical_device_destroy(struct vk_physical_device *vk_device);
1246*61046927SAndroid Build Coastguard Worker
1247*61046927SAndroid Build Coastguard Worker static inline uint32_t
anv_physical_device_bindless_heap_size(const struct anv_physical_device * device,bool descriptor_buffer)1248*61046927SAndroid Build Coastguard Worker anv_physical_device_bindless_heap_size(const struct anv_physical_device *device,
1249*61046927SAndroid Build Coastguard Worker bool descriptor_buffer)
1250*61046927SAndroid Build Coastguard Worker {
1251*61046927SAndroid Build Coastguard Worker /* Pre-Gfx12.5, the HW bindless surface heap is only 64MB. After it's 4GB,
1252*61046927SAndroid Build Coastguard Worker * but we have some workarounds that require 2 heaps to overlap, so the
1253*61046927SAndroid Build Coastguard Worker * size is dictated by our VA allocation.
1254*61046927SAndroid Build Coastguard Worker */
1255*61046927SAndroid Build Coastguard Worker return device->uses_ex_bso ?
1256*61046927SAndroid Build Coastguard Worker (descriptor_buffer ?
1257*61046927SAndroid Build Coastguard Worker device->va.dynamic_visible_pool.size :
1258*61046927SAndroid Build Coastguard Worker device->va.bindless_surface_state_pool.size) :
1259*61046927SAndroid Build Coastguard Worker 64 * 1024 * 1024 /* 64 MiB */;
1260*61046927SAndroid Build Coastguard Worker }
1261*61046927SAndroid Build Coastguard Worker
1262*61046927SAndroid Build Coastguard Worker static inline bool
anv_physical_device_has_vram(const struct anv_physical_device * device)1263*61046927SAndroid Build Coastguard Worker anv_physical_device_has_vram(const struct anv_physical_device *device)
1264*61046927SAndroid Build Coastguard Worker {
1265*61046927SAndroid Build Coastguard Worker return device->vram_mappable.size > 0;
1266*61046927SAndroid Build Coastguard Worker }
1267*61046927SAndroid Build Coastguard Worker
1268*61046927SAndroid Build Coastguard Worker struct anv_instance {
1269*61046927SAndroid Build Coastguard Worker struct vk_instance vk;
1270*61046927SAndroid Build Coastguard Worker
1271*61046927SAndroid Build Coastguard Worker struct driOptionCache dri_options;
1272*61046927SAndroid Build Coastguard Worker struct driOptionCache available_dri_options;
1273*61046927SAndroid Build Coastguard Worker
1274*61046927SAndroid Build Coastguard Worker int mesh_conv_prim_attrs_to_vert_attrs;
1275*61046927SAndroid Build Coastguard Worker bool enable_tbimr;
1276*61046927SAndroid Build Coastguard Worker bool external_memory_implicit_sync;
1277*61046927SAndroid Build Coastguard Worker bool force_guc_low_latency;
1278*61046927SAndroid Build Coastguard Worker
1279*61046927SAndroid Build Coastguard Worker /**
1280*61046927SAndroid Build Coastguard Worker * Workarounds for game bugs.
1281*61046927SAndroid Build Coastguard Worker */
1282*61046927SAndroid Build Coastguard Worker uint8_t assume_full_subgroups;
1283*61046927SAndroid Build Coastguard Worker bool assume_full_subgroups_with_barrier;
1284*61046927SAndroid Build Coastguard Worker bool limit_trig_input_range;
1285*61046927SAndroid Build Coastguard Worker bool sample_mask_out_opengl_behaviour;
1286*61046927SAndroid Build Coastguard Worker bool force_filter_addr_rounding;
1287*61046927SAndroid Build Coastguard Worker bool fp64_workaround_enabled;
1288*61046927SAndroid Build Coastguard Worker float lower_depth_range_rate;
1289*61046927SAndroid Build Coastguard Worker unsigned generated_indirect_threshold;
1290*61046927SAndroid Build Coastguard Worker unsigned generated_indirect_ring_threshold;
1291*61046927SAndroid Build Coastguard Worker unsigned query_clear_with_blorp_threshold;
1292*61046927SAndroid Build Coastguard Worker unsigned query_copy_with_shader_threshold;
1293*61046927SAndroid Build Coastguard Worker unsigned force_vk_vendor;
1294*61046927SAndroid Build Coastguard Worker bool has_fake_sparse;
1295*61046927SAndroid Build Coastguard Worker bool disable_fcv;
1296*61046927SAndroid Build Coastguard Worker bool disable_xe2_ccs;
1297*61046927SAndroid Build Coastguard Worker bool compression_control_enabled;
1298*61046927SAndroid Build Coastguard Worker bool anv_fake_nonlocal_memory;
1299*61046927SAndroid Build Coastguard Worker
1300*61046927SAndroid Build Coastguard Worker /* HW workarounds */
1301*61046927SAndroid Build Coastguard Worker bool no_16bit;
1302*61046927SAndroid Build Coastguard Worker bool intel_enable_wa_14018912822;
1303*61046927SAndroid Build Coastguard Worker
1304*61046927SAndroid Build Coastguard Worker /**
1305*61046927SAndroid Build Coastguard Worker * Ray tracing configuration.
1306*61046927SAndroid Build Coastguard Worker */
1307*61046927SAndroid Build Coastguard Worker unsigned stack_ids;
1308*61046927SAndroid Build Coastguard Worker };
1309*61046927SAndroid Build Coastguard Worker
1310*61046927SAndroid Build Coastguard Worker VkResult anv_init_wsi(struct anv_physical_device *physical_device);
1311*61046927SAndroid Build Coastguard Worker void anv_finish_wsi(struct anv_physical_device *physical_device);
1312*61046927SAndroid Build Coastguard Worker
1313*61046927SAndroid Build Coastguard Worker struct anv_queue {
1314*61046927SAndroid Build Coastguard Worker struct vk_queue vk;
1315*61046927SAndroid Build Coastguard Worker
1316*61046927SAndroid Build Coastguard Worker struct anv_device * device;
1317*61046927SAndroid Build Coastguard Worker
1318*61046927SAndroid Build Coastguard Worker const struct anv_queue_family * family;
1319*61046927SAndroid Build Coastguard Worker
1320*61046927SAndroid Build Coastguard Worker struct intel_batch_decode_ctx * decoder;
1321*61046927SAndroid Build Coastguard Worker
1322*61046927SAndroid Build Coastguard Worker union {
1323*61046927SAndroid Build Coastguard Worker uint32_t exec_flags; /* i915 */
1324*61046927SAndroid Build Coastguard Worker uint32_t context_id; /* i915 */
1325*61046927SAndroid Build Coastguard Worker uint32_t exec_queue_id; /* Xe */
1326*61046927SAndroid Build Coastguard Worker };
1327*61046927SAndroid Build Coastguard Worker
1328*61046927SAndroid Build Coastguard Worker /** Context/Engine id which executes companion RCS command buffer */
1329*61046927SAndroid Build Coastguard Worker uint32_t companion_rcs_id;
1330*61046927SAndroid Build Coastguard Worker
1331*61046927SAndroid Build Coastguard Worker /** Synchronization object for debug purposes (DEBUG_SYNC) */
1332*61046927SAndroid Build Coastguard Worker struct vk_sync *sync;
1333*61046927SAndroid Build Coastguard Worker
1334*61046927SAndroid Build Coastguard Worker /** Companion synchronization object
1335*61046927SAndroid Build Coastguard Worker *
1336*61046927SAndroid Build Coastguard Worker * Vulkan command buffers can be destroyed as soon as their lifecycle moved
1337*61046927SAndroid Build Coastguard Worker * from the Pending state to the Invalid/Executable state. This transition
1338*61046927SAndroid Build Coastguard Worker * happens when the VkFence/VkSemaphore associated with the completion of
1339*61046927SAndroid Build Coastguard Worker * the command buffer work is signaled.
1340*61046927SAndroid Build Coastguard Worker *
1341*61046927SAndroid Build Coastguard Worker * When we're using a companion command buffer to execute part of another
1342*61046927SAndroid Build Coastguard Worker * command buffer, we need to tie the 2 work submissions together to ensure
1343*61046927SAndroid Build Coastguard Worker * when the associated VkFence/VkSemaphore is signaled, both command
1344*61046927SAndroid Build Coastguard Worker * buffers are actually unused by the HW. To do this, we run an empty batch
1345*61046927SAndroid Build Coastguard Worker * buffer that we use to signal after both submissions :
1346*61046927SAndroid Build Coastguard Worker *
1347*61046927SAndroid Build Coastguard Worker * CCS --> main ---> empty_batch (with wait on companion) --> signal
1348*61046927SAndroid Build Coastguard Worker * RCS --> companion -|
1349*61046927SAndroid Build Coastguard Worker *
1350*61046927SAndroid Build Coastguard Worker * When companion batch completes, it signals companion_sync and allow
1351*61046927SAndroid Build Coastguard Worker * empty_batch to execute. Since empty_batch is running on the main engine,
1352*61046927SAndroid Build Coastguard Worker * we're guaranteed that upon completion both main & companion command
1353*61046927SAndroid Build Coastguard Worker * buffers are not used by HW anymore.
1354*61046927SAndroid Build Coastguard Worker */
1355*61046927SAndroid Build Coastguard Worker struct vk_sync *companion_sync;
1356*61046927SAndroid Build Coastguard Worker
1357*61046927SAndroid Build Coastguard Worker struct intel_ds_queue ds;
1358*61046927SAndroid Build Coastguard Worker
1359*61046927SAndroid Build Coastguard Worker struct anv_async_submit *init_submit;
1360*61046927SAndroid Build Coastguard Worker struct anv_async_submit *init_companion_submit;
1361*61046927SAndroid Build Coastguard Worker };
1362*61046927SAndroid Build Coastguard Worker
1363*61046927SAndroid Build Coastguard Worker struct nir_xfb_info;
1364*61046927SAndroid Build Coastguard Worker struct anv_pipeline_bind_map;
1365*61046927SAndroid Build Coastguard Worker struct anv_pipeline_sets_layout;
1366*61046927SAndroid Build Coastguard Worker struct anv_push_descriptor_info;
1367*61046927SAndroid Build Coastguard Worker enum anv_dynamic_push_bits;
1368*61046927SAndroid Build Coastguard Worker
1369*61046927SAndroid Build Coastguard Worker void anv_device_init_embedded_samplers(struct anv_device *device);
1370*61046927SAndroid Build Coastguard Worker void anv_device_finish_embedded_samplers(struct anv_device *device);
1371*61046927SAndroid Build Coastguard Worker
1372*61046927SAndroid Build Coastguard Worker extern const struct vk_pipeline_cache_object_ops *const anv_cache_import_ops[2];
1373*61046927SAndroid Build Coastguard Worker
1374*61046927SAndroid Build Coastguard Worker struct anv_shader_bin *
1375*61046927SAndroid Build Coastguard Worker anv_device_search_for_kernel(struct anv_device *device,
1376*61046927SAndroid Build Coastguard Worker struct vk_pipeline_cache *cache,
1377*61046927SAndroid Build Coastguard Worker const void *key_data, uint32_t key_size,
1378*61046927SAndroid Build Coastguard Worker bool *user_cache_bit);
1379*61046927SAndroid Build Coastguard Worker
1380*61046927SAndroid Build Coastguard Worker struct anv_shader_upload_params;
1381*61046927SAndroid Build Coastguard Worker
1382*61046927SAndroid Build Coastguard Worker struct anv_shader_bin *
1383*61046927SAndroid Build Coastguard Worker anv_device_upload_kernel(struct anv_device *device,
1384*61046927SAndroid Build Coastguard Worker struct vk_pipeline_cache *cache,
1385*61046927SAndroid Build Coastguard Worker const struct anv_shader_upload_params *params);
1386*61046927SAndroid Build Coastguard Worker
1387*61046927SAndroid Build Coastguard Worker struct nir_shader;
1388*61046927SAndroid Build Coastguard Worker struct nir_shader_compiler_options;
1389*61046927SAndroid Build Coastguard Worker
1390*61046927SAndroid Build Coastguard Worker struct nir_shader *
1391*61046927SAndroid Build Coastguard Worker anv_device_search_for_nir(struct anv_device *device,
1392*61046927SAndroid Build Coastguard Worker struct vk_pipeline_cache *cache,
1393*61046927SAndroid Build Coastguard Worker const struct nir_shader_compiler_options *nir_options,
1394*61046927SAndroid Build Coastguard Worker unsigned char sha1_key[20],
1395*61046927SAndroid Build Coastguard Worker void *mem_ctx);
1396*61046927SAndroid Build Coastguard Worker
1397*61046927SAndroid Build Coastguard Worker void
1398*61046927SAndroid Build Coastguard Worker anv_device_upload_nir(struct anv_device *device,
1399*61046927SAndroid Build Coastguard Worker struct vk_pipeline_cache *cache,
1400*61046927SAndroid Build Coastguard Worker const struct nir_shader *nir,
1401*61046927SAndroid Build Coastguard Worker unsigned char sha1_key[20]);
1402*61046927SAndroid Build Coastguard Worker
1403*61046927SAndroid Build Coastguard Worker void
1404*61046927SAndroid Build Coastguard Worker anv_load_fp64_shader(struct anv_device *device);
1405*61046927SAndroid Build Coastguard Worker
1406*61046927SAndroid Build Coastguard Worker /**
1407*61046927SAndroid Build Coastguard Worker * This enum tracks the various HW instructions that hold graphics state
1408*61046927SAndroid Build Coastguard Worker * needing to be reprogrammed. Some instructions are grouped together as they
1409*61046927SAndroid Build Coastguard Worker * pretty much need to be emitted together (like 3DSTATE_URB_*).
1410*61046927SAndroid Build Coastguard Worker *
1411*61046927SAndroid Build Coastguard Worker * Not all bits apply to all platforms. We build a dirty state based on
1412*61046927SAndroid Build Coastguard Worker * enabled extensions & generation on anv_device.
1413*61046927SAndroid Build Coastguard Worker */
1414*61046927SAndroid Build Coastguard Worker enum anv_gfx_state_bits {
1415*61046927SAndroid Build Coastguard Worker /* Pipeline states */
1416*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_URB, /* All legacy stages, including mesh */
1417*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_VF_STATISTICS,
1418*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_VF_SGVS,
1419*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_VF_SGVS_2,
1420*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_VF_SGVS_VI, /* 3DSTATE_VERTEX_ELEMENTS for sgvs elements */
1421*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_VF_SGVS_INSTANCING, /* 3DSTATE_VF_INSTANCING for sgvs elements */
1422*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_PRIMITIVE_REPLICATION,
1423*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_SBE,
1424*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_SBE_SWIZ,
1425*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_SO_DECL_LIST,
1426*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_VS,
1427*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_HS,
1428*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_DS,
1429*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_GS,
1430*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_PS,
1431*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_SBE_MESH,
1432*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_CLIP_MESH,
1433*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_MESH_CONTROL,
1434*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_MESH_SHADER,
1435*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_MESH_DISTRIB,
1436*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_TASK_CONTROL,
1437*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_TASK_SHADER,
1438*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_TASK_REDISTRIB,
1439*61046927SAndroid Build Coastguard Worker /* Dynamic states */
1440*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_BLEND_STATE, /* Just the dynamic state structure */
1441*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_BLEND_STATE_PTR, /* The pointer to the dynamic state */
1442*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_CLIP,
1443*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_CC_STATE,
1444*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_CC_STATE_PTR,
1445*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_CPS,
1446*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_DEPTH_BOUNDS,
1447*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_INDEX_BUFFER,
1448*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_LINE_STIPPLE,
1449*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_MULTISAMPLE,
1450*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_PS_BLEND,
1451*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_RASTER,
1452*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_SAMPLE_MASK,
1453*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_SAMPLE_PATTERN,
1454*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_SCISSOR,
1455*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_SF,
1456*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_STREAMOUT,
1457*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_TE,
1458*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_VERTEX_INPUT,
1459*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_VF,
1460*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_VF_TOPOLOGY,
1461*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_VFG,
1462*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_VIEWPORT_CC,
1463*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_VIEWPORT_CC_PTR,
1464*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_VIEWPORT_SF_CLIP,
1465*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_WM,
1466*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_WM_DEPTH_STENCIL,
1467*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_PS_EXTRA,
1468*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_PMA_FIX, /* Fake state to implement workaround */
1469*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_WA_18019816803, /* Fake state to implement workaround */
1470*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_WA_14018283232, /* Fake state to implement workaround */
1471*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_TBIMR_TILE_PASS_INFO,
1472*61046927SAndroid Build Coastguard Worker
1473*61046927SAndroid Build Coastguard Worker ANV_GFX_STATE_MAX,
1474*61046927SAndroid Build Coastguard Worker };
1475*61046927SAndroid Build Coastguard Worker
1476*61046927SAndroid Build Coastguard Worker const char *anv_gfx_state_bit_to_str(enum anv_gfx_state_bits state);
1477*61046927SAndroid Build Coastguard Worker
1478*61046927SAndroid Build Coastguard Worker /* This structure tracks the values to program in HW instructions for
1479*61046927SAndroid Build Coastguard Worker * corresponding to dynamic states of the Vulkan API. Only fields that need to
1480*61046927SAndroid Build Coastguard Worker * be reemitted outside of the VkPipeline object are tracked here.
1481*61046927SAndroid Build Coastguard Worker */
1482*61046927SAndroid Build Coastguard Worker struct anv_gfx_dynamic_state {
1483*61046927SAndroid Build Coastguard Worker /* 3DSTATE_BLEND_STATE_POINTERS */
1484*61046927SAndroid Build Coastguard Worker struct {
1485*61046927SAndroid Build Coastguard Worker bool AlphaToCoverageEnable;
1486*61046927SAndroid Build Coastguard Worker bool AlphaToOneEnable;
1487*61046927SAndroid Build Coastguard Worker bool IndependentAlphaBlendEnable;
1488*61046927SAndroid Build Coastguard Worker bool ColorDitherEnable;
1489*61046927SAndroid Build Coastguard Worker struct {
1490*61046927SAndroid Build Coastguard Worker bool WriteDisableAlpha;
1491*61046927SAndroid Build Coastguard Worker bool WriteDisableRed;
1492*61046927SAndroid Build Coastguard Worker bool WriteDisableGreen;
1493*61046927SAndroid Build Coastguard Worker bool WriteDisableBlue;
1494*61046927SAndroid Build Coastguard Worker
1495*61046927SAndroid Build Coastguard Worker uint32_t LogicOpFunction;
1496*61046927SAndroid Build Coastguard Worker bool LogicOpEnable;
1497*61046927SAndroid Build Coastguard Worker
1498*61046927SAndroid Build Coastguard Worker bool ColorBufferBlendEnable;
1499*61046927SAndroid Build Coastguard Worker uint32_t ColorClampRange;
1500*61046927SAndroid Build Coastguard Worker bool PreBlendColorClampEnable;
1501*61046927SAndroid Build Coastguard Worker bool PostBlendColorClampEnable;
1502*61046927SAndroid Build Coastguard Worker uint32_t SourceBlendFactor;
1503*61046927SAndroid Build Coastguard Worker uint32_t DestinationBlendFactor;
1504*61046927SAndroid Build Coastguard Worker uint32_t ColorBlendFunction;
1505*61046927SAndroid Build Coastguard Worker uint32_t SourceAlphaBlendFactor;
1506*61046927SAndroid Build Coastguard Worker uint32_t DestinationAlphaBlendFactor;
1507*61046927SAndroid Build Coastguard Worker uint32_t AlphaBlendFunction;
1508*61046927SAndroid Build Coastguard Worker } rts[MAX_RTS];
1509*61046927SAndroid Build Coastguard Worker
1510*61046927SAndroid Build Coastguard Worker struct anv_state state;
1511*61046927SAndroid Build Coastguard Worker } blend;
1512*61046927SAndroid Build Coastguard Worker
1513*61046927SAndroid Build Coastguard Worker /* 3DSTATE_CC_STATE_POINTERS */
1514*61046927SAndroid Build Coastguard Worker struct {
1515*61046927SAndroid Build Coastguard Worker float BlendConstantColorRed;
1516*61046927SAndroid Build Coastguard Worker float BlendConstantColorGreen;
1517*61046927SAndroid Build Coastguard Worker float BlendConstantColorBlue;
1518*61046927SAndroid Build Coastguard Worker float BlendConstantColorAlpha;
1519*61046927SAndroid Build Coastguard Worker
1520*61046927SAndroid Build Coastguard Worker struct anv_state state;
1521*61046927SAndroid Build Coastguard Worker } cc;
1522*61046927SAndroid Build Coastguard Worker
1523*61046927SAndroid Build Coastguard Worker /* 3DSTATE_CLIP */
1524*61046927SAndroid Build Coastguard Worker struct {
1525*61046927SAndroid Build Coastguard Worker uint32_t APIMode;
1526*61046927SAndroid Build Coastguard Worker uint32_t ViewportXYClipTestEnable;
1527*61046927SAndroid Build Coastguard Worker uint32_t MaximumVPIndex;
1528*61046927SAndroid Build Coastguard Worker uint32_t TriangleStripListProvokingVertexSelect;
1529*61046927SAndroid Build Coastguard Worker uint32_t LineStripListProvokingVertexSelect;
1530*61046927SAndroid Build Coastguard Worker uint32_t TriangleFanProvokingVertexSelect;
1531*61046927SAndroid Build Coastguard Worker } clip;
1532*61046927SAndroid Build Coastguard Worker
1533*61046927SAndroid Build Coastguard Worker /* 3DSTATE_CPS/3DSTATE_CPS_POINTERS */
1534*61046927SAndroid Build Coastguard Worker struct {
1535*61046927SAndroid Build Coastguard Worker /* Gfx11 */
1536*61046927SAndroid Build Coastguard Worker uint32_t CoarsePixelShadingMode;
1537*61046927SAndroid Build Coastguard Worker float MinCPSizeX;
1538*61046927SAndroid Build Coastguard Worker float MinCPSizeY;
1539*61046927SAndroid Build Coastguard Worker /* Gfx12+ */
1540*61046927SAndroid Build Coastguard Worker uint32_t CoarsePixelShadingStateArrayPointer;
1541*61046927SAndroid Build Coastguard Worker } cps;
1542*61046927SAndroid Build Coastguard Worker
1543*61046927SAndroid Build Coastguard Worker /* 3DSTATE_DEPTH_BOUNDS */
1544*61046927SAndroid Build Coastguard Worker struct {
1545*61046927SAndroid Build Coastguard Worker bool DepthBoundsTestEnable;
1546*61046927SAndroid Build Coastguard Worker float DepthBoundsTestMinValue;
1547*61046927SAndroid Build Coastguard Worker float DepthBoundsTestMaxValue;
1548*61046927SAndroid Build Coastguard Worker } db;
1549*61046927SAndroid Build Coastguard Worker
1550*61046927SAndroid Build Coastguard Worker /* 3DSTATE_GS */
1551*61046927SAndroid Build Coastguard Worker struct {
1552*61046927SAndroid Build Coastguard Worker uint32_t ReorderMode;
1553*61046927SAndroid Build Coastguard Worker } gs;
1554*61046927SAndroid Build Coastguard Worker
1555*61046927SAndroid Build Coastguard Worker /* 3DSTATE_LINE_STIPPLE */
1556*61046927SAndroid Build Coastguard Worker struct {
1557*61046927SAndroid Build Coastguard Worker uint32_t LineStipplePattern;
1558*61046927SAndroid Build Coastguard Worker float LineStippleInverseRepeatCount;
1559*61046927SAndroid Build Coastguard Worker uint32_t LineStippleRepeatCount;
1560*61046927SAndroid Build Coastguard Worker } ls;
1561*61046927SAndroid Build Coastguard Worker
1562*61046927SAndroid Build Coastguard Worker /* 3DSTATE_MULTISAMPLE */
1563*61046927SAndroid Build Coastguard Worker struct {
1564*61046927SAndroid Build Coastguard Worker uint32_t NumberofMultisamples;
1565*61046927SAndroid Build Coastguard Worker } ms;
1566*61046927SAndroid Build Coastguard Worker
1567*61046927SAndroid Build Coastguard Worker /* 3DSTATE_PS */
1568*61046927SAndroid Build Coastguard Worker struct {
1569*61046927SAndroid Build Coastguard Worker uint32_t PositionXYOffsetSelect;
1570*61046927SAndroid Build Coastguard Worker
1571*61046927SAndroid Build Coastguard Worker uint32_t KernelStartPointer0;
1572*61046927SAndroid Build Coastguard Worker uint32_t KernelStartPointer1;
1573*61046927SAndroid Build Coastguard Worker uint32_t KernelStartPointer2;
1574*61046927SAndroid Build Coastguard Worker
1575*61046927SAndroid Build Coastguard Worker uint32_t DispatchGRFStartRegisterForConstantSetupData0;
1576*61046927SAndroid Build Coastguard Worker uint32_t DispatchGRFStartRegisterForConstantSetupData1;
1577*61046927SAndroid Build Coastguard Worker uint32_t DispatchGRFStartRegisterForConstantSetupData2;
1578*61046927SAndroid Build Coastguard Worker
1579*61046927SAndroid Build Coastguard Worker /* Pre-Gfx20 only */
1580*61046927SAndroid Build Coastguard Worker bool _8PixelDispatchEnable;
1581*61046927SAndroid Build Coastguard Worker bool _16PixelDispatchEnable;
1582*61046927SAndroid Build Coastguard Worker bool _32PixelDispatchEnable;
1583*61046927SAndroid Build Coastguard Worker
1584*61046927SAndroid Build Coastguard Worker /* Gfx20+ only */
1585*61046927SAndroid Build Coastguard Worker bool Kernel0Enable;
1586*61046927SAndroid Build Coastguard Worker bool Kernel1Enable;
1587*61046927SAndroid Build Coastguard Worker uint32_t Kernel0SIMDWidth;
1588*61046927SAndroid Build Coastguard Worker uint32_t Kernel1SIMDWidth;
1589*61046927SAndroid Build Coastguard Worker uint32_t Kernel0PolyPackingPolicy;
1590*61046927SAndroid Build Coastguard Worker } ps;
1591*61046927SAndroid Build Coastguard Worker
1592*61046927SAndroid Build Coastguard Worker /* 3DSTATE_PS_EXTRA */
1593*61046927SAndroid Build Coastguard Worker struct {
1594*61046927SAndroid Build Coastguard Worker bool PixelShaderHasUAV;
1595*61046927SAndroid Build Coastguard Worker bool PixelShaderIsPerSample;
1596*61046927SAndroid Build Coastguard Worker bool PixelShaderKillsPixel;
1597*61046927SAndroid Build Coastguard Worker bool PixelShaderIsPerCoarsePixel;
1598*61046927SAndroid Build Coastguard Worker bool EnablePSDependencyOnCPsizeChange;
1599*61046927SAndroid Build Coastguard Worker } ps_extra;
1600*61046927SAndroid Build Coastguard Worker
1601*61046927SAndroid Build Coastguard Worker /* 3DSTATE_PS_BLEND */
1602*61046927SAndroid Build Coastguard Worker struct {
1603*61046927SAndroid Build Coastguard Worker bool HasWriteableRT;
1604*61046927SAndroid Build Coastguard Worker bool ColorBufferBlendEnable;
1605*61046927SAndroid Build Coastguard Worker uint32_t SourceAlphaBlendFactor;
1606*61046927SAndroid Build Coastguard Worker uint32_t DestinationAlphaBlendFactor;
1607*61046927SAndroid Build Coastguard Worker uint32_t SourceBlendFactor;
1608*61046927SAndroid Build Coastguard Worker uint32_t DestinationBlendFactor;
1609*61046927SAndroid Build Coastguard Worker bool AlphaTestEnable;
1610*61046927SAndroid Build Coastguard Worker bool IndependentAlphaBlendEnable;
1611*61046927SAndroid Build Coastguard Worker bool AlphaToCoverageEnable;
1612*61046927SAndroid Build Coastguard Worker } ps_blend;
1613*61046927SAndroid Build Coastguard Worker
1614*61046927SAndroid Build Coastguard Worker /* 3DSTATE_RASTER */
1615*61046927SAndroid Build Coastguard Worker struct {
1616*61046927SAndroid Build Coastguard Worker uint32_t APIMode;
1617*61046927SAndroid Build Coastguard Worker bool DXMultisampleRasterizationEnable;
1618*61046927SAndroid Build Coastguard Worker bool AntialiasingEnable;
1619*61046927SAndroid Build Coastguard Worker uint32_t CullMode;
1620*61046927SAndroid Build Coastguard Worker uint32_t FrontWinding;
1621*61046927SAndroid Build Coastguard Worker bool GlobalDepthOffsetEnableSolid;
1622*61046927SAndroid Build Coastguard Worker bool GlobalDepthOffsetEnableWireframe;
1623*61046927SAndroid Build Coastguard Worker bool GlobalDepthOffsetEnablePoint;
1624*61046927SAndroid Build Coastguard Worker float GlobalDepthOffsetConstant;
1625*61046927SAndroid Build Coastguard Worker float GlobalDepthOffsetScale;
1626*61046927SAndroid Build Coastguard Worker float GlobalDepthOffsetClamp;
1627*61046927SAndroid Build Coastguard Worker uint32_t FrontFaceFillMode;
1628*61046927SAndroid Build Coastguard Worker uint32_t BackFaceFillMode;
1629*61046927SAndroid Build Coastguard Worker bool ViewportZFarClipTestEnable;
1630*61046927SAndroid Build Coastguard Worker bool ViewportZNearClipTestEnable;
1631*61046927SAndroid Build Coastguard Worker bool ConservativeRasterizationEnable;
1632*61046927SAndroid Build Coastguard Worker } raster;
1633*61046927SAndroid Build Coastguard Worker
1634*61046927SAndroid Build Coastguard Worker /* 3DSTATE_SCISSOR_STATE_POINTERS */
1635*61046927SAndroid Build Coastguard Worker struct {
1636*61046927SAndroid Build Coastguard Worker uint32_t count;
1637*61046927SAndroid Build Coastguard Worker struct {
1638*61046927SAndroid Build Coastguard Worker uint32_t ScissorRectangleYMin;
1639*61046927SAndroid Build Coastguard Worker uint32_t ScissorRectangleXMin;
1640*61046927SAndroid Build Coastguard Worker uint32_t ScissorRectangleYMax;
1641*61046927SAndroid Build Coastguard Worker uint32_t ScissorRectangleXMax;
1642*61046927SAndroid Build Coastguard Worker } elem[MAX_SCISSORS];
1643*61046927SAndroid Build Coastguard Worker } scissor;
1644*61046927SAndroid Build Coastguard Worker
1645*61046927SAndroid Build Coastguard Worker /* 3DSTATE_SF */
1646*61046927SAndroid Build Coastguard Worker struct {
1647*61046927SAndroid Build Coastguard Worker float LineWidth;
1648*61046927SAndroid Build Coastguard Worker uint32_t TriangleStripListProvokingVertexSelect;
1649*61046927SAndroid Build Coastguard Worker uint32_t LineStripListProvokingVertexSelect;
1650*61046927SAndroid Build Coastguard Worker uint32_t TriangleFanProvokingVertexSelect;
1651*61046927SAndroid Build Coastguard Worker bool LegacyGlobalDepthBiasEnable;
1652*61046927SAndroid Build Coastguard Worker } sf;
1653*61046927SAndroid Build Coastguard Worker
1654*61046927SAndroid Build Coastguard Worker /* 3DSTATE_STREAMOUT */
1655*61046927SAndroid Build Coastguard Worker struct {
1656*61046927SAndroid Build Coastguard Worker bool RenderingDisable;
1657*61046927SAndroid Build Coastguard Worker uint32_t RenderStreamSelect;
1658*61046927SAndroid Build Coastguard Worker uint32_t ReorderMode;
1659*61046927SAndroid Build Coastguard Worker uint32_t ForceRendering;
1660*61046927SAndroid Build Coastguard Worker } so;
1661*61046927SAndroid Build Coastguard Worker
1662*61046927SAndroid Build Coastguard Worker /* 3DSTATE_SAMPLE_MASK */
1663*61046927SAndroid Build Coastguard Worker struct {
1664*61046927SAndroid Build Coastguard Worker uint32_t SampleMask;
1665*61046927SAndroid Build Coastguard Worker } sm;
1666*61046927SAndroid Build Coastguard Worker
1667*61046927SAndroid Build Coastguard Worker /* 3DSTATE_TE */
1668*61046927SAndroid Build Coastguard Worker struct {
1669*61046927SAndroid Build Coastguard Worker uint32_t OutputTopology;
1670*61046927SAndroid Build Coastguard Worker } te;
1671*61046927SAndroid Build Coastguard Worker
1672*61046927SAndroid Build Coastguard Worker /* 3DSTATE_VF */
1673*61046927SAndroid Build Coastguard Worker struct {
1674*61046927SAndroid Build Coastguard Worker bool IndexedDrawCutIndexEnable;
1675*61046927SAndroid Build Coastguard Worker uint32_t CutIndex;
1676*61046927SAndroid Build Coastguard Worker } vf;
1677*61046927SAndroid Build Coastguard Worker
1678*61046927SAndroid Build Coastguard Worker /* 3DSTATE_VFG */
1679*61046927SAndroid Build Coastguard Worker struct {
1680*61046927SAndroid Build Coastguard Worker uint32_t DistributionMode;
1681*61046927SAndroid Build Coastguard Worker bool ListCutIndexEnable;
1682*61046927SAndroid Build Coastguard Worker } vfg;
1683*61046927SAndroid Build Coastguard Worker
1684*61046927SAndroid Build Coastguard Worker /* 3DSTATE_VF_TOPOLOGY */
1685*61046927SAndroid Build Coastguard Worker struct {
1686*61046927SAndroid Build Coastguard Worker uint32_t PrimitiveTopologyType;
1687*61046927SAndroid Build Coastguard Worker } vft;
1688*61046927SAndroid Build Coastguard Worker
1689*61046927SAndroid Build Coastguard Worker /* 3DSTATE_VIEWPORT_STATE_POINTERS_CC */
1690*61046927SAndroid Build Coastguard Worker struct {
1691*61046927SAndroid Build Coastguard Worker uint32_t count;
1692*61046927SAndroid Build Coastguard Worker struct {
1693*61046927SAndroid Build Coastguard Worker float MinimumDepth;
1694*61046927SAndroid Build Coastguard Worker float MaximumDepth;
1695*61046927SAndroid Build Coastguard Worker } elem[MAX_VIEWPORTS];
1696*61046927SAndroid Build Coastguard Worker
1697*61046927SAndroid Build Coastguard Worker struct anv_state state;
1698*61046927SAndroid Build Coastguard Worker } vp_cc;
1699*61046927SAndroid Build Coastguard Worker
1700*61046927SAndroid Build Coastguard Worker /* 3DSTATE_VIEWPORT_STATE_POINTERS_SF_CLIP */
1701*61046927SAndroid Build Coastguard Worker struct {
1702*61046927SAndroid Build Coastguard Worker uint32_t count;
1703*61046927SAndroid Build Coastguard Worker struct {
1704*61046927SAndroid Build Coastguard Worker float ViewportMatrixElementm00;
1705*61046927SAndroid Build Coastguard Worker float ViewportMatrixElementm11;
1706*61046927SAndroid Build Coastguard Worker float ViewportMatrixElementm22;
1707*61046927SAndroid Build Coastguard Worker float ViewportMatrixElementm30;
1708*61046927SAndroid Build Coastguard Worker float ViewportMatrixElementm31;
1709*61046927SAndroid Build Coastguard Worker float ViewportMatrixElementm32;
1710*61046927SAndroid Build Coastguard Worker float XMinClipGuardband;
1711*61046927SAndroid Build Coastguard Worker float XMaxClipGuardband;
1712*61046927SAndroid Build Coastguard Worker float YMinClipGuardband;
1713*61046927SAndroid Build Coastguard Worker float YMaxClipGuardband;
1714*61046927SAndroid Build Coastguard Worker float XMinViewPort;
1715*61046927SAndroid Build Coastguard Worker float XMaxViewPort;
1716*61046927SAndroid Build Coastguard Worker float YMinViewPort;
1717*61046927SAndroid Build Coastguard Worker float YMaxViewPort;
1718*61046927SAndroid Build Coastguard Worker } elem[MAX_VIEWPORTS];
1719*61046927SAndroid Build Coastguard Worker } vp_sf_clip;
1720*61046927SAndroid Build Coastguard Worker
1721*61046927SAndroid Build Coastguard Worker /* 3DSTATE_WM */
1722*61046927SAndroid Build Coastguard Worker struct {
1723*61046927SAndroid Build Coastguard Worker bool LineStippleEnable;
1724*61046927SAndroid Build Coastguard Worker uint32_t BarycentricInterpolationMode;
1725*61046927SAndroid Build Coastguard Worker } wm;
1726*61046927SAndroid Build Coastguard Worker
1727*61046927SAndroid Build Coastguard Worker /* 3DSTATE_WM_DEPTH_STENCIL */
1728*61046927SAndroid Build Coastguard Worker struct {
1729*61046927SAndroid Build Coastguard Worker bool DoubleSidedStencilEnable;
1730*61046927SAndroid Build Coastguard Worker uint32_t StencilTestMask;
1731*61046927SAndroid Build Coastguard Worker uint32_t StencilWriteMask;
1732*61046927SAndroid Build Coastguard Worker uint32_t BackfaceStencilTestMask;
1733*61046927SAndroid Build Coastguard Worker uint32_t BackfaceStencilWriteMask;
1734*61046927SAndroid Build Coastguard Worker uint32_t StencilReferenceValue;
1735*61046927SAndroid Build Coastguard Worker uint32_t BackfaceStencilReferenceValue;
1736*61046927SAndroid Build Coastguard Worker bool DepthTestEnable;
1737*61046927SAndroid Build Coastguard Worker bool DepthBufferWriteEnable;
1738*61046927SAndroid Build Coastguard Worker uint32_t DepthTestFunction;
1739*61046927SAndroid Build Coastguard Worker bool StencilTestEnable;
1740*61046927SAndroid Build Coastguard Worker bool StencilBufferWriteEnable;
1741*61046927SAndroid Build Coastguard Worker uint32_t StencilFailOp;
1742*61046927SAndroid Build Coastguard Worker uint32_t StencilPassDepthPassOp;
1743*61046927SAndroid Build Coastguard Worker uint32_t StencilPassDepthFailOp;
1744*61046927SAndroid Build Coastguard Worker uint32_t StencilTestFunction;
1745*61046927SAndroid Build Coastguard Worker uint32_t BackfaceStencilFailOp;
1746*61046927SAndroid Build Coastguard Worker uint32_t BackfaceStencilPassDepthPassOp;
1747*61046927SAndroid Build Coastguard Worker uint32_t BackfaceStencilPassDepthFailOp;
1748*61046927SAndroid Build Coastguard Worker uint32_t BackfaceStencilTestFunction;
1749*61046927SAndroid Build Coastguard Worker } ds;
1750*61046927SAndroid Build Coastguard Worker
1751*61046927SAndroid Build Coastguard Worker /* 3DSTATE_TBIMR_TILE_PASS_INFO */
1752*61046927SAndroid Build Coastguard Worker struct {
1753*61046927SAndroid Build Coastguard Worker unsigned TileRectangleHeight;
1754*61046927SAndroid Build Coastguard Worker unsigned TileRectangleWidth;
1755*61046927SAndroid Build Coastguard Worker unsigned VerticalTileCount;
1756*61046927SAndroid Build Coastguard Worker unsigned HorizontalTileCount;
1757*61046927SAndroid Build Coastguard Worker unsigned TBIMRBatchSize;
1758*61046927SAndroid Build Coastguard Worker unsigned TileBoxCheck;
1759*61046927SAndroid Build Coastguard Worker } tbimr;
1760*61046927SAndroid Build Coastguard Worker bool use_tbimr;
1761*61046927SAndroid Build Coastguard Worker
1762*61046927SAndroid Build Coastguard Worker bool pma_fix;
1763*61046927SAndroid Build Coastguard Worker
1764*61046927SAndroid Build Coastguard Worker /**
1765*61046927SAndroid Build Coastguard Worker * DEPTH and STENCIL attachment write state for Wa_18019816803.
1766*61046927SAndroid Build Coastguard Worker */
1767*61046927SAndroid Build Coastguard Worker bool ds_write_state;
1768*61046927SAndroid Build Coastguard Worker
1769*61046927SAndroid Build Coastguard Worker /**
1770*61046927SAndroid Build Coastguard Worker * Toggle tracking for Wa_14018283232.
1771*61046927SAndroid Build Coastguard Worker */
1772*61046927SAndroid Build Coastguard Worker bool wa_14018283232_toggle;
1773*61046927SAndroid Build Coastguard Worker
1774*61046927SAndroid Build Coastguard Worker BITSET_DECLARE(dirty, ANV_GFX_STATE_MAX);
1775*61046927SAndroid Build Coastguard Worker };
1776*61046927SAndroid Build Coastguard Worker
1777*61046927SAndroid Build Coastguard Worker enum anv_internal_kernel_name {
1778*61046927SAndroid Build Coastguard Worker ANV_INTERNAL_KERNEL_GENERATED_DRAWS,
1779*61046927SAndroid Build Coastguard Worker ANV_INTERNAL_KERNEL_COPY_QUERY_RESULTS_COMPUTE,
1780*61046927SAndroid Build Coastguard Worker ANV_INTERNAL_KERNEL_COPY_QUERY_RESULTS_FRAGMENT,
1781*61046927SAndroid Build Coastguard Worker ANV_INTERNAL_KERNEL_MEMCPY_COMPUTE,
1782*61046927SAndroid Build Coastguard Worker
1783*61046927SAndroid Build Coastguard Worker ANV_INTERNAL_KERNEL_COUNT,
1784*61046927SAndroid Build Coastguard Worker };
1785*61046927SAndroid Build Coastguard Worker
1786*61046927SAndroid Build Coastguard Worker enum anv_rt_bvh_build_method {
1787*61046927SAndroid Build Coastguard Worker ANV_BVH_BUILD_METHOD_TRIVIAL,
1788*61046927SAndroid Build Coastguard Worker ANV_BVH_BUILD_METHOD_NEW_SAH,
1789*61046927SAndroid Build Coastguard Worker };
1790*61046927SAndroid Build Coastguard Worker
1791*61046927SAndroid Build Coastguard Worker struct anv_device_astc_emu {
1792*61046927SAndroid Build Coastguard Worker struct vk_texcompress_astc_state *texcompress;
1793*61046927SAndroid Build Coastguard Worker
1794*61046927SAndroid Build Coastguard Worker /* for flush_astc_ldr_void_extent_denorms */
1795*61046927SAndroid Build Coastguard Worker simple_mtx_t mutex;
1796*61046927SAndroid Build Coastguard Worker VkDescriptorSetLayout ds_layout;
1797*61046927SAndroid Build Coastguard Worker VkPipelineLayout pipeline_layout;
1798*61046927SAndroid Build Coastguard Worker VkPipeline pipeline;
1799*61046927SAndroid Build Coastguard Worker };
1800*61046927SAndroid Build Coastguard Worker
1801*61046927SAndroid Build Coastguard Worker struct anv_device {
1802*61046927SAndroid Build Coastguard Worker struct vk_device vk;
1803*61046927SAndroid Build Coastguard Worker
1804*61046927SAndroid Build Coastguard Worker struct anv_physical_device * physical;
1805*61046927SAndroid Build Coastguard Worker const struct intel_device_info * info;
1806*61046927SAndroid Build Coastguard Worker const struct anv_kmd_backend * kmd_backend;
1807*61046927SAndroid Build Coastguard Worker struct isl_device isl_dev;
1808*61046927SAndroid Build Coastguard Worker union {
1809*61046927SAndroid Build Coastguard Worker uint32_t context_id; /* i915 */
1810*61046927SAndroid Build Coastguard Worker uint32_t vm_id; /* Xe */
1811*61046927SAndroid Build Coastguard Worker };
1812*61046927SAndroid Build Coastguard Worker int fd;
1813*61046927SAndroid Build Coastguard Worker
1814*61046927SAndroid Build Coastguard Worker pthread_mutex_t vma_mutex;
1815*61046927SAndroid Build Coastguard Worker struct util_vma_heap vma_lo;
1816*61046927SAndroid Build Coastguard Worker struct util_vma_heap vma_hi;
1817*61046927SAndroid Build Coastguard Worker struct util_vma_heap vma_desc;
1818*61046927SAndroid Build Coastguard Worker struct util_vma_heap vma_dynamic_visible;
1819*61046927SAndroid Build Coastguard Worker struct util_vma_heap vma_trtt;
1820*61046927SAndroid Build Coastguard Worker
1821*61046927SAndroid Build Coastguard Worker /** List of all anv_device_memory objects */
1822*61046927SAndroid Build Coastguard Worker struct list_head memory_objects;
1823*61046927SAndroid Build Coastguard Worker
1824*61046927SAndroid Build Coastguard Worker /** List of anv_image objects with a private binding for implicit CCS */
1825*61046927SAndroid Build Coastguard Worker struct list_head image_private_objects;
1826*61046927SAndroid Build Coastguard Worker
1827*61046927SAndroid Build Coastguard Worker /** Memory pool for batch buffers */
1828*61046927SAndroid Build Coastguard Worker struct anv_bo_pool batch_bo_pool;
1829*61046927SAndroid Build Coastguard Worker /** Memory pool for utrace timestamp buffers */
1830*61046927SAndroid Build Coastguard Worker struct anv_bo_pool utrace_bo_pool;
1831*61046927SAndroid Build Coastguard Worker /**
1832*61046927SAndroid Build Coastguard Worker * Size of the timestamp captured for utrace.
1833*61046927SAndroid Build Coastguard Worker */
1834*61046927SAndroid Build Coastguard Worker uint32_t utrace_timestamp_size;
1835*61046927SAndroid Build Coastguard Worker /** Memory pool for BVH build buffers */
1836*61046927SAndroid Build Coastguard Worker struct anv_bo_pool bvh_bo_pool;
1837*61046927SAndroid Build Coastguard Worker
1838*61046927SAndroid Build Coastguard Worker struct anv_bo_cache bo_cache;
1839*61046927SAndroid Build Coastguard Worker
1840*61046927SAndroid Build Coastguard Worker struct anv_state_pool general_state_pool;
1841*61046927SAndroid Build Coastguard Worker struct anv_state_pool aux_tt_pool;
1842*61046927SAndroid Build Coastguard Worker struct anv_state_pool dynamic_state_pool;
1843*61046927SAndroid Build Coastguard Worker struct anv_state_pool instruction_state_pool;
1844*61046927SAndroid Build Coastguard Worker struct anv_state_pool binding_table_pool;
1845*61046927SAndroid Build Coastguard Worker struct anv_state_pool scratch_surface_state_pool;
1846*61046927SAndroid Build Coastguard Worker struct anv_state_pool internal_surface_state_pool;
1847*61046927SAndroid Build Coastguard Worker struct anv_state_pool bindless_surface_state_pool;
1848*61046927SAndroid Build Coastguard Worker struct anv_state_pool indirect_push_descriptor_pool;
1849*61046927SAndroid Build Coastguard Worker struct anv_state_pool push_descriptor_buffer_pool;
1850*61046927SAndroid Build Coastguard Worker
1851*61046927SAndroid Build Coastguard Worker struct anv_state_reserved_array_pool custom_border_colors;
1852*61046927SAndroid Build Coastguard Worker
1853*61046927SAndroid Build Coastguard Worker /** BO used for various workarounds
1854*61046927SAndroid Build Coastguard Worker *
1855*61046927SAndroid Build Coastguard Worker * There are a number of workarounds on our hardware which require writing
1856*61046927SAndroid Build Coastguard Worker * data somewhere and it doesn't really matter where. For that, we use
1857*61046927SAndroid Build Coastguard Worker * this BO and just write to the first dword or so.
1858*61046927SAndroid Build Coastguard Worker *
1859*61046927SAndroid Build Coastguard Worker * We also need to be able to handle NULL buffers bound as pushed UBOs.
1860*61046927SAndroid Build Coastguard Worker * For that, we use the high bytes (>= 1024) of the workaround BO.
1861*61046927SAndroid Build Coastguard Worker */
1862*61046927SAndroid Build Coastguard Worker struct anv_bo * workaround_bo;
1863*61046927SAndroid Build Coastguard Worker struct anv_address workaround_address;
1864*61046927SAndroid Build Coastguard Worker
1865*61046927SAndroid Build Coastguard Worker struct anv_bo * dummy_aux_bo;
1866*61046927SAndroid Build Coastguard Worker
1867*61046927SAndroid Build Coastguard Worker /**
1868*61046927SAndroid Build Coastguard Worker * Workarounds for game bugs.
1869*61046927SAndroid Build Coastguard Worker */
1870*61046927SAndroid Build Coastguard Worker struct {
1871*61046927SAndroid Build Coastguard Worker struct set * doom64_images;
1872*61046927SAndroid Build Coastguard Worker } workarounds;
1873*61046927SAndroid Build Coastguard Worker
1874*61046927SAndroid Build Coastguard Worker struct anv_bo * trivial_batch_bo;
1875*61046927SAndroid Build Coastguard Worker struct anv_state null_surface_state;
1876*61046927SAndroid Build Coastguard Worker
1877*61046927SAndroid Build Coastguard Worker /**
1878*61046927SAndroid Build Coastguard Worker * NULL surface state copy stored in host memory for use as a fast
1879*61046927SAndroid Build Coastguard Worker * memcpy() source.
1880*61046927SAndroid Build Coastguard Worker */
1881*61046927SAndroid Build Coastguard Worker char host_null_surface_state[ANV_SURFACE_STATE_SIZE];
1882*61046927SAndroid Build Coastguard Worker
1883*61046927SAndroid Build Coastguard Worker struct vk_pipeline_cache * internal_cache;
1884*61046927SAndroid Build Coastguard Worker
1885*61046927SAndroid Build Coastguard Worker struct {
1886*61046927SAndroid Build Coastguard Worker struct blorp_context context;
1887*61046927SAndroid Build Coastguard Worker struct anv_state dynamic_states[BLORP_DYNAMIC_STATE_COUNT];
1888*61046927SAndroid Build Coastguard Worker } blorp;
1889*61046927SAndroid Build Coastguard Worker
1890*61046927SAndroid Build Coastguard Worker struct anv_state border_colors;
1891*61046927SAndroid Build Coastguard Worker
1892*61046927SAndroid Build Coastguard Worker struct anv_state slice_hash;
1893*61046927SAndroid Build Coastguard Worker
1894*61046927SAndroid Build Coastguard Worker /** An array of CPS_STATE structures grouped by MAX_VIEWPORTS elements
1895*61046927SAndroid Build Coastguard Worker *
1896*61046927SAndroid Build Coastguard Worker * We need to emit CPS_STATE structures for each viewport accessible by a
1897*61046927SAndroid Build Coastguard Worker * pipeline. So rather than write many identical CPS_STATE structures
1898*61046927SAndroid Build Coastguard Worker * dynamically, we can enumerate all possible combinaisons and then just
1899*61046927SAndroid Build Coastguard Worker * emit a 3DSTATE_CPS_POINTERS instruction with the right offset into this
1900*61046927SAndroid Build Coastguard Worker * array.
1901*61046927SAndroid Build Coastguard Worker */
1902*61046927SAndroid Build Coastguard Worker struct anv_state cps_states;
1903*61046927SAndroid Build Coastguard Worker
1904*61046927SAndroid Build Coastguard Worker uint32_t queue_count;
1905*61046927SAndroid Build Coastguard Worker struct anv_queue * queues;
1906*61046927SAndroid Build Coastguard Worker
1907*61046927SAndroid Build Coastguard Worker struct anv_scratch_pool scratch_pool;
1908*61046927SAndroid Build Coastguard Worker struct anv_scratch_pool protected_scratch_pool;
1909*61046927SAndroid Build Coastguard Worker struct anv_bo *rt_scratch_bos[16];
1910*61046927SAndroid Build Coastguard Worker struct anv_bo *btd_fifo_bo;
1911*61046927SAndroid Build Coastguard Worker struct anv_address rt_uuid_addr;
1912*61046927SAndroid Build Coastguard Worker
1913*61046927SAndroid Build Coastguard Worker bool robust_buffer_access;
1914*61046927SAndroid Build Coastguard Worker
1915*61046927SAndroid Build Coastguard Worker uint32_t protected_session_id;
1916*61046927SAndroid Build Coastguard Worker
1917*61046927SAndroid Build Coastguard Worker /** Shadow ray query BO
1918*61046927SAndroid Build Coastguard Worker *
1919*61046927SAndroid Build Coastguard Worker * The ray_query_bo only holds the current ray being traced. When using
1920*61046927SAndroid Build Coastguard Worker * more than 1 ray query per thread, we cannot fit all the queries in
1921*61046927SAndroid Build Coastguard Worker * there, so we need a another buffer to hold query data that is not
1922*61046927SAndroid Build Coastguard Worker * currently being used by the HW for tracing, similar to a scratch space.
1923*61046927SAndroid Build Coastguard Worker *
1924*61046927SAndroid Build Coastguard Worker * The size of the shadow buffer depends on the number of queries per
1925*61046927SAndroid Build Coastguard Worker * shader.
1926*61046927SAndroid Build Coastguard Worker */
1927*61046927SAndroid Build Coastguard Worker struct anv_bo *ray_query_shadow_bos[16];
1928*61046927SAndroid Build Coastguard Worker /** Ray query buffer used to communicated with HW unit.
1929*61046927SAndroid Build Coastguard Worker */
1930*61046927SAndroid Build Coastguard Worker struct anv_bo *ray_query_bo;
1931*61046927SAndroid Build Coastguard Worker
1932*61046927SAndroid Build Coastguard Worker struct anv_shader_bin *rt_trampoline;
1933*61046927SAndroid Build Coastguard Worker struct anv_shader_bin *rt_trivial_return;
1934*61046927SAndroid Build Coastguard Worker
1935*61046927SAndroid Build Coastguard Worker enum anv_rt_bvh_build_method bvh_build_method;
1936*61046927SAndroid Build Coastguard Worker
1937*61046927SAndroid Build Coastguard Worker /** Draw generation shader
1938*61046927SAndroid Build Coastguard Worker *
1939*61046927SAndroid Build Coastguard Worker * Generates direct draw calls out of indirect parameters. Used to
1940*61046927SAndroid Build Coastguard Worker * workaround slowness with indirect draw calls.
1941*61046927SAndroid Build Coastguard Worker */
1942*61046927SAndroid Build Coastguard Worker struct anv_shader_bin *internal_kernels[ANV_INTERNAL_KERNEL_COUNT];
1943*61046927SAndroid Build Coastguard Worker const struct intel_l3_config *internal_kernels_l3_config;
1944*61046927SAndroid Build Coastguard Worker
1945*61046927SAndroid Build Coastguard Worker pthread_mutex_t mutex;
1946*61046927SAndroid Build Coastguard Worker pthread_cond_t queue_submit;
1947*61046927SAndroid Build Coastguard Worker
1948*61046927SAndroid Build Coastguard Worker struct intel_batch_decode_ctx decoder[ANV_MAX_QUEUE_FAMILIES];
1949*61046927SAndroid Build Coastguard Worker /*
1950*61046927SAndroid Build Coastguard Worker * When decoding a anv_cmd_buffer, we might need to search for BOs through
1951*61046927SAndroid Build Coastguard Worker * the cmd_buffer's list.
1952*61046927SAndroid Build Coastguard Worker */
1953*61046927SAndroid Build Coastguard Worker struct anv_cmd_buffer *cmd_buffer_being_decoded;
1954*61046927SAndroid Build Coastguard Worker
1955*61046927SAndroid Build Coastguard Worker int perf_fd; /* -1 if no opened */
1956*61046927SAndroid Build Coastguard Worker struct anv_queue *perf_queue;
1957*61046927SAndroid Build Coastguard Worker
1958*61046927SAndroid Build Coastguard Worker struct intel_aux_map_context *aux_map_ctx;
1959*61046927SAndroid Build Coastguard Worker
1960*61046927SAndroid Build Coastguard Worker const struct intel_l3_config *l3_config;
1961*61046927SAndroid Build Coastguard Worker
1962*61046927SAndroid Build Coastguard Worker struct intel_debug_block_frame *debug_frame_desc;
1963*61046927SAndroid Build Coastguard Worker
1964*61046927SAndroid Build Coastguard Worker struct intel_ds_device ds;
1965*61046927SAndroid Build Coastguard Worker
1966*61046927SAndroid Build Coastguard Worker nir_shader *fp64_nir;
1967*61046927SAndroid Build Coastguard Worker
1968*61046927SAndroid Build Coastguard Worker uint32_t draw_call_count;
1969*61046927SAndroid Build Coastguard Worker struct anv_state breakpoint;
1970*61046927SAndroid Build Coastguard Worker #if DETECT_OS_ANDROID
1971*61046927SAndroid Build Coastguard Worker struct u_gralloc *u_gralloc;
1972*61046927SAndroid Build Coastguard Worker #endif
1973*61046927SAndroid Build Coastguard Worker
1974*61046927SAndroid Build Coastguard Worker /** Precompute all dirty graphics bits
1975*61046927SAndroid Build Coastguard Worker *
1976*61046927SAndroid Build Coastguard Worker * Depending on platforms, some of the dirty bits don't apply (for example
1977*61046927SAndroid Build Coastguard Worker * 3DSTATE_PRIMITIVE_REPLICATION is only Gfx12.0+). Disabling some
1978*61046927SAndroid Build Coastguard Worker * extensions like Mesh shaders also allow us to avoid emitting any
1979*61046927SAndroid Build Coastguard Worker * mesh/task related instructions (we only initialize them once at device
1980*61046927SAndroid Build Coastguard Worker * initialization).
1981*61046927SAndroid Build Coastguard Worker */
1982*61046927SAndroid Build Coastguard Worker BITSET_DECLARE(gfx_dirty_state, ANV_GFX_STATE_MAX);
1983*61046927SAndroid Build Coastguard Worker
1984*61046927SAndroid Build Coastguard Worker /*
1985*61046927SAndroid Build Coastguard Worker * Command pool for companion RCS command buffer.
1986*61046927SAndroid Build Coastguard Worker */
1987*61046927SAndroid Build Coastguard Worker VkCommandPool companion_rcs_cmd_pool;
1988*61046927SAndroid Build Coastguard Worker
1989*61046927SAndroid Build Coastguard Worker struct anv_trtt {
1990*61046927SAndroid Build Coastguard Worker simple_mtx_t mutex;
1991*61046927SAndroid Build Coastguard Worker
1992*61046927SAndroid Build Coastguard Worker /* Sometimes we need to run batches from places where we don't have a
1993*61046927SAndroid Build Coastguard Worker * queue coming from the API, so we use this.
1994*61046927SAndroid Build Coastguard Worker */
1995*61046927SAndroid Build Coastguard Worker struct anv_queue *queue;
1996*61046927SAndroid Build Coastguard Worker
1997*61046927SAndroid Build Coastguard Worker /* There's only one L3 table, so if l3_addr is zero that means we
1998*61046927SAndroid Build Coastguard Worker * didn't initialize the TR-TT context yet (i.e., we're not using TR-TT
1999*61046927SAndroid Build Coastguard Worker * yet in this context).
2000*61046927SAndroid Build Coastguard Worker */
2001*61046927SAndroid Build Coastguard Worker uint64_t l3_addr;
2002*61046927SAndroid Build Coastguard Worker
2003*61046927SAndroid Build Coastguard Worker /* We don't want to access the page tables from the CPU, so just
2004*61046927SAndroid Build Coastguard Worker * maintain a mirror that we can use.
2005*61046927SAndroid Build Coastguard Worker */
2006*61046927SAndroid Build Coastguard Worker uint64_t *l3_mirror;
2007*61046927SAndroid Build Coastguard Worker uint64_t *l2_mirror;
2008*61046927SAndroid Build Coastguard Worker
2009*61046927SAndroid Build Coastguard Worker /* We keep a dynamic list of page table bos, and each bo can store
2010*61046927SAndroid Build Coastguard Worker * multiple page tables.
2011*61046927SAndroid Build Coastguard Worker */
2012*61046927SAndroid Build Coastguard Worker struct anv_bo **page_table_bos;
2013*61046927SAndroid Build Coastguard Worker int num_page_table_bos;
2014*61046927SAndroid Build Coastguard Worker int page_table_bos_capacity;
2015*61046927SAndroid Build Coastguard Worker
2016*61046927SAndroid Build Coastguard Worker /* These are used to keep track of space available for more page tables
2017*61046927SAndroid Build Coastguard Worker * within a bo.
2018*61046927SAndroid Build Coastguard Worker */
2019*61046927SAndroid Build Coastguard Worker struct anv_bo *cur_page_table_bo;
2020*61046927SAndroid Build Coastguard Worker uint64_t next_page_table_bo_offset;
2021*61046927SAndroid Build Coastguard Worker
2022*61046927SAndroid Build Coastguard Worker struct vk_sync *timeline;
2023*61046927SAndroid Build Coastguard Worker uint64_t timeline_val;
2024*61046927SAndroid Build Coastguard Worker
2025*61046927SAndroid Build Coastguard Worker /* List of struct anv_trtt_submission that are in flight and can be
2026*61046927SAndroid Build Coastguard Worker * freed once their vk_sync gets signaled.
2027*61046927SAndroid Build Coastguard Worker */
2028*61046927SAndroid Build Coastguard Worker struct list_head in_flight_batches;
2029*61046927SAndroid Build Coastguard Worker } trtt;
2030*61046927SAndroid Build Coastguard Worker
2031*61046927SAndroid Build Coastguard Worker /* Number of sparse resources that currently exist. This is used for a
2032*61046927SAndroid Build Coastguard Worker * workaround that makes every memoryBarrier flush more things than it
2033*61046927SAndroid Build Coastguard Worker * should. Some workloads create and then immediately destroy sparse
2034*61046927SAndroid Build Coastguard Worker * resources when they start, so just counting if a sparse resource was
2035*61046927SAndroid Build Coastguard Worker * ever created is not enough.
2036*61046927SAndroid Build Coastguard Worker */
2037*61046927SAndroid Build Coastguard Worker uint32_t num_sparse_resources;
2038*61046927SAndroid Build Coastguard Worker
2039*61046927SAndroid Build Coastguard Worker struct anv_device_astc_emu astc_emu;
2040*61046927SAndroid Build Coastguard Worker
2041*61046927SAndroid Build Coastguard Worker struct intel_bind_timeline bind_timeline; /* Xe only */
2042*61046927SAndroid Build Coastguard Worker
2043*61046927SAndroid Build Coastguard Worker struct {
2044*61046927SAndroid Build Coastguard Worker simple_mtx_t mutex;
2045*61046927SAndroid Build Coastguard Worker struct hash_table *map;
2046*61046927SAndroid Build Coastguard Worker } embedded_samplers;
2047*61046927SAndroid Build Coastguard Worker
2048*61046927SAndroid Build Coastguard Worker struct {
2049*61046927SAndroid Build Coastguard Worker /**
2050*61046927SAndroid Build Coastguard Worker * Mutex for the printfs array
2051*61046927SAndroid Build Coastguard Worker */
2052*61046927SAndroid Build Coastguard Worker simple_mtx_t mutex;
2053*61046927SAndroid Build Coastguard Worker /**
2054*61046927SAndroid Build Coastguard Worker * Buffer in which the shader printfs are stored
2055*61046927SAndroid Build Coastguard Worker */
2056*61046927SAndroid Build Coastguard Worker struct anv_bo *bo;
2057*61046927SAndroid Build Coastguard Worker /**
2058*61046927SAndroid Build Coastguard Worker * Array of pointers to u_printf_info
2059*61046927SAndroid Build Coastguard Worker */
2060*61046927SAndroid Build Coastguard Worker struct util_dynarray prints;
2061*61046927SAndroid Build Coastguard Worker } printf;
2062*61046927SAndroid Build Coastguard Worker };
2063*61046927SAndroid Build Coastguard Worker
2064*61046927SAndroid Build Coastguard Worker static inline uint32_t
anv_get_first_render_queue_index(struct anv_physical_device * pdevice)2065*61046927SAndroid Build Coastguard Worker anv_get_first_render_queue_index(struct anv_physical_device *pdevice)
2066*61046927SAndroid Build Coastguard Worker {
2067*61046927SAndroid Build Coastguard Worker assert(pdevice != NULL);
2068*61046927SAndroid Build Coastguard Worker
2069*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < pdevice->queue.family_count; i++) {
2070*61046927SAndroid Build Coastguard Worker if (pdevice->queue.families[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) {
2071*61046927SAndroid Build Coastguard Worker return i;
2072*61046927SAndroid Build Coastguard Worker }
2073*61046927SAndroid Build Coastguard Worker }
2074*61046927SAndroid Build Coastguard Worker
2075*61046927SAndroid Build Coastguard Worker unreachable("Graphics capable queue family not found");
2076*61046927SAndroid Build Coastguard Worker }
2077*61046927SAndroid Build Coastguard Worker
2078*61046927SAndroid Build Coastguard Worker static inline struct anv_state
anv_binding_table_pool_alloc(struct anv_device * device)2079*61046927SAndroid Build Coastguard Worker anv_binding_table_pool_alloc(struct anv_device *device)
2080*61046927SAndroid Build Coastguard Worker {
2081*61046927SAndroid Build Coastguard Worker return anv_state_pool_alloc(&device->binding_table_pool,
2082*61046927SAndroid Build Coastguard Worker device->binding_table_pool.block_size, 0);
2083*61046927SAndroid Build Coastguard Worker }
2084*61046927SAndroid Build Coastguard Worker
2085*61046927SAndroid Build Coastguard Worker static inline void
anv_binding_table_pool_free(struct anv_device * device,struct anv_state state)2086*61046927SAndroid Build Coastguard Worker anv_binding_table_pool_free(struct anv_device *device, struct anv_state state)
2087*61046927SAndroid Build Coastguard Worker {
2088*61046927SAndroid Build Coastguard Worker anv_state_pool_free(&device->binding_table_pool, state);
2089*61046927SAndroid Build Coastguard Worker }
2090*61046927SAndroid Build Coastguard Worker
2091*61046927SAndroid Build Coastguard Worker static inline struct anv_state
anv_null_surface_state_for_binding_table(struct anv_device * device)2092*61046927SAndroid Build Coastguard Worker anv_null_surface_state_for_binding_table(struct anv_device *device)
2093*61046927SAndroid Build Coastguard Worker {
2094*61046927SAndroid Build Coastguard Worker struct anv_state state = device->null_surface_state;
2095*61046927SAndroid Build Coastguard Worker if (device->physical->indirect_descriptors) {
2096*61046927SAndroid Build Coastguard Worker state.offset += device->physical->va.bindless_surface_state_pool.addr -
2097*61046927SAndroid Build Coastguard Worker device->physical->va.internal_surface_state_pool.addr;
2098*61046927SAndroid Build Coastguard Worker }
2099*61046927SAndroid Build Coastguard Worker return state;
2100*61046927SAndroid Build Coastguard Worker }
2101*61046927SAndroid Build Coastguard Worker
2102*61046927SAndroid Build Coastguard Worker static inline struct anv_state
anv_bindless_state_for_binding_table(struct anv_device * device,struct anv_state state)2103*61046927SAndroid Build Coastguard Worker anv_bindless_state_for_binding_table(struct anv_device *device,
2104*61046927SAndroid Build Coastguard Worker struct anv_state state)
2105*61046927SAndroid Build Coastguard Worker {
2106*61046927SAndroid Build Coastguard Worker state.offset += device->physical->va.bindless_surface_state_pool.addr -
2107*61046927SAndroid Build Coastguard Worker device->physical->va.internal_surface_state_pool.addr;
2108*61046927SAndroid Build Coastguard Worker return state;
2109*61046927SAndroid Build Coastguard Worker }
2110*61046927SAndroid Build Coastguard Worker
2111*61046927SAndroid Build Coastguard Worker static inline struct anv_state
anv_device_maybe_alloc_surface_state(struct anv_device * device,struct anv_state_stream * surface_state_stream)2112*61046927SAndroid Build Coastguard Worker anv_device_maybe_alloc_surface_state(struct anv_device *device,
2113*61046927SAndroid Build Coastguard Worker struct anv_state_stream *surface_state_stream)
2114*61046927SAndroid Build Coastguard Worker {
2115*61046927SAndroid Build Coastguard Worker if (device->physical->indirect_descriptors) {
2116*61046927SAndroid Build Coastguard Worker if (surface_state_stream)
2117*61046927SAndroid Build Coastguard Worker return anv_state_stream_alloc(surface_state_stream, 64, 64);
2118*61046927SAndroid Build Coastguard Worker return anv_state_pool_alloc(&device->bindless_surface_state_pool, 64, 64);
2119*61046927SAndroid Build Coastguard Worker } else {
2120*61046927SAndroid Build Coastguard Worker return ANV_STATE_NULL;
2121*61046927SAndroid Build Coastguard Worker }
2122*61046927SAndroid Build Coastguard Worker }
2123*61046927SAndroid Build Coastguard Worker
2124*61046927SAndroid Build Coastguard Worker static inline uint32_t
anv_mocs(const struct anv_device * device,const struct anv_bo * bo,isl_surf_usage_flags_t usage)2125*61046927SAndroid Build Coastguard Worker anv_mocs(const struct anv_device *device,
2126*61046927SAndroid Build Coastguard Worker const struct anv_bo *bo,
2127*61046927SAndroid Build Coastguard Worker isl_surf_usage_flags_t usage)
2128*61046927SAndroid Build Coastguard Worker {
2129*61046927SAndroid Build Coastguard Worker return isl_mocs(&device->isl_dev, usage, bo && anv_bo_is_external(bo));
2130*61046927SAndroid Build Coastguard Worker }
2131*61046927SAndroid Build Coastguard Worker
2132*61046927SAndroid Build Coastguard Worker static inline uint32_t
anv_mocs_for_address(const struct anv_device * device,const struct anv_address * addr)2133*61046927SAndroid Build Coastguard Worker anv_mocs_for_address(const struct anv_device *device,
2134*61046927SAndroid Build Coastguard Worker const struct anv_address *addr)
2135*61046927SAndroid Build Coastguard Worker {
2136*61046927SAndroid Build Coastguard Worker return anv_mocs(device, addr->bo, 0);
2137*61046927SAndroid Build Coastguard Worker }
2138*61046927SAndroid Build Coastguard Worker
2139*61046927SAndroid Build Coastguard Worker void anv_device_init_blorp(struct anv_device *device);
2140*61046927SAndroid Build Coastguard Worker void anv_device_finish_blorp(struct anv_device *device);
2141*61046927SAndroid Build Coastguard Worker
2142*61046927SAndroid Build Coastguard Worker VkResult anv_device_alloc_bo(struct anv_device *device,
2143*61046927SAndroid Build Coastguard Worker const char *name, uint64_t size,
2144*61046927SAndroid Build Coastguard Worker enum anv_bo_alloc_flags alloc_flags,
2145*61046927SAndroid Build Coastguard Worker uint64_t explicit_address,
2146*61046927SAndroid Build Coastguard Worker struct anv_bo **bo);
2147*61046927SAndroid Build Coastguard Worker VkResult anv_device_map_bo(struct anv_device *device,
2148*61046927SAndroid Build Coastguard Worker struct anv_bo *bo,
2149*61046927SAndroid Build Coastguard Worker uint64_t offset,
2150*61046927SAndroid Build Coastguard Worker size_t size,
2151*61046927SAndroid Build Coastguard Worker void *placed_addr,
2152*61046927SAndroid Build Coastguard Worker void **map_out);
2153*61046927SAndroid Build Coastguard Worker VkResult anv_device_unmap_bo(struct anv_device *device,
2154*61046927SAndroid Build Coastguard Worker struct anv_bo *bo,
2155*61046927SAndroid Build Coastguard Worker void *map, size_t map_size,
2156*61046927SAndroid Build Coastguard Worker bool replace);
2157*61046927SAndroid Build Coastguard Worker VkResult anv_device_import_bo_from_host_ptr(struct anv_device *device,
2158*61046927SAndroid Build Coastguard Worker void *host_ptr, uint32_t size,
2159*61046927SAndroid Build Coastguard Worker enum anv_bo_alloc_flags alloc_flags,
2160*61046927SAndroid Build Coastguard Worker uint64_t client_address,
2161*61046927SAndroid Build Coastguard Worker struct anv_bo **bo_out);
2162*61046927SAndroid Build Coastguard Worker VkResult anv_device_import_bo(struct anv_device *device, int fd,
2163*61046927SAndroid Build Coastguard Worker enum anv_bo_alloc_flags alloc_flags,
2164*61046927SAndroid Build Coastguard Worker uint64_t client_address,
2165*61046927SAndroid Build Coastguard Worker struct anv_bo **bo);
2166*61046927SAndroid Build Coastguard Worker VkResult anv_device_export_bo(struct anv_device *device,
2167*61046927SAndroid Build Coastguard Worker struct anv_bo *bo, int *fd_out);
2168*61046927SAndroid Build Coastguard Worker VkResult anv_device_get_bo_tiling(struct anv_device *device,
2169*61046927SAndroid Build Coastguard Worker struct anv_bo *bo,
2170*61046927SAndroid Build Coastguard Worker enum isl_tiling *tiling_out);
2171*61046927SAndroid Build Coastguard Worker VkResult anv_device_set_bo_tiling(struct anv_device *device,
2172*61046927SAndroid Build Coastguard Worker struct anv_bo *bo,
2173*61046927SAndroid Build Coastguard Worker uint32_t row_pitch_B,
2174*61046927SAndroid Build Coastguard Worker enum isl_tiling tiling);
2175*61046927SAndroid Build Coastguard Worker void anv_device_release_bo(struct anv_device *device,
2176*61046927SAndroid Build Coastguard Worker struct anv_bo *bo);
2177*61046927SAndroid Build Coastguard Worker
anv_device_set_physical(struct anv_device * device,struct anv_physical_device * physical_device)2178*61046927SAndroid Build Coastguard Worker static inline void anv_device_set_physical(struct anv_device *device,
2179*61046927SAndroid Build Coastguard Worker struct anv_physical_device *physical_device)
2180*61046927SAndroid Build Coastguard Worker {
2181*61046927SAndroid Build Coastguard Worker device->physical = physical_device;
2182*61046927SAndroid Build Coastguard Worker device->info = &physical_device->info;
2183*61046927SAndroid Build Coastguard Worker device->isl_dev = physical_device->isl_dev;
2184*61046927SAndroid Build Coastguard Worker }
2185*61046927SAndroid Build Coastguard Worker
2186*61046927SAndroid Build Coastguard Worker static inline struct anv_bo *
anv_device_lookup_bo(struct anv_device * device,uint32_t gem_handle)2187*61046927SAndroid Build Coastguard Worker anv_device_lookup_bo(struct anv_device *device, uint32_t gem_handle)
2188*61046927SAndroid Build Coastguard Worker {
2189*61046927SAndroid Build Coastguard Worker return util_sparse_array_get(&device->bo_cache.bo_map, gem_handle);
2190*61046927SAndroid Build Coastguard Worker }
2191*61046927SAndroid Build Coastguard Worker
2192*61046927SAndroid Build Coastguard Worker VkResult anv_device_wait(struct anv_device *device, struct anv_bo *bo,
2193*61046927SAndroid Build Coastguard Worker int64_t timeout);
2194*61046927SAndroid Build Coastguard Worker
2195*61046927SAndroid Build Coastguard Worker VkResult anv_device_print_init(struct anv_device *device);
2196*61046927SAndroid Build Coastguard Worker void anv_device_print_fini(struct anv_device *device);
2197*61046927SAndroid Build Coastguard Worker void anv_device_print_shader_prints(struct anv_device *device);
2198*61046927SAndroid Build Coastguard Worker
2199*61046927SAndroid Build Coastguard Worker VkResult anv_queue_init(struct anv_device *device, struct anv_queue *queue,
2200*61046927SAndroid Build Coastguard Worker const VkDeviceQueueCreateInfo *pCreateInfo,
2201*61046927SAndroid Build Coastguard Worker uint32_t index_in_family);
2202*61046927SAndroid Build Coastguard Worker void anv_queue_finish(struct anv_queue *queue);
2203*61046927SAndroid Build Coastguard Worker
2204*61046927SAndroid Build Coastguard Worker VkResult anv_queue_submit(struct vk_queue *queue,
2205*61046927SAndroid Build Coastguard Worker struct vk_queue_submit *submit);
2206*61046927SAndroid Build Coastguard Worker
2207*61046927SAndroid Build Coastguard Worker void anv_queue_trace(struct anv_queue *queue, const char *label,
2208*61046927SAndroid Build Coastguard Worker bool frame, bool begin);
2209*61046927SAndroid Build Coastguard Worker
2210*61046927SAndroid Build Coastguard Worker static inline VkResult
anv_queue_post_submit(struct anv_queue * queue,VkResult submit_result)2211*61046927SAndroid Build Coastguard Worker anv_queue_post_submit(struct anv_queue *queue, VkResult submit_result)
2212*61046927SAndroid Build Coastguard Worker {
2213*61046927SAndroid Build Coastguard Worker if (submit_result != VK_SUCCESS)
2214*61046927SAndroid Build Coastguard Worker return submit_result;
2215*61046927SAndroid Build Coastguard Worker
2216*61046927SAndroid Build Coastguard Worker VkResult result = VK_SUCCESS;
2217*61046927SAndroid Build Coastguard Worker if (queue->sync) {
2218*61046927SAndroid Build Coastguard Worker result = vk_sync_wait(&queue->device->vk, queue->sync, 0,
2219*61046927SAndroid Build Coastguard Worker VK_SYNC_WAIT_COMPLETE, UINT64_MAX);
2220*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS)
2221*61046927SAndroid Build Coastguard Worker result = vk_queue_set_lost(&queue->vk, "sync wait failed");
2222*61046927SAndroid Build Coastguard Worker }
2223*61046927SAndroid Build Coastguard Worker
2224*61046927SAndroid Build Coastguard Worker if (INTEL_DEBUG(DEBUG_SHADER_PRINT))
2225*61046927SAndroid Build Coastguard Worker anv_device_print_shader_prints(queue->device);
2226*61046927SAndroid Build Coastguard Worker
2227*61046927SAndroid Build Coastguard Worker return result;
2228*61046927SAndroid Build Coastguard Worker }
2229*61046927SAndroid Build Coastguard Worker
2230*61046927SAndroid Build Coastguard Worker int anv_gem_wait(struct anv_device *device, uint32_t gem_handle, int64_t *timeout_ns);
2231*61046927SAndroid Build Coastguard Worker int anv_gem_set_tiling(struct anv_device *device, uint32_t gem_handle,
2232*61046927SAndroid Build Coastguard Worker uint32_t stride, uint32_t tiling);
2233*61046927SAndroid Build Coastguard Worker int anv_gem_get_tiling(struct anv_device *device, uint32_t gem_handle);
2234*61046927SAndroid Build Coastguard Worker int anv_gem_handle_to_fd(struct anv_device *device, uint32_t gem_handle);
2235*61046927SAndroid Build Coastguard Worker uint32_t anv_gem_fd_to_handle(struct anv_device *device, int fd);
2236*61046927SAndroid Build Coastguard Worker int anv_gem_set_context_param(int fd, uint32_t context, uint32_t param,
2237*61046927SAndroid Build Coastguard Worker uint64_t value);
2238*61046927SAndroid Build Coastguard Worker VkResult
2239*61046927SAndroid Build Coastguard Worker anv_gem_import_bo_alloc_flags_to_bo_flags(struct anv_device *device,
2240*61046927SAndroid Build Coastguard Worker struct anv_bo *bo,
2241*61046927SAndroid Build Coastguard Worker enum anv_bo_alloc_flags alloc_flags,
2242*61046927SAndroid Build Coastguard Worker uint32_t *bo_flags);
2243*61046927SAndroid Build Coastguard Worker const struct intel_device_info_pat_entry *
2244*61046927SAndroid Build Coastguard Worker anv_device_get_pat_entry(struct anv_device *device,
2245*61046927SAndroid Build Coastguard Worker enum anv_bo_alloc_flags alloc_flags);
2246*61046927SAndroid Build Coastguard Worker
2247*61046927SAndroid Build Coastguard Worker uint64_t anv_vma_alloc(struct anv_device *device,
2248*61046927SAndroid Build Coastguard Worker uint64_t size, uint64_t align,
2249*61046927SAndroid Build Coastguard Worker enum anv_bo_alloc_flags alloc_flags,
2250*61046927SAndroid Build Coastguard Worker uint64_t client_address,
2251*61046927SAndroid Build Coastguard Worker struct util_vma_heap **out_vma_heap);
2252*61046927SAndroid Build Coastguard Worker void anv_vma_free(struct anv_device *device,
2253*61046927SAndroid Build Coastguard Worker struct util_vma_heap *vma_heap,
2254*61046927SAndroid Build Coastguard Worker uint64_t address, uint64_t size);
2255*61046927SAndroid Build Coastguard Worker
2256*61046927SAndroid Build Coastguard Worker struct anv_reloc_list {
2257*61046927SAndroid Build Coastguard Worker bool uses_relocs;
2258*61046927SAndroid Build Coastguard Worker uint32_t dep_words;
2259*61046927SAndroid Build Coastguard Worker BITSET_WORD * deps;
2260*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *alloc;
2261*61046927SAndroid Build Coastguard Worker };
2262*61046927SAndroid Build Coastguard Worker
2263*61046927SAndroid Build Coastguard Worker VkResult anv_reloc_list_init(struct anv_reloc_list *list,
2264*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *alloc,
2265*61046927SAndroid Build Coastguard Worker bool uses_relocs);
2266*61046927SAndroid Build Coastguard Worker void anv_reloc_list_finish(struct anv_reloc_list *list);
2267*61046927SAndroid Build Coastguard Worker
2268*61046927SAndroid Build Coastguard Worker VkResult
2269*61046927SAndroid Build Coastguard Worker anv_reloc_list_add_bo_impl(struct anv_reloc_list *list, struct anv_bo *target_bo);
2270*61046927SAndroid Build Coastguard Worker
2271*61046927SAndroid Build Coastguard Worker static inline VkResult
anv_reloc_list_add_bo(struct anv_reloc_list * list,struct anv_bo * target_bo)2272*61046927SAndroid Build Coastguard Worker anv_reloc_list_add_bo(struct anv_reloc_list *list, struct anv_bo *target_bo)
2273*61046927SAndroid Build Coastguard Worker {
2274*61046927SAndroid Build Coastguard Worker return list->uses_relocs ? anv_reloc_list_add_bo_impl(list, target_bo) : VK_SUCCESS;
2275*61046927SAndroid Build Coastguard Worker }
2276*61046927SAndroid Build Coastguard Worker
2277*61046927SAndroid Build Coastguard Worker VkResult anv_reloc_list_append(struct anv_reloc_list *list,
2278*61046927SAndroid Build Coastguard Worker struct anv_reloc_list *other);
2279*61046927SAndroid Build Coastguard Worker
2280*61046927SAndroid Build Coastguard Worker struct anv_batch_bo {
2281*61046927SAndroid Build Coastguard Worker /* Link in the anv_cmd_buffer.owned_batch_bos list */
2282*61046927SAndroid Build Coastguard Worker struct list_head link;
2283*61046927SAndroid Build Coastguard Worker
2284*61046927SAndroid Build Coastguard Worker struct anv_bo * bo;
2285*61046927SAndroid Build Coastguard Worker
2286*61046927SAndroid Build Coastguard Worker /* Bytes actually consumed in this batch BO */
2287*61046927SAndroid Build Coastguard Worker uint32_t length;
2288*61046927SAndroid Build Coastguard Worker
2289*61046927SAndroid Build Coastguard Worker /* When this batch BO is used as part of a primary batch buffer, this
2290*61046927SAndroid Build Coastguard Worker * tracked whether it is chained to another primary batch buffer.
2291*61046927SAndroid Build Coastguard Worker *
2292*61046927SAndroid Build Coastguard Worker * If this is the case, the relocation list's last entry points the
2293*61046927SAndroid Build Coastguard Worker * location of the MI_BATCH_BUFFER_START chaining to the next batch.
2294*61046927SAndroid Build Coastguard Worker */
2295*61046927SAndroid Build Coastguard Worker bool chained;
2296*61046927SAndroid Build Coastguard Worker
2297*61046927SAndroid Build Coastguard Worker struct anv_reloc_list relocs;
2298*61046927SAndroid Build Coastguard Worker };
2299*61046927SAndroid Build Coastguard Worker
2300*61046927SAndroid Build Coastguard Worker struct anv_batch {
2301*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks * alloc;
2302*61046927SAndroid Build Coastguard Worker
2303*61046927SAndroid Build Coastguard Worker /**
2304*61046927SAndroid Build Coastguard Worker * Sum of all the anv_batch_bo sizes allocated for this command buffer.
2305*61046927SAndroid Build Coastguard Worker * Used to increase allocation size for long command buffers.
2306*61046927SAndroid Build Coastguard Worker */
2307*61046927SAndroid Build Coastguard Worker size_t allocated_batch_size;
2308*61046927SAndroid Build Coastguard Worker
2309*61046927SAndroid Build Coastguard Worker struct anv_address start_addr;
2310*61046927SAndroid Build Coastguard Worker
2311*61046927SAndroid Build Coastguard Worker void * start;
2312*61046927SAndroid Build Coastguard Worker void * end;
2313*61046927SAndroid Build Coastguard Worker void * next;
2314*61046927SAndroid Build Coastguard Worker
2315*61046927SAndroid Build Coastguard Worker struct anv_reloc_list * relocs;
2316*61046927SAndroid Build Coastguard Worker
2317*61046927SAndroid Build Coastguard Worker /* This callback is called (with the associated user data) in the event
2318*61046927SAndroid Build Coastguard Worker * that the batch runs out of space.
2319*61046927SAndroid Build Coastguard Worker */
2320*61046927SAndroid Build Coastguard Worker VkResult (*extend_cb)(struct anv_batch *, uint32_t, void *);
2321*61046927SAndroid Build Coastguard Worker void * user_data;
2322*61046927SAndroid Build Coastguard Worker
2323*61046927SAndroid Build Coastguard Worker /**
2324*61046927SAndroid Build Coastguard Worker * Current error status of the command buffer. Used to track inconsistent
2325*61046927SAndroid Build Coastguard Worker * or incomplete command buffer states that are the consequence of run-time
2326*61046927SAndroid Build Coastguard Worker * errors such as out of memory scenarios. We want to track this in the
2327*61046927SAndroid Build Coastguard Worker * batch because the command buffer object is not visible to some parts
2328*61046927SAndroid Build Coastguard Worker * of the driver.
2329*61046927SAndroid Build Coastguard Worker */
2330*61046927SAndroid Build Coastguard Worker VkResult status;
2331*61046927SAndroid Build Coastguard Worker
2332*61046927SAndroid Build Coastguard Worker enum intel_engine_class engine_class;
2333*61046927SAndroid Build Coastguard Worker
2334*61046927SAndroid Build Coastguard Worker /**
2335*61046927SAndroid Build Coastguard Worker * Write fencing status for mi_builder.
2336*61046927SAndroid Build Coastguard Worker */
2337*61046927SAndroid Build Coastguard Worker bool write_fence_status;
2338*61046927SAndroid Build Coastguard Worker
2339*61046927SAndroid Build Coastguard Worker /**
2340*61046927SAndroid Build Coastguard Worker * Number of 3DPRIMITIVE's emitted for WA 16014538804
2341*61046927SAndroid Build Coastguard Worker */
2342*61046927SAndroid Build Coastguard Worker uint8_t num_3d_primitives_emitted;
2343*61046927SAndroid Build Coastguard Worker
2344*61046927SAndroid Build Coastguard Worker struct u_trace * trace;
2345*61046927SAndroid Build Coastguard Worker const char * pc_reasons[4];
2346*61046927SAndroid Build Coastguard Worker uint32_t pc_reasons_count;
2347*61046927SAndroid Build Coastguard Worker
2348*61046927SAndroid Build Coastguard Worker };
2349*61046927SAndroid Build Coastguard Worker
2350*61046927SAndroid Build Coastguard Worker void *anv_batch_emit_dwords(struct anv_batch *batch, int num_dwords);
2351*61046927SAndroid Build Coastguard Worker VkResult anv_batch_emit_ensure_space(struct anv_batch *batch, uint32_t size);
2352*61046927SAndroid Build Coastguard Worker void anv_batch_advance(struct anv_batch *batch, uint32_t size);
2353*61046927SAndroid Build Coastguard Worker void anv_batch_emit_batch(struct anv_batch *batch, struct anv_batch *other);
2354*61046927SAndroid Build Coastguard Worker struct anv_address anv_batch_address(struct anv_batch *batch, void *batch_location);
2355*61046927SAndroid Build Coastguard Worker
2356*61046927SAndroid Build Coastguard Worker static inline struct anv_address
anv_batch_current_address(struct anv_batch * batch)2357*61046927SAndroid Build Coastguard Worker anv_batch_current_address(struct anv_batch *batch)
2358*61046927SAndroid Build Coastguard Worker {
2359*61046927SAndroid Build Coastguard Worker return anv_batch_address(batch, batch->next);
2360*61046927SAndroid Build Coastguard Worker }
2361*61046927SAndroid Build Coastguard Worker
2362*61046927SAndroid Build Coastguard Worker static inline void
anv_batch_set_storage(struct anv_batch * batch,struct anv_address addr,void * map,size_t size)2363*61046927SAndroid Build Coastguard Worker anv_batch_set_storage(struct anv_batch *batch, struct anv_address addr,
2364*61046927SAndroid Build Coastguard Worker void *map, size_t size)
2365*61046927SAndroid Build Coastguard Worker {
2366*61046927SAndroid Build Coastguard Worker batch->start_addr = addr;
2367*61046927SAndroid Build Coastguard Worker batch->next = batch->start = map;
2368*61046927SAndroid Build Coastguard Worker batch->end = map + size;
2369*61046927SAndroid Build Coastguard Worker }
2370*61046927SAndroid Build Coastguard Worker
2371*61046927SAndroid Build Coastguard Worker static inline VkResult
anv_batch_set_error(struct anv_batch * batch,VkResult error)2372*61046927SAndroid Build Coastguard Worker anv_batch_set_error(struct anv_batch *batch, VkResult error)
2373*61046927SAndroid Build Coastguard Worker {
2374*61046927SAndroid Build Coastguard Worker assert(error != VK_SUCCESS);
2375*61046927SAndroid Build Coastguard Worker if (batch->status == VK_SUCCESS)
2376*61046927SAndroid Build Coastguard Worker batch->status = error;
2377*61046927SAndroid Build Coastguard Worker return batch->status;
2378*61046927SAndroid Build Coastguard Worker }
2379*61046927SAndroid Build Coastguard Worker
2380*61046927SAndroid Build Coastguard Worker static inline bool
anv_batch_has_error(struct anv_batch * batch)2381*61046927SAndroid Build Coastguard Worker anv_batch_has_error(struct anv_batch *batch)
2382*61046927SAndroid Build Coastguard Worker {
2383*61046927SAndroid Build Coastguard Worker return batch->status != VK_SUCCESS;
2384*61046927SAndroid Build Coastguard Worker }
2385*61046927SAndroid Build Coastguard Worker
2386*61046927SAndroid Build Coastguard Worker static inline uint64_t
_anv_combine_address(struct anv_batch * batch,void * location,const struct anv_address address,uint32_t delta)2387*61046927SAndroid Build Coastguard Worker _anv_combine_address(struct anv_batch *batch, void *location,
2388*61046927SAndroid Build Coastguard Worker const struct anv_address address, uint32_t delta)
2389*61046927SAndroid Build Coastguard Worker {
2390*61046927SAndroid Build Coastguard Worker if (address.bo == NULL)
2391*61046927SAndroid Build Coastguard Worker return address.offset + delta;
2392*61046927SAndroid Build Coastguard Worker
2393*61046927SAndroid Build Coastguard Worker if (batch)
2394*61046927SAndroid Build Coastguard Worker anv_reloc_list_add_bo(batch->relocs, address.bo);
2395*61046927SAndroid Build Coastguard Worker
2396*61046927SAndroid Build Coastguard Worker return anv_address_physical(anv_address_add(address, delta));
2397*61046927SAndroid Build Coastguard Worker }
2398*61046927SAndroid Build Coastguard Worker
2399*61046927SAndroid Build Coastguard Worker #define __gen_address_type struct anv_address
2400*61046927SAndroid Build Coastguard Worker #define __gen_user_data struct anv_batch
2401*61046927SAndroid Build Coastguard Worker #define __gen_combine_address _anv_combine_address
2402*61046927SAndroid Build Coastguard Worker
2403*61046927SAndroid Build Coastguard Worker /* Wrapper macros needed to work around preprocessor argument issues. In
2404*61046927SAndroid Build Coastguard Worker * particular, arguments don't get pre-evaluated if they are concatenated.
2405*61046927SAndroid Build Coastguard Worker * This means that, if you pass GENX(3DSTATE_PS) into the emit macro, the
2406*61046927SAndroid Build Coastguard Worker * GENX macro won't get evaluated if the emit macro contains "cmd ## foo".
2407*61046927SAndroid Build Coastguard Worker * We can work around this easily enough with these helpers.
2408*61046927SAndroid Build Coastguard Worker */
2409*61046927SAndroid Build Coastguard Worker #define __anv_cmd_length(cmd) cmd ## _length
2410*61046927SAndroid Build Coastguard Worker #define __anv_cmd_length_bias(cmd) cmd ## _length_bias
2411*61046927SAndroid Build Coastguard Worker #define __anv_cmd_header(cmd) cmd ## _header
2412*61046927SAndroid Build Coastguard Worker #define __anv_cmd_pack(cmd) cmd ## _pack
2413*61046927SAndroid Build Coastguard Worker #define __anv_reg_num(reg) reg ## _num
2414*61046927SAndroid Build Coastguard Worker
2415*61046927SAndroid Build Coastguard Worker #define anv_pack_struct(dst, struc, ...) do { \
2416*61046927SAndroid Build Coastguard Worker struct struc __template = { \
2417*61046927SAndroid Build Coastguard Worker __VA_ARGS__ \
2418*61046927SAndroid Build Coastguard Worker }; \
2419*61046927SAndroid Build Coastguard Worker __anv_cmd_pack(struc)(NULL, dst, &__template); \
2420*61046927SAndroid Build Coastguard Worker VG(VALGRIND_CHECK_MEM_IS_DEFINED(dst, __anv_cmd_length(struc) * 4)); \
2421*61046927SAndroid Build Coastguard Worker } while (0)
2422*61046927SAndroid Build Coastguard Worker
2423*61046927SAndroid Build Coastguard Worker #define anv_batch_emitn(batch, n, cmd, ...) ({ \
2424*61046927SAndroid Build Coastguard Worker void *__dst = anv_batch_emit_dwords(batch, n); \
2425*61046927SAndroid Build Coastguard Worker if (__dst) { \
2426*61046927SAndroid Build Coastguard Worker struct cmd __template = { \
2427*61046927SAndroid Build Coastguard Worker __anv_cmd_header(cmd), \
2428*61046927SAndroid Build Coastguard Worker .DWordLength = n - __anv_cmd_length_bias(cmd), \
2429*61046927SAndroid Build Coastguard Worker __VA_ARGS__ \
2430*61046927SAndroid Build Coastguard Worker }; \
2431*61046927SAndroid Build Coastguard Worker __anv_cmd_pack(cmd)(batch, __dst, &__template); \
2432*61046927SAndroid Build Coastguard Worker } \
2433*61046927SAndroid Build Coastguard Worker __dst; \
2434*61046927SAndroid Build Coastguard Worker })
2435*61046927SAndroid Build Coastguard Worker
2436*61046927SAndroid Build Coastguard Worker #define anv_batch_emit_merge(batch, cmd, pipeline, state, name) \
2437*61046927SAndroid Build Coastguard Worker for (struct cmd name = { 0 }, \
2438*61046927SAndroid Build Coastguard Worker *_dst = anv_batch_emit_dwords(batch, __anv_cmd_length(cmd)); \
2439*61046927SAndroid Build Coastguard Worker __builtin_expect(_dst != NULL, 1); \
2440*61046927SAndroid Build Coastguard Worker ({ uint32_t _partial[__anv_cmd_length(cmd)]; \
2441*61046927SAndroid Build Coastguard Worker assert((pipeline)->state.len == __anv_cmd_length(cmd)); \
2442*61046927SAndroid Build Coastguard Worker __anv_cmd_pack(cmd)(batch, _partial, &name); \
2443*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < __anv_cmd_length(cmd); i++) { \
2444*61046927SAndroid Build Coastguard Worker assert((_partial[i] & \
2445*61046927SAndroid Build Coastguard Worker (pipeline)->batch_data[ \
2446*61046927SAndroid Build Coastguard Worker (pipeline)->state.offset + i]) == 0); \
2447*61046927SAndroid Build Coastguard Worker ((uint32_t *)_dst)[i] = _partial[i] | \
2448*61046927SAndroid Build Coastguard Worker (pipeline)->batch_data[(pipeline)->state.offset + i]; \
2449*61046927SAndroid Build Coastguard Worker } \
2450*61046927SAndroid Build Coastguard Worker VG(VALGRIND_CHECK_MEM_IS_DEFINED(_dst, __anv_cmd_length(cmd) * 4)); \
2451*61046927SAndroid Build Coastguard Worker _dst = NULL; \
2452*61046927SAndroid Build Coastguard Worker }))
2453*61046927SAndroid Build Coastguard Worker
2454*61046927SAndroid Build Coastguard Worker #define anv_batch_emit_merge_protected(batch, cmd, pipeline, state, \
2455*61046927SAndroid Build Coastguard Worker name, protected) \
2456*61046927SAndroid Build Coastguard Worker for (struct cmd name = { 0 }, \
2457*61046927SAndroid Build Coastguard Worker *_dst = anv_batch_emit_dwords(batch, __anv_cmd_length(cmd)); \
2458*61046927SAndroid Build Coastguard Worker __builtin_expect(_dst != NULL, 1); \
2459*61046927SAndroid Build Coastguard Worker ({ struct anv_gfx_state_ptr *_cmd_state = protected ? \
2460*61046927SAndroid Build Coastguard Worker &(pipeline)->state##_protected : \
2461*61046927SAndroid Build Coastguard Worker &(pipeline)->state; \
2462*61046927SAndroid Build Coastguard Worker uint32_t _partial[__anv_cmd_length(cmd)]; \
2463*61046927SAndroid Build Coastguard Worker assert(_cmd_state->len == __anv_cmd_length(cmd)); \
2464*61046927SAndroid Build Coastguard Worker __anv_cmd_pack(cmd)(batch, _partial, &name); \
2465*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < __anv_cmd_length(cmd); i++) { \
2466*61046927SAndroid Build Coastguard Worker assert((_partial[i] & \
2467*61046927SAndroid Build Coastguard Worker (pipeline)->batch_data[ \
2468*61046927SAndroid Build Coastguard Worker (pipeline)->state.offset + i]) == 0); \
2469*61046927SAndroid Build Coastguard Worker ((uint32_t *)_dst)[i] = _partial[i] | \
2470*61046927SAndroid Build Coastguard Worker (pipeline)->batch_data[_cmd_state->offset + i]; \
2471*61046927SAndroid Build Coastguard Worker } \
2472*61046927SAndroid Build Coastguard Worker VG(VALGRIND_CHECK_MEM_IS_DEFINED(_dst, __anv_cmd_length(cmd) * 4)); \
2473*61046927SAndroid Build Coastguard Worker _dst = NULL; \
2474*61046927SAndroid Build Coastguard Worker }))
2475*61046927SAndroid Build Coastguard Worker
2476*61046927SAndroid Build Coastguard Worker #define anv_batch_emit(batch, cmd, name) \
2477*61046927SAndroid Build Coastguard Worker for (struct cmd name = { __anv_cmd_header(cmd) }, \
2478*61046927SAndroid Build Coastguard Worker *_dst = anv_batch_emit_dwords(batch, __anv_cmd_length(cmd)); \
2479*61046927SAndroid Build Coastguard Worker __builtin_expect(_dst != NULL, 1); \
2480*61046927SAndroid Build Coastguard Worker ({ __anv_cmd_pack(cmd)(batch, _dst, &name); \
2481*61046927SAndroid Build Coastguard Worker VG(VALGRIND_CHECK_MEM_IS_DEFINED(_dst, __anv_cmd_length(cmd) * 4)); \
2482*61046927SAndroid Build Coastguard Worker _dst = NULL; \
2483*61046927SAndroid Build Coastguard Worker }))
2484*61046927SAndroid Build Coastguard Worker
2485*61046927SAndroid Build Coastguard Worker #define anv_batch_write_reg(batch, reg, name) \
2486*61046927SAndroid Build Coastguard Worker for (struct reg name = {}, *_cont = (struct reg *)1; _cont != NULL; \
2487*61046927SAndroid Build Coastguard Worker ({ \
2488*61046927SAndroid Build Coastguard Worker uint32_t _dw[__anv_cmd_length(reg)]; \
2489*61046927SAndroid Build Coastguard Worker __anv_cmd_pack(reg)(NULL, _dw, &name); \
2490*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < __anv_cmd_length(reg); i++) { \
2491*61046927SAndroid Build Coastguard Worker anv_batch_emit(batch, GENX(MI_LOAD_REGISTER_IMM), lri) { \
2492*61046927SAndroid Build Coastguard Worker lri.RegisterOffset = __anv_reg_num(reg); \
2493*61046927SAndroid Build Coastguard Worker lri.DataDWord = _dw[i]; \
2494*61046927SAndroid Build Coastguard Worker } \
2495*61046927SAndroid Build Coastguard Worker } \
2496*61046927SAndroid Build Coastguard Worker _cont = NULL; \
2497*61046927SAndroid Build Coastguard Worker }))
2498*61046927SAndroid Build Coastguard Worker
2499*61046927SAndroid Build Coastguard Worker /* #define __gen_get_batch_dwords anv_batch_emit_dwords */
2500*61046927SAndroid Build Coastguard Worker /* #define __gen_get_batch_address anv_batch_address */
2501*61046927SAndroid Build Coastguard Worker /* #define __gen_address_value anv_address_physical */
2502*61046927SAndroid Build Coastguard Worker /* #define __gen_address_offset anv_address_add */
2503*61046927SAndroid Build Coastguard Worker
2504*61046927SAndroid Build Coastguard Worker /* Base structure used to track a submission that needs some clean operations
2505*61046927SAndroid Build Coastguard Worker * upon completion. Should be embedded into a larger structure.
2506*61046927SAndroid Build Coastguard Worker */
2507*61046927SAndroid Build Coastguard Worker struct anv_async_submit {
2508*61046927SAndroid Build Coastguard Worker struct anv_queue *queue;
2509*61046927SAndroid Build Coastguard Worker
2510*61046927SAndroid Build Coastguard Worker struct anv_bo_pool *bo_pool;
2511*61046927SAndroid Build Coastguard Worker
2512*61046927SAndroid Build Coastguard Worker bool use_companion_rcs;
2513*61046927SAndroid Build Coastguard Worker
2514*61046927SAndroid Build Coastguard Worker bool owns_sync;
2515*61046927SAndroid Build Coastguard Worker struct vk_sync_signal signal;
2516*61046927SAndroid Build Coastguard Worker
2517*61046927SAndroid Build Coastguard Worker struct anv_reloc_list relocs;
2518*61046927SAndroid Build Coastguard Worker struct anv_batch batch;
2519*61046927SAndroid Build Coastguard Worker struct util_dynarray batch_bos;
2520*61046927SAndroid Build Coastguard Worker };
2521*61046927SAndroid Build Coastguard Worker
2522*61046927SAndroid Build Coastguard Worker VkResult
2523*61046927SAndroid Build Coastguard Worker anv_async_submit_init(struct anv_async_submit *submit,
2524*61046927SAndroid Build Coastguard Worker struct anv_queue *queue,
2525*61046927SAndroid Build Coastguard Worker struct anv_bo_pool *bo_pool,
2526*61046927SAndroid Build Coastguard Worker bool use_companion_rcs,
2527*61046927SAndroid Build Coastguard Worker bool create_signal_sync);
2528*61046927SAndroid Build Coastguard Worker
2529*61046927SAndroid Build Coastguard Worker void
2530*61046927SAndroid Build Coastguard Worker anv_async_submit_fini(struct anv_async_submit *submit);
2531*61046927SAndroid Build Coastguard Worker
2532*61046927SAndroid Build Coastguard Worker VkResult
2533*61046927SAndroid Build Coastguard Worker anv_async_submit_create(struct anv_queue *queue,
2534*61046927SAndroid Build Coastguard Worker struct anv_bo_pool *bo_pool,
2535*61046927SAndroid Build Coastguard Worker bool use_companion_rcs,
2536*61046927SAndroid Build Coastguard Worker bool create_signal_sync,
2537*61046927SAndroid Build Coastguard Worker struct anv_async_submit **out_submit);
2538*61046927SAndroid Build Coastguard Worker
2539*61046927SAndroid Build Coastguard Worker void
2540*61046927SAndroid Build Coastguard Worker anv_async_submit_destroy(struct anv_async_submit *submit);
2541*61046927SAndroid Build Coastguard Worker
2542*61046927SAndroid Build Coastguard Worker bool
2543*61046927SAndroid Build Coastguard Worker anv_async_submit_done(struct anv_async_submit *submit);
2544*61046927SAndroid Build Coastguard Worker
2545*61046927SAndroid Build Coastguard Worker bool
2546*61046927SAndroid Build Coastguard Worker anv_async_submit_wait(struct anv_async_submit *submit);
2547*61046927SAndroid Build Coastguard Worker
2548*61046927SAndroid Build Coastguard Worker struct anv_sparse_submission {
2549*61046927SAndroid Build Coastguard Worker struct anv_queue *queue;
2550*61046927SAndroid Build Coastguard Worker
2551*61046927SAndroid Build Coastguard Worker struct anv_vm_bind *binds;
2552*61046927SAndroid Build Coastguard Worker int binds_len;
2553*61046927SAndroid Build Coastguard Worker int binds_capacity;
2554*61046927SAndroid Build Coastguard Worker
2555*61046927SAndroid Build Coastguard Worker uint32_t wait_count;
2556*61046927SAndroid Build Coastguard Worker uint32_t signal_count;
2557*61046927SAndroid Build Coastguard Worker
2558*61046927SAndroid Build Coastguard Worker struct vk_sync_wait *waits;
2559*61046927SAndroid Build Coastguard Worker struct vk_sync_signal *signals;
2560*61046927SAndroid Build Coastguard Worker };
2561*61046927SAndroid Build Coastguard Worker
2562*61046927SAndroid Build Coastguard Worker struct anv_trtt_bind {
2563*61046927SAndroid Build Coastguard Worker uint64_t pte_addr;
2564*61046927SAndroid Build Coastguard Worker uint64_t entry_addr;
2565*61046927SAndroid Build Coastguard Worker };
2566*61046927SAndroid Build Coastguard Worker
2567*61046927SAndroid Build Coastguard Worker struct anv_trtt_submission {
2568*61046927SAndroid Build Coastguard Worker struct anv_async_submit base;
2569*61046927SAndroid Build Coastguard Worker
2570*61046927SAndroid Build Coastguard Worker struct anv_sparse_submission *sparse;
2571*61046927SAndroid Build Coastguard Worker
2572*61046927SAndroid Build Coastguard Worker struct list_head link;
2573*61046927SAndroid Build Coastguard Worker };
2574*61046927SAndroid Build Coastguard Worker
2575*61046927SAndroid Build Coastguard Worker struct anv_device_memory {
2576*61046927SAndroid Build Coastguard Worker struct vk_device_memory vk;
2577*61046927SAndroid Build Coastguard Worker
2578*61046927SAndroid Build Coastguard Worker struct list_head link;
2579*61046927SAndroid Build Coastguard Worker
2580*61046927SAndroid Build Coastguard Worker struct anv_bo * bo;
2581*61046927SAndroid Build Coastguard Worker const struct anv_memory_type * type;
2582*61046927SAndroid Build Coastguard Worker
2583*61046927SAndroid Build Coastguard Worker void * map;
2584*61046927SAndroid Build Coastguard Worker size_t map_size;
2585*61046927SAndroid Build Coastguard Worker
2586*61046927SAndroid Build Coastguard Worker /* The map, from the user PoV is map + map_delta */
2587*61046927SAndroid Build Coastguard Worker uint64_t map_delta;
2588*61046927SAndroid Build Coastguard Worker };
2589*61046927SAndroid Build Coastguard Worker
2590*61046927SAndroid Build Coastguard Worker /**
2591*61046927SAndroid Build Coastguard Worker * Header for Vertex URB Entry (VUE)
2592*61046927SAndroid Build Coastguard Worker */
2593*61046927SAndroid Build Coastguard Worker struct anv_vue_header {
2594*61046927SAndroid Build Coastguard Worker uint32_t Reserved;
2595*61046927SAndroid Build Coastguard Worker uint32_t RTAIndex; /* RenderTargetArrayIndex */
2596*61046927SAndroid Build Coastguard Worker uint32_t ViewportIndex;
2597*61046927SAndroid Build Coastguard Worker float PointWidth;
2598*61046927SAndroid Build Coastguard Worker };
2599*61046927SAndroid Build Coastguard Worker
2600*61046927SAndroid Build Coastguard Worker /** Struct representing a sampled image descriptor
2601*61046927SAndroid Build Coastguard Worker *
2602*61046927SAndroid Build Coastguard Worker * This descriptor layout is used for sampled images, bare sampler, and
2603*61046927SAndroid Build Coastguard Worker * combined image/sampler descriptors.
2604*61046927SAndroid Build Coastguard Worker */
2605*61046927SAndroid Build Coastguard Worker struct anv_sampled_image_descriptor {
2606*61046927SAndroid Build Coastguard Worker /** Bindless image handle
2607*61046927SAndroid Build Coastguard Worker *
2608*61046927SAndroid Build Coastguard Worker * This is expected to already be shifted such that the 20-bit
2609*61046927SAndroid Build Coastguard Worker * SURFACE_STATE table index is in the top 20 bits.
2610*61046927SAndroid Build Coastguard Worker */
2611*61046927SAndroid Build Coastguard Worker uint32_t image;
2612*61046927SAndroid Build Coastguard Worker
2613*61046927SAndroid Build Coastguard Worker /** Bindless sampler handle
2614*61046927SAndroid Build Coastguard Worker *
2615*61046927SAndroid Build Coastguard Worker * This is assumed to be a 32B-aligned SAMPLER_STATE pointer relative
2616*61046927SAndroid Build Coastguard Worker * to the dynamic state base address.
2617*61046927SAndroid Build Coastguard Worker */
2618*61046927SAndroid Build Coastguard Worker uint32_t sampler;
2619*61046927SAndroid Build Coastguard Worker };
2620*61046927SAndroid Build Coastguard Worker
2621*61046927SAndroid Build Coastguard Worker /** Struct representing a storage image descriptor */
2622*61046927SAndroid Build Coastguard Worker struct anv_storage_image_descriptor {
2623*61046927SAndroid Build Coastguard Worker /** Bindless image handles
2624*61046927SAndroid Build Coastguard Worker *
2625*61046927SAndroid Build Coastguard Worker * These are expected to already be shifted such that the 20-bit
2626*61046927SAndroid Build Coastguard Worker * SURFACE_STATE table index is in the top 20 bits.
2627*61046927SAndroid Build Coastguard Worker */
2628*61046927SAndroid Build Coastguard Worker uint32_t vanilla;
2629*61046927SAndroid Build Coastguard Worker
2630*61046927SAndroid Build Coastguard Worker /** Image depth
2631*61046927SAndroid Build Coastguard Worker *
2632*61046927SAndroid Build Coastguard Worker * By default the HW RESINFO message allows us to query the depth of an image :
2633*61046927SAndroid Build Coastguard Worker *
2634*61046927SAndroid Build Coastguard Worker * From the Kaby Lake docs for the RESINFO message:
2635*61046927SAndroid Build Coastguard Worker *
2636*61046927SAndroid Build Coastguard Worker * "Surface Type | ... | Blue
2637*61046927SAndroid Build Coastguard Worker * --------------+-----+----------------
2638*61046927SAndroid Build Coastguard Worker * SURFTYPE_3D | ... | (Depth+1)»LOD"
2639*61046927SAndroid Build Coastguard Worker *
2640*61046927SAndroid Build Coastguard Worker * With VK_EXT_sliced_view_of_3d, we have to support a slice of a 3D image,
2641*61046927SAndroid Build Coastguard Worker * meaning at a depth offset with a new depth value potentially reduced
2642*61046927SAndroid Build Coastguard Worker * from the original image. Unfortunately if we change the Depth value of
2643*61046927SAndroid Build Coastguard Worker * the image, we then run into issues with Yf/Ys tilings where the HW fetch
2644*61046927SAndroid Build Coastguard Worker * data at incorrect locations.
2645*61046927SAndroid Build Coastguard Worker *
2646*61046927SAndroid Build Coastguard Worker * To solve this, we put the slice depth in the descriptor and recompose
2647*61046927SAndroid Build Coastguard Worker * the vec3 (width, height, depth) using this field for z and xy using the
2648*61046927SAndroid Build Coastguard Worker * RESINFO result.
2649*61046927SAndroid Build Coastguard Worker */
2650*61046927SAndroid Build Coastguard Worker uint32_t image_depth;
2651*61046927SAndroid Build Coastguard Worker };
2652*61046927SAndroid Build Coastguard Worker
2653*61046927SAndroid Build Coastguard Worker /** Struct representing a address/range descriptor
2654*61046927SAndroid Build Coastguard Worker *
2655*61046927SAndroid Build Coastguard Worker * The fields of this struct correspond directly to the data layout of
2656*61046927SAndroid Build Coastguard Worker * nir_address_format_64bit_bounded_global addresses. The last field is the
2657*61046927SAndroid Build Coastguard Worker * offset in the NIR address so it must be zero so that when you load the
2658*61046927SAndroid Build Coastguard Worker * descriptor you get a pointer to the start of the range.
2659*61046927SAndroid Build Coastguard Worker */
2660*61046927SAndroid Build Coastguard Worker struct anv_address_range_descriptor {
2661*61046927SAndroid Build Coastguard Worker uint64_t address;
2662*61046927SAndroid Build Coastguard Worker uint32_t range;
2663*61046927SAndroid Build Coastguard Worker uint32_t zero;
2664*61046927SAndroid Build Coastguard Worker };
2665*61046927SAndroid Build Coastguard Worker
2666*61046927SAndroid Build Coastguard Worker enum anv_descriptor_data {
2667*61046927SAndroid Build Coastguard Worker /** The descriptor contains a BTI reference to a surface state */
2668*61046927SAndroid Build Coastguard Worker ANV_DESCRIPTOR_BTI_SURFACE_STATE = BITFIELD_BIT(0),
2669*61046927SAndroid Build Coastguard Worker /** The descriptor contains a BTI reference to a sampler state */
2670*61046927SAndroid Build Coastguard Worker ANV_DESCRIPTOR_BTI_SAMPLER_STATE = BITFIELD_BIT(1),
2671*61046927SAndroid Build Coastguard Worker /** The descriptor contains an actual buffer view */
2672*61046927SAndroid Build Coastguard Worker ANV_DESCRIPTOR_BUFFER_VIEW = BITFIELD_BIT(2),
2673*61046927SAndroid Build Coastguard Worker /** The descriptor contains inline uniform data */
2674*61046927SAndroid Build Coastguard Worker ANV_DESCRIPTOR_INLINE_UNIFORM = BITFIELD_BIT(3),
2675*61046927SAndroid Build Coastguard Worker /** anv_address_range_descriptor with a buffer address and range */
2676*61046927SAndroid Build Coastguard Worker ANV_DESCRIPTOR_INDIRECT_ADDRESS_RANGE = BITFIELD_BIT(4),
2677*61046927SAndroid Build Coastguard Worker /** Bindless surface handle (through anv_sampled_image_descriptor) */
2678*61046927SAndroid Build Coastguard Worker ANV_DESCRIPTOR_INDIRECT_SAMPLED_IMAGE = BITFIELD_BIT(5),
2679*61046927SAndroid Build Coastguard Worker /** Storage image handles (through anv_storage_image_descriptor) */
2680*61046927SAndroid Build Coastguard Worker ANV_DESCRIPTOR_INDIRECT_STORAGE_IMAGE = BITFIELD_BIT(6),
2681*61046927SAndroid Build Coastguard Worker /** The descriptor contains a single RENDER_SURFACE_STATE */
2682*61046927SAndroid Build Coastguard Worker ANV_DESCRIPTOR_SURFACE = BITFIELD_BIT(7),
2683*61046927SAndroid Build Coastguard Worker /** The descriptor contains a SAMPLER_STATE */
2684*61046927SAndroid Build Coastguard Worker ANV_DESCRIPTOR_SAMPLER = BITFIELD_BIT(8),
2685*61046927SAndroid Build Coastguard Worker /** A tuple of RENDER_SURFACE_STATE & SAMPLER_STATE */
2686*61046927SAndroid Build Coastguard Worker ANV_DESCRIPTOR_SURFACE_SAMPLER = BITFIELD_BIT(9),
2687*61046927SAndroid Build Coastguard Worker };
2688*61046927SAndroid Build Coastguard Worker
2689*61046927SAndroid Build Coastguard Worker struct anv_descriptor_set_binding_layout {
2690*61046927SAndroid Build Coastguard Worker /* The type of the descriptors in this binding */
2691*61046927SAndroid Build Coastguard Worker VkDescriptorType type;
2692*61046927SAndroid Build Coastguard Worker
2693*61046927SAndroid Build Coastguard Worker /* Flags provided when this binding was created */
2694*61046927SAndroid Build Coastguard Worker VkDescriptorBindingFlags flags;
2695*61046927SAndroid Build Coastguard Worker
2696*61046927SAndroid Build Coastguard Worker /* Bitfield representing the type of data this descriptor contains */
2697*61046927SAndroid Build Coastguard Worker enum anv_descriptor_data data;
2698*61046927SAndroid Build Coastguard Worker
2699*61046927SAndroid Build Coastguard Worker /* Maximum number of YCbCr texture/sampler planes */
2700*61046927SAndroid Build Coastguard Worker uint8_t max_plane_count;
2701*61046927SAndroid Build Coastguard Worker
2702*61046927SAndroid Build Coastguard Worker /* Number of array elements in this binding (or size in bytes for inline
2703*61046927SAndroid Build Coastguard Worker * uniform data)
2704*61046927SAndroid Build Coastguard Worker */
2705*61046927SAndroid Build Coastguard Worker uint32_t array_size;
2706*61046927SAndroid Build Coastguard Worker
2707*61046927SAndroid Build Coastguard Worker /* Index into the flattened descriptor set */
2708*61046927SAndroid Build Coastguard Worker uint32_t descriptor_index;
2709*61046927SAndroid Build Coastguard Worker
2710*61046927SAndroid Build Coastguard Worker /* Index into the dynamic state array for a dynamic buffer, relative to the
2711*61046927SAndroid Build Coastguard Worker * set.
2712*61046927SAndroid Build Coastguard Worker */
2713*61046927SAndroid Build Coastguard Worker int16_t dynamic_offset_index;
2714*61046927SAndroid Build Coastguard Worker
2715*61046927SAndroid Build Coastguard Worker /* Computed surface size from data (for one plane) */
2716*61046927SAndroid Build Coastguard Worker uint16_t descriptor_data_surface_size;
2717*61046927SAndroid Build Coastguard Worker
2718*61046927SAndroid Build Coastguard Worker /* Computed sampler size from data (for one plane) */
2719*61046927SAndroid Build Coastguard Worker uint16_t descriptor_data_sampler_size;
2720*61046927SAndroid Build Coastguard Worker
2721*61046927SAndroid Build Coastguard Worker /* Index into the descriptor set buffer views */
2722*61046927SAndroid Build Coastguard Worker int32_t buffer_view_index;
2723*61046927SAndroid Build Coastguard Worker
2724*61046927SAndroid Build Coastguard Worker /* Offset into the descriptor buffer where the surface descriptor lives */
2725*61046927SAndroid Build Coastguard Worker uint32_t descriptor_surface_offset;
2726*61046927SAndroid Build Coastguard Worker
2727*61046927SAndroid Build Coastguard Worker /* Offset into the descriptor buffer where the sampler descriptor lives */
2728*61046927SAndroid Build Coastguard Worker uint16_t descriptor_sampler_offset;
2729*61046927SAndroid Build Coastguard Worker
2730*61046927SAndroid Build Coastguard Worker /* Pre computed surface stride (with multiplane descriptor, the descriptor
2731*61046927SAndroid Build Coastguard Worker * includes all the planes)
2732*61046927SAndroid Build Coastguard Worker */
2733*61046927SAndroid Build Coastguard Worker uint16_t descriptor_surface_stride;
2734*61046927SAndroid Build Coastguard Worker
2735*61046927SAndroid Build Coastguard Worker /* Pre computed sampler stride (with multiplane descriptor, the descriptor
2736*61046927SAndroid Build Coastguard Worker * includes all the planes)
2737*61046927SAndroid Build Coastguard Worker */
2738*61046927SAndroid Build Coastguard Worker uint16_t descriptor_sampler_stride;
2739*61046927SAndroid Build Coastguard Worker
2740*61046927SAndroid Build Coastguard Worker /* Immutable samplers (or NULL if no immutable samplers) */
2741*61046927SAndroid Build Coastguard Worker struct anv_sampler **immutable_samplers;
2742*61046927SAndroid Build Coastguard Worker };
2743*61046927SAndroid Build Coastguard Worker
2744*61046927SAndroid Build Coastguard Worker enum anv_descriptor_set_layout_type {
2745*61046927SAndroid Build Coastguard Worker ANV_PIPELINE_DESCRIPTOR_SET_LAYOUT_TYPE_UNKNOWN,
2746*61046927SAndroid Build Coastguard Worker ANV_PIPELINE_DESCRIPTOR_SET_LAYOUT_TYPE_INDIRECT,
2747*61046927SAndroid Build Coastguard Worker ANV_PIPELINE_DESCRIPTOR_SET_LAYOUT_TYPE_DIRECT,
2748*61046927SAndroid Build Coastguard Worker ANV_PIPELINE_DESCRIPTOR_SET_LAYOUT_TYPE_BUFFER,
2749*61046927SAndroid Build Coastguard Worker };
2750*61046927SAndroid Build Coastguard Worker
2751*61046927SAndroid Build Coastguard Worker struct anv_descriptor_set_layout {
2752*61046927SAndroid Build Coastguard Worker struct vk_object_base base;
2753*61046927SAndroid Build Coastguard Worker
2754*61046927SAndroid Build Coastguard Worker VkDescriptorSetLayoutCreateFlags flags;
2755*61046927SAndroid Build Coastguard Worker
2756*61046927SAndroid Build Coastguard Worker /* Type of descriptor set layout */
2757*61046927SAndroid Build Coastguard Worker enum anv_descriptor_set_layout_type type;
2758*61046927SAndroid Build Coastguard Worker
2759*61046927SAndroid Build Coastguard Worker /* Descriptor set layouts can be destroyed at almost any time */
2760*61046927SAndroid Build Coastguard Worker uint32_t ref_cnt;
2761*61046927SAndroid Build Coastguard Worker
2762*61046927SAndroid Build Coastguard Worker /* Number of bindings in this descriptor set */
2763*61046927SAndroid Build Coastguard Worker uint32_t binding_count;
2764*61046927SAndroid Build Coastguard Worker
2765*61046927SAndroid Build Coastguard Worker /* Total number of descriptors */
2766*61046927SAndroid Build Coastguard Worker uint32_t descriptor_count;
2767*61046927SAndroid Build Coastguard Worker
2768*61046927SAndroid Build Coastguard Worker /* Shader stages affected by this descriptor set */
2769*61046927SAndroid Build Coastguard Worker uint16_t shader_stages;
2770*61046927SAndroid Build Coastguard Worker
2771*61046927SAndroid Build Coastguard Worker /* Number of buffer views in this descriptor set */
2772*61046927SAndroid Build Coastguard Worker uint32_t buffer_view_count;
2773*61046927SAndroid Build Coastguard Worker
2774*61046927SAndroid Build Coastguard Worker /* Number of dynamic offsets used by this descriptor set */
2775*61046927SAndroid Build Coastguard Worker uint16_t dynamic_offset_count;
2776*61046927SAndroid Build Coastguard Worker
2777*61046927SAndroid Build Coastguard Worker /* For each dynamic buffer, which VkShaderStageFlagBits stages are using
2778*61046927SAndroid Build Coastguard Worker * this buffer
2779*61046927SAndroid Build Coastguard Worker */
2780*61046927SAndroid Build Coastguard Worker VkShaderStageFlags dynamic_offset_stages[MAX_DYNAMIC_BUFFERS];
2781*61046927SAndroid Build Coastguard Worker
2782*61046927SAndroid Build Coastguard Worker /* Size of the descriptor buffer dedicated to surface states for this
2783*61046927SAndroid Build Coastguard Worker * descriptor set
2784*61046927SAndroid Build Coastguard Worker */
2785*61046927SAndroid Build Coastguard Worker uint32_t descriptor_buffer_surface_size;
2786*61046927SAndroid Build Coastguard Worker
2787*61046927SAndroid Build Coastguard Worker /* Size of the descriptor buffer dedicated to sampler states for this
2788*61046927SAndroid Build Coastguard Worker * descriptor set
2789*61046927SAndroid Build Coastguard Worker */
2790*61046927SAndroid Build Coastguard Worker uint32_t descriptor_buffer_sampler_size;
2791*61046927SAndroid Build Coastguard Worker
2792*61046927SAndroid Build Coastguard Worker /* Number of embedded sampler count */
2793*61046927SAndroid Build Coastguard Worker uint32_t embedded_sampler_count;
2794*61046927SAndroid Build Coastguard Worker
2795*61046927SAndroid Build Coastguard Worker /* Bindings in this descriptor set */
2796*61046927SAndroid Build Coastguard Worker struct anv_descriptor_set_binding_layout binding[0];
2797*61046927SAndroid Build Coastguard Worker };
2798*61046927SAndroid Build Coastguard Worker
2799*61046927SAndroid Build Coastguard Worker bool anv_descriptor_supports_bindless(const struct anv_physical_device *pdevice,
2800*61046927SAndroid Build Coastguard Worker const struct anv_descriptor_set_layout *set,
2801*61046927SAndroid Build Coastguard Worker const struct anv_descriptor_set_binding_layout *binding);
2802*61046927SAndroid Build Coastguard Worker
2803*61046927SAndroid Build Coastguard Worker bool anv_descriptor_requires_bindless(const struct anv_physical_device *pdevice,
2804*61046927SAndroid Build Coastguard Worker const struct anv_descriptor_set_layout *set,
2805*61046927SAndroid Build Coastguard Worker const struct anv_descriptor_set_binding_layout *binding);
2806*61046927SAndroid Build Coastguard Worker
2807*61046927SAndroid Build Coastguard Worker void anv_descriptor_set_layout_destroy(struct anv_device *device,
2808*61046927SAndroid Build Coastguard Worker struct anv_descriptor_set_layout *layout);
2809*61046927SAndroid Build Coastguard Worker
2810*61046927SAndroid Build Coastguard Worker void anv_descriptor_set_layout_print(const struct anv_descriptor_set_layout *layout);
2811*61046927SAndroid Build Coastguard Worker
2812*61046927SAndroid Build Coastguard Worker static inline struct anv_descriptor_set_layout *
anv_descriptor_set_layout_ref(struct anv_descriptor_set_layout * layout)2813*61046927SAndroid Build Coastguard Worker anv_descriptor_set_layout_ref(struct anv_descriptor_set_layout *layout)
2814*61046927SAndroid Build Coastguard Worker {
2815*61046927SAndroid Build Coastguard Worker assert(layout && layout->ref_cnt >= 1);
2816*61046927SAndroid Build Coastguard Worker p_atomic_inc(&layout->ref_cnt);
2817*61046927SAndroid Build Coastguard Worker
2818*61046927SAndroid Build Coastguard Worker return layout;
2819*61046927SAndroid Build Coastguard Worker }
2820*61046927SAndroid Build Coastguard Worker
2821*61046927SAndroid Build Coastguard Worker static inline void
anv_descriptor_set_layout_unref(struct anv_device * device,struct anv_descriptor_set_layout * layout)2822*61046927SAndroid Build Coastguard Worker anv_descriptor_set_layout_unref(struct anv_device *device,
2823*61046927SAndroid Build Coastguard Worker struct anv_descriptor_set_layout *layout)
2824*61046927SAndroid Build Coastguard Worker {
2825*61046927SAndroid Build Coastguard Worker assert(layout && layout->ref_cnt >= 1);
2826*61046927SAndroid Build Coastguard Worker if (p_atomic_dec_zero(&layout->ref_cnt))
2827*61046927SAndroid Build Coastguard Worker anv_descriptor_set_layout_destroy(device, layout);
2828*61046927SAndroid Build Coastguard Worker }
2829*61046927SAndroid Build Coastguard Worker
2830*61046927SAndroid Build Coastguard Worker struct anv_descriptor {
2831*61046927SAndroid Build Coastguard Worker VkDescriptorType type;
2832*61046927SAndroid Build Coastguard Worker
2833*61046927SAndroid Build Coastguard Worker union {
2834*61046927SAndroid Build Coastguard Worker struct {
2835*61046927SAndroid Build Coastguard Worker VkImageLayout layout;
2836*61046927SAndroid Build Coastguard Worker struct anv_image_view *image_view;
2837*61046927SAndroid Build Coastguard Worker struct anv_sampler *sampler;
2838*61046927SAndroid Build Coastguard Worker };
2839*61046927SAndroid Build Coastguard Worker
2840*61046927SAndroid Build Coastguard Worker struct {
2841*61046927SAndroid Build Coastguard Worker struct anv_buffer_view *set_buffer_view;
2842*61046927SAndroid Build Coastguard Worker struct anv_buffer *buffer;
2843*61046927SAndroid Build Coastguard Worker uint64_t offset;
2844*61046927SAndroid Build Coastguard Worker uint64_t range;
2845*61046927SAndroid Build Coastguard Worker uint64_t bind_range;
2846*61046927SAndroid Build Coastguard Worker };
2847*61046927SAndroid Build Coastguard Worker
2848*61046927SAndroid Build Coastguard Worker struct anv_buffer_view *buffer_view;
2849*61046927SAndroid Build Coastguard Worker
2850*61046927SAndroid Build Coastguard Worker struct vk_acceleration_structure *accel_struct;
2851*61046927SAndroid Build Coastguard Worker };
2852*61046927SAndroid Build Coastguard Worker };
2853*61046927SAndroid Build Coastguard Worker
2854*61046927SAndroid Build Coastguard Worker struct anv_descriptor_set {
2855*61046927SAndroid Build Coastguard Worker struct vk_object_base base;
2856*61046927SAndroid Build Coastguard Worker
2857*61046927SAndroid Build Coastguard Worker struct anv_descriptor_pool *pool;
2858*61046927SAndroid Build Coastguard Worker struct anv_descriptor_set_layout *layout;
2859*61046927SAndroid Build Coastguard Worker
2860*61046927SAndroid Build Coastguard Worker /* Amount of space occupied in the the pool by this descriptor set. It can
2861*61046927SAndroid Build Coastguard Worker * be larger than the size of the descriptor set.
2862*61046927SAndroid Build Coastguard Worker */
2863*61046927SAndroid Build Coastguard Worker uint32_t size;
2864*61046927SAndroid Build Coastguard Worker
2865*61046927SAndroid Build Coastguard Worker /* Is this descriptor set a push descriptor */
2866*61046927SAndroid Build Coastguard Worker bool is_push;
2867*61046927SAndroid Build Coastguard Worker
2868*61046927SAndroid Build Coastguard Worker /* Bitfield of descriptors for which we need to generate surface states.
2869*61046927SAndroid Build Coastguard Worker * Only valid for push descriptors
2870*61046927SAndroid Build Coastguard Worker */
2871*61046927SAndroid Build Coastguard Worker uint32_t generate_surface_states;
2872*61046927SAndroid Build Coastguard Worker
2873*61046927SAndroid Build Coastguard Worker /* State relative to anv_descriptor_pool::surface_bo */
2874*61046927SAndroid Build Coastguard Worker struct anv_state desc_surface_mem;
2875*61046927SAndroid Build Coastguard Worker /* State relative to anv_descriptor_pool::sampler_bo */
2876*61046927SAndroid Build Coastguard Worker struct anv_state desc_sampler_mem;
2877*61046927SAndroid Build Coastguard Worker /* Surface state for the descriptor buffer */
2878*61046927SAndroid Build Coastguard Worker struct anv_state desc_surface_state;
2879*61046927SAndroid Build Coastguard Worker
2880*61046927SAndroid Build Coastguard Worker /* Descriptor set address pointing to desc_surface_mem (we don't need one
2881*61046927SAndroid Build Coastguard Worker * for sampler because they're never accessed other than by the HW through
2882*61046927SAndroid Build Coastguard Worker * the shader sampler handle).
2883*61046927SAndroid Build Coastguard Worker */
2884*61046927SAndroid Build Coastguard Worker struct anv_address desc_surface_addr;
2885*61046927SAndroid Build Coastguard Worker
2886*61046927SAndroid Build Coastguard Worker struct anv_address desc_sampler_addr;
2887*61046927SAndroid Build Coastguard Worker
2888*61046927SAndroid Build Coastguard Worker /* Descriptor offset from the
2889*61046927SAndroid Build Coastguard Worker * device->va.internal_surface_state_pool.addr
2890*61046927SAndroid Build Coastguard Worker *
2891*61046927SAndroid Build Coastguard Worker * It just needs to be added to the binding table offset to be put into the
2892*61046927SAndroid Build Coastguard Worker * HW BTI entry.
2893*61046927SAndroid Build Coastguard Worker */
2894*61046927SAndroid Build Coastguard Worker uint32_t desc_offset;
2895*61046927SAndroid Build Coastguard Worker
2896*61046927SAndroid Build Coastguard Worker uint32_t buffer_view_count;
2897*61046927SAndroid Build Coastguard Worker struct anv_buffer_view *buffer_views;
2898*61046927SAndroid Build Coastguard Worker
2899*61046927SAndroid Build Coastguard Worker /* Link to descriptor pool's desc_sets list . */
2900*61046927SAndroid Build Coastguard Worker struct list_head pool_link;
2901*61046927SAndroid Build Coastguard Worker
2902*61046927SAndroid Build Coastguard Worker uint32_t descriptor_count;
2903*61046927SAndroid Build Coastguard Worker struct anv_descriptor descriptors[0];
2904*61046927SAndroid Build Coastguard Worker };
2905*61046927SAndroid Build Coastguard Worker
2906*61046927SAndroid Build Coastguard Worker static inline bool
anv_descriptor_set_is_push(struct anv_descriptor_set * set)2907*61046927SAndroid Build Coastguard Worker anv_descriptor_set_is_push(struct anv_descriptor_set *set)
2908*61046927SAndroid Build Coastguard Worker {
2909*61046927SAndroid Build Coastguard Worker return set->pool == NULL;
2910*61046927SAndroid Build Coastguard Worker }
2911*61046927SAndroid Build Coastguard Worker
2912*61046927SAndroid Build Coastguard Worker struct anv_surface_state_data {
2913*61046927SAndroid Build Coastguard Worker uint8_t data[ANV_SURFACE_STATE_SIZE];
2914*61046927SAndroid Build Coastguard Worker };
2915*61046927SAndroid Build Coastguard Worker
2916*61046927SAndroid Build Coastguard Worker struct anv_buffer_state {
2917*61046927SAndroid Build Coastguard Worker /** Surface state allocated from the bindless heap
2918*61046927SAndroid Build Coastguard Worker *
2919*61046927SAndroid Build Coastguard Worker * Only valid if anv_physical_device::indirect_descriptors is true
2920*61046927SAndroid Build Coastguard Worker */
2921*61046927SAndroid Build Coastguard Worker struct anv_state state;
2922*61046927SAndroid Build Coastguard Worker
2923*61046927SAndroid Build Coastguard Worker /** Surface state after genxml packing
2924*61046927SAndroid Build Coastguard Worker *
2925*61046927SAndroid Build Coastguard Worker * Only valid if anv_physical_device::indirect_descriptors is false
2926*61046927SAndroid Build Coastguard Worker */
2927*61046927SAndroid Build Coastguard Worker struct anv_surface_state_data state_data;
2928*61046927SAndroid Build Coastguard Worker };
2929*61046927SAndroid Build Coastguard Worker
2930*61046927SAndroid Build Coastguard Worker struct anv_buffer_view {
2931*61046927SAndroid Build Coastguard Worker struct vk_buffer_view vk;
2932*61046927SAndroid Build Coastguard Worker
2933*61046927SAndroid Build Coastguard Worker struct anv_address address;
2934*61046927SAndroid Build Coastguard Worker
2935*61046927SAndroid Build Coastguard Worker struct anv_buffer_state general;
2936*61046927SAndroid Build Coastguard Worker struct anv_buffer_state storage;
2937*61046927SAndroid Build Coastguard Worker };
2938*61046927SAndroid Build Coastguard Worker
2939*61046927SAndroid Build Coastguard Worker struct anv_push_descriptor_set {
2940*61046927SAndroid Build Coastguard Worker struct anv_descriptor_set set;
2941*61046927SAndroid Build Coastguard Worker
2942*61046927SAndroid Build Coastguard Worker /* Put this field right behind anv_descriptor_set so it fills up the
2943*61046927SAndroid Build Coastguard Worker * descriptors[0] field. */
2944*61046927SAndroid Build Coastguard Worker struct anv_descriptor descriptors[MAX_PUSH_DESCRIPTORS];
2945*61046927SAndroid Build Coastguard Worker
2946*61046927SAndroid Build Coastguard Worker /** True if the descriptor set buffer has been referenced by a draw or
2947*61046927SAndroid Build Coastguard Worker * dispatch command.
2948*61046927SAndroid Build Coastguard Worker */
2949*61046927SAndroid Build Coastguard Worker bool set_used_on_gpu;
2950*61046927SAndroid Build Coastguard Worker
2951*61046927SAndroid Build Coastguard Worker struct anv_buffer_view buffer_views[MAX_PUSH_DESCRIPTORS];
2952*61046927SAndroid Build Coastguard Worker };
2953*61046927SAndroid Build Coastguard Worker
2954*61046927SAndroid Build Coastguard Worker static inline struct anv_address
anv_descriptor_set_address(struct anv_descriptor_set * set)2955*61046927SAndroid Build Coastguard Worker anv_descriptor_set_address(struct anv_descriptor_set *set)
2956*61046927SAndroid Build Coastguard Worker {
2957*61046927SAndroid Build Coastguard Worker if (anv_descriptor_set_is_push(set)) {
2958*61046927SAndroid Build Coastguard Worker /* We have to flag push descriptor set as used on the GPU
2959*61046927SAndroid Build Coastguard Worker * so that the next time we push descriptors, we grab a new memory.
2960*61046927SAndroid Build Coastguard Worker */
2961*61046927SAndroid Build Coastguard Worker struct anv_push_descriptor_set *push_set =
2962*61046927SAndroid Build Coastguard Worker (struct anv_push_descriptor_set *)set;
2963*61046927SAndroid Build Coastguard Worker push_set->set_used_on_gpu = true;
2964*61046927SAndroid Build Coastguard Worker }
2965*61046927SAndroid Build Coastguard Worker
2966*61046927SAndroid Build Coastguard Worker return set->desc_surface_addr;
2967*61046927SAndroid Build Coastguard Worker }
2968*61046927SAndroid Build Coastguard Worker
2969*61046927SAndroid Build Coastguard Worker struct anv_descriptor_pool_heap {
2970*61046927SAndroid Build Coastguard Worker /* BO allocated to back the pool (unused for host pools) */
2971*61046927SAndroid Build Coastguard Worker struct anv_bo *bo;
2972*61046927SAndroid Build Coastguard Worker
2973*61046927SAndroid Build Coastguard Worker /* Host memory allocated to back a host pool */
2974*61046927SAndroid Build Coastguard Worker void *host_mem;
2975*61046927SAndroid Build Coastguard Worker
2976*61046927SAndroid Build Coastguard Worker /* Heap tracking allocations in bo/host_mem */
2977*61046927SAndroid Build Coastguard Worker struct util_vma_heap heap;
2978*61046927SAndroid Build Coastguard Worker
2979*61046927SAndroid Build Coastguard Worker /* Size of the heap */
2980*61046927SAndroid Build Coastguard Worker uint32_t size;
2981*61046927SAndroid Build Coastguard Worker };
2982*61046927SAndroid Build Coastguard Worker
2983*61046927SAndroid Build Coastguard Worker struct anv_descriptor_pool {
2984*61046927SAndroid Build Coastguard Worker struct vk_object_base base;
2985*61046927SAndroid Build Coastguard Worker
2986*61046927SAndroid Build Coastguard Worker struct anv_descriptor_pool_heap surfaces;
2987*61046927SAndroid Build Coastguard Worker struct anv_descriptor_pool_heap samplers;
2988*61046927SAndroid Build Coastguard Worker
2989*61046927SAndroid Build Coastguard Worker struct anv_state_stream surface_state_stream;
2990*61046927SAndroid Build Coastguard Worker void *surface_state_free_list;
2991*61046927SAndroid Build Coastguard Worker
2992*61046927SAndroid Build Coastguard Worker /** List of anv_descriptor_set. */
2993*61046927SAndroid Build Coastguard Worker struct list_head desc_sets;
2994*61046927SAndroid Build Coastguard Worker
2995*61046927SAndroid Build Coastguard Worker /** Heap over host_mem */
2996*61046927SAndroid Build Coastguard Worker struct util_vma_heap host_heap;
2997*61046927SAndroid Build Coastguard Worker
2998*61046927SAndroid Build Coastguard Worker /** Allocated size of host_mem */
2999*61046927SAndroid Build Coastguard Worker uint32_t host_mem_size;
3000*61046927SAndroid Build Coastguard Worker
3001*61046927SAndroid Build Coastguard Worker /**
3002*61046927SAndroid Build Coastguard Worker * VK_DESCRIPTOR_POOL_CREATE_HOST_ONLY_BIT_EXT. If set, then
3003*61046927SAndroid Build Coastguard Worker * surface_state_stream is unused.
3004*61046927SAndroid Build Coastguard Worker */
3005*61046927SAndroid Build Coastguard Worker bool host_only;
3006*61046927SAndroid Build Coastguard Worker
3007*61046927SAndroid Build Coastguard Worker char host_mem[0];
3008*61046927SAndroid Build Coastguard Worker };
3009*61046927SAndroid Build Coastguard Worker
3010*61046927SAndroid Build Coastguard Worker bool
3011*61046927SAndroid Build Coastguard Worker anv_push_descriptor_set_init(struct anv_cmd_buffer *cmd_buffer,
3012*61046927SAndroid Build Coastguard Worker struct anv_push_descriptor_set *push_set,
3013*61046927SAndroid Build Coastguard Worker struct anv_descriptor_set_layout *layout);
3014*61046927SAndroid Build Coastguard Worker
3015*61046927SAndroid Build Coastguard Worker void
3016*61046927SAndroid Build Coastguard Worker anv_push_descriptor_set_finish(struct anv_push_descriptor_set *push_set);
3017*61046927SAndroid Build Coastguard Worker
3018*61046927SAndroid Build Coastguard Worker void
3019*61046927SAndroid Build Coastguard Worker anv_descriptor_set_write_image_view(struct anv_device *device,
3020*61046927SAndroid Build Coastguard Worker struct anv_descriptor_set *set,
3021*61046927SAndroid Build Coastguard Worker const VkDescriptorImageInfo * const info,
3022*61046927SAndroid Build Coastguard Worker VkDescriptorType type,
3023*61046927SAndroid Build Coastguard Worker uint32_t binding,
3024*61046927SAndroid Build Coastguard Worker uint32_t element);
3025*61046927SAndroid Build Coastguard Worker
3026*61046927SAndroid Build Coastguard Worker void
3027*61046927SAndroid Build Coastguard Worker anv_descriptor_set_write_buffer_view(struct anv_device *device,
3028*61046927SAndroid Build Coastguard Worker struct anv_descriptor_set *set,
3029*61046927SAndroid Build Coastguard Worker VkDescriptorType type,
3030*61046927SAndroid Build Coastguard Worker struct anv_buffer_view *buffer_view,
3031*61046927SAndroid Build Coastguard Worker uint32_t binding,
3032*61046927SAndroid Build Coastguard Worker uint32_t element);
3033*61046927SAndroid Build Coastguard Worker
3034*61046927SAndroid Build Coastguard Worker void
3035*61046927SAndroid Build Coastguard Worker anv_descriptor_set_write_buffer(struct anv_device *device,
3036*61046927SAndroid Build Coastguard Worker struct anv_descriptor_set *set,
3037*61046927SAndroid Build Coastguard Worker VkDescriptorType type,
3038*61046927SAndroid Build Coastguard Worker struct anv_buffer *buffer,
3039*61046927SAndroid Build Coastguard Worker uint32_t binding,
3040*61046927SAndroid Build Coastguard Worker uint32_t element,
3041*61046927SAndroid Build Coastguard Worker VkDeviceSize offset,
3042*61046927SAndroid Build Coastguard Worker VkDeviceSize range);
3043*61046927SAndroid Build Coastguard Worker
3044*61046927SAndroid Build Coastguard Worker void
3045*61046927SAndroid Build Coastguard Worker anv_descriptor_write_surface_state(struct anv_device *device,
3046*61046927SAndroid Build Coastguard Worker struct anv_descriptor *desc,
3047*61046927SAndroid Build Coastguard Worker struct anv_state surface_state);
3048*61046927SAndroid Build Coastguard Worker
3049*61046927SAndroid Build Coastguard Worker void
3050*61046927SAndroid Build Coastguard Worker anv_descriptor_set_write_acceleration_structure(struct anv_device *device,
3051*61046927SAndroid Build Coastguard Worker struct anv_descriptor_set *set,
3052*61046927SAndroid Build Coastguard Worker struct vk_acceleration_structure *accel,
3053*61046927SAndroid Build Coastguard Worker uint32_t binding,
3054*61046927SAndroid Build Coastguard Worker uint32_t element);
3055*61046927SAndroid Build Coastguard Worker
3056*61046927SAndroid Build Coastguard Worker void
3057*61046927SAndroid Build Coastguard Worker anv_descriptor_set_write_inline_uniform_data(struct anv_device *device,
3058*61046927SAndroid Build Coastguard Worker struct anv_descriptor_set *set,
3059*61046927SAndroid Build Coastguard Worker uint32_t binding,
3060*61046927SAndroid Build Coastguard Worker const void *data,
3061*61046927SAndroid Build Coastguard Worker size_t offset,
3062*61046927SAndroid Build Coastguard Worker size_t size);
3063*61046927SAndroid Build Coastguard Worker
3064*61046927SAndroid Build Coastguard Worker void
3065*61046927SAndroid Build Coastguard Worker anv_descriptor_set_write(struct anv_device *device,
3066*61046927SAndroid Build Coastguard Worker struct anv_descriptor_set *set_override,
3067*61046927SAndroid Build Coastguard Worker uint32_t write_count,
3068*61046927SAndroid Build Coastguard Worker const VkWriteDescriptorSet *writes);
3069*61046927SAndroid Build Coastguard Worker
3070*61046927SAndroid Build Coastguard Worker void
3071*61046927SAndroid Build Coastguard Worker anv_descriptor_set_write_template(struct anv_device *device,
3072*61046927SAndroid Build Coastguard Worker struct anv_descriptor_set *set,
3073*61046927SAndroid Build Coastguard Worker const struct vk_descriptor_update_template *template,
3074*61046927SAndroid Build Coastguard Worker const void *data);
3075*61046927SAndroid Build Coastguard Worker
3076*61046927SAndroid Build Coastguard Worker #define ANV_DESCRIPTOR_SET_DESCRIPTORS_BUFFER (UINT8_MAX - 5)
3077*61046927SAndroid Build Coastguard Worker #define ANV_DESCRIPTOR_SET_NULL (UINT8_MAX - 4)
3078*61046927SAndroid Build Coastguard Worker #define ANV_DESCRIPTOR_SET_PUSH_CONSTANTS (UINT8_MAX - 3)
3079*61046927SAndroid Build Coastguard Worker #define ANV_DESCRIPTOR_SET_DESCRIPTORS (UINT8_MAX - 2)
3080*61046927SAndroid Build Coastguard Worker #define ANV_DESCRIPTOR_SET_NUM_WORK_GROUPS (UINT8_MAX - 1)
3081*61046927SAndroid Build Coastguard Worker #define ANV_DESCRIPTOR_SET_COLOR_ATTACHMENTS UINT8_MAX
3082*61046927SAndroid Build Coastguard Worker
3083*61046927SAndroid Build Coastguard Worker struct anv_pipeline_binding {
3084*61046927SAndroid Build Coastguard Worker /** Index in the descriptor set
3085*61046927SAndroid Build Coastguard Worker *
3086*61046927SAndroid Build Coastguard Worker * This is a flattened index; the descriptor set layout is already taken
3087*61046927SAndroid Build Coastguard Worker * into account.
3088*61046927SAndroid Build Coastguard Worker */
3089*61046927SAndroid Build Coastguard Worker uint32_t index;
3090*61046927SAndroid Build Coastguard Worker
3091*61046927SAndroid Build Coastguard Worker /** Binding in the descriptor set. Not valid for any of the
3092*61046927SAndroid Build Coastguard Worker * ANV_DESCRIPTOR_SET_*
3093*61046927SAndroid Build Coastguard Worker */
3094*61046927SAndroid Build Coastguard Worker uint32_t binding;
3095*61046927SAndroid Build Coastguard Worker
3096*61046927SAndroid Build Coastguard Worker /** Offset in the descriptor buffer
3097*61046927SAndroid Build Coastguard Worker *
3098*61046927SAndroid Build Coastguard Worker * Relative to anv_descriptor_set::desc_addr. This is useful for
3099*61046927SAndroid Build Coastguard Worker * ANV_PIPELINE_DESCRIPTOR_SET_LAYOUT_TYPE_DIRECT, to generate the binding
3100*61046927SAndroid Build Coastguard Worker * table entry.
3101*61046927SAndroid Build Coastguard Worker */
3102*61046927SAndroid Build Coastguard Worker uint32_t set_offset;
3103*61046927SAndroid Build Coastguard Worker
3104*61046927SAndroid Build Coastguard Worker /** The descriptor set this surface corresponds to.
3105*61046927SAndroid Build Coastguard Worker *
3106*61046927SAndroid Build Coastguard Worker * The special ANV_DESCRIPTOR_SET_* values above indicates that this
3107*61046927SAndroid Build Coastguard Worker * binding is not a normal descriptor set but something else.
3108*61046927SAndroid Build Coastguard Worker */
3109*61046927SAndroid Build Coastguard Worker uint8_t set;
3110*61046927SAndroid Build Coastguard Worker
3111*61046927SAndroid Build Coastguard Worker union {
3112*61046927SAndroid Build Coastguard Worker /** Plane in the binding index for images */
3113*61046927SAndroid Build Coastguard Worker uint8_t plane;
3114*61046927SAndroid Build Coastguard Worker
3115*61046927SAndroid Build Coastguard Worker /** Input attachment index (relative to the subpass) */
3116*61046927SAndroid Build Coastguard Worker uint8_t input_attachment_index;
3117*61046927SAndroid Build Coastguard Worker
3118*61046927SAndroid Build Coastguard Worker /** Dynamic offset index
3119*61046927SAndroid Build Coastguard Worker *
3120*61046927SAndroid Build Coastguard Worker * For dynamic UBOs and SSBOs, relative to set.
3121*61046927SAndroid Build Coastguard Worker */
3122*61046927SAndroid Build Coastguard Worker uint8_t dynamic_offset_index;
3123*61046927SAndroid Build Coastguard Worker };
3124*61046927SAndroid Build Coastguard Worker };
3125*61046927SAndroid Build Coastguard Worker
3126*61046927SAndroid Build Coastguard Worker struct anv_embedded_sampler_key {
3127*61046927SAndroid Build Coastguard Worker /** No need to track binding elements for embedded samplers as :
3128*61046927SAndroid Build Coastguard Worker *
3129*61046927SAndroid Build Coastguard Worker * VUID-VkDescriptorSetLayoutBinding-flags-08006:
3130*61046927SAndroid Build Coastguard Worker *
3131*61046927SAndroid Build Coastguard Worker * "If VkDescriptorSetLayoutCreateInfo:flags contains
3132*61046927SAndroid Build Coastguard Worker * VK_DESCRIPTOR_SET_LAYOUT_CREATE_EMBEDDED_IMMUTABLE_SAMPLERS_BIT_EXT,
3133*61046927SAndroid Build Coastguard Worker * descriptorCount must: less than or equal to 1"
3134*61046927SAndroid Build Coastguard Worker *
3135*61046927SAndroid Build Coastguard Worker * The following struct can be safely hash as it doesn't include in
3136*61046927SAndroid Build Coastguard Worker * address/offset.
3137*61046927SAndroid Build Coastguard Worker */
3138*61046927SAndroid Build Coastguard Worker uint32_t sampler[4];
3139*61046927SAndroid Build Coastguard Worker uint32_t color[4];
3140*61046927SAndroid Build Coastguard Worker };
3141*61046927SAndroid Build Coastguard Worker
3142*61046927SAndroid Build Coastguard Worker struct anv_pipeline_embedded_sampler_binding {
3143*61046927SAndroid Build Coastguard Worker /** The descriptor set this sampler belongs to */
3144*61046927SAndroid Build Coastguard Worker uint8_t set;
3145*61046927SAndroid Build Coastguard Worker
3146*61046927SAndroid Build Coastguard Worker /** The binding in the set this sampler belongs to */
3147*61046927SAndroid Build Coastguard Worker uint32_t binding;
3148*61046927SAndroid Build Coastguard Worker
3149*61046927SAndroid Build Coastguard Worker /** The data configuring the sampler */
3150*61046927SAndroid Build Coastguard Worker struct anv_embedded_sampler_key key;
3151*61046927SAndroid Build Coastguard Worker };
3152*61046927SAndroid Build Coastguard Worker
3153*61046927SAndroid Build Coastguard Worker struct anv_push_range {
3154*61046927SAndroid Build Coastguard Worker /** Index in the descriptor set */
3155*61046927SAndroid Build Coastguard Worker uint32_t index;
3156*61046927SAndroid Build Coastguard Worker
3157*61046927SAndroid Build Coastguard Worker /** Descriptor set index */
3158*61046927SAndroid Build Coastguard Worker uint8_t set;
3159*61046927SAndroid Build Coastguard Worker
3160*61046927SAndroid Build Coastguard Worker /** Dynamic offset index (for dynamic UBOs), relative to set. */
3161*61046927SAndroid Build Coastguard Worker uint8_t dynamic_offset_index;
3162*61046927SAndroid Build Coastguard Worker
3163*61046927SAndroid Build Coastguard Worker /** Start offset in units of 32B */
3164*61046927SAndroid Build Coastguard Worker uint8_t start;
3165*61046927SAndroid Build Coastguard Worker
3166*61046927SAndroid Build Coastguard Worker /** Range in units of 32B */
3167*61046927SAndroid Build Coastguard Worker uint8_t length;
3168*61046927SAndroid Build Coastguard Worker };
3169*61046927SAndroid Build Coastguard Worker
3170*61046927SAndroid Build Coastguard Worker struct anv_pipeline_sets_layout {
3171*61046927SAndroid Build Coastguard Worker struct anv_device *device;
3172*61046927SAndroid Build Coastguard Worker
3173*61046927SAndroid Build Coastguard Worker struct {
3174*61046927SAndroid Build Coastguard Worker struct anv_descriptor_set_layout *layout;
3175*61046927SAndroid Build Coastguard Worker uint32_t dynamic_offset_start;
3176*61046927SAndroid Build Coastguard Worker } set[MAX_SETS];
3177*61046927SAndroid Build Coastguard Worker
3178*61046927SAndroid Build Coastguard Worker enum anv_descriptor_set_layout_type type;
3179*61046927SAndroid Build Coastguard Worker
3180*61046927SAndroid Build Coastguard Worker uint32_t num_sets;
3181*61046927SAndroid Build Coastguard Worker uint32_t num_dynamic_buffers;
3182*61046927SAndroid Build Coastguard Worker int push_descriptor_set_index;
3183*61046927SAndroid Build Coastguard Worker
3184*61046927SAndroid Build Coastguard Worker bool independent_sets;
3185*61046927SAndroid Build Coastguard Worker
3186*61046927SAndroid Build Coastguard Worker unsigned char sha1[20];
3187*61046927SAndroid Build Coastguard Worker };
3188*61046927SAndroid Build Coastguard Worker
3189*61046927SAndroid Build Coastguard Worker void anv_pipeline_sets_layout_init(struct anv_pipeline_sets_layout *layout,
3190*61046927SAndroid Build Coastguard Worker struct anv_device *device,
3191*61046927SAndroid Build Coastguard Worker bool independent_sets);
3192*61046927SAndroid Build Coastguard Worker
3193*61046927SAndroid Build Coastguard Worker void anv_pipeline_sets_layout_fini(struct anv_pipeline_sets_layout *layout);
3194*61046927SAndroid Build Coastguard Worker
3195*61046927SAndroid Build Coastguard Worker void anv_pipeline_sets_layout_add(struct anv_pipeline_sets_layout *layout,
3196*61046927SAndroid Build Coastguard Worker uint32_t set_idx,
3197*61046927SAndroid Build Coastguard Worker struct anv_descriptor_set_layout *set_layout);
3198*61046927SAndroid Build Coastguard Worker
3199*61046927SAndroid Build Coastguard Worker uint32_t
3200*61046927SAndroid Build Coastguard Worker anv_pipeline_sets_layout_embedded_sampler_count(const struct anv_pipeline_sets_layout *layout);
3201*61046927SAndroid Build Coastguard Worker
3202*61046927SAndroid Build Coastguard Worker void anv_pipeline_sets_layout_hash(struct anv_pipeline_sets_layout *layout);
3203*61046927SAndroid Build Coastguard Worker
3204*61046927SAndroid Build Coastguard Worker void anv_pipeline_sets_layout_print(const struct anv_pipeline_sets_layout *layout);
3205*61046927SAndroid Build Coastguard Worker
3206*61046927SAndroid Build Coastguard Worker struct anv_pipeline_layout {
3207*61046927SAndroid Build Coastguard Worker struct vk_object_base base;
3208*61046927SAndroid Build Coastguard Worker
3209*61046927SAndroid Build Coastguard Worker struct anv_pipeline_sets_layout sets_layout;
3210*61046927SAndroid Build Coastguard Worker };
3211*61046927SAndroid Build Coastguard Worker
3212*61046927SAndroid Build Coastguard Worker const struct anv_descriptor_set_layout *
3213*61046927SAndroid Build Coastguard Worker anv_pipeline_layout_get_push_set(const struct anv_pipeline_sets_layout *layout,
3214*61046927SAndroid Build Coastguard Worker uint8_t *desc_idx);
3215*61046927SAndroid Build Coastguard Worker
3216*61046927SAndroid Build Coastguard Worker struct anv_sparse_binding_data {
3217*61046927SAndroid Build Coastguard Worker uint64_t address;
3218*61046927SAndroid Build Coastguard Worker uint64_t size;
3219*61046927SAndroid Build Coastguard Worker
3220*61046927SAndroid Build Coastguard Worker /* This is kept only because it's given to us by vma_alloc() and need to be
3221*61046927SAndroid Build Coastguard Worker * passed back to vma_free(), we have no other particular use for it
3222*61046927SAndroid Build Coastguard Worker */
3223*61046927SAndroid Build Coastguard Worker struct util_vma_heap *vma_heap;
3224*61046927SAndroid Build Coastguard Worker };
3225*61046927SAndroid Build Coastguard Worker
3226*61046927SAndroid Build Coastguard Worker #define ANV_SPARSE_BLOCK_SIZE (64 * 1024)
3227*61046927SAndroid Build Coastguard Worker
3228*61046927SAndroid Build Coastguard Worker static inline bool
anv_sparse_binding_is_enabled(struct anv_device * device)3229*61046927SAndroid Build Coastguard Worker anv_sparse_binding_is_enabled(struct anv_device *device)
3230*61046927SAndroid Build Coastguard Worker {
3231*61046927SAndroid Build Coastguard Worker return device->vk.enabled_features.sparseBinding;
3232*61046927SAndroid Build Coastguard Worker }
3233*61046927SAndroid Build Coastguard Worker
3234*61046927SAndroid Build Coastguard Worker static inline bool
anv_sparse_residency_is_enabled(struct anv_device * device)3235*61046927SAndroid Build Coastguard Worker anv_sparse_residency_is_enabled(struct anv_device *device)
3236*61046927SAndroid Build Coastguard Worker {
3237*61046927SAndroid Build Coastguard Worker return device->vk.enabled_features.sparseResidencyBuffer ||
3238*61046927SAndroid Build Coastguard Worker device->vk.enabled_features.sparseResidencyImage2D ||
3239*61046927SAndroid Build Coastguard Worker device->vk.enabled_features.sparseResidencyImage3D ||
3240*61046927SAndroid Build Coastguard Worker device->vk.enabled_features.sparseResidency2Samples ||
3241*61046927SAndroid Build Coastguard Worker device->vk.enabled_features.sparseResidency4Samples ||
3242*61046927SAndroid Build Coastguard Worker device->vk.enabled_features.sparseResidency8Samples ||
3243*61046927SAndroid Build Coastguard Worker device->vk.enabled_features.sparseResidency16Samples ||
3244*61046927SAndroid Build Coastguard Worker device->vk.enabled_features.sparseResidencyAliased;
3245*61046927SAndroid Build Coastguard Worker }
3246*61046927SAndroid Build Coastguard Worker
3247*61046927SAndroid Build Coastguard Worker VkResult anv_init_sparse_bindings(struct anv_device *device,
3248*61046927SAndroid Build Coastguard Worker uint64_t size,
3249*61046927SAndroid Build Coastguard Worker struct anv_sparse_binding_data *sparse,
3250*61046927SAndroid Build Coastguard Worker enum anv_bo_alloc_flags alloc_flags,
3251*61046927SAndroid Build Coastguard Worker uint64_t client_address,
3252*61046927SAndroid Build Coastguard Worker struct anv_address *out_address);
3253*61046927SAndroid Build Coastguard Worker void anv_free_sparse_bindings(struct anv_device *device,
3254*61046927SAndroid Build Coastguard Worker struct anv_sparse_binding_data *sparse);
3255*61046927SAndroid Build Coastguard Worker VkResult anv_sparse_bind_buffer(struct anv_device *device,
3256*61046927SAndroid Build Coastguard Worker struct anv_buffer *buffer,
3257*61046927SAndroid Build Coastguard Worker const VkSparseMemoryBind *vk_bind,
3258*61046927SAndroid Build Coastguard Worker struct anv_sparse_submission *submit);
3259*61046927SAndroid Build Coastguard Worker VkResult anv_sparse_bind_image_opaque(struct anv_device *device,
3260*61046927SAndroid Build Coastguard Worker struct anv_image *image,
3261*61046927SAndroid Build Coastguard Worker const VkSparseMemoryBind *vk_bind,
3262*61046927SAndroid Build Coastguard Worker struct anv_sparse_submission *submit);
3263*61046927SAndroid Build Coastguard Worker VkResult anv_sparse_bind_image_memory(struct anv_queue *queue,
3264*61046927SAndroid Build Coastguard Worker struct anv_image *image,
3265*61046927SAndroid Build Coastguard Worker const VkSparseImageMemoryBind *bind,
3266*61046927SAndroid Build Coastguard Worker struct anv_sparse_submission *submit);
3267*61046927SAndroid Build Coastguard Worker VkResult anv_sparse_bind(struct anv_device *device,
3268*61046927SAndroid Build Coastguard Worker struct anv_sparse_submission *sparse_submit);
3269*61046927SAndroid Build Coastguard Worker
3270*61046927SAndroid Build Coastguard Worker VkResult anv_sparse_trtt_garbage_collect_batches(struct anv_device *device,
3271*61046927SAndroid Build Coastguard Worker bool wait_completion);
3272*61046927SAndroid Build Coastguard Worker
3273*61046927SAndroid Build Coastguard Worker VkSparseImageFormatProperties
3274*61046927SAndroid Build Coastguard Worker anv_sparse_calc_image_format_properties(struct anv_physical_device *pdevice,
3275*61046927SAndroid Build Coastguard Worker VkImageAspectFlags aspect,
3276*61046927SAndroid Build Coastguard Worker VkImageType vk_image_type,
3277*61046927SAndroid Build Coastguard Worker VkSampleCountFlagBits vk_samples,
3278*61046927SAndroid Build Coastguard Worker struct isl_surf *surf);
3279*61046927SAndroid Build Coastguard Worker void anv_sparse_calc_miptail_properties(struct anv_device *device,
3280*61046927SAndroid Build Coastguard Worker struct anv_image *image,
3281*61046927SAndroid Build Coastguard Worker VkImageAspectFlags vk_aspect,
3282*61046927SAndroid Build Coastguard Worker uint32_t *imageMipTailFirstLod,
3283*61046927SAndroid Build Coastguard Worker VkDeviceSize *imageMipTailSize,
3284*61046927SAndroid Build Coastguard Worker VkDeviceSize *imageMipTailOffset,
3285*61046927SAndroid Build Coastguard Worker VkDeviceSize *imageMipTailStride);
3286*61046927SAndroid Build Coastguard Worker VkResult anv_sparse_image_check_support(struct anv_physical_device *pdevice,
3287*61046927SAndroid Build Coastguard Worker VkImageCreateFlags flags,
3288*61046927SAndroid Build Coastguard Worker VkImageTiling tiling,
3289*61046927SAndroid Build Coastguard Worker VkSampleCountFlagBits samples,
3290*61046927SAndroid Build Coastguard Worker VkImageType type,
3291*61046927SAndroid Build Coastguard Worker VkFormat format);
3292*61046927SAndroid Build Coastguard Worker
3293*61046927SAndroid Build Coastguard Worker struct anv_buffer {
3294*61046927SAndroid Build Coastguard Worker struct vk_buffer vk;
3295*61046927SAndroid Build Coastguard Worker
3296*61046927SAndroid Build Coastguard Worker /* Set when bound */
3297*61046927SAndroid Build Coastguard Worker struct anv_address address;
3298*61046927SAndroid Build Coastguard Worker
3299*61046927SAndroid Build Coastguard Worker struct anv_sparse_binding_data sparse_data;
3300*61046927SAndroid Build Coastguard Worker };
3301*61046927SAndroid Build Coastguard Worker
3302*61046927SAndroid Build Coastguard Worker static inline bool
anv_buffer_is_protected(const struct anv_buffer * buffer)3303*61046927SAndroid Build Coastguard Worker anv_buffer_is_protected(const struct anv_buffer *buffer)
3304*61046927SAndroid Build Coastguard Worker {
3305*61046927SAndroid Build Coastguard Worker return buffer->vk.create_flags & VK_BUFFER_CREATE_PROTECTED_BIT;
3306*61046927SAndroid Build Coastguard Worker }
3307*61046927SAndroid Build Coastguard Worker
3308*61046927SAndroid Build Coastguard Worker static inline bool
anv_buffer_is_sparse(const struct anv_buffer * buffer)3309*61046927SAndroid Build Coastguard Worker anv_buffer_is_sparse(const struct anv_buffer *buffer)
3310*61046927SAndroid Build Coastguard Worker {
3311*61046927SAndroid Build Coastguard Worker return buffer->vk.create_flags & VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
3312*61046927SAndroid Build Coastguard Worker }
3313*61046927SAndroid Build Coastguard Worker
3314*61046927SAndroid Build Coastguard Worker enum anv_cmd_dirty_bits {
3315*61046927SAndroid Build Coastguard Worker ANV_CMD_DIRTY_PIPELINE = 1 << 0,
3316*61046927SAndroid Build Coastguard Worker ANV_CMD_DIRTY_INDEX_BUFFER = 1 << 1,
3317*61046927SAndroid Build Coastguard Worker ANV_CMD_DIRTY_RENDER_AREA = 1 << 2,
3318*61046927SAndroid Build Coastguard Worker ANV_CMD_DIRTY_RENDER_TARGETS = 1 << 3,
3319*61046927SAndroid Build Coastguard Worker ANV_CMD_DIRTY_XFB_ENABLE = 1 << 4,
3320*61046927SAndroid Build Coastguard Worker ANV_CMD_DIRTY_RESTART_INDEX = 1 << 5,
3321*61046927SAndroid Build Coastguard Worker ANV_CMD_DIRTY_OCCLUSION_QUERY_ACTIVE = 1 << 6,
3322*61046927SAndroid Build Coastguard Worker ANV_CMD_DIRTY_FS_MSAA_FLAGS = 1 << 7,
3323*61046927SAndroid Build Coastguard Worker ANV_CMD_DIRTY_COARSE_PIXEL_ACTIVE = 1 << 8,
3324*61046927SAndroid Build Coastguard Worker ANV_CMD_DIRTY_INDIRECT_DATA_STRIDE = 1 << 9,
3325*61046927SAndroid Build Coastguard Worker };
3326*61046927SAndroid Build Coastguard Worker typedef enum anv_cmd_dirty_bits anv_cmd_dirty_mask_t;
3327*61046927SAndroid Build Coastguard Worker
3328*61046927SAndroid Build Coastguard Worker enum anv_pipe_bits {
3329*61046927SAndroid Build Coastguard Worker ANV_PIPE_DEPTH_CACHE_FLUSH_BIT = (1 << 0),
3330*61046927SAndroid Build Coastguard Worker ANV_PIPE_STALL_AT_SCOREBOARD_BIT = (1 << 1),
3331*61046927SAndroid Build Coastguard Worker ANV_PIPE_STATE_CACHE_INVALIDATE_BIT = (1 << 2),
3332*61046927SAndroid Build Coastguard Worker ANV_PIPE_CONSTANT_CACHE_INVALIDATE_BIT = (1 << 3),
3333*61046927SAndroid Build Coastguard Worker ANV_PIPE_VF_CACHE_INVALIDATE_BIT = (1 << 4),
3334*61046927SAndroid Build Coastguard Worker ANV_PIPE_DATA_CACHE_FLUSH_BIT = (1 << 5),
3335*61046927SAndroid Build Coastguard Worker ANV_PIPE_TILE_CACHE_FLUSH_BIT = (1 << 6),
3336*61046927SAndroid Build Coastguard Worker ANV_PIPE_TEXTURE_CACHE_INVALIDATE_BIT = (1 << 10),
3337*61046927SAndroid Build Coastguard Worker ANV_PIPE_INSTRUCTION_CACHE_INVALIDATE_BIT = (1 << 11),
3338*61046927SAndroid Build Coastguard Worker ANV_PIPE_RENDER_TARGET_CACHE_FLUSH_BIT = (1 << 12),
3339*61046927SAndroid Build Coastguard Worker ANV_PIPE_DEPTH_STALL_BIT = (1 << 13),
3340*61046927SAndroid Build Coastguard Worker
3341*61046927SAndroid Build Coastguard Worker /* ANV_PIPE_HDC_PIPELINE_FLUSH_BIT is a precise way to ensure prior data
3342*61046927SAndroid Build Coastguard Worker * cache work has completed. Available on Gfx12+. For earlier Gfx we
3343*61046927SAndroid Build Coastguard Worker * must reinterpret this flush as ANV_PIPE_DATA_CACHE_FLUSH_BIT.
3344*61046927SAndroid Build Coastguard Worker */
3345*61046927SAndroid Build Coastguard Worker ANV_PIPE_HDC_PIPELINE_FLUSH_BIT = (1 << 14),
3346*61046927SAndroid Build Coastguard Worker ANV_PIPE_PSS_STALL_SYNC_BIT = (1 << 15),
3347*61046927SAndroid Build Coastguard Worker
3348*61046927SAndroid Build Coastguard Worker /*
3349*61046927SAndroid Build Coastguard Worker * This bit flush data-port's Untyped L1 data cache (LSC L1).
3350*61046927SAndroid Build Coastguard Worker */
3351*61046927SAndroid Build Coastguard Worker ANV_PIPE_UNTYPED_DATAPORT_CACHE_FLUSH_BIT = (1 << 16),
3352*61046927SAndroid Build Coastguard Worker
3353*61046927SAndroid Build Coastguard Worker /* This bit controls the flushing of the engine (Render, Compute) specific
3354*61046927SAndroid Build Coastguard Worker * entries from the compression cache.
3355*61046927SAndroid Build Coastguard Worker */
3356*61046927SAndroid Build Coastguard Worker ANV_PIPE_CCS_CACHE_FLUSH_BIT = (1 << 17),
3357*61046927SAndroid Build Coastguard Worker
3358*61046927SAndroid Build Coastguard Worker ANV_PIPE_TLB_INVALIDATE_BIT = (1 << 18),
3359*61046927SAndroid Build Coastguard Worker
3360*61046927SAndroid Build Coastguard Worker ANV_PIPE_CS_STALL_BIT = (1 << 20),
3361*61046927SAndroid Build Coastguard Worker ANV_PIPE_END_OF_PIPE_SYNC_BIT = (1 << 21),
3362*61046927SAndroid Build Coastguard Worker
3363*61046927SAndroid Build Coastguard Worker /* This bit does not exist directly in PIPE_CONTROL. Instead it means that
3364*61046927SAndroid Build Coastguard Worker * a flush has happened but not a CS stall. The next time we do any sort
3365*61046927SAndroid Build Coastguard Worker * of invalidation we need to insert a CS stall at that time. Otherwise,
3366*61046927SAndroid Build Coastguard Worker * we would have to CS stall on every flush which could be bad.
3367*61046927SAndroid Build Coastguard Worker */
3368*61046927SAndroid Build Coastguard Worker ANV_PIPE_NEEDS_END_OF_PIPE_SYNC_BIT = (1 << 22),
3369*61046927SAndroid Build Coastguard Worker
3370*61046927SAndroid Build Coastguard Worker /* This bit does not exist directly in PIPE_CONTROL. It means that Gfx12
3371*61046927SAndroid Build Coastguard Worker * AUX-TT data has changed and we need to invalidate AUX-TT data. This is
3372*61046927SAndroid Build Coastguard Worker * done by writing the AUX-TT register.
3373*61046927SAndroid Build Coastguard Worker */
3374*61046927SAndroid Build Coastguard Worker ANV_PIPE_AUX_TABLE_INVALIDATE_BIT = (1 << 23),
3375*61046927SAndroid Build Coastguard Worker
3376*61046927SAndroid Build Coastguard Worker /* This bit does not exist directly in PIPE_CONTROL. It means that a
3377*61046927SAndroid Build Coastguard Worker * PIPE_CONTROL with a post-sync operation will follow. This is used to
3378*61046927SAndroid Build Coastguard Worker * implement a workaround for Gfx9.
3379*61046927SAndroid Build Coastguard Worker */
3380*61046927SAndroid Build Coastguard Worker ANV_PIPE_POST_SYNC_BIT = (1 << 24),
3381*61046927SAndroid Build Coastguard Worker };
3382*61046927SAndroid Build Coastguard Worker
3383*61046927SAndroid Build Coastguard Worker /* These bits track the state of buffer writes for queries. They get cleared
3384*61046927SAndroid Build Coastguard Worker * based on PIPE_CONTROL emissions.
3385*61046927SAndroid Build Coastguard Worker */
3386*61046927SAndroid Build Coastguard Worker enum anv_query_bits {
3387*61046927SAndroid Build Coastguard Worker ANV_QUERY_WRITES_RT_FLUSH = (1 << 0),
3388*61046927SAndroid Build Coastguard Worker
3389*61046927SAndroid Build Coastguard Worker ANV_QUERY_WRITES_TILE_FLUSH = (1 << 1),
3390*61046927SAndroid Build Coastguard Worker
3391*61046927SAndroid Build Coastguard Worker ANV_QUERY_WRITES_CS_STALL = (1 << 2),
3392*61046927SAndroid Build Coastguard Worker
3393*61046927SAndroid Build Coastguard Worker ANV_QUERY_WRITES_DATA_FLUSH = (1 << 3),
3394*61046927SAndroid Build Coastguard Worker };
3395*61046927SAndroid Build Coastguard Worker
3396*61046927SAndroid Build Coastguard Worker /* It's not clear why DG2 doesn't have issues with L3/CS coherency. But it's
3397*61046927SAndroid Build Coastguard Worker * likely related to performance workaround 14015868140.
3398*61046927SAndroid Build Coastguard Worker *
3399*61046927SAndroid Build Coastguard Worker * For now we enable this only on DG2 and platform prior to Gfx12 where there
3400*61046927SAndroid Build Coastguard Worker * is no tile cache.
3401*61046927SAndroid Build Coastguard Worker */
3402*61046927SAndroid Build Coastguard Worker #define ANV_DEVINFO_HAS_COHERENT_L3_CS(devinfo) \
3403*61046927SAndroid Build Coastguard Worker (intel_device_info_is_dg2(devinfo))
3404*61046927SAndroid Build Coastguard Worker
3405*61046927SAndroid Build Coastguard Worker /* Things we need to flush before accessing query data using the command
3406*61046927SAndroid Build Coastguard Worker * streamer.
3407*61046927SAndroid Build Coastguard Worker *
3408*61046927SAndroid Build Coastguard Worker * Prior to DG2 experiments show that the command streamer is not coherent
3409*61046927SAndroid Build Coastguard Worker * with the tile cache so we need to flush it to make any data visible to CS.
3410*61046927SAndroid Build Coastguard Worker *
3411*61046927SAndroid Build Coastguard Worker * Otherwise we want to flush the RT cache which is where blorp writes, either
3412*61046927SAndroid Build Coastguard Worker * for clearing the query buffer or for clearing the destination buffer in
3413*61046927SAndroid Build Coastguard Worker * vkCopyQueryPoolResults().
3414*61046927SAndroid Build Coastguard Worker */
3415*61046927SAndroid Build Coastguard Worker #define ANV_QUERY_RENDER_TARGET_WRITES_PENDING_BITS(devinfo) \
3416*61046927SAndroid Build Coastguard Worker (((!ANV_DEVINFO_HAS_COHERENT_L3_CS(devinfo) && \
3417*61046927SAndroid Build Coastguard Worker (devinfo)->ver >= 12) ? \
3418*61046927SAndroid Build Coastguard Worker ANV_QUERY_WRITES_TILE_FLUSH : 0) | \
3419*61046927SAndroid Build Coastguard Worker ANV_QUERY_WRITES_RT_FLUSH | \
3420*61046927SAndroid Build Coastguard Worker ANV_QUERY_WRITES_CS_STALL)
3421*61046927SAndroid Build Coastguard Worker #define ANV_QUERY_COMPUTE_WRITES_PENDING_BITS \
3422*61046927SAndroid Build Coastguard Worker (ANV_QUERY_WRITES_DATA_FLUSH | \
3423*61046927SAndroid Build Coastguard Worker ANV_QUERY_WRITES_CS_STALL)
3424*61046927SAndroid Build Coastguard Worker
3425*61046927SAndroid Build Coastguard Worker #define ANV_PIPE_QUERY_BITS(pending_query_bits) ( \
3426*61046927SAndroid Build Coastguard Worker ((pending_query_bits & ANV_QUERY_WRITES_RT_FLUSH) ? \
3427*61046927SAndroid Build Coastguard Worker ANV_PIPE_RENDER_TARGET_CACHE_FLUSH_BIT : 0) | \
3428*61046927SAndroid Build Coastguard Worker ((pending_query_bits & ANV_QUERY_WRITES_TILE_FLUSH) ? \
3429*61046927SAndroid Build Coastguard Worker ANV_PIPE_TILE_CACHE_FLUSH_BIT : 0) | \
3430*61046927SAndroid Build Coastguard Worker ((pending_query_bits & ANV_QUERY_WRITES_CS_STALL) ? \
3431*61046927SAndroid Build Coastguard Worker ANV_PIPE_CS_STALL_BIT : 0) | \
3432*61046927SAndroid Build Coastguard Worker ((pending_query_bits & ANV_QUERY_WRITES_DATA_FLUSH) ? \
3433*61046927SAndroid Build Coastguard Worker (ANV_PIPE_DATA_CACHE_FLUSH_BIT | \
3434*61046927SAndroid Build Coastguard Worker ANV_PIPE_HDC_PIPELINE_FLUSH_BIT | \
3435*61046927SAndroid Build Coastguard Worker ANV_PIPE_UNTYPED_DATAPORT_CACHE_FLUSH_BIT) : 0))
3436*61046927SAndroid Build Coastguard Worker
3437*61046927SAndroid Build Coastguard Worker #define ANV_PIPE_FLUSH_BITS ( \
3438*61046927SAndroid Build Coastguard Worker ANV_PIPE_DEPTH_CACHE_FLUSH_BIT | \
3439*61046927SAndroid Build Coastguard Worker ANV_PIPE_DATA_CACHE_FLUSH_BIT | \
3440*61046927SAndroid Build Coastguard Worker ANV_PIPE_HDC_PIPELINE_FLUSH_BIT | \
3441*61046927SAndroid Build Coastguard Worker ANV_PIPE_UNTYPED_DATAPORT_CACHE_FLUSH_BIT | \
3442*61046927SAndroid Build Coastguard Worker ANV_PIPE_RENDER_TARGET_CACHE_FLUSH_BIT | \
3443*61046927SAndroid Build Coastguard Worker ANV_PIPE_TILE_CACHE_FLUSH_BIT)
3444*61046927SAndroid Build Coastguard Worker
3445*61046927SAndroid Build Coastguard Worker #define ANV_PIPE_STALL_BITS ( \
3446*61046927SAndroid Build Coastguard Worker ANV_PIPE_STALL_AT_SCOREBOARD_BIT | \
3447*61046927SAndroid Build Coastguard Worker ANV_PIPE_DEPTH_STALL_BIT | \
3448*61046927SAndroid Build Coastguard Worker ANV_PIPE_CS_STALL_BIT | \
3449*61046927SAndroid Build Coastguard Worker ANV_PIPE_PSS_STALL_SYNC_BIT)
3450*61046927SAndroid Build Coastguard Worker
3451*61046927SAndroid Build Coastguard Worker #define ANV_PIPE_INVALIDATE_BITS ( \
3452*61046927SAndroid Build Coastguard Worker ANV_PIPE_STATE_CACHE_INVALIDATE_BIT | \
3453*61046927SAndroid Build Coastguard Worker ANV_PIPE_CONSTANT_CACHE_INVALIDATE_BIT | \
3454*61046927SAndroid Build Coastguard Worker ANV_PIPE_VF_CACHE_INVALIDATE_BIT | \
3455*61046927SAndroid Build Coastguard Worker ANV_PIPE_TEXTURE_CACHE_INVALIDATE_BIT | \
3456*61046927SAndroid Build Coastguard Worker ANV_PIPE_INSTRUCTION_CACHE_INVALIDATE_BIT | \
3457*61046927SAndroid Build Coastguard Worker ANV_PIPE_AUX_TABLE_INVALIDATE_BIT)
3458*61046927SAndroid Build Coastguard Worker
3459*61046927SAndroid Build Coastguard Worker /* PIPE_CONTROL bits that should be set only in 3D RCS mode.
3460*61046927SAndroid Build Coastguard Worker * For more details see genX(emit_apply_pipe_flushes).
3461*61046927SAndroid Build Coastguard Worker */
3462*61046927SAndroid Build Coastguard Worker #define ANV_PIPE_GFX_BITS ( \
3463*61046927SAndroid Build Coastguard Worker ANV_PIPE_RENDER_TARGET_CACHE_FLUSH_BIT | \
3464*61046927SAndroid Build Coastguard Worker ANV_PIPE_DEPTH_CACHE_FLUSH_BIT | \
3465*61046927SAndroid Build Coastguard Worker ANV_PIPE_TILE_CACHE_FLUSH_BIT | \
3466*61046927SAndroid Build Coastguard Worker ANV_PIPE_DEPTH_STALL_BIT | \
3467*61046927SAndroid Build Coastguard Worker ANV_PIPE_STALL_AT_SCOREBOARD_BIT | \
3468*61046927SAndroid Build Coastguard Worker (GFX_VERx10 >= 125 ? ANV_PIPE_PSS_STALL_SYNC_BIT : 0) | \
3469*61046927SAndroid Build Coastguard Worker ANV_PIPE_VF_CACHE_INVALIDATE_BIT)
3470*61046927SAndroid Build Coastguard Worker
3471*61046927SAndroid Build Coastguard Worker /* PIPE_CONTROL bits that should be set only in Media/GPGPU RCS mode.
3472*61046927SAndroid Build Coastguard Worker * For more details see genX(emit_apply_pipe_flushes).
3473*61046927SAndroid Build Coastguard Worker *
3474*61046927SAndroid Build Coastguard Worker * Documentation says that untyped L1 dataport cache flush is controlled by
3475*61046927SAndroid Build Coastguard Worker * HDC pipeline flush in 3D mode according to HDC_CHICKEN0 register:
3476*61046927SAndroid Build Coastguard Worker *
3477*61046927SAndroid Build Coastguard Worker * BSpec 47112: PIPE_CONTROL::HDC Pipeline Flush:
3478*61046927SAndroid Build Coastguard Worker *
3479*61046927SAndroid Build Coastguard Worker * "When the "Pipeline Select" mode in PIPELINE_SELECT command is set to
3480*61046927SAndroid Build Coastguard Worker * "3D", HDC Pipeline Flush can also flush/invalidate the LSC Untyped L1
3481*61046927SAndroid Build Coastguard Worker * cache based on the programming of HDC_Chicken0 register bits 13:11."
3482*61046927SAndroid Build Coastguard Worker *
3483*61046927SAndroid Build Coastguard Worker * "When the 'Pipeline Select' mode is set to 'GPGPU', the LSC Untyped L1
3484*61046927SAndroid Build Coastguard Worker * cache flush is controlled by 'Untyped Data-Port Cache Flush' bit in the
3485*61046927SAndroid Build Coastguard Worker * PIPE_CONTROL command."
3486*61046927SAndroid Build Coastguard Worker *
3487*61046927SAndroid Build Coastguard Worker * As part of Wa_22010960976 & Wa_14013347512, i915 is programming
3488*61046927SAndroid Build Coastguard Worker * HDC_CHICKEN0[11:13] = 0 ("Untyped L1 is flushed, for both 3D Pipecontrol
3489*61046927SAndroid Build Coastguard Worker * Dataport flush, and UAV coherency barrier event"). So there is no need
3490*61046927SAndroid Build Coastguard Worker * to set "Untyped Data-Port Cache" in 3D mode.
3491*61046927SAndroid Build Coastguard Worker *
3492*61046927SAndroid Build Coastguard Worker * On MTL the HDC_CHICKEN0 default values changed to match what was programmed
3493*61046927SAndroid Build Coastguard Worker * by Wa_22010960976 & Wa_14013347512 on DG2, but experiments show that the
3494*61046927SAndroid Build Coastguard Worker * change runs a bit deeper. Even manually writing to the HDC_CHICKEN0
3495*61046927SAndroid Build Coastguard Worker * register to force L1 untyped flush with HDC pipeline flush has no effect on
3496*61046927SAndroid Build Coastguard Worker * MTL.
3497*61046927SAndroid Build Coastguard Worker *
3498*61046927SAndroid Build Coastguard Worker * It seems like the HW change completely disconnected L1 untyped flush from
3499*61046927SAndroid Build Coastguard Worker * HDC pipeline flush with no way to bring that behavior back. So leave the L1
3500*61046927SAndroid Build Coastguard Worker * untyped flush active in 3D mode on all platforms since it doesn't seems to
3501*61046927SAndroid Build Coastguard Worker * cause issues there too.
3502*61046927SAndroid Build Coastguard Worker *
3503*61046927SAndroid Build Coastguard Worker * Maybe we'll have some GPGPU only bits here at some point.
3504*61046927SAndroid Build Coastguard Worker */
3505*61046927SAndroid Build Coastguard Worker #define ANV_PIPE_GPGPU_BITS (0)
3506*61046927SAndroid Build Coastguard Worker
3507*61046927SAndroid Build Coastguard Worker enum intel_ds_stall_flag
3508*61046927SAndroid Build Coastguard Worker anv_pipe_flush_bit_to_ds_stall_flag(enum anv_pipe_bits bits);
3509*61046927SAndroid Build Coastguard Worker
3510*61046927SAndroid Build Coastguard Worker #define VK_IMAGE_ASPECT_PLANES_BITS_ANV ( \
3511*61046927SAndroid Build Coastguard Worker VK_IMAGE_ASPECT_PLANE_0_BIT | \
3512*61046927SAndroid Build Coastguard Worker VK_IMAGE_ASPECT_PLANE_1_BIT | \
3513*61046927SAndroid Build Coastguard Worker VK_IMAGE_ASPECT_PLANE_2_BIT)
3514*61046927SAndroid Build Coastguard Worker
3515*61046927SAndroid Build Coastguard Worker #define VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV ( \
3516*61046927SAndroid Build Coastguard Worker VK_IMAGE_ASPECT_COLOR_BIT | \
3517*61046927SAndroid Build Coastguard Worker VK_IMAGE_ASPECT_PLANES_BITS_ANV)
3518*61046927SAndroid Build Coastguard Worker
3519*61046927SAndroid Build Coastguard Worker struct anv_vertex_binding {
3520*61046927SAndroid Build Coastguard Worker struct anv_buffer * buffer;
3521*61046927SAndroid Build Coastguard Worker VkDeviceSize offset;
3522*61046927SAndroid Build Coastguard Worker VkDeviceSize size;
3523*61046927SAndroid Build Coastguard Worker };
3524*61046927SAndroid Build Coastguard Worker
3525*61046927SAndroid Build Coastguard Worker struct anv_xfb_binding {
3526*61046927SAndroid Build Coastguard Worker struct anv_buffer * buffer;
3527*61046927SAndroid Build Coastguard Worker VkDeviceSize offset;
3528*61046927SAndroid Build Coastguard Worker VkDeviceSize size;
3529*61046927SAndroid Build Coastguard Worker };
3530*61046927SAndroid Build Coastguard Worker
3531*61046927SAndroid Build Coastguard Worker struct anv_push_constants {
3532*61046927SAndroid Build Coastguard Worker /** Push constant data provided by the client through vkPushConstants */
3533*61046927SAndroid Build Coastguard Worker uint8_t client_data[MAX_PUSH_CONSTANTS_SIZE];
3534*61046927SAndroid Build Coastguard Worker
3535*61046927SAndroid Build Coastguard Worker #define ANV_DESCRIPTOR_SET_DYNAMIC_INDEX_MASK ((uint32_t)ANV_UBO_ALIGNMENT - 1)
3536*61046927SAndroid Build Coastguard Worker #define ANV_DESCRIPTOR_SET_OFFSET_MASK (~(uint32_t)(ANV_UBO_ALIGNMENT - 1))
3537*61046927SAndroid Build Coastguard Worker
3538*61046927SAndroid Build Coastguard Worker /**
3539*61046927SAndroid Build Coastguard Worker * Base offsets for descriptor sets from
3540*61046927SAndroid Build Coastguard Worker *
3541*61046927SAndroid Build Coastguard Worker * The offset has different meaning depending on a number of factors :
3542*61046927SAndroid Build Coastguard Worker *
3543*61046927SAndroid Build Coastguard Worker * - with descriptor sets (direct or indirect), this relative
3544*61046927SAndroid Build Coastguard Worker * pdevice->va.descriptor_pool
3545*61046927SAndroid Build Coastguard Worker *
3546*61046927SAndroid Build Coastguard Worker * - with descriptor buffers on DG2+, relative
3547*61046927SAndroid Build Coastguard Worker * device->va.descriptor_buffer_pool
3548*61046927SAndroid Build Coastguard Worker *
3549*61046927SAndroid Build Coastguard Worker * - with descriptor buffers prior to DG2, relative the programmed value
3550*61046927SAndroid Build Coastguard Worker * in STATE_BASE_ADDRESS::BindlessSurfaceStateBaseAddress
3551*61046927SAndroid Build Coastguard Worker */
3552*61046927SAndroid Build Coastguard Worker uint32_t desc_surface_offsets[MAX_SETS];
3553*61046927SAndroid Build Coastguard Worker
3554*61046927SAndroid Build Coastguard Worker /**
3555*61046927SAndroid Build Coastguard Worker * Base offsets for descriptor sets from
3556*61046927SAndroid Build Coastguard Worker */
3557*61046927SAndroid Build Coastguard Worker uint32_t desc_sampler_offsets[MAX_SETS];
3558*61046927SAndroid Build Coastguard Worker
3559*61046927SAndroid Build Coastguard Worker /** Dynamic offsets for dynamic UBOs and SSBOs */
3560*61046927SAndroid Build Coastguard Worker uint32_t dynamic_offsets[MAX_DYNAMIC_BUFFERS];
3561*61046927SAndroid Build Coastguard Worker
3562*61046927SAndroid Build Coastguard Worker /** Surface buffer base offset
3563*61046927SAndroid Build Coastguard Worker *
3564*61046927SAndroid Build Coastguard Worker * Only used prior to DG2 with descriptor buffers.
3565*61046927SAndroid Build Coastguard Worker *
3566*61046927SAndroid Build Coastguard Worker * (surfaces_base_offset + desc_offsets[set_index]) is relative to
3567*61046927SAndroid Build Coastguard Worker * device->va.descriptor_buffer_pool and can be used to compute a 64bit
3568*61046927SAndroid Build Coastguard Worker * address to the descriptor buffer (using load_desc_set_address_intel).
3569*61046927SAndroid Build Coastguard Worker */
3570*61046927SAndroid Build Coastguard Worker uint32_t surfaces_base_offset;
3571*61046927SAndroid Build Coastguard Worker
3572*61046927SAndroid Build Coastguard Worker /* Robust access pushed registers. */
3573*61046927SAndroid Build Coastguard Worker uint64_t push_reg_mask[MESA_SHADER_STAGES];
3574*61046927SAndroid Build Coastguard Worker
3575*61046927SAndroid Build Coastguard Worker /** Ray query globals (RT_DISPATCH_GLOBALS) */
3576*61046927SAndroid Build Coastguard Worker uint64_t ray_query_globals;
3577*61046927SAndroid Build Coastguard Worker
3578*61046927SAndroid Build Coastguard Worker union {
3579*61046927SAndroid Build Coastguard Worker struct {
3580*61046927SAndroid Build Coastguard Worker /** Dynamic MSAA value */
3581*61046927SAndroid Build Coastguard Worker uint32_t fs_msaa_flags;
3582*61046927SAndroid Build Coastguard Worker
3583*61046927SAndroid Build Coastguard Worker /** Dynamic TCS input vertices */
3584*61046927SAndroid Build Coastguard Worker uint32_t tcs_input_vertices;
3585*61046927SAndroid Build Coastguard Worker } gfx;
3586*61046927SAndroid Build Coastguard Worker
3587*61046927SAndroid Build Coastguard Worker struct {
3588*61046927SAndroid Build Coastguard Worker /** Base workgroup ID
3589*61046927SAndroid Build Coastguard Worker *
3590*61046927SAndroid Build Coastguard Worker * Used for vkCmdDispatchBase.
3591*61046927SAndroid Build Coastguard Worker */
3592*61046927SAndroid Build Coastguard Worker uint32_t base_work_group_id[3];
3593*61046927SAndroid Build Coastguard Worker
3594*61046927SAndroid Build Coastguard Worker /** Subgroup ID
3595*61046927SAndroid Build Coastguard Worker *
3596*61046927SAndroid Build Coastguard Worker * This is never set by software but is implicitly filled out when
3597*61046927SAndroid Build Coastguard Worker * uploading the push constants for compute shaders.
3598*61046927SAndroid Build Coastguard Worker *
3599*61046927SAndroid Build Coastguard Worker * This *MUST* be the last field of the anv_push_constants structure.
3600*61046927SAndroid Build Coastguard Worker */
3601*61046927SAndroid Build Coastguard Worker uint32_t subgroup_id;
3602*61046927SAndroid Build Coastguard Worker } cs;
3603*61046927SAndroid Build Coastguard Worker };
3604*61046927SAndroid Build Coastguard Worker };
3605*61046927SAndroid Build Coastguard Worker
3606*61046927SAndroid Build Coastguard Worker struct anv_surface_state {
3607*61046927SAndroid Build Coastguard Worker /** Surface state allocated from the bindless heap
3608*61046927SAndroid Build Coastguard Worker *
3609*61046927SAndroid Build Coastguard Worker * Can be NULL if unused.
3610*61046927SAndroid Build Coastguard Worker */
3611*61046927SAndroid Build Coastguard Worker struct anv_state state;
3612*61046927SAndroid Build Coastguard Worker
3613*61046927SAndroid Build Coastguard Worker /** Surface state after genxml packing
3614*61046927SAndroid Build Coastguard Worker *
3615*61046927SAndroid Build Coastguard Worker * Same data as in state.
3616*61046927SAndroid Build Coastguard Worker */
3617*61046927SAndroid Build Coastguard Worker struct anv_surface_state_data state_data;
3618*61046927SAndroid Build Coastguard Worker
3619*61046927SAndroid Build Coastguard Worker /** Address of the surface referred to by this state
3620*61046927SAndroid Build Coastguard Worker *
3621*61046927SAndroid Build Coastguard Worker * This address is relative to the start of the BO.
3622*61046927SAndroid Build Coastguard Worker */
3623*61046927SAndroid Build Coastguard Worker struct anv_address address;
3624*61046927SAndroid Build Coastguard Worker /* Address of the aux surface, if any
3625*61046927SAndroid Build Coastguard Worker *
3626*61046927SAndroid Build Coastguard Worker * This field is ANV_NULL_ADDRESS if and only if no aux surface exists.
3627*61046927SAndroid Build Coastguard Worker *
3628*61046927SAndroid Build Coastguard Worker * With the exception of gfx8, the bottom 12 bits of this address' offset
3629*61046927SAndroid Build Coastguard Worker * include extra aux information.
3630*61046927SAndroid Build Coastguard Worker */
3631*61046927SAndroid Build Coastguard Worker struct anv_address aux_address;
3632*61046927SAndroid Build Coastguard Worker /* Address of the clear color, if any
3633*61046927SAndroid Build Coastguard Worker *
3634*61046927SAndroid Build Coastguard Worker * This address is relative to the start of the BO.
3635*61046927SAndroid Build Coastguard Worker */
3636*61046927SAndroid Build Coastguard Worker struct anv_address clear_address;
3637*61046927SAndroid Build Coastguard Worker };
3638*61046927SAndroid Build Coastguard Worker
3639*61046927SAndroid Build Coastguard Worker struct anv_attachment {
3640*61046927SAndroid Build Coastguard Worker VkFormat vk_format;
3641*61046927SAndroid Build Coastguard Worker const struct anv_image_view *iview;
3642*61046927SAndroid Build Coastguard Worker VkImageLayout layout;
3643*61046927SAndroid Build Coastguard Worker enum isl_aux_usage aux_usage;
3644*61046927SAndroid Build Coastguard Worker struct anv_surface_state surface_state;
3645*61046927SAndroid Build Coastguard Worker
3646*61046927SAndroid Build Coastguard Worker VkResolveModeFlagBits resolve_mode;
3647*61046927SAndroid Build Coastguard Worker const struct anv_image_view *resolve_iview;
3648*61046927SAndroid Build Coastguard Worker VkImageLayout resolve_layout;
3649*61046927SAndroid Build Coastguard Worker };
3650*61046927SAndroid Build Coastguard Worker
3651*61046927SAndroid Build Coastguard Worker /** State tracking for vertex buffer flushes
3652*61046927SAndroid Build Coastguard Worker *
3653*61046927SAndroid Build Coastguard Worker * On Gfx8-9, the VF cache only considers the bottom 32 bits of memory
3654*61046927SAndroid Build Coastguard Worker * addresses. If you happen to have two vertex buffers which get placed
3655*61046927SAndroid Build Coastguard Worker * exactly 4 GiB apart and use them in back-to-back draw calls, you can get
3656*61046927SAndroid Build Coastguard Worker * collisions. In order to solve this problem, we track vertex address ranges
3657*61046927SAndroid Build Coastguard Worker * which are live in the cache and invalidate the cache if one ever exceeds 32
3658*61046927SAndroid Build Coastguard Worker * bits.
3659*61046927SAndroid Build Coastguard Worker */
3660*61046927SAndroid Build Coastguard Worker struct anv_vb_cache_range {
3661*61046927SAndroid Build Coastguard Worker /* Virtual address at which the live vertex buffer cache range starts for
3662*61046927SAndroid Build Coastguard Worker * this vertex buffer index.
3663*61046927SAndroid Build Coastguard Worker */
3664*61046927SAndroid Build Coastguard Worker uint64_t start;
3665*61046927SAndroid Build Coastguard Worker
3666*61046927SAndroid Build Coastguard Worker /* Virtual address of the byte after where vertex buffer cache range ends.
3667*61046927SAndroid Build Coastguard Worker * This is exclusive such that end - start is the size of the range.
3668*61046927SAndroid Build Coastguard Worker */
3669*61046927SAndroid Build Coastguard Worker uint64_t end;
3670*61046927SAndroid Build Coastguard Worker };
3671*61046927SAndroid Build Coastguard Worker
3672*61046927SAndroid Build Coastguard Worker static inline void
anv_merge_vb_cache_range(struct anv_vb_cache_range * dirty,const struct anv_vb_cache_range * bound)3673*61046927SAndroid Build Coastguard Worker anv_merge_vb_cache_range(struct anv_vb_cache_range *dirty,
3674*61046927SAndroid Build Coastguard Worker const struct anv_vb_cache_range *bound)
3675*61046927SAndroid Build Coastguard Worker {
3676*61046927SAndroid Build Coastguard Worker if (dirty->start == dirty->end) {
3677*61046927SAndroid Build Coastguard Worker *dirty = *bound;
3678*61046927SAndroid Build Coastguard Worker } else if (bound->start != bound->end) {
3679*61046927SAndroid Build Coastguard Worker dirty->start = MIN2(dirty->start, bound->start);
3680*61046927SAndroid Build Coastguard Worker dirty->end = MAX2(dirty->end, bound->end);
3681*61046927SAndroid Build Coastguard Worker }
3682*61046927SAndroid Build Coastguard Worker }
3683*61046927SAndroid Build Coastguard Worker
3684*61046927SAndroid Build Coastguard Worker /* Check whether we need to apply the Gfx8-9 vertex buffer workaround*/
3685*61046927SAndroid Build Coastguard Worker static inline bool
anv_gfx8_9_vb_cache_range_needs_workaround(struct anv_vb_cache_range * bound,struct anv_vb_cache_range * dirty,struct anv_address vb_address,uint32_t vb_size)3686*61046927SAndroid Build Coastguard Worker anv_gfx8_9_vb_cache_range_needs_workaround(struct anv_vb_cache_range *bound,
3687*61046927SAndroid Build Coastguard Worker struct anv_vb_cache_range *dirty,
3688*61046927SAndroid Build Coastguard Worker struct anv_address vb_address,
3689*61046927SAndroid Build Coastguard Worker uint32_t vb_size)
3690*61046927SAndroid Build Coastguard Worker {
3691*61046927SAndroid Build Coastguard Worker if (vb_size == 0) {
3692*61046927SAndroid Build Coastguard Worker bound->start = 0;
3693*61046927SAndroid Build Coastguard Worker bound->end = 0;
3694*61046927SAndroid Build Coastguard Worker return false;
3695*61046927SAndroid Build Coastguard Worker }
3696*61046927SAndroid Build Coastguard Worker
3697*61046927SAndroid Build Coastguard Worker bound->start = intel_48b_address(anv_address_physical(vb_address));
3698*61046927SAndroid Build Coastguard Worker bound->end = bound->start + vb_size;
3699*61046927SAndroid Build Coastguard Worker assert(bound->end > bound->start); /* No overflow */
3700*61046927SAndroid Build Coastguard Worker
3701*61046927SAndroid Build Coastguard Worker /* Align everything to a cache line */
3702*61046927SAndroid Build Coastguard Worker bound->start &= ~(64ull - 1ull);
3703*61046927SAndroid Build Coastguard Worker bound->end = align64(bound->end, 64);
3704*61046927SAndroid Build Coastguard Worker
3705*61046927SAndroid Build Coastguard Worker anv_merge_vb_cache_range(dirty, bound);
3706*61046927SAndroid Build Coastguard Worker
3707*61046927SAndroid Build Coastguard Worker /* If our range is larger than 32 bits, we have to flush */
3708*61046927SAndroid Build Coastguard Worker assert(bound->end - bound->start <= (1ull << 32));
3709*61046927SAndroid Build Coastguard Worker return (dirty->end - dirty->start) > (1ull << 32);
3710*61046927SAndroid Build Coastguard Worker }
3711*61046927SAndroid Build Coastguard Worker
3712*61046927SAndroid Build Coastguard Worker /**
3713*61046927SAndroid Build Coastguard Worker * State tracking for simple internal shaders
3714*61046927SAndroid Build Coastguard Worker */
3715*61046927SAndroid Build Coastguard Worker struct anv_simple_shader {
3716*61046927SAndroid Build Coastguard Worker /* The device associated with this emission */
3717*61046927SAndroid Build Coastguard Worker struct anv_device *device;
3718*61046927SAndroid Build Coastguard Worker /* The command buffer associated with this emission (can be NULL) */
3719*61046927SAndroid Build Coastguard Worker struct anv_cmd_buffer *cmd_buffer;
3720*61046927SAndroid Build Coastguard Worker /* State stream used for various internal allocations */
3721*61046927SAndroid Build Coastguard Worker struct anv_state_stream *dynamic_state_stream;
3722*61046927SAndroid Build Coastguard Worker struct anv_state_stream *general_state_stream;
3723*61046927SAndroid Build Coastguard Worker /* Where to emit the commands (can be different from cmd_buffer->batch) */
3724*61046927SAndroid Build Coastguard Worker struct anv_batch *batch;
3725*61046927SAndroid Build Coastguard Worker /* Shader to use */
3726*61046927SAndroid Build Coastguard Worker struct anv_shader_bin *kernel;
3727*61046927SAndroid Build Coastguard Worker /* L3 config used by the shader */
3728*61046927SAndroid Build Coastguard Worker const struct intel_l3_config *l3_config;
3729*61046927SAndroid Build Coastguard Worker /* Current URB config */
3730*61046927SAndroid Build Coastguard Worker const struct intel_urb_config *urb_cfg;
3731*61046927SAndroid Build Coastguard Worker
3732*61046927SAndroid Build Coastguard Worker /* Managed by the simpler shader helper*/
3733*61046927SAndroid Build Coastguard Worker struct anv_state bt_state;
3734*61046927SAndroid Build Coastguard Worker };
3735*61046927SAndroid Build Coastguard Worker
3736*61046927SAndroid Build Coastguard Worker /** State tracking for particular pipeline bind point
3737*61046927SAndroid Build Coastguard Worker *
3738*61046927SAndroid Build Coastguard Worker * This struct is the base struct for anv_cmd_graphics_state and
3739*61046927SAndroid Build Coastguard Worker * anv_cmd_compute_state. These are used to track state which is bound to a
3740*61046927SAndroid Build Coastguard Worker * particular type of pipeline. Generic state that applies per-stage such as
3741*61046927SAndroid Build Coastguard Worker * binding table offsets and push constants is tracked generically with a
3742*61046927SAndroid Build Coastguard Worker * per-stage array in anv_cmd_state.
3743*61046927SAndroid Build Coastguard Worker */
3744*61046927SAndroid Build Coastguard Worker struct anv_cmd_pipeline_state {
3745*61046927SAndroid Build Coastguard Worker struct anv_descriptor_set *descriptors[MAX_SETS];
3746*61046927SAndroid Build Coastguard Worker struct {
3747*61046927SAndroid Build Coastguard Worker bool bound;
3748*61046927SAndroid Build Coastguard Worker /**
3749*61046927SAndroid Build Coastguard Worker * Buffer index used by this descriptor set.
3750*61046927SAndroid Build Coastguard Worker */
3751*61046927SAndroid Build Coastguard Worker int32_t buffer_index; /* -1 means push descriptor */
3752*61046927SAndroid Build Coastguard Worker /**
3753*61046927SAndroid Build Coastguard Worker * Offset of the descriptor set in the descriptor buffer.
3754*61046927SAndroid Build Coastguard Worker */
3755*61046927SAndroid Build Coastguard Worker uint32_t buffer_offset;
3756*61046927SAndroid Build Coastguard Worker /**
3757*61046927SAndroid Build Coastguard Worker * Final computed address to be emitted in the descriptor set surface
3758*61046927SAndroid Build Coastguard Worker * state.
3759*61046927SAndroid Build Coastguard Worker */
3760*61046927SAndroid Build Coastguard Worker uint64_t address;
3761*61046927SAndroid Build Coastguard Worker /**
3762*61046927SAndroid Build Coastguard Worker * The descriptor set surface state.
3763*61046927SAndroid Build Coastguard Worker */
3764*61046927SAndroid Build Coastguard Worker struct anv_state state;
3765*61046927SAndroid Build Coastguard Worker } descriptor_buffers[MAX_SETS];
3766*61046927SAndroid Build Coastguard Worker struct anv_push_descriptor_set push_descriptor;
3767*61046927SAndroid Build Coastguard Worker
3768*61046927SAndroid Build Coastguard Worker struct anv_push_constants push_constants;
3769*61046927SAndroid Build Coastguard Worker
3770*61046927SAndroid Build Coastguard Worker /** Tracks whether the push constant data has changed and need to be reemitted */
3771*61046927SAndroid Build Coastguard Worker bool push_constants_data_dirty;
3772*61046927SAndroid Build Coastguard Worker
3773*61046927SAndroid Build Coastguard Worker /* Push constant state allocated when flushing push constants. */
3774*61046927SAndroid Build Coastguard Worker struct anv_state push_constants_state;
3775*61046927SAndroid Build Coastguard Worker
3776*61046927SAndroid Build Coastguard Worker /**
3777*61046927SAndroid Build Coastguard Worker * Dynamic buffer offsets.
3778*61046927SAndroid Build Coastguard Worker *
3779*61046927SAndroid Build Coastguard Worker * We have a maximum of MAX_DYNAMIC_BUFFERS per pipeline, but with
3780*61046927SAndroid Build Coastguard Worker * independent sets we cannot know which how much in total is going to be
3781*61046927SAndroid Build Coastguard Worker * used. As a result we need to store the maximum possible number per set.
3782*61046927SAndroid Build Coastguard Worker *
3783*61046927SAndroid Build Coastguard Worker * Those values are written into anv_push_constants::dynamic_offsets at
3784*61046927SAndroid Build Coastguard Worker * flush time when have the pipeline with the final
3785*61046927SAndroid Build Coastguard Worker * anv_pipeline_sets_layout.
3786*61046927SAndroid Build Coastguard Worker */
3787*61046927SAndroid Build Coastguard Worker struct {
3788*61046927SAndroid Build Coastguard Worker uint32_t offsets[MAX_DYNAMIC_BUFFERS];
3789*61046927SAndroid Build Coastguard Worker } dynamic_offsets[MAX_SETS];
3790*61046927SAndroid Build Coastguard Worker
3791*61046927SAndroid Build Coastguard Worker /**
3792*61046927SAndroid Build Coastguard Worker * The current bound pipeline.
3793*61046927SAndroid Build Coastguard Worker */
3794*61046927SAndroid Build Coastguard Worker struct anv_pipeline *pipeline;
3795*61046927SAndroid Build Coastguard Worker };
3796*61046927SAndroid Build Coastguard Worker
3797*61046927SAndroid Build Coastguard Worker enum anv_coarse_pixel_state {
3798*61046927SAndroid Build Coastguard Worker ANV_COARSE_PIXEL_STATE_UNKNOWN,
3799*61046927SAndroid Build Coastguard Worker ANV_COARSE_PIXEL_STATE_DISABLED,
3800*61046927SAndroid Build Coastguard Worker ANV_COARSE_PIXEL_STATE_ENABLED,
3801*61046927SAndroid Build Coastguard Worker };
3802*61046927SAndroid Build Coastguard Worker
3803*61046927SAndroid Build Coastguard Worker /** State tracking for graphics pipeline
3804*61046927SAndroid Build Coastguard Worker *
3805*61046927SAndroid Build Coastguard Worker * This has anv_cmd_pipeline_state as a base struct to track things which get
3806*61046927SAndroid Build Coastguard Worker * bound to a graphics pipeline. Along with general pipeline bind point state
3807*61046927SAndroid Build Coastguard Worker * which is in the anv_cmd_pipeline_state base struct, it also contains other
3808*61046927SAndroid Build Coastguard Worker * state which is graphics-specific.
3809*61046927SAndroid Build Coastguard Worker */
3810*61046927SAndroid Build Coastguard Worker struct anv_cmd_graphics_state {
3811*61046927SAndroid Build Coastguard Worker struct anv_cmd_pipeline_state base;
3812*61046927SAndroid Build Coastguard Worker
3813*61046927SAndroid Build Coastguard Worker VkRenderingFlags rendering_flags;
3814*61046927SAndroid Build Coastguard Worker VkRect2D render_area;
3815*61046927SAndroid Build Coastguard Worker uint32_t layer_count;
3816*61046927SAndroid Build Coastguard Worker uint32_t samples;
3817*61046927SAndroid Build Coastguard Worker uint32_t view_mask;
3818*61046927SAndroid Build Coastguard Worker uint32_t color_att_count;
3819*61046927SAndroid Build Coastguard Worker struct anv_state att_states;
3820*61046927SAndroid Build Coastguard Worker struct anv_attachment color_att[MAX_RTS];
3821*61046927SAndroid Build Coastguard Worker struct anv_attachment depth_att;
3822*61046927SAndroid Build Coastguard Worker struct anv_attachment stencil_att;
3823*61046927SAndroid Build Coastguard Worker struct anv_state null_surface_state;
3824*61046927SAndroid Build Coastguard Worker
3825*61046927SAndroid Build Coastguard Worker anv_cmd_dirty_mask_t dirty;
3826*61046927SAndroid Build Coastguard Worker uint32_t vb_dirty;
3827*61046927SAndroid Build Coastguard Worker
3828*61046927SAndroid Build Coastguard Worker struct anv_vb_cache_range ib_bound_range;
3829*61046927SAndroid Build Coastguard Worker struct anv_vb_cache_range ib_dirty_range;
3830*61046927SAndroid Build Coastguard Worker struct anv_vb_cache_range vb_bound_ranges[33];
3831*61046927SAndroid Build Coastguard Worker struct anv_vb_cache_range vb_dirty_ranges[33];
3832*61046927SAndroid Build Coastguard Worker
3833*61046927SAndroid Build Coastguard Worker uint32_t restart_index;
3834*61046927SAndroid Build Coastguard Worker
3835*61046927SAndroid Build Coastguard Worker VkShaderStageFlags push_constant_stages;
3836*61046927SAndroid Build Coastguard Worker
3837*61046927SAndroid Build Coastguard Worker uint32_t primitive_topology;
3838*61046927SAndroid Build Coastguard Worker bool used_task_shader;
3839*61046927SAndroid Build Coastguard Worker
3840*61046927SAndroid Build Coastguard Worker struct anv_buffer *index_buffer;
3841*61046927SAndroid Build Coastguard Worker uint32_t index_type; /**< 3DSTATE_INDEX_BUFFER.IndexFormat */
3842*61046927SAndroid Build Coastguard Worker uint32_t index_offset;
3843*61046927SAndroid Build Coastguard Worker uint32_t index_size;
3844*61046927SAndroid Build Coastguard Worker
3845*61046927SAndroid Build Coastguard Worker uint32_t indirect_data_stride;
3846*61046927SAndroid Build Coastguard Worker bool indirect_data_stride_aligned;
3847*61046927SAndroid Build Coastguard Worker
3848*61046927SAndroid Build Coastguard Worker struct vk_vertex_input_state vertex_input;
3849*61046927SAndroid Build Coastguard Worker struct vk_sample_locations_state sample_locations;
3850*61046927SAndroid Build Coastguard Worker
3851*61046927SAndroid Build Coastguard Worker /* Dynamic msaa flags, this value can be different from
3852*61046927SAndroid Build Coastguard Worker * anv_push_constants::gfx::fs_msaa_flags, as the push constant value only
3853*61046927SAndroid Build Coastguard Worker * needs to be updated for fragment shaders dynamically checking the value.
3854*61046927SAndroid Build Coastguard Worker */
3855*61046927SAndroid Build Coastguard Worker enum intel_msaa_flags fs_msaa_flags;
3856*61046927SAndroid Build Coastguard Worker
3857*61046927SAndroid Build Coastguard Worker bool object_preemption;
3858*61046927SAndroid Build Coastguard Worker bool has_uint_rt;
3859*61046927SAndroid Build Coastguard Worker
3860*61046927SAndroid Build Coastguard Worker /* State tracking for Wa_14018912822. */
3861*61046927SAndroid Build Coastguard Worker bool color_blend_zero;
3862*61046927SAndroid Build Coastguard Worker bool alpha_blend_zero;
3863*61046927SAndroid Build Coastguard Worker
3864*61046927SAndroid Build Coastguard Worker /**
3865*61046927SAndroid Build Coastguard Worker * State tracking for Wa_18020335297.
3866*61046927SAndroid Build Coastguard Worker */
3867*61046927SAndroid Build Coastguard Worker bool viewport_set;
3868*61046927SAndroid Build Coastguard Worker
3869*61046927SAndroid Build Coastguard Worker /**
3870*61046927SAndroid Build Coastguard Worker * State tracking for Wa_18038825448.
3871*61046927SAndroid Build Coastguard Worker */
3872*61046927SAndroid Build Coastguard Worker enum anv_coarse_pixel_state coarse_pixel_active;
3873*61046927SAndroid Build Coastguard Worker
3874*61046927SAndroid Build Coastguard Worker struct intel_urb_config urb_cfg;
3875*61046927SAndroid Build Coastguard Worker
3876*61046927SAndroid Build Coastguard Worker uint32_t n_occlusion_queries;
3877*61046927SAndroid Build Coastguard Worker
3878*61046927SAndroid Build Coastguard Worker struct anv_gfx_dynamic_state dyn_state;
3879*61046927SAndroid Build Coastguard Worker };
3880*61046927SAndroid Build Coastguard Worker
3881*61046927SAndroid Build Coastguard Worker enum anv_depth_reg_mode {
3882*61046927SAndroid Build Coastguard Worker ANV_DEPTH_REG_MODE_UNKNOWN = 0,
3883*61046927SAndroid Build Coastguard Worker ANV_DEPTH_REG_MODE_HW_DEFAULT,
3884*61046927SAndroid Build Coastguard Worker ANV_DEPTH_REG_MODE_D16_1X_MSAA,
3885*61046927SAndroid Build Coastguard Worker };
3886*61046927SAndroid Build Coastguard Worker
3887*61046927SAndroid Build Coastguard Worker /** State tracking for compute pipeline
3888*61046927SAndroid Build Coastguard Worker *
3889*61046927SAndroid Build Coastguard Worker * This has anv_cmd_pipeline_state as a base struct to track things which get
3890*61046927SAndroid Build Coastguard Worker * bound to a compute pipeline. Along with general pipeline bind point state
3891*61046927SAndroid Build Coastguard Worker * which is in the anv_cmd_pipeline_state base struct, it also contains other
3892*61046927SAndroid Build Coastguard Worker * state which is compute-specific.
3893*61046927SAndroid Build Coastguard Worker */
3894*61046927SAndroid Build Coastguard Worker struct anv_cmd_compute_state {
3895*61046927SAndroid Build Coastguard Worker struct anv_cmd_pipeline_state base;
3896*61046927SAndroid Build Coastguard Worker
3897*61046927SAndroid Build Coastguard Worker bool pipeline_dirty;
3898*61046927SAndroid Build Coastguard Worker
3899*61046927SAndroid Build Coastguard Worker struct anv_address num_workgroups;
3900*61046927SAndroid Build Coastguard Worker
3901*61046927SAndroid Build Coastguard Worker uint32_t scratch_size;
3902*61046927SAndroid Build Coastguard Worker };
3903*61046927SAndroid Build Coastguard Worker
3904*61046927SAndroid Build Coastguard Worker struct anv_cmd_ray_tracing_state {
3905*61046927SAndroid Build Coastguard Worker struct anv_cmd_pipeline_state base;
3906*61046927SAndroid Build Coastguard Worker
3907*61046927SAndroid Build Coastguard Worker bool pipeline_dirty;
3908*61046927SAndroid Build Coastguard Worker
3909*61046927SAndroid Build Coastguard Worker struct {
3910*61046927SAndroid Build Coastguard Worker struct anv_bo *bo;
3911*61046927SAndroid Build Coastguard Worker struct brw_rt_scratch_layout layout;
3912*61046927SAndroid Build Coastguard Worker } scratch;
3913*61046927SAndroid Build Coastguard Worker
3914*61046927SAndroid Build Coastguard Worker struct anv_address build_priv_mem_addr;
3915*61046927SAndroid Build Coastguard Worker size_t build_priv_mem_size;
3916*61046927SAndroid Build Coastguard Worker };
3917*61046927SAndroid Build Coastguard Worker
3918*61046927SAndroid Build Coastguard Worker enum anv_cmd_descriptor_buffer_mode {
3919*61046927SAndroid Build Coastguard Worker ANV_CMD_DESCRIPTOR_BUFFER_MODE_UNKNOWN,
3920*61046927SAndroid Build Coastguard Worker ANV_CMD_DESCRIPTOR_BUFFER_MODE_LEGACY,
3921*61046927SAndroid Build Coastguard Worker ANV_CMD_DESCRIPTOR_BUFFER_MODE_BUFFER,
3922*61046927SAndroid Build Coastguard Worker };
3923*61046927SAndroid Build Coastguard Worker
3924*61046927SAndroid Build Coastguard Worker /** State required while building cmd buffer */
3925*61046927SAndroid Build Coastguard Worker struct anv_cmd_state {
3926*61046927SAndroid Build Coastguard Worker /* PIPELINE_SELECT.PipelineSelection */
3927*61046927SAndroid Build Coastguard Worker uint32_t current_pipeline;
3928*61046927SAndroid Build Coastguard Worker const struct intel_l3_config * current_l3_config;
3929*61046927SAndroid Build Coastguard Worker uint32_t last_aux_map_state;
3930*61046927SAndroid Build Coastguard Worker
3931*61046927SAndroid Build Coastguard Worker struct anv_cmd_graphics_state gfx;
3932*61046927SAndroid Build Coastguard Worker struct anv_cmd_compute_state compute;
3933*61046927SAndroid Build Coastguard Worker struct anv_cmd_ray_tracing_state rt;
3934*61046927SAndroid Build Coastguard Worker
3935*61046927SAndroid Build Coastguard Worker enum anv_pipe_bits pending_pipe_bits;
3936*61046927SAndroid Build Coastguard Worker
3937*61046927SAndroid Build Coastguard Worker /**
3938*61046927SAndroid Build Coastguard Worker * Whether the last programmed STATE_BASE_ADDRESS references
3939*61046927SAndroid Build Coastguard Worker * anv_device::dynamic_state_pool or anv_device::dynamic_state_pool_db for
3940*61046927SAndroid Build Coastguard Worker * the dynamic state heap.
3941*61046927SAndroid Build Coastguard Worker */
3942*61046927SAndroid Build Coastguard Worker enum anv_cmd_descriptor_buffer_mode current_db_mode;
3943*61046927SAndroid Build Coastguard Worker
3944*61046927SAndroid Build Coastguard Worker /**
3945*61046927SAndroid Build Coastguard Worker * Whether the command buffer has pending descriptor buffers bound it. This
3946*61046927SAndroid Build Coastguard Worker * variable changes before anv_device::current_db_mode.
3947*61046927SAndroid Build Coastguard Worker */
3948*61046927SAndroid Build Coastguard Worker enum anv_cmd_descriptor_buffer_mode pending_db_mode;
3949*61046927SAndroid Build Coastguard Worker
3950*61046927SAndroid Build Coastguard Worker struct {
3951*61046927SAndroid Build Coastguard Worker /**
3952*61046927SAndroid Build Coastguard Worker * Tracks operations susceptible to interfere with queries in the
3953*61046927SAndroid Build Coastguard Worker * destination buffer of vkCmdCopyQueryResults, we need those operations to
3954*61046927SAndroid Build Coastguard Worker * have completed before we do the work of vkCmdCopyQueryResults.
3955*61046927SAndroid Build Coastguard Worker */
3956*61046927SAndroid Build Coastguard Worker enum anv_query_bits buffer_write_bits;
3957*61046927SAndroid Build Coastguard Worker
3958*61046927SAndroid Build Coastguard Worker /**
3959*61046927SAndroid Build Coastguard Worker * Tracks clear operations of query buffers that can interact with
3960*61046927SAndroid Build Coastguard Worker * vkCmdQueryBegin*, vkCmdWriteTimestamp*,
3961*61046927SAndroid Build Coastguard Worker * vkCmdWriteAccelerationStructuresPropertiesKHR, etc...
3962*61046927SAndroid Build Coastguard Worker *
3963*61046927SAndroid Build Coastguard Worker * We need the clearing of the buffer completed before with write data with
3964*61046927SAndroid Build Coastguard Worker * the command streamer or a shader.
3965*61046927SAndroid Build Coastguard Worker */
3966*61046927SAndroid Build Coastguard Worker enum anv_query_bits clear_bits;
3967*61046927SAndroid Build Coastguard Worker } queries;
3968*61046927SAndroid Build Coastguard Worker
3969*61046927SAndroid Build Coastguard Worker VkShaderStageFlags descriptors_dirty;
3970*61046927SAndroid Build Coastguard Worker VkShaderStageFlags push_descriptors_dirty;
3971*61046927SAndroid Build Coastguard Worker /** Tracks the 3DSTATE_CONSTANT_* instruction that needs to be reemitted */
3972*61046927SAndroid Build Coastguard Worker VkShaderStageFlags push_constants_dirty;
3973*61046927SAndroid Build Coastguard Worker
3974*61046927SAndroid Build Coastguard Worker struct {
3975*61046927SAndroid Build Coastguard Worker uint64_t surfaces_address;
3976*61046927SAndroid Build Coastguard Worker uint64_t samplers_address;
3977*61046927SAndroid Build Coastguard Worker bool dirty;
3978*61046927SAndroid Build Coastguard Worker VkShaderStageFlags offsets_dirty;
3979*61046927SAndroid Build Coastguard Worker uint64_t address[MAX_SETS];
3980*61046927SAndroid Build Coastguard Worker } descriptor_buffers;
3981*61046927SAndroid Build Coastguard Worker
3982*61046927SAndroid Build Coastguard Worker struct anv_vertex_binding vertex_bindings[MAX_VBS];
3983*61046927SAndroid Build Coastguard Worker bool xfb_enabled;
3984*61046927SAndroid Build Coastguard Worker struct anv_xfb_binding xfb_bindings[MAX_XFB_BUFFERS];
3985*61046927SAndroid Build Coastguard Worker struct anv_state binding_tables[MESA_VULKAN_SHADER_STAGES];
3986*61046927SAndroid Build Coastguard Worker struct anv_state samplers[MESA_VULKAN_SHADER_STAGES];
3987*61046927SAndroid Build Coastguard Worker
3988*61046927SAndroid Build Coastguard Worker unsigned char sampler_sha1s[MESA_VULKAN_SHADER_STAGES][20];
3989*61046927SAndroid Build Coastguard Worker unsigned char surface_sha1s[MESA_VULKAN_SHADER_STAGES][20];
3990*61046927SAndroid Build Coastguard Worker unsigned char push_sha1s[MESA_VULKAN_SHADER_STAGES][20];
3991*61046927SAndroid Build Coastguard Worker
3992*61046927SAndroid Build Coastguard Worker /**
3993*61046927SAndroid Build Coastguard Worker * Whether or not the gfx8 PMA fix is enabled. We ensure that, at the top
3994*61046927SAndroid Build Coastguard Worker * of any command buffer it is disabled by disabling it in EndCommandBuffer
3995*61046927SAndroid Build Coastguard Worker * and before invoking the secondary in ExecuteCommands.
3996*61046927SAndroid Build Coastguard Worker */
3997*61046927SAndroid Build Coastguard Worker bool pma_fix_enabled;
3998*61046927SAndroid Build Coastguard Worker
3999*61046927SAndroid Build Coastguard Worker /**
4000*61046927SAndroid Build Coastguard Worker * Whether or not we know for certain that HiZ is enabled for the current
4001*61046927SAndroid Build Coastguard Worker * subpass. If, for whatever reason, we are unsure as to whether HiZ is
4002*61046927SAndroid Build Coastguard Worker * enabled or not, this will be false.
4003*61046927SAndroid Build Coastguard Worker */
4004*61046927SAndroid Build Coastguard Worker bool hiz_enabled;
4005*61046927SAndroid Build Coastguard Worker
4006*61046927SAndroid Build Coastguard Worker /* We ensure the registers for the gfx12 D16 fix are initialized at the
4007*61046927SAndroid Build Coastguard Worker * first non-NULL depth stencil packet emission of every command buffer.
4008*61046927SAndroid Build Coastguard Worker * For secondary command buffer execution, we transfer the state from the
4009*61046927SAndroid Build Coastguard Worker * last command buffer to the primary (if known).
4010*61046927SAndroid Build Coastguard Worker */
4011*61046927SAndroid Build Coastguard Worker enum anv_depth_reg_mode depth_reg_mode;
4012*61046927SAndroid Build Coastguard Worker
4013*61046927SAndroid Build Coastguard Worker /* The last auxiliary surface operation (or equivalent operation) provided
4014*61046927SAndroid Build Coastguard Worker * to genX(cmd_buffer_update_color_aux_op).
4015*61046927SAndroid Build Coastguard Worker */
4016*61046927SAndroid Build Coastguard Worker enum isl_aux_op color_aux_op;
4017*61046927SAndroid Build Coastguard Worker
4018*61046927SAndroid Build Coastguard Worker /**
4019*61046927SAndroid Build Coastguard Worker * Whether RHWO optimization is enabled (Wa_1508744258).
4020*61046927SAndroid Build Coastguard Worker */
4021*61046927SAndroid Build Coastguard Worker bool rhwo_optimization_enabled;
4022*61046927SAndroid Build Coastguard Worker
4023*61046927SAndroid Build Coastguard Worker /**
4024*61046927SAndroid Build Coastguard Worker * Pending state of the RHWO optimization, to be applied at the next
4025*61046927SAndroid Build Coastguard Worker * genX(cmd_buffer_apply_pipe_flushes).
4026*61046927SAndroid Build Coastguard Worker */
4027*61046927SAndroid Build Coastguard Worker bool pending_rhwo_optimization_enabled;
4028*61046927SAndroid Build Coastguard Worker
4029*61046927SAndroid Build Coastguard Worker bool conditional_render_enabled;
4030*61046927SAndroid Build Coastguard Worker
4031*61046927SAndroid Build Coastguard Worker /**
4032*61046927SAndroid Build Coastguard Worker * Last rendering scale argument provided to
4033*61046927SAndroid Build Coastguard Worker * genX(cmd_buffer_emit_hashing_mode)().
4034*61046927SAndroid Build Coastguard Worker */
4035*61046927SAndroid Build Coastguard Worker unsigned current_hash_scale;
4036*61046927SAndroid Build Coastguard Worker
4037*61046927SAndroid Build Coastguard Worker /**
4038*61046927SAndroid Build Coastguard Worker * A buffer used for spill/fill of ray queries.
4039*61046927SAndroid Build Coastguard Worker */
4040*61046927SAndroid Build Coastguard Worker struct anv_bo * ray_query_shadow_bo;
4041*61046927SAndroid Build Coastguard Worker
4042*61046927SAndroid Build Coastguard Worker /** Pointer to the last emitted COMPUTE_WALKER.
4043*61046927SAndroid Build Coastguard Worker *
4044*61046927SAndroid Build Coastguard Worker * This is used to edit the instruction post emission to replace the "Post
4045*61046927SAndroid Build Coastguard Worker * Sync" field for utrace timestamp emission.
4046*61046927SAndroid Build Coastguard Worker */
4047*61046927SAndroid Build Coastguard Worker void *last_compute_walker;
4048*61046927SAndroid Build Coastguard Worker
4049*61046927SAndroid Build Coastguard Worker /** Pointer to the last emitted EXECUTE_INDIRECT_DISPATCH.
4050*61046927SAndroid Build Coastguard Worker *
4051*61046927SAndroid Build Coastguard Worker * This is used to edit the instruction post emission to replace the "Post
4052*61046927SAndroid Build Coastguard Worker * Sync" field for utrace timestamp emission.
4053*61046927SAndroid Build Coastguard Worker */
4054*61046927SAndroid Build Coastguard Worker void *last_indirect_dispatch;
4055*61046927SAndroid Build Coastguard Worker };
4056*61046927SAndroid Build Coastguard Worker
4057*61046927SAndroid Build Coastguard Worker #define ANV_MIN_CMD_BUFFER_BATCH_SIZE 8192
4058*61046927SAndroid Build Coastguard Worker #define ANV_MAX_CMD_BUFFER_BATCH_SIZE (16 * 1024 * 1024)
4059*61046927SAndroid Build Coastguard Worker
4060*61046927SAndroid Build Coastguard Worker enum anv_cmd_buffer_exec_mode {
4061*61046927SAndroid Build Coastguard Worker ANV_CMD_BUFFER_EXEC_MODE_PRIMARY,
4062*61046927SAndroid Build Coastguard Worker ANV_CMD_BUFFER_EXEC_MODE_EMIT,
4063*61046927SAndroid Build Coastguard Worker ANV_CMD_BUFFER_EXEC_MODE_GROW_AND_EMIT,
4064*61046927SAndroid Build Coastguard Worker ANV_CMD_BUFFER_EXEC_MODE_CHAIN,
4065*61046927SAndroid Build Coastguard Worker ANV_CMD_BUFFER_EXEC_MODE_COPY_AND_CHAIN,
4066*61046927SAndroid Build Coastguard Worker ANV_CMD_BUFFER_EXEC_MODE_CALL_AND_RETURN,
4067*61046927SAndroid Build Coastguard Worker };
4068*61046927SAndroid Build Coastguard Worker
4069*61046927SAndroid Build Coastguard Worker struct anv_measure_batch;
4070*61046927SAndroid Build Coastguard Worker
4071*61046927SAndroid Build Coastguard Worker struct anv_cmd_buffer {
4072*61046927SAndroid Build Coastguard Worker struct vk_command_buffer vk;
4073*61046927SAndroid Build Coastguard Worker
4074*61046927SAndroid Build Coastguard Worker struct anv_device * device;
4075*61046927SAndroid Build Coastguard Worker struct anv_queue_family * queue_family;
4076*61046927SAndroid Build Coastguard Worker
4077*61046927SAndroid Build Coastguard Worker /** Batch where the main commands live */
4078*61046927SAndroid Build Coastguard Worker struct anv_batch batch;
4079*61046927SAndroid Build Coastguard Worker
4080*61046927SAndroid Build Coastguard Worker /* Pointer to the location in the batch where MI_BATCH_BUFFER_END was
4081*61046927SAndroid Build Coastguard Worker * recorded upon calling vkEndCommandBuffer(). This is useful if we need to
4082*61046927SAndroid Build Coastguard Worker * rewrite the end to chain multiple batch together at vkQueueSubmit().
4083*61046927SAndroid Build Coastguard Worker */
4084*61046927SAndroid Build Coastguard Worker void * batch_end;
4085*61046927SAndroid Build Coastguard Worker
4086*61046927SAndroid Build Coastguard Worker /* Fields required for the actual chain of anv_batch_bo's.
4087*61046927SAndroid Build Coastguard Worker *
4088*61046927SAndroid Build Coastguard Worker * These fields are initialized by anv_cmd_buffer_init_batch_bo_chain().
4089*61046927SAndroid Build Coastguard Worker */
4090*61046927SAndroid Build Coastguard Worker struct list_head batch_bos;
4091*61046927SAndroid Build Coastguard Worker enum anv_cmd_buffer_exec_mode exec_mode;
4092*61046927SAndroid Build Coastguard Worker
4093*61046927SAndroid Build Coastguard Worker /* A vector of anv_batch_bo pointers for every batch or surface buffer
4094*61046927SAndroid Build Coastguard Worker * referenced by this command buffer
4095*61046927SAndroid Build Coastguard Worker *
4096*61046927SAndroid Build Coastguard Worker * initialized by anv_cmd_buffer_init_batch_bo_chain()
4097*61046927SAndroid Build Coastguard Worker */
4098*61046927SAndroid Build Coastguard Worker struct u_vector seen_bbos;
4099*61046927SAndroid Build Coastguard Worker
4100*61046927SAndroid Build Coastguard Worker /* A vector of int32_t's for every block of binding tables.
4101*61046927SAndroid Build Coastguard Worker *
4102*61046927SAndroid Build Coastguard Worker * initialized by anv_cmd_buffer_init_batch_bo_chain()
4103*61046927SAndroid Build Coastguard Worker */
4104*61046927SAndroid Build Coastguard Worker struct u_vector bt_block_states;
4105*61046927SAndroid Build Coastguard Worker struct anv_state bt_next;
4106*61046927SAndroid Build Coastguard Worker
4107*61046927SAndroid Build Coastguard Worker struct anv_reloc_list surface_relocs;
4108*61046927SAndroid Build Coastguard Worker
4109*61046927SAndroid Build Coastguard Worker /* Serial for tracking buffer completion */
4110*61046927SAndroid Build Coastguard Worker uint32_t serial;
4111*61046927SAndroid Build Coastguard Worker
4112*61046927SAndroid Build Coastguard Worker /* Stream objects for storing temporary data */
4113*61046927SAndroid Build Coastguard Worker struct anv_state_stream surface_state_stream;
4114*61046927SAndroid Build Coastguard Worker struct anv_state_stream dynamic_state_stream;
4115*61046927SAndroid Build Coastguard Worker struct anv_state_stream general_state_stream;
4116*61046927SAndroid Build Coastguard Worker struct anv_state_stream indirect_push_descriptor_stream;
4117*61046927SAndroid Build Coastguard Worker struct anv_state_stream push_descriptor_buffer_stream;
4118*61046927SAndroid Build Coastguard Worker
4119*61046927SAndroid Build Coastguard Worker VkCommandBufferUsageFlags usage_flags;
4120*61046927SAndroid Build Coastguard Worker
4121*61046927SAndroid Build Coastguard Worker struct anv_query_pool *perf_query_pool;
4122*61046927SAndroid Build Coastguard Worker
4123*61046927SAndroid Build Coastguard Worker struct anv_cmd_state state;
4124*61046927SAndroid Build Coastguard Worker
4125*61046927SAndroid Build Coastguard Worker struct anv_address return_addr;
4126*61046927SAndroid Build Coastguard Worker
4127*61046927SAndroid Build Coastguard Worker /* Set by SetPerformanceMarkerINTEL, written into queries by CmdBeginQuery */
4128*61046927SAndroid Build Coastguard Worker uint64_t intel_perf_marker;
4129*61046927SAndroid Build Coastguard Worker
4130*61046927SAndroid Build Coastguard Worker struct anv_measure_batch *measure;
4131*61046927SAndroid Build Coastguard Worker
4132*61046927SAndroid Build Coastguard Worker /**
4133*61046927SAndroid Build Coastguard Worker * KHR_performance_query requires self modifying command buffers and this
4134*61046927SAndroid Build Coastguard Worker * array has the location of modifying commands to the query begin and end
4135*61046927SAndroid Build Coastguard Worker * instructions storing performance counters. The array length is
4136*61046927SAndroid Build Coastguard Worker * anv_physical_device::n_perf_query_commands.
4137*61046927SAndroid Build Coastguard Worker */
4138*61046927SAndroid Build Coastguard Worker struct mi_address_token *self_mod_locations;
4139*61046927SAndroid Build Coastguard Worker
4140*61046927SAndroid Build Coastguard Worker /**
4141*61046927SAndroid Build Coastguard Worker * Index tracking which of the self_mod_locations items have already been
4142*61046927SAndroid Build Coastguard Worker * used.
4143*61046927SAndroid Build Coastguard Worker */
4144*61046927SAndroid Build Coastguard Worker uint32_t perf_reloc_idx;
4145*61046927SAndroid Build Coastguard Worker
4146*61046927SAndroid Build Coastguard Worker /**
4147*61046927SAndroid Build Coastguard Worker * Sum of all the anv_batch_bo written sizes for this command buffer
4148*61046927SAndroid Build Coastguard Worker * including any executed secondary command buffer.
4149*61046927SAndroid Build Coastguard Worker */
4150*61046927SAndroid Build Coastguard Worker uint32_t total_batch_size;
4151*61046927SAndroid Build Coastguard Worker
4152*61046927SAndroid Build Coastguard Worker struct {
4153*61046927SAndroid Build Coastguard Worker /** Batch generating part of the anv_cmd_buffer::batch */
4154*61046927SAndroid Build Coastguard Worker struct anv_batch batch;
4155*61046927SAndroid Build Coastguard Worker
4156*61046927SAndroid Build Coastguard Worker /**
4157*61046927SAndroid Build Coastguard Worker * Location in anv_cmd_buffer::batch at which we left some space to
4158*61046927SAndroid Build Coastguard Worker * insert a MI_BATCH_BUFFER_START into the
4159*61046927SAndroid Build Coastguard Worker * anv_cmd_buffer::generation::batch if needed.
4160*61046927SAndroid Build Coastguard Worker */
4161*61046927SAndroid Build Coastguard Worker struct anv_address jump_addr;
4162*61046927SAndroid Build Coastguard Worker
4163*61046927SAndroid Build Coastguard Worker /**
4164*61046927SAndroid Build Coastguard Worker * Location in anv_cmd_buffer::batch at which the generation batch
4165*61046927SAndroid Build Coastguard Worker * should jump back to.
4166*61046927SAndroid Build Coastguard Worker */
4167*61046927SAndroid Build Coastguard Worker struct anv_address return_addr;
4168*61046927SAndroid Build Coastguard Worker
4169*61046927SAndroid Build Coastguard Worker /** List of anv_batch_bo used for generation
4170*61046927SAndroid Build Coastguard Worker *
4171*61046927SAndroid Build Coastguard Worker * We have to keep this separated of the anv_cmd_buffer::batch_bos that
4172*61046927SAndroid Build Coastguard Worker * is used for a chaining optimization.
4173*61046927SAndroid Build Coastguard Worker */
4174*61046927SAndroid Build Coastguard Worker struct list_head batch_bos;
4175*61046927SAndroid Build Coastguard Worker
4176*61046927SAndroid Build Coastguard Worker /** Ring buffer of generated commands
4177*61046927SAndroid Build Coastguard Worker *
4178*61046927SAndroid Build Coastguard Worker * When generating draws in ring mode, this buffer will hold generated
4179*61046927SAndroid Build Coastguard Worker * 3DPRIMITIVE commands.
4180*61046927SAndroid Build Coastguard Worker */
4181*61046927SAndroid Build Coastguard Worker struct anv_bo *ring_bo;
4182*61046927SAndroid Build Coastguard Worker
4183*61046927SAndroid Build Coastguard Worker /**
4184*61046927SAndroid Build Coastguard Worker * State tracking of the generation shader (only used for the non-ring
4185*61046927SAndroid Build Coastguard Worker * mode).
4186*61046927SAndroid Build Coastguard Worker */
4187*61046927SAndroid Build Coastguard Worker struct anv_simple_shader shader_state;
4188*61046927SAndroid Build Coastguard Worker } generation;
4189*61046927SAndroid Build Coastguard Worker
4190*61046927SAndroid Build Coastguard Worker /**
4191*61046927SAndroid Build Coastguard Worker * A vector of anv_bo pointers for chunks of memory used by the command
4192*61046927SAndroid Build Coastguard Worker * buffer that are too large to be allocated through dynamic_state_stream.
4193*61046927SAndroid Build Coastguard Worker * This is the case for large enough acceleration structures.
4194*61046927SAndroid Build Coastguard Worker *
4195*61046927SAndroid Build Coastguard Worker * initialized by anv_cmd_buffer_init_batch_bo_chain()
4196*61046927SAndroid Build Coastguard Worker */
4197*61046927SAndroid Build Coastguard Worker struct u_vector dynamic_bos;
4198*61046927SAndroid Build Coastguard Worker
4199*61046927SAndroid Build Coastguard Worker /**
4200*61046927SAndroid Build Coastguard Worker * Structure holding tracepoints recorded in the command buffer.
4201*61046927SAndroid Build Coastguard Worker */
4202*61046927SAndroid Build Coastguard Worker struct u_trace trace;
4203*61046927SAndroid Build Coastguard Worker
4204*61046927SAndroid Build Coastguard Worker struct {
4205*61046927SAndroid Build Coastguard Worker struct anv_video_session *vid;
4206*61046927SAndroid Build Coastguard Worker struct anv_video_session_params *params;
4207*61046927SAndroid Build Coastguard Worker } video;
4208*61046927SAndroid Build Coastguard Worker
4209*61046927SAndroid Build Coastguard Worker /**
4210*61046927SAndroid Build Coastguard Worker * Companion RCS command buffer to support the MSAA operations on compute
4211*61046927SAndroid Build Coastguard Worker * queue.
4212*61046927SAndroid Build Coastguard Worker */
4213*61046927SAndroid Build Coastguard Worker struct anv_cmd_buffer *companion_rcs_cmd_buffer;
4214*61046927SAndroid Build Coastguard Worker
4215*61046927SAndroid Build Coastguard Worker /**
4216*61046927SAndroid Build Coastguard Worker * Whether this command buffer is a companion command buffer of compute one.
4217*61046927SAndroid Build Coastguard Worker */
4218*61046927SAndroid Build Coastguard Worker bool is_companion_rcs_cmd_buffer;
4219*61046927SAndroid Build Coastguard Worker
4220*61046927SAndroid Build Coastguard Worker };
4221*61046927SAndroid Build Coastguard Worker
4222*61046927SAndroid Build Coastguard Worker extern const struct vk_command_buffer_ops anv_cmd_buffer_ops;
4223*61046927SAndroid Build Coastguard Worker
4224*61046927SAndroid Build Coastguard Worker /* Determine whether we can chain a given cmd_buffer to another one. We need
4225*61046927SAndroid Build Coastguard Worker * to make sure that we can edit the end of the batch to point to next one,
4226*61046927SAndroid Build Coastguard Worker * which requires the command buffer to not be used simultaneously.
4227*61046927SAndroid Build Coastguard Worker *
4228*61046927SAndroid Build Coastguard Worker * We could in theory also implement chaining with companion command buffers,
4229*61046927SAndroid Build Coastguard Worker * but let's sparse ourselves some pain and misery. This optimization has no
4230*61046927SAndroid Build Coastguard Worker * benefit on the brand new Xe kernel driver.
4231*61046927SAndroid Build Coastguard Worker */
4232*61046927SAndroid Build Coastguard Worker static inline bool
anv_cmd_buffer_is_chainable(struct anv_cmd_buffer * cmd_buffer)4233*61046927SAndroid Build Coastguard Worker anv_cmd_buffer_is_chainable(struct anv_cmd_buffer *cmd_buffer)
4234*61046927SAndroid Build Coastguard Worker {
4235*61046927SAndroid Build Coastguard Worker return !(cmd_buffer->usage_flags &
4236*61046927SAndroid Build Coastguard Worker VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT) &&
4237*61046927SAndroid Build Coastguard Worker !(cmd_buffer->is_companion_rcs_cmd_buffer);
4238*61046927SAndroid Build Coastguard Worker }
4239*61046927SAndroid Build Coastguard Worker
4240*61046927SAndroid Build Coastguard Worker static inline bool
anv_cmd_buffer_is_render_queue(const struct anv_cmd_buffer * cmd_buffer)4241*61046927SAndroid Build Coastguard Worker anv_cmd_buffer_is_render_queue(const struct anv_cmd_buffer *cmd_buffer)
4242*61046927SAndroid Build Coastguard Worker {
4243*61046927SAndroid Build Coastguard Worker struct anv_queue_family *queue_family = cmd_buffer->queue_family;
4244*61046927SAndroid Build Coastguard Worker return (queue_family->queueFlags & VK_QUEUE_GRAPHICS_BIT) != 0;
4245*61046927SAndroid Build Coastguard Worker }
4246*61046927SAndroid Build Coastguard Worker
4247*61046927SAndroid Build Coastguard Worker static inline bool
anv_cmd_buffer_is_video_queue(const struct anv_cmd_buffer * cmd_buffer)4248*61046927SAndroid Build Coastguard Worker anv_cmd_buffer_is_video_queue(const struct anv_cmd_buffer *cmd_buffer)
4249*61046927SAndroid Build Coastguard Worker {
4250*61046927SAndroid Build Coastguard Worker struct anv_queue_family *queue_family = cmd_buffer->queue_family;
4251*61046927SAndroid Build Coastguard Worker return ((queue_family->queueFlags & VK_QUEUE_VIDEO_DECODE_BIT_KHR) |
4252*61046927SAndroid Build Coastguard Worker (queue_family->queueFlags & VK_QUEUE_VIDEO_ENCODE_BIT_KHR)) != 0;
4253*61046927SAndroid Build Coastguard Worker }
4254*61046927SAndroid Build Coastguard Worker
4255*61046927SAndroid Build Coastguard Worker static inline bool
anv_cmd_buffer_is_compute_queue(const struct anv_cmd_buffer * cmd_buffer)4256*61046927SAndroid Build Coastguard Worker anv_cmd_buffer_is_compute_queue(const struct anv_cmd_buffer *cmd_buffer)
4257*61046927SAndroid Build Coastguard Worker {
4258*61046927SAndroid Build Coastguard Worker struct anv_queue_family *queue_family = cmd_buffer->queue_family;
4259*61046927SAndroid Build Coastguard Worker return queue_family->engine_class == INTEL_ENGINE_CLASS_COMPUTE;
4260*61046927SAndroid Build Coastguard Worker }
4261*61046927SAndroid Build Coastguard Worker
4262*61046927SAndroid Build Coastguard Worker static inline bool
anv_cmd_buffer_is_blitter_queue(const struct anv_cmd_buffer * cmd_buffer)4263*61046927SAndroid Build Coastguard Worker anv_cmd_buffer_is_blitter_queue(const struct anv_cmd_buffer *cmd_buffer)
4264*61046927SAndroid Build Coastguard Worker {
4265*61046927SAndroid Build Coastguard Worker struct anv_queue_family *queue_family = cmd_buffer->queue_family;
4266*61046927SAndroid Build Coastguard Worker return queue_family->engine_class == INTEL_ENGINE_CLASS_COPY;
4267*61046927SAndroid Build Coastguard Worker }
4268*61046927SAndroid Build Coastguard Worker
4269*61046927SAndroid Build Coastguard Worker static inline bool
anv_cmd_buffer_is_render_or_compute_queue(const struct anv_cmd_buffer * cmd_buffer)4270*61046927SAndroid Build Coastguard Worker anv_cmd_buffer_is_render_or_compute_queue(const struct anv_cmd_buffer *cmd_buffer)
4271*61046927SAndroid Build Coastguard Worker {
4272*61046927SAndroid Build Coastguard Worker return anv_cmd_buffer_is_render_queue(cmd_buffer) ||
4273*61046927SAndroid Build Coastguard Worker anv_cmd_buffer_is_compute_queue(cmd_buffer);
4274*61046927SAndroid Build Coastguard Worker }
4275*61046927SAndroid Build Coastguard Worker
4276*61046927SAndroid Build Coastguard Worker static inline struct anv_address
anv_cmd_buffer_dynamic_state_address(struct anv_cmd_buffer * cmd_buffer,struct anv_state state)4277*61046927SAndroid Build Coastguard Worker anv_cmd_buffer_dynamic_state_address(struct anv_cmd_buffer *cmd_buffer,
4278*61046927SAndroid Build Coastguard Worker struct anv_state state)
4279*61046927SAndroid Build Coastguard Worker {
4280*61046927SAndroid Build Coastguard Worker return anv_state_pool_state_address(
4281*61046927SAndroid Build Coastguard Worker &cmd_buffer->device->dynamic_state_pool, state);
4282*61046927SAndroid Build Coastguard Worker }
4283*61046927SAndroid Build Coastguard Worker
4284*61046927SAndroid Build Coastguard Worker static inline uint64_t
anv_cmd_buffer_descriptor_buffer_address(struct anv_cmd_buffer * cmd_buffer,int32_t buffer_index)4285*61046927SAndroid Build Coastguard Worker anv_cmd_buffer_descriptor_buffer_address(struct anv_cmd_buffer *cmd_buffer,
4286*61046927SAndroid Build Coastguard Worker int32_t buffer_index)
4287*61046927SAndroid Build Coastguard Worker {
4288*61046927SAndroid Build Coastguard Worker if (buffer_index == -1)
4289*61046927SAndroid Build Coastguard Worker return cmd_buffer->device->physical->va.push_descriptor_buffer_pool.addr;
4290*61046927SAndroid Build Coastguard Worker
4291*61046927SAndroid Build Coastguard Worker return cmd_buffer->state.descriptor_buffers.address[buffer_index];
4292*61046927SAndroid Build Coastguard Worker }
4293*61046927SAndroid Build Coastguard Worker
4294*61046927SAndroid Build Coastguard Worker VkResult anv_cmd_buffer_init_batch_bo_chain(struct anv_cmd_buffer *cmd_buffer);
4295*61046927SAndroid Build Coastguard Worker void anv_cmd_buffer_fini_batch_bo_chain(struct anv_cmd_buffer *cmd_buffer);
4296*61046927SAndroid Build Coastguard Worker void anv_cmd_buffer_reset_batch_bo_chain(struct anv_cmd_buffer *cmd_buffer);
4297*61046927SAndroid Build Coastguard Worker void anv_cmd_buffer_end_batch_buffer(struct anv_cmd_buffer *cmd_buffer);
4298*61046927SAndroid Build Coastguard Worker void anv_cmd_buffer_add_secondary(struct anv_cmd_buffer *primary,
4299*61046927SAndroid Build Coastguard Worker struct anv_cmd_buffer *secondary);
4300*61046927SAndroid Build Coastguard Worker void anv_cmd_buffer_prepare_execbuf(struct anv_cmd_buffer *cmd_buffer);
4301*61046927SAndroid Build Coastguard Worker VkResult anv_cmd_buffer_execbuf(struct anv_queue *queue,
4302*61046927SAndroid Build Coastguard Worker struct anv_cmd_buffer *cmd_buffer,
4303*61046927SAndroid Build Coastguard Worker const VkSemaphore *in_semaphores,
4304*61046927SAndroid Build Coastguard Worker const uint64_t *in_wait_values,
4305*61046927SAndroid Build Coastguard Worker uint32_t num_in_semaphores,
4306*61046927SAndroid Build Coastguard Worker const VkSemaphore *out_semaphores,
4307*61046927SAndroid Build Coastguard Worker const uint64_t *out_signal_values,
4308*61046927SAndroid Build Coastguard Worker uint32_t num_out_semaphores,
4309*61046927SAndroid Build Coastguard Worker VkFence fence,
4310*61046927SAndroid Build Coastguard Worker int perf_query_pass);
4311*61046927SAndroid Build Coastguard Worker
4312*61046927SAndroid Build Coastguard Worker void anv_cmd_buffer_reset(struct vk_command_buffer *vk_cmd_buffer,
4313*61046927SAndroid Build Coastguard Worker UNUSED VkCommandBufferResetFlags flags);
4314*61046927SAndroid Build Coastguard Worker
4315*61046927SAndroid Build Coastguard Worker struct anv_state anv_cmd_buffer_emit_dynamic(struct anv_cmd_buffer *cmd_buffer,
4316*61046927SAndroid Build Coastguard Worker const void *data, uint32_t size, uint32_t alignment);
4317*61046927SAndroid Build Coastguard Worker struct anv_state anv_cmd_buffer_merge_dynamic(struct anv_cmd_buffer *cmd_buffer,
4318*61046927SAndroid Build Coastguard Worker uint32_t *a, uint32_t *b,
4319*61046927SAndroid Build Coastguard Worker uint32_t dwords, uint32_t alignment);
4320*61046927SAndroid Build Coastguard Worker
4321*61046927SAndroid Build Coastguard Worker struct anv_address
4322*61046927SAndroid Build Coastguard Worker anv_cmd_buffer_surface_base_address(struct anv_cmd_buffer *cmd_buffer);
4323*61046927SAndroid Build Coastguard Worker struct anv_state
4324*61046927SAndroid Build Coastguard Worker anv_cmd_buffer_alloc_binding_table(struct anv_cmd_buffer *cmd_buffer,
4325*61046927SAndroid Build Coastguard Worker uint32_t entries, uint32_t *state_offset);
4326*61046927SAndroid Build Coastguard Worker struct anv_state
4327*61046927SAndroid Build Coastguard Worker anv_cmd_buffer_alloc_surface_states(struct anv_cmd_buffer *cmd_buffer,
4328*61046927SAndroid Build Coastguard Worker uint32_t count);
4329*61046927SAndroid Build Coastguard Worker struct anv_state
4330*61046927SAndroid Build Coastguard Worker anv_cmd_buffer_alloc_dynamic_state(struct anv_cmd_buffer *cmd_buffer,
4331*61046927SAndroid Build Coastguard Worker uint32_t size, uint32_t alignment);
4332*61046927SAndroid Build Coastguard Worker struct anv_state
4333*61046927SAndroid Build Coastguard Worker anv_cmd_buffer_alloc_general_state(struct anv_cmd_buffer *cmd_buffer,
4334*61046927SAndroid Build Coastguard Worker uint32_t size, uint32_t alignment);
4335*61046927SAndroid Build Coastguard Worker static inline struct anv_state
anv_cmd_buffer_alloc_temporary_state(struct anv_cmd_buffer * cmd_buffer,uint32_t size,uint32_t alignment)4336*61046927SAndroid Build Coastguard Worker anv_cmd_buffer_alloc_temporary_state(struct anv_cmd_buffer *cmd_buffer,
4337*61046927SAndroid Build Coastguard Worker uint32_t size, uint32_t alignment)
4338*61046927SAndroid Build Coastguard Worker {
4339*61046927SAndroid Build Coastguard Worker struct anv_state state =
4340*61046927SAndroid Build Coastguard Worker anv_state_stream_alloc(&cmd_buffer->dynamic_state_stream,
4341*61046927SAndroid Build Coastguard Worker size, alignment);
4342*61046927SAndroid Build Coastguard Worker if (state.map == NULL)
4343*61046927SAndroid Build Coastguard Worker anv_batch_set_error(&cmd_buffer->batch, VK_ERROR_OUT_OF_DEVICE_MEMORY);
4344*61046927SAndroid Build Coastguard Worker return state;
4345*61046927SAndroid Build Coastguard Worker }
4346*61046927SAndroid Build Coastguard Worker static inline struct anv_address
anv_cmd_buffer_temporary_state_address(struct anv_cmd_buffer * cmd_buffer,struct anv_state state)4347*61046927SAndroid Build Coastguard Worker anv_cmd_buffer_temporary_state_address(struct anv_cmd_buffer *cmd_buffer,
4348*61046927SAndroid Build Coastguard Worker struct anv_state state)
4349*61046927SAndroid Build Coastguard Worker {
4350*61046927SAndroid Build Coastguard Worker return anv_state_pool_state_address(
4351*61046927SAndroid Build Coastguard Worker &cmd_buffer->device->dynamic_state_pool, state);
4352*61046927SAndroid Build Coastguard Worker }
4353*61046927SAndroid Build Coastguard Worker
4354*61046927SAndroid Build Coastguard Worker void
4355*61046927SAndroid Build Coastguard Worker anv_cmd_buffer_chain_command_buffers(struct anv_cmd_buffer **cmd_buffers,
4356*61046927SAndroid Build Coastguard Worker uint32_t num_cmd_buffers);
4357*61046927SAndroid Build Coastguard Worker void
4358*61046927SAndroid Build Coastguard Worker anv_cmd_buffer_exec_batch_debug(struct anv_queue *queue,
4359*61046927SAndroid Build Coastguard Worker uint32_t cmd_buffer_count,
4360*61046927SAndroid Build Coastguard Worker struct anv_cmd_buffer **cmd_buffers,
4361*61046927SAndroid Build Coastguard Worker struct anv_query_pool *perf_query_pool,
4362*61046927SAndroid Build Coastguard Worker uint32_t perf_query_pass);
4363*61046927SAndroid Build Coastguard Worker void
4364*61046927SAndroid Build Coastguard Worker anv_cmd_buffer_clflush(struct anv_cmd_buffer **cmd_buffers,
4365*61046927SAndroid Build Coastguard Worker uint32_t num_cmd_buffers);
4366*61046927SAndroid Build Coastguard Worker
4367*61046927SAndroid Build Coastguard Worker void
4368*61046927SAndroid Build Coastguard Worker anv_cmd_buffer_update_pending_query_bits(struct anv_cmd_buffer *cmd_buffer,
4369*61046927SAndroid Build Coastguard Worker enum anv_pipe_bits flushed_bits);
4370*61046927SAndroid Build Coastguard Worker
4371*61046927SAndroid Build Coastguard Worker /**
4372*61046927SAndroid Build Coastguard Worker * A allocation tied to a command buffer.
4373*61046927SAndroid Build Coastguard Worker *
4374*61046927SAndroid Build Coastguard Worker * Don't use anv_cmd_alloc::address::map to write memory from userspace, use
4375*61046927SAndroid Build Coastguard Worker * anv_cmd_alloc::map instead.
4376*61046927SAndroid Build Coastguard Worker */
4377*61046927SAndroid Build Coastguard Worker struct anv_cmd_alloc {
4378*61046927SAndroid Build Coastguard Worker struct anv_address address;
4379*61046927SAndroid Build Coastguard Worker void *map;
4380*61046927SAndroid Build Coastguard Worker size_t size;
4381*61046927SAndroid Build Coastguard Worker };
4382*61046927SAndroid Build Coastguard Worker
4383*61046927SAndroid Build Coastguard Worker #define ANV_EMPTY_ALLOC ((struct anv_cmd_alloc) { .map = NULL, .size = 0 })
4384*61046927SAndroid Build Coastguard Worker
4385*61046927SAndroid Build Coastguard Worker static inline bool
anv_cmd_alloc_is_empty(struct anv_cmd_alloc alloc)4386*61046927SAndroid Build Coastguard Worker anv_cmd_alloc_is_empty(struct anv_cmd_alloc alloc)
4387*61046927SAndroid Build Coastguard Worker {
4388*61046927SAndroid Build Coastguard Worker return alloc.size == 0;
4389*61046927SAndroid Build Coastguard Worker }
4390*61046927SAndroid Build Coastguard Worker
4391*61046927SAndroid Build Coastguard Worker struct anv_cmd_alloc
4392*61046927SAndroid Build Coastguard Worker anv_cmd_buffer_alloc_space(struct anv_cmd_buffer *cmd_buffer,
4393*61046927SAndroid Build Coastguard Worker size_t size, uint32_t alignment,
4394*61046927SAndroid Build Coastguard Worker bool private);
4395*61046927SAndroid Build Coastguard Worker
4396*61046927SAndroid Build Coastguard Worker VkResult
4397*61046927SAndroid Build Coastguard Worker anv_cmd_buffer_new_binding_table_block(struct anv_cmd_buffer *cmd_buffer);
4398*61046927SAndroid Build Coastguard Worker
4399*61046927SAndroid Build Coastguard Worker void anv_cmd_buffer_emit_bt_pool_base_address(struct anv_cmd_buffer *cmd_buffer);
4400*61046927SAndroid Build Coastguard Worker
4401*61046927SAndroid Build Coastguard Worker struct anv_state
4402*61046927SAndroid Build Coastguard Worker anv_cmd_buffer_gfx_push_constants(struct anv_cmd_buffer *cmd_buffer);
4403*61046927SAndroid Build Coastguard Worker struct anv_state
4404*61046927SAndroid Build Coastguard Worker anv_cmd_buffer_cs_push_constants(struct anv_cmd_buffer *cmd_buffer);
4405*61046927SAndroid Build Coastguard Worker
4406*61046927SAndroid Build Coastguard Worker VkResult
4407*61046927SAndroid Build Coastguard Worker anv_cmd_buffer_alloc_blorp_binding_table(struct anv_cmd_buffer *cmd_buffer,
4408*61046927SAndroid Build Coastguard Worker uint32_t num_entries,
4409*61046927SAndroid Build Coastguard Worker uint32_t *state_offset,
4410*61046927SAndroid Build Coastguard Worker struct anv_state *bt_state);
4411*61046927SAndroid Build Coastguard Worker
4412*61046927SAndroid Build Coastguard Worker void anv_cmd_emit_conditional_render_predicate(struct anv_cmd_buffer *cmd_buffer);
4413*61046927SAndroid Build Coastguard Worker
4414*61046927SAndroid Build Coastguard Worker static inline unsigned
anv_cmd_buffer_get_view_count(struct anv_cmd_buffer * cmd_buffer)4415*61046927SAndroid Build Coastguard Worker anv_cmd_buffer_get_view_count(struct anv_cmd_buffer *cmd_buffer)
4416*61046927SAndroid Build Coastguard Worker {
4417*61046927SAndroid Build Coastguard Worker struct anv_cmd_graphics_state *gfx = &cmd_buffer->state.gfx;
4418*61046927SAndroid Build Coastguard Worker return MAX2(1, util_bitcount(gfx->view_mask));
4419*61046927SAndroid Build Coastguard Worker }
4420*61046927SAndroid Build Coastguard Worker
4421*61046927SAndroid Build Coastguard Worker /* Save/restore cmd buffer states for meta operations */
4422*61046927SAndroid Build Coastguard Worker enum anv_cmd_saved_state_flags {
4423*61046927SAndroid Build Coastguard Worker ANV_CMD_SAVED_STATE_COMPUTE_PIPELINE = BITFIELD_BIT(0),
4424*61046927SAndroid Build Coastguard Worker ANV_CMD_SAVED_STATE_DESCRIPTOR_SET_0 = BITFIELD_BIT(1),
4425*61046927SAndroid Build Coastguard Worker ANV_CMD_SAVED_STATE_PUSH_CONSTANTS = BITFIELD_BIT(2),
4426*61046927SAndroid Build Coastguard Worker };
4427*61046927SAndroid Build Coastguard Worker
4428*61046927SAndroid Build Coastguard Worker struct anv_cmd_saved_state {
4429*61046927SAndroid Build Coastguard Worker uint32_t flags;
4430*61046927SAndroid Build Coastguard Worker
4431*61046927SAndroid Build Coastguard Worker struct anv_pipeline *pipeline;
4432*61046927SAndroid Build Coastguard Worker struct anv_descriptor_set *descriptor_set;
4433*61046927SAndroid Build Coastguard Worker uint8_t push_constants[MAX_PUSH_CONSTANTS_SIZE];
4434*61046927SAndroid Build Coastguard Worker };
4435*61046927SAndroid Build Coastguard Worker
4436*61046927SAndroid Build Coastguard Worker void anv_cmd_buffer_save_state(struct anv_cmd_buffer *cmd_buffer,
4437*61046927SAndroid Build Coastguard Worker uint32_t flags,
4438*61046927SAndroid Build Coastguard Worker struct anv_cmd_saved_state *state);
4439*61046927SAndroid Build Coastguard Worker
4440*61046927SAndroid Build Coastguard Worker void anv_cmd_buffer_restore_state(struct anv_cmd_buffer *cmd_buffer,
4441*61046927SAndroid Build Coastguard Worker struct anv_cmd_saved_state *state);
4442*61046927SAndroid Build Coastguard Worker
4443*61046927SAndroid Build Coastguard Worker enum anv_bo_sync_state {
4444*61046927SAndroid Build Coastguard Worker /** Indicates that this is a new (or newly reset fence) */
4445*61046927SAndroid Build Coastguard Worker ANV_BO_SYNC_STATE_RESET,
4446*61046927SAndroid Build Coastguard Worker
4447*61046927SAndroid Build Coastguard Worker /** Indicates that this fence has been submitted to the GPU but is still
4448*61046927SAndroid Build Coastguard Worker * (as far as we know) in use by the GPU.
4449*61046927SAndroid Build Coastguard Worker */
4450*61046927SAndroid Build Coastguard Worker ANV_BO_SYNC_STATE_SUBMITTED,
4451*61046927SAndroid Build Coastguard Worker
4452*61046927SAndroid Build Coastguard Worker ANV_BO_SYNC_STATE_SIGNALED,
4453*61046927SAndroid Build Coastguard Worker };
4454*61046927SAndroid Build Coastguard Worker
4455*61046927SAndroid Build Coastguard Worker struct anv_bo_sync {
4456*61046927SAndroid Build Coastguard Worker struct vk_sync sync;
4457*61046927SAndroid Build Coastguard Worker
4458*61046927SAndroid Build Coastguard Worker enum anv_bo_sync_state state;
4459*61046927SAndroid Build Coastguard Worker struct anv_bo *bo;
4460*61046927SAndroid Build Coastguard Worker };
4461*61046927SAndroid Build Coastguard Worker
4462*61046927SAndroid Build Coastguard Worker extern const struct vk_sync_type anv_bo_sync_type;
4463*61046927SAndroid Build Coastguard Worker
4464*61046927SAndroid Build Coastguard Worker static inline bool
vk_sync_is_anv_bo_sync(const struct vk_sync * sync)4465*61046927SAndroid Build Coastguard Worker vk_sync_is_anv_bo_sync(const struct vk_sync *sync)
4466*61046927SAndroid Build Coastguard Worker {
4467*61046927SAndroid Build Coastguard Worker return sync->type == &anv_bo_sync_type;
4468*61046927SAndroid Build Coastguard Worker }
4469*61046927SAndroid Build Coastguard Worker
4470*61046927SAndroid Build Coastguard Worker VkResult anv_create_sync_for_memory(struct vk_device *device,
4471*61046927SAndroid Build Coastguard Worker VkDeviceMemory memory,
4472*61046927SAndroid Build Coastguard Worker bool signal_memory,
4473*61046927SAndroid Build Coastguard Worker struct vk_sync **sync_out);
4474*61046927SAndroid Build Coastguard Worker
4475*61046927SAndroid Build Coastguard Worker struct anv_event {
4476*61046927SAndroid Build Coastguard Worker struct vk_object_base base;
4477*61046927SAndroid Build Coastguard Worker uint64_t semaphore;
4478*61046927SAndroid Build Coastguard Worker struct anv_state state;
4479*61046927SAndroid Build Coastguard Worker };
4480*61046927SAndroid Build Coastguard Worker
4481*61046927SAndroid Build Coastguard Worker #define ANV_STAGE_MASK ((1 << MESA_VULKAN_SHADER_STAGES) - 1)
4482*61046927SAndroid Build Coastguard Worker
4483*61046927SAndroid Build Coastguard Worker #define anv_foreach_stage(stage, stage_bits) \
4484*61046927SAndroid Build Coastguard Worker for (gl_shader_stage stage, \
4485*61046927SAndroid Build Coastguard Worker __tmp = (gl_shader_stage)((stage_bits) & ANV_STAGE_MASK); \
4486*61046927SAndroid Build Coastguard Worker stage = __builtin_ffs(__tmp) - 1, __tmp; \
4487*61046927SAndroid Build Coastguard Worker __tmp &= ~(1 << (stage)))
4488*61046927SAndroid Build Coastguard Worker
4489*61046927SAndroid Build Coastguard Worker struct anv_pipeline_bind_map {
4490*61046927SAndroid Build Coastguard Worker unsigned char surface_sha1[20];
4491*61046927SAndroid Build Coastguard Worker unsigned char sampler_sha1[20];
4492*61046927SAndroid Build Coastguard Worker unsigned char push_sha1[20];
4493*61046927SAndroid Build Coastguard Worker
4494*61046927SAndroid Build Coastguard Worker uint32_t surface_count;
4495*61046927SAndroid Build Coastguard Worker uint32_t sampler_count;
4496*61046927SAndroid Build Coastguard Worker uint32_t embedded_sampler_count;
4497*61046927SAndroid Build Coastguard Worker uint16_t kernel_args_size;
4498*61046927SAndroid Build Coastguard Worker uint16_t kernel_arg_count;
4499*61046927SAndroid Build Coastguard Worker
4500*61046927SAndroid Build Coastguard Worker struct anv_pipeline_binding * surface_to_descriptor;
4501*61046927SAndroid Build Coastguard Worker struct anv_pipeline_binding * sampler_to_descriptor;
4502*61046927SAndroid Build Coastguard Worker struct anv_pipeline_embedded_sampler_binding* embedded_sampler_to_binding;
4503*61046927SAndroid Build Coastguard Worker struct brw_kernel_arg_desc * kernel_args;
4504*61046927SAndroid Build Coastguard Worker
4505*61046927SAndroid Build Coastguard Worker struct anv_push_range push_ranges[4];
4506*61046927SAndroid Build Coastguard Worker };
4507*61046927SAndroid Build Coastguard Worker
4508*61046927SAndroid Build Coastguard Worker struct anv_push_descriptor_info {
4509*61046927SAndroid Build Coastguard Worker /* A bitfield of descriptors used. */
4510*61046927SAndroid Build Coastguard Worker uint32_t used_descriptors;
4511*61046927SAndroid Build Coastguard Worker
4512*61046927SAndroid Build Coastguard Worker /* A bitfield of UBOs bindings fully promoted to push constants. */
4513*61046927SAndroid Build Coastguard Worker uint32_t fully_promoted_ubo_descriptors;
4514*61046927SAndroid Build Coastguard Worker
4515*61046927SAndroid Build Coastguard Worker /* */
4516*61046927SAndroid Build Coastguard Worker uint8_t used_set_buffer;
4517*61046927SAndroid Build Coastguard Worker };
4518*61046927SAndroid Build Coastguard Worker
4519*61046927SAndroid Build Coastguard Worker /* A list of values we push to implement some of the dynamic states */
4520*61046927SAndroid Build Coastguard Worker enum anv_dynamic_push_bits {
4521*61046927SAndroid Build Coastguard Worker ANV_DYNAMIC_PUSH_INPUT_VERTICES = BITFIELD_BIT(0),
4522*61046927SAndroid Build Coastguard Worker };
4523*61046927SAndroid Build Coastguard Worker
4524*61046927SAndroid Build Coastguard Worker struct anv_shader_upload_params {
4525*61046927SAndroid Build Coastguard Worker gl_shader_stage stage;
4526*61046927SAndroid Build Coastguard Worker
4527*61046927SAndroid Build Coastguard Worker const void *key_data;
4528*61046927SAndroid Build Coastguard Worker uint32_t key_size;
4529*61046927SAndroid Build Coastguard Worker
4530*61046927SAndroid Build Coastguard Worker const void *kernel_data;
4531*61046927SAndroid Build Coastguard Worker uint32_t kernel_size;
4532*61046927SAndroid Build Coastguard Worker
4533*61046927SAndroid Build Coastguard Worker const struct brw_stage_prog_data *prog_data;
4534*61046927SAndroid Build Coastguard Worker uint32_t prog_data_size;
4535*61046927SAndroid Build Coastguard Worker
4536*61046927SAndroid Build Coastguard Worker const struct brw_compile_stats *stats;
4537*61046927SAndroid Build Coastguard Worker uint32_t num_stats;
4538*61046927SAndroid Build Coastguard Worker
4539*61046927SAndroid Build Coastguard Worker const struct nir_xfb_info *xfb_info;
4540*61046927SAndroid Build Coastguard Worker
4541*61046927SAndroid Build Coastguard Worker const struct anv_pipeline_bind_map *bind_map;
4542*61046927SAndroid Build Coastguard Worker
4543*61046927SAndroid Build Coastguard Worker const struct anv_push_descriptor_info *push_desc_info;
4544*61046927SAndroid Build Coastguard Worker
4545*61046927SAndroid Build Coastguard Worker enum anv_dynamic_push_bits dynamic_push_values;
4546*61046927SAndroid Build Coastguard Worker };
4547*61046927SAndroid Build Coastguard Worker
4548*61046927SAndroid Build Coastguard Worker struct anv_embedded_sampler {
4549*61046927SAndroid Build Coastguard Worker uint32_t ref_cnt;
4550*61046927SAndroid Build Coastguard Worker
4551*61046927SAndroid Build Coastguard Worker struct anv_embedded_sampler_key key;
4552*61046927SAndroid Build Coastguard Worker
4553*61046927SAndroid Build Coastguard Worker struct anv_state sampler_state;
4554*61046927SAndroid Build Coastguard Worker struct anv_state border_color_state;
4555*61046927SAndroid Build Coastguard Worker };
4556*61046927SAndroid Build Coastguard Worker
4557*61046927SAndroid Build Coastguard Worker struct anv_shader_bin {
4558*61046927SAndroid Build Coastguard Worker struct vk_pipeline_cache_object base;
4559*61046927SAndroid Build Coastguard Worker
4560*61046927SAndroid Build Coastguard Worker gl_shader_stage stage;
4561*61046927SAndroid Build Coastguard Worker
4562*61046927SAndroid Build Coastguard Worker struct anv_state kernel;
4563*61046927SAndroid Build Coastguard Worker uint32_t kernel_size;
4564*61046927SAndroid Build Coastguard Worker
4565*61046927SAndroid Build Coastguard Worker const struct brw_stage_prog_data *prog_data;
4566*61046927SAndroid Build Coastguard Worker uint32_t prog_data_size;
4567*61046927SAndroid Build Coastguard Worker
4568*61046927SAndroid Build Coastguard Worker struct brw_compile_stats stats[3];
4569*61046927SAndroid Build Coastguard Worker uint32_t num_stats;
4570*61046927SAndroid Build Coastguard Worker
4571*61046927SAndroid Build Coastguard Worker struct nir_xfb_info *xfb_info;
4572*61046927SAndroid Build Coastguard Worker
4573*61046927SAndroid Build Coastguard Worker struct anv_push_descriptor_info push_desc_info;
4574*61046927SAndroid Build Coastguard Worker
4575*61046927SAndroid Build Coastguard Worker struct anv_pipeline_bind_map bind_map;
4576*61046927SAndroid Build Coastguard Worker
4577*61046927SAndroid Build Coastguard Worker enum anv_dynamic_push_bits dynamic_push_values;
4578*61046927SAndroid Build Coastguard Worker
4579*61046927SAndroid Build Coastguard Worker /* Not saved in the pipeline cache.
4580*61046927SAndroid Build Coastguard Worker *
4581*61046927SAndroid Build Coastguard Worker * Array of pointers of length bind_map.embedded_sampler_count
4582*61046927SAndroid Build Coastguard Worker */
4583*61046927SAndroid Build Coastguard Worker struct anv_embedded_sampler **embedded_samplers;
4584*61046927SAndroid Build Coastguard Worker };
4585*61046927SAndroid Build Coastguard Worker
4586*61046927SAndroid Build Coastguard Worker static inline struct anv_shader_bin *
anv_shader_bin_ref(struct anv_shader_bin * shader)4587*61046927SAndroid Build Coastguard Worker anv_shader_bin_ref(struct anv_shader_bin *shader)
4588*61046927SAndroid Build Coastguard Worker {
4589*61046927SAndroid Build Coastguard Worker vk_pipeline_cache_object_ref(&shader->base);
4590*61046927SAndroid Build Coastguard Worker
4591*61046927SAndroid Build Coastguard Worker return shader;
4592*61046927SAndroid Build Coastguard Worker }
4593*61046927SAndroid Build Coastguard Worker
4594*61046927SAndroid Build Coastguard Worker static inline void
anv_shader_bin_unref(struct anv_device * device,struct anv_shader_bin * shader)4595*61046927SAndroid Build Coastguard Worker anv_shader_bin_unref(struct anv_device *device, struct anv_shader_bin *shader)
4596*61046927SAndroid Build Coastguard Worker {
4597*61046927SAndroid Build Coastguard Worker vk_pipeline_cache_object_unref(&device->vk, &shader->base);
4598*61046927SAndroid Build Coastguard Worker }
4599*61046927SAndroid Build Coastguard Worker
4600*61046927SAndroid Build Coastguard Worker struct anv_pipeline_executable {
4601*61046927SAndroid Build Coastguard Worker gl_shader_stage stage;
4602*61046927SAndroid Build Coastguard Worker
4603*61046927SAndroid Build Coastguard Worker struct brw_compile_stats stats;
4604*61046927SAndroid Build Coastguard Worker
4605*61046927SAndroid Build Coastguard Worker char *nir;
4606*61046927SAndroid Build Coastguard Worker char *disasm;
4607*61046927SAndroid Build Coastguard Worker };
4608*61046927SAndroid Build Coastguard Worker
4609*61046927SAndroid Build Coastguard Worker enum anv_pipeline_type {
4610*61046927SAndroid Build Coastguard Worker ANV_PIPELINE_GRAPHICS,
4611*61046927SAndroid Build Coastguard Worker ANV_PIPELINE_GRAPHICS_LIB,
4612*61046927SAndroid Build Coastguard Worker ANV_PIPELINE_COMPUTE,
4613*61046927SAndroid Build Coastguard Worker ANV_PIPELINE_RAY_TRACING,
4614*61046927SAndroid Build Coastguard Worker };
4615*61046927SAndroid Build Coastguard Worker
4616*61046927SAndroid Build Coastguard Worker struct anv_pipeline {
4617*61046927SAndroid Build Coastguard Worker struct vk_object_base base;
4618*61046927SAndroid Build Coastguard Worker
4619*61046927SAndroid Build Coastguard Worker struct anv_device * device;
4620*61046927SAndroid Build Coastguard Worker
4621*61046927SAndroid Build Coastguard Worker struct anv_batch batch;
4622*61046927SAndroid Build Coastguard Worker struct anv_reloc_list batch_relocs;
4623*61046927SAndroid Build Coastguard Worker
4624*61046927SAndroid Build Coastguard Worker void * mem_ctx;
4625*61046927SAndroid Build Coastguard Worker
4626*61046927SAndroid Build Coastguard Worker enum anv_pipeline_type type;
4627*61046927SAndroid Build Coastguard Worker VkPipelineCreateFlags2KHR flags;
4628*61046927SAndroid Build Coastguard Worker
4629*61046927SAndroid Build Coastguard Worker VkShaderStageFlags active_stages;
4630*61046927SAndroid Build Coastguard Worker
4631*61046927SAndroid Build Coastguard Worker uint32_t ray_queries;
4632*61046927SAndroid Build Coastguard Worker
4633*61046927SAndroid Build Coastguard Worker /**
4634*61046927SAndroid Build Coastguard Worker * Mask of stages that are accessing push descriptors.
4635*61046927SAndroid Build Coastguard Worker */
4636*61046927SAndroid Build Coastguard Worker VkShaderStageFlags use_push_descriptor;
4637*61046927SAndroid Build Coastguard Worker
4638*61046927SAndroid Build Coastguard Worker /**
4639*61046927SAndroid Build Coastguard Worker * Mask of stages that are accessing the push descriptors buffer.
4640*61046927SAndroid Build Coastguard Worker */
4641*61046927SAndroid Build Coastguard Worker VkShaderStageFlags use_push_descriptor_buffer;
4642*61046927SAndroid Build Coastguard Worker
4643*61046927SAndroid Build Coastguard Worker /**
4644*61046927SAndroid Build Coastguard Worker * Maximum scratch size for all shaders in this pipeline.
4645*61046927SAndroid Build Coastguard Worker */
4646*61046927SAndroid Build Coastguard Worker uint32_t scratch_size;
4647*61046927SAndroid Build Coastguard Worker
4648*61046927SAndroid Build Coastguard Worker /* Layout of the sets used by the pipeline. */
4649*61046927SAndroid Build Coastguard Worker struct anv_pipeline_sets_layout layout;
4650*61046927SAndroid Build Coastguard Worker
4651*61046927SAndroid Build Coastguard Worker struct util_dynarray executables;
4652*61046927SAndroid Build Coastguard Worker
4653*61046927SAndroid Build Coastguard Worker const struct intel_l3_config * l3_config;
4654*61046927SAndroid Build Coastguard Worker };
4655*61046927SAndroid Build Coastguard Worker
4656*61046927SAndroid Build Coastguard Worker /* The base graphics pipeline object only hold shaders. */
4657*61046927SAndroid Build Coastguard Worker struct anv_graphics_base_pipeline {
4658*61046927SAndroid Build Coastguard Worker struct anv_pipeline base;
4659*61046927SAndroid Build Coastguard Worker
4660*61046927SAndroid Build Coastguard Worker struct vk_sample_locations_state sample_locations;
4661*61046927SAndroid Build Coastguard Worker
4662*61046927SAndroid Build Coastguard Worker /* Shaders */
4663*61046927SAndroid Build Coastguard Worker struct anv_shader_bin * shaders[ANV_GRAPHICS_SHADER_STAGE_COUNT];
4664*61046927SAndroid Build Coastguard Worker
4665*61046927SAndroid Build Coastguard Worker /* A small hash based of shader_info::source_sha1 for identifying
4666*61046927SAndroid Build Coastguard Worker * shaders in renderdoc/shader-db.
4667*61046927SAndroid Build Coastguard Worker */
4668*61046927SAndroid Build Coastguard Worker uint32_t source_hashes[ANV_GRAPHICS_SHADER_STAGE_COUNT];
4669*61046927SAndroid Build Coastguard Worker
4670*61046927SAndroid Build Coastguard Worker /* Feedback index in
4671*61046927SAndroid Build Coastguard Worker * VkPipelineCreationFeedbackCreateInfo::pPipelineStageCreationFeedbacks
4672*61046927SAndroid Build Coastguard Worker *
4673*61046927SAndroid Build Coastguard Worker * For pipeline libraries, we need to remember the order at creation when
4674*61046927SAndroid Build Coastguard Worker * included into a linked pipeline.
4675*61046927SAndroid Build Coastguard Worker */
4676*61046927SAndroid Build Coastguard Worker uint32_t feedback_index[ANV_GRAPHICS_SHADER_STAGE_COUNT];
4677*61046927SAndroid Build Coastguard Worker
4678*61046927SAndroid Build Coastguard Worker /* Robustness flags used shaders
4679*61046927SAndroid Build Coastguard Worker */
4680*61046927SAndroid Build Coastguard Worker enum brw_robustness_flags robust_flags[ANV_GRAPHICS_SHADER_STAGE_COUNT];
4681*61046927SAndroid Build Coastguard Worker
4682*61046927SAndroid Build Coastguard Worker /* True if at the time the fragment shader was compiled, it didn't have all
4683*61046927SAndroid Build Coastguard Worker * the information to avoid INTEL_MSAA_FLAG_ENABLE_DYNAMIC.
4684*61046927SAndroid Build Coastguard Worker */
4685*61046927SAndroid Build Coastguard Worker bool fragment_dynamic;
4686*61046927SAndroid Build Coastguard Worker };
4687*61046927SAndroid Build Coastguard Worker
4688*61046927SAndroid Build Coastguard Worker /* The library graphics pipeline object has a partial graphic state and
4689*61046927SAndroid Build Coastguard Worker * possibly some shaders. If requested, shaders are also present in NIR early
4690*61046927SAndroid Build Coastguard Worker * form.
4691*61046927SAndroid Build Coastguard Worker */
4692*61046927SAndroid Build Coastguard Worker struct anv_graphics_lib_pipeline {
4693*61046927SAndroid Build Coastguard Worker struct anv_graphics_base_pipeline base;
4694*61046927SAndroid Build Coastguard Worker
4695*61046927SAndroid Build Coastguard Worker VkGraphicsPipelineLibraryFlagsEXT lib_flags;
4696*61046927SAndroid Build Coastguard Worker
4697*61046927SAndroid Build Coastguard Worker struct vk_graphics_pipeline_all_state all_state;
4698*61046927SAndroid Build Coastguard Worker struct vk_graphics_pipeline_state state;
4699*61046927SAndroid Build Coastguard Worker
4700*61046927SAndroid Build Coastguard Worker /* Retained shaders for link optimization. */
4701*61046927SAndroid Build Coastguard Worker struct {
4702*61046927SAndroid Build Coastguard Worker /* This hash is the same as computed in
4703*61046927SAndroid Build Coastguard Worker * anv_graphics_pipeline_gather_shaders().
4704*61046927SAndroid Build Coastguard Worker */
4705*61046927SAndroid Build Coastguard Worker unsigned char shader_sha1[20];
4706*61046927SAndroid Build Coastguard Worker
4707*61046927SAndroid Build Coastguard Worker enum gl_subgroup_size subgroup_size_type;
4708*61046927SAndroid Build Coastguard Worker
4709*61046927SAndroid Build Coastguard Worker /* Hold on the value of VK_PIPELINE_CREATE_VIEW_INDEX_FROM_DEVICE_INDEX_BIT
4710*61046927SAndroid Build Coastguard Worker * from library that introduces the stage, so it remains consistent.
4711*61046927SAndroid Build Coastguard Worker */
4712*61046927SAndroid Build Coastguard Worker bool view_index_from_device_index;
4713*61046927SAndroid Build Coastguard Worker
4714*61046927SAndroid Build Coastguard Worker /* NIR captured in anv_pipeline_stage_get_nir(), includes specialization
4715*61046927SAndroid Build Coastguard Worker * constants.
4716*61046927SAndroid Build Coastguard Worker */
4717*61046927SAndroid Build Coastguard Worker nir_shader * nir;
4718*61046927SAndroid Build Coastguard Worker } retained_shaders[ANV_GRAPHICS_SHADER_STAGE_COUNT];
4719*61046927SAndroid Build Coastguard Worker
4720*61046927SAndroid Build Coastguard Worker /* Whether the shaders have been retained */
4721*61046927SAndroid Build Coastguard Worker bool retain_shaders;
4722*61046927SAndroid Build Coastguard Worker };
4723*61046927SAndroid Build Coastguard Worker
4724*61046927SAndroid Build Coastguard Worker struct anv_gfx_state_ptr {
4725*61046927SAndroid Build Coastguard Worker /* Both in dwords */
4726*61046927SAndroid Build Coastguard Worker uint16_t offset;
4727*61046927SAndroid Build Coastguard Worker uint16_t len;
4728*61046927SAndroid Build Coastguard Worker };
4729*61046927SAndroid Build Coastguard Worker
4730*61046927SAndroid Build Coastguard Worker /* The final graphics pipeline object has all the graphics state ready to be
4731*61046927SAndroid Build Coastguard Worker * programmed into HW packets (dynamic_state field) or fully baked in its
4732*61046927SAndroid Build Coastguard Worker * batch.
4733*61046927SAndroid Build Coastguard Worker */
4734*61046927SAndroid Build Coastguard Worker struct anv_graphics_pipeline {
4735*61046927SAndroid Build Coastguard Worker struct anv_graphics_base_pipeline base;
4736*61046927SAndroid Build Coastguard Worker
4737*61046927SAndroid Build Coastguard Worker struct vk_vertex_input_state vertex_input;
4738*61046927SAndroid Build Coastguard Worker struct vk_sample_locations_state sample_locations;
4739*61046927SAndroid Build Coastguard Worker struct vk_dynamic_graphics_state dynamic_state;
4740*61046927SAndroid Build Coastguard Worker
4741*61046927SAndroid Build Coastguard Worker /* If true, the patch control points are passed through push constants
4742*61046927SAndroid Build Coastguard Worker * (anv_push_constants::gfx::tcs_input_vertices)
4743*61046927SAndroid Build Coastguard Worker */
4744*61046927SAndroid Build Coastguard Worker bool dynamic_patch_control_points;
4745*61046927SAndroid Build Coastguard Worker
4746*61046927SAndroid Build Coastguard Worker uint32_t view_mask;
4747*61046927SAndroid Build Coastguard Worker uint32_t instance_multiplier;
4748*61046927SAndroid Build Coastguard Worker
4749*61046927SAndroid Build Coastguard Worker bool rp_has_ds_self_dep;
4750*61046927SAndroid Build Coastguard Worker
4751*61046927SAndroid Build Coastguard Worker bool kill_pixel;
4752*61046927SAndroid Build Coastguard Worker bool uses_xfb;
4753*61046927SAndroid Build Coastguard Worker bool sample_shading_enable;
4754*61046927SAndroid Build Coastguard Worker float min_sample_shading;
4755*61046927SAndroid Build Coastguard Worker
4756*61046927SAndroid Build Coastguard Worker /* Number of VERTEX_ELEMENT_STATE input elements used by the shader */
4757*61046927SAndroid Build Coastguard Worker uint32_t vs_input_elements;
4758*61046927SAndroid Build Coastguard Worker
4759*61046927SAndroid Build Coastguard Worker /* Number of VERTEX_ELEMENT_STATE elements we need to implement some of the
4760*61046927SAndroid Build Coastguard Worker * draw parameters
4761*61046927SAndroid Build Coastguard Worker */
4762*61046927SAndroid Build Coastguard Worker uint32_t svgs_count;
4763*61046927SAndroid Build Coastguard Worker
4764*61046927SAndroid Build Coastguard Worker /* Pre computed VERTEX_ELEMENT_STATE structures for the vertex input that
4765*61046927SAndroid Build Coastguard Worker * can be copied into the anv_cmd_buffer behind a 3DSTATE_VERTEX_BUFFER.
4766*61046927SAndroid Build Coastguard Worker *
4767*61046927SAndroid Build Coastguard Worker * When MESA_VK_DYNAMIC_VI is not dynamic
4768*61046927SAndroid Build Coastguard Worker *
4769*61046927SAndroid Build Coastguard Worker * vertex_input_elems = vs_input_elements + svgs_count
4770*61046927SAndroid Build Coastguard Worker *
4771*61046927SAndroid Build Coastguard Worker * All the VERTEX_ELEMENT_STATE can be directly copied behind a
4772*61046927SAndroid Build Coastguard Worker * 3DSTATE_VERTEX_ELEMENTS instruction in the command buffer. Otherwise
4773*61046927SAndroid Build Coastguard Worker * this array only holds the svgs_count elements.
4774*61046927SAndroid Build Coastguard Worker */
4775*61046927SAndroid Build Coastguard Worker uint32_t vertex_input_elems;
4776*61046927SAndroid Build Coastguard Worker uint32_t vertex_input_data[2 * 31 /* MAX_VES + 2 internal */];
4777*61046927SAndroid Build Coastguard Worker
4778*61046927SAndroid Build Coastguard Worker /* Pre computed CS instructions that can directly be copied into
4779*61046927SAndroid Build Coastguard Worker * anv_cmd_buffer.
4780*61046927SAndroid Build Coastguard Worker */
4781*61046927SAndroid Build Coastguard Worker uint32_t batch_data[480];
4782*61046927SAndroid Build Coastguard Worker
4783*61046927SAndroid Build Coastguard Worker /* Urb setup utilized by this pipeline. */
4784*61046927SAndroid Build Coastguard Worker struct intel_urb_config urb_cfg;
4785*61046927SAndroid Build Coastguard Worker
4786*61046927SAndroid Build Coastguard Worker /* Fully backed instructions, ready to be emitted in the anv_cmd_buffer */
4787*61046927SAndroid Build Coastguard Worker struct {
4788*61046927SAndroid Build Coastguard Worker struct anv_gfx_state_ptr urb;
4789*61046927SAndroid Build Coastguard Worker struct anv_gfx_state_ptr vf_statistics;
4790*61046927SAndroid Build Coastguard Worker struct anv_gfx_state_ptr vf_sgvs;
4791*61046927SAndroid Build Coastguard Worker struct anv_gfx_state_ptr vf_sgvs_2;
4792*61046927SAndroid Build Coastguard Worker struct anv_gfx_state_ptr vf_sgvs_instancing;
4793*61046927SAndroid Build Coastguard Worker struct anv_gfx_state_ptr vf_instancing;
4794*61046927SAndroid Build Coastguard Worker struct anv_gfx_state_ptr primitive_replication;
4795*61046927SAndroid Build Coastguard Worker struct anv_gfx_state_ptr sbe;
4796*61046927SAndroid Build Coastguard Worker struct anv_gfx_state_ptr sbe_swiz;
4797*61046927SAndroid Build Coastguard Worker struct anv_gfx_state_ptr so_decl_list;
4798*61046927SAndroid Build Coastguard Worker struct anv_gfx_state_ptr vs;
4799*61046927SAndroid Build Coastguard Worker struct anv_gfx_state_ptr hs;
4800*61046927SAndroid Build Coastguard Worker struct anv_gfx_state_ptr ds;
4801*61046927SAndroid Build Coastguard Worker struct anv_gfx_state_ptr vs_protected;
4802*61046927SAndroid Build Coastguard Worker struct anv_gfx_state_ptr hs_protected;
4803*61046927SAndroid Build Coastguard Worker struct anv_gfx_state_ptr ds_protected;
4804*61046927SAndroid Build Coastguard Worker
4805*61046927SAndroid Build Coastguard Worker struct anv_gfx_state_ptr task_control;
4806*61046927SAndroid Build Coastguard Worker struct anv_gfx_state_ptr task_control_protected;
4807*61046927SAndroid Build Coastguard Worker struct anv_gfx_state_ptr task_shader;
4808*61046927SAndroid Build Coastguard Worker struct anv_gfx_state_ptr task_redistrib;
4809*61046927SAndroid Build Coastguard Worker struct anv_gfx_state_ptr clip_mesh;
4810*61046927SAndroid Build Coastguard Worker struct anv_gfx_state_ptr mesh_control;
4811*61046927SAndroid Build Coastguard Worker struct anv_gfx_state_ptr mesh_control_protected;
4812*61046927SAndroid Build Coastguard Worker struct anv_gfx_state_ptr mesh_shader;
4813*61046927SAndroid Build Coastguard Worker struct anv_gfx_state_ptr mesh_distrib;
4814*61046927SAndroid Build Coastguard Worker struct anv_gfx_state_ptr sbe_mesh;
4815*61046927SAndroid Build Coastguard Worker } final;
4816*61046927SAndroid Build Coastguard Worker
4817*61046927SAndroid Build Coastguard Worker /* Pre packed CS instructions & structures that need to be merged later
4818*61046927SAndroid Build Coastguard Worker * with dynamic state.
4819*61046927SAndroid Build Coastguard Worker */
4820*61046927SAndroid Build Coastguard Worker struct {
4821*61046927SAndroid Build Coastguard Worker struct anv_gfx_state_ptr clip;
4822*61046927SAndroid Build Coastguard Worker struct anv_gfx_state_ptr sf;
4823*61046927SAndroid Build Coastguard Worker struct anv_gfx_state_ptr raster;
4824*61046927SAndroid Build Coastguard Worker struct anv_gfx_state_ptr ms;
4825*61046927SAndroid Build Coastguard Worker struct anv_gfx_state_ptr ps_extra;
4826*61046927SAndroid Build Coastguard Worker struct anv_gfx_state_ptr wm;
4827*61046927SAndroid Build Coastguard Worker struct anv_gfx_state_ptr so;
4828*61046927SAndroid Build Coastguard Worker struct anv_gfx_state_ptr gs;
4829*61046927SAndroid Build Coastguard Worker struct anv_gfx_state_ptr gs_protected;
4830*61046927SAndroid Build Coastguard Worker struct anv_gfx_state_ptr te;
4831*61046927SAndroid Build Coastguard Worker struct anv_gfx_state_ptr ps;
4832*61046927SAndroid Build Coastguard Worker struct anv_gfx_state_ptr ps_protected;
4833*61046927SAndroid Build Coastguard Worker struct anv_gfx_state_ptr vfg;
4834*61046927SAndroid Build Coastguard Worker } partial;
4835*61046927SAndroid Build Coastguard Worker };
4836*61046927SAndroid Build Coastguard Worker
4837*61046927SAndroid Build Coastguard Worker #define anv_batch_emit_pipeline_state(batch, pipeline, state) \
4838*61046927SAndroid Build Coastguard Worker do { \
4839*61046927SAndroid Build Coastguard Worker if ((pipeline)->state.len == 0) \
4840*61046927SAndroid Build Coastguard Worker break; \
4841*61046927SAndroid Build Coastguard Worker uint32_t *dw; \
4842*61046927SAndroid Build Coastguard Worker dw = anv_batch_emit_dwords((batch), (pipeline)->state.len); \
4843*61046927SAndroid Build Coastguard Worker if (!dw) \
4844*61046927SAndroid Build Coastguard Worker break; \
4845*61046927SAndroid Build Coastguard Worker memcpy(dw, &(pipeline)->batch_data[(pipeline)->state.offset], \
4846*61046927SAndroid Build Coastguard Worker 4 * (pipeline)->state.len); \
4847*61046927SAndroid Build Coastguard Worker } while (0)
4848*61046927SAndroid Build Coastguard Worker
4849*61046927SAndroid Build Coastguard Worker #define anv_batch_emit_pipeline_state_protected(batch, pipeline, \
4850*61046927SAndroid Build Coastguard Worker state, protected) \
4851*61046927SAndroid Build Coastguard Worker do { \
4852*61046927SAndroid Build Coastguard Worker struct anv_gfx_state_ptr *_cmd_state = protected ? \
4853*61046927SAndroid Build Coastguard Worker &(pipeline)->state##_protected : &(pipeline)->state; \
4854*61046927SAndroid Build Coastguard Worker if (_cmd_state->len == 0) \
4855*61046927SAndroid Build Coastguard Worker break; \
4856*61046927SAndroid Build Coastguard Worker uint32_t *dw; \
4857*61046927SAndroid Build Coastguard Worker dw = anv_batch_emit_dwords((batch), _cmd_state->len); \
4858*61046927SAndroid Build Coastguard Worker if (!dw) \
4859*61046927SAndroid Build Coastguard Worker break; \
4860*61046927SAndroid Build Coastguard Worker memcpy(dw, &(pipeline)->batch_data[_cmd_state->offset], \
4861*61046927SAndroid Build Coastguard Worker 4 * _cmd_state->len); \
4862*61046927SAndroid Build Coastguard Worker } while (0)
4863*61046927SAndroid Build Coastguard Worker
4864*61046927SAndroid Build Coastguard Worker
4865*61046927SAndroid Build Coastguard Worker struct anv_compute_pipeline {
4866*61046927SAndroid Build Coastguard Worker struct anv_pipeline base;
4867*61046927SAndroid Build Coastguard Worker
4868*61046927SAndroid Build Coastguard Worker struct anv_shader_bin * cs;
4869*61046927SAndroid Build Coastguard Worker uint32_t batch_data[9];
4870*61046927SAndroid Build Coastguard Worker uint32_t interface_descriptor_data[8];
4871*61046927SAndroid Build Coastguard Worker
4872*61046927SAndroid Build Coastguard Worker /* A small hash based of shader_info::source_sha1 for identifying shaders
4873*61046927SAndroid Build Coastguard Worker * in renderdoc/shader-db.
4874*61046927SAndroid Build Coastguard Worker */
4875*61046927SAndroid Build Coastguard Worker uint32_t source_hash;
4876*61046927SAndroid Build Coastguard Worker };
4877*61046927SAndroid Build Coastguard Worker
4878*61046927SAndroid Build Coastguard Worker struct anv_rt_shader_group {
4879*61046927SAndroid Build Coastguard Worker VkRayTracingShaderGroupTypeKHR type;
4880*61046927SAndroid Build Coastguard Worker
4881*61046927SAndroid Build Coastguard Worker /* Whether this group was imported from another pipeline */
4882*61046927SAndroid Build Coastguard Worker bool imported;
4883*61046927SAndroid Build Coastguard Worker
4884*61046927SAndroid Build Coastguard Worker struct anv_shader_bin *general;
4885*61046927SAndroid Build Coastguard Worker struct anv_shader_bin *closest_hit;
4886*61046927SAndroid Build Coastguard Worker struct anv_shader_bin *any_hit;
4887*61046927SAndroid Build Coastguard Worker struct anv_shader_bin *intersection;
4888*61046927SAndroid Build Coastguard Worker
4889*61046927SAndroid Build Coastguard Worker /* VK_KHR_ray_tracing requires shaderGroupHandleSize == 32 */
4890*61046927SAndroid Build Coastguard Worker uint32_t handle[8];
4891*61046927SAndroid Build Coastguard Worker };
4892*61046927SAndroid Build Coastguard Worker
4893*61046927SAndroid Build Coastguard Worker struct anv_ray_tracing_pipeline {
4894*61046927SAndroid Build Coastguard Worker struct anv_pipeline base;
4895*61046927SAndroid Build Coastguard Worker
4896*61046927SAndroid Build Coastguard Worker /* All shaders in the pipeline */
4897*61046927SAndroid Build Coastguard Worker struct util_dynarray shaders;
4898*61046927SAndroid Build Coastguard Worker
4899*61046927SAndroid Build Coastguard Worker uint32_t group_count;
4900*61046927SAndroid Build Coastguard Worker struct anv_rt_shader_group * groups;
4901*61046927SAndroid Build Coastguard Worker
4902*61046927SAndroid Build Coastguard Worker /* If non-zero, this is the default computed stack size as per the stack
4903*61046927SAndroid Build Coastguard Worker * size computation in the Vulkan spec. If zero, that indicates that the
4904*61046927SAndroid Build Coastguard Worker * client has requested a dynamic stack size.
4905*61046927SAndroid Build Coastguard Worker */
4906*61046927SAndroid Build Coastguard Worker uint32_t stack_size;
4907*61046927SAndroid Build Coastguard Worker };
4908*61046927SAndroid Build Coastguard Worker
4909*61046927SAndroid Build Coastguard Worker #define ANV_DECL_PIPELINE_DOWNCAST(pipe_type, pipe_enum) \
4910*61046927SAndroid Build Coastguard Worker static inline struct anv_##pipe_type##_pipeline * \
4911*61046927SAndroid Build Coastguard Worker anv_pipeline_to_##pipe_type(struct anv_pipeline *pipeline) \
4912*61046927SAndroid Build Coastguard Worker { \
4913*61046927SAndroid Build Coastguard Worker assert(pipeline->type == pipe_enum); \
4914*61046927SAndroid Build Coastguard Worker return (struct anv_##pipe_type##_pipeline *) pipeline; \
4915*61046927SAndroid Build Coastguard Worker }
4916*61046927SAndroid Build Coastguard Worker
ANV_DECL_PIPELINE_DOWNCAST(graphics,ANV_PIPELINE_GRAPHICS)4917*61046927SAndroid Build Coastguard Worker ANV_DECL_PIPELINE_DOWNCAST(graphics, ANV_PIPELINE_GRAPHICS)
4918*61046927SAndroid Build Coastguard Worker ANV_DECL_PIPELINE_DOWNCAST(graphics_lib, ANV_PIPELINE_GRAPHICS_LIB)
4919*61046927SAndroid Build Coastguard Worker ANV_DECL_PIPELINE_DOWNCAST(compute, ANV_PIPELINE_COMPUTE)
4920*61046927SAndroid Build Coastguard Worker ANV_DECL_PIPELINE_DOWNCAST(ray_tracing, ANV_PIPELINE_RAY_TRACING)
4921*61046927SAndroid Build Coastguard Worker
4922*61046927SAndroid Build Coastguard Worker /* Can't use the macro because we need to handle both types. */
4923*61046927SAndroid Build Coastguard Worker static inline struct anv_graphics_base_pipeline *
4924*61046927SAndroid Build Coastguard Worker anv_pipeline_to_graphics_base(struct anv_pipeline *pipeline)
4925*61046927SAndroid Build Coastguard Worker {
4926*61046927SAndroid Build Coastguard Worker assert(pipeline->type == ANV_PIPELINE_GRAPHICS ||
4927*61046927SAndroid Build Coastguard Worker pipeline->type == ANV_PIPELINE_GRAPHICS_LIB);
4928*61046927SAndroid Build Coastguard Worker return (struct anv_graphics_base_pipeline *) pipeline;
4929*61046927SAndroid Build Coastguard Worker }
4930*61046927SAndroid Build Coastguard Worker
4931*61046927SAndroid Build Coastguard Worker static inline bool
anv_pipeline_has_stage(const struct anv_graphics_pipeline * pipeline,gl_shader_stage stage)4932*61046927SAndroid Build Coastguard Worker anv_pipeline_has_stage(const struct anv_graphics_pipeline *pipeline,
4933*61046927SAndroid Build Coastguard Worker gl_shader_stage stage)
4934*61046927SAndroid Build Coastguard Worker {
4935*61046927SAndroid Build Coastguard Worker return (pipeline->base.base.active_stages & mesa_to_vk_shader_stage(stage)) != 0;
4936*61046927SAndroid Build Coastguard Worker }
4937*61046927SAndroid Build Coastguard Worker
4938*61046927SAndroid Build Coastguard Worker static inline bool
anv_pipeline_base_has_stage(const struct anv_graphics_base_pipeline * pipeline,gl_shader_stage stage)4939*61046927SAndroid Build Coastguard Worker anv_pipeline_base_has_stage(const struct anv_graphics_base_pipeline *pipeline,
4940*61046927SAndroid Build Coastguard Worker gl_shader_stage stage)
4941*61046927SAndroid Build Coastguard Worker {
4942*61046927SAndroid Build Coastguard Worker return (pipeline->base.active_stages & mesa_to_vk_shader_stage(stage)) != 0;
4943*61046927SAndroid Build Coastguard Worker }
4944*61046927SAndroid Build Coastguard Worker
4945*61046927SAndroid Build Coastguard Worker static inline bool
anv_pipeline_is_primitive(const struct anv_graphics_pipeline * pipeline)4946*61046927SAndroid Build Coastguard Worker anv_pipeline_is_primitive(const struct anv_graphics_pipeline *pipeline)
4947*61046927SAndroid Build Coastguard Worker {
4948*61046927SAndroid Build Coastguard Worker return anv_pipeline_has_stage(pipeline, MESA_SHADER_VERTEX);
4949*61046927SAndroid Build Coastguard Worker }
4950*61046927SAndroid Build Coastguard Worker
4951*61046927SAndroid Build Coastguard Worker static inline bool
anv_pipeline_is_mesh(const struct anv_graphics_pipeline * pipeline)4952*61046927SAndroid Build Coastguard Worker anv_pipeline_is_mesh(const struct anv_graphics_pipeline *pipeline)
4953*61046927SAndroid Build Coastguard Worker {
4954*61046927SAndroid Build Coastguard Worker return anv_pipeline_has_stage(pipeline, MESA_SHADER_MESH);
4955*61046927SAndroid Build Coastguard Worker }
4956*61046927SAndroid Build Coastguard Worker
4957*61046927SAndroid Build Coastguard Worker static inline bool
anv_cmd_buffer_all_color_write_masked(const struct anv_cmd_buffer * cmd_buffer)4958*61046927SAndroid Build Coastguard Worker anv_cmd_buffer_all_color_write_masked(const struct anv_cmd_buffer *cmd_buffer)
4959*61046927SAndroid Build Coastguard Worker {
4960*61046927SAndroid Build Coastguard Worker const struct anv_cmd_graphics_state *state = &cmd_buffer->state.gfx;
4961*61046927SAndroid Build Coastguard Worker const struct vk_dynamic_graphics_state *dyn =
4962*61046927SAndroid Build Coastguard Worker &cmd_buffer->vk.dynamic_graphics_state;
4963*61046927SAndroid Build Coastguard Worker uint8_t color_writes = dyn->cb.color_write_enables;
4964*61046927SAndroid Build Coastguard Worker
4965*61046927SAndroid Build Coastguard Worker /* All writes disabled through vkCmdSetColorWriteEnableEXT */
4966*61046927SAndroid Build Coastguard Worker if ((color_writes & ((1u << state->color_att_count) - 1)) == 0)
4967*61046927SAndroid Build Coastguard Worker return true;
4968*61046927SAndroid Build Coastguard Worker
4969*61046927SAndroid Build Coastguard Worker /* Or all write masks are empty */
4970*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < state->color_att_count; i++) {
4971*61046927SAndroid Build Coastguard Worker if (dyn->cb.attachments[i].write_mask != 0)
4972*61046927SAndroid Build Coastguard Worker return false;
4973*61046927SAndroid Build Coastguard Worker }
4974*61046927SAndroid Build Coastguard Worker
4975*61046927SAndroid Build Coastguard Worker return true;
4976*61046927SAndroid Build Coastguard Worker }
4977*61046927SAndroid Build Coastguard Worker
4978*61046927SAndroid Build Coastguard Worker static inline void
anv_cmd_graphic_state_update_has_uint_rt(struct anv_cmd_graphics_state * state)4979*61046927SAndroid Build Coastguard Worker anv_cmd_graphic_state_update_has_uint_rt(struct anv_cmd_graphics_state *state)
4980*61046927SAndroid Build Coastguard Worker {
4981*61046927SAndroid Build Coastguard Worker state->has_uint_rt = false;
4982*61046927SAndroid Build Coastguard Worker for (unsigned a = 0; a < state->color_att_count; a++) {
4983*61046927SAndroid Build Coastguard Worker if (vk_format_is_int(state->color_att[a].vk_format)) {
4984*61046927SAndroid Build Coastguard Worker state->has_uint_rt = true;
4985*61046927SAndroid Build Coastguard Worker break;
4986*61046927SAndroid Build Coastguard Worker }
4987*61046927SAndroid Build Coastguard Worker }
4988*61046927SAndroid Build Coastguard Worker }
4989*61046927SAndroid Build Coastguard Worker
4990*61046927SAndroid Build Coastguard Worker #define ANV_DECL_GET_GRAPHICS_PROG_DATA_FUNC(prefix, stage) \
4991*61046927SAndroid Build Coastguard Worker static inline const struct brw_##prefix##_prog_data * \
4992*61046927SAndroid Build Coastguard Worker get_##prefix##_prog_data(const struct anv_graphics_pipeline *pipeline) \
4993*61046927SAndroid Build Coastguard Worker { \
4994*61046927SAndroid Build Coastguard Worker if (anv_pipeline_has_stage(pipeline, stage)) { \
4995*61046927SAndroid Build Coastguard Worker return (const struct brw_##prefix##_prog_data *) \
4996*61046927SAndroid Build Coastguard Worker pipeline->base.shaders[stage]->prog_data; \
4997*61046927SAndroid Build Coastguard Worker } else { \
4998*61046927SAndroid Build Coastguard Worker return NULL; \
4999*61046927SAndroid Build Coastguard Worker } \
5000*61046927SAndroid Build Coastguard Worker }
5001*61046927SAndroid Build Coastguard Worker
ANV_DECL_GET_GRAPHICS_PROG_DATA_FUNC(vs,MESA_SHADER_VERTEX)5002*61046927SAndroid Build Coastguard Worker ANV_DECL_GET_GRAPHICS_PROG_DATA_FUNC(vs, MESA_SHADER_VERTEX)
5003*61046927SAndroid Build Coastguard Worker ANV_DECL_GET_GRAPHICS_PROG_DATA_FUNC(tcs, MESA_SHADER_TESS_CTRL)
5004*61046927SAndroid Build Coastguard Worker ANV_DECL_GET_GRAPHICS_PROG_DATA_FUNC(tes, MESA_SHADER_TESS_EVAL)
5005*61046927SAndroid Build Coastguard Worker ANV_DECL_GET_GRAPHICS_PROG_DATA_FUNC(gs, MESA_SHADER_GEOMETRY)
5006*61046927SAndroid Build Coastguard Worker ANV_DECL_GET_GRAPHICS_PROG_DATA_FUNC(wm, MESA_SHADER_FRAGMENT)
5007*61046927SAndroid Build Coastguard Worker ANV_DECL_GET_GRAPHICS_PROG_DATA_FUNC(mesh, MESA_SHADER_MESH)
5008*61046927SAndroid Build Coastguard Worker ANV_DECL_GET_GRAPHICS_PROG_DATA_FUNC(task, MESA_SHADER_TASK)
5009*61046927SAndroid Build Coastguard Worker
5010*61046927SAndroid Build Coastguard Worker static inline const struct brw_cs_prog_data *
5011*61046927SAndroid Build Coastguard Worker get_cs_prog_data(const struct anv_compute_pipeline *pipeline)
5012*61046927SAndroid Build Coastguard Worker {
5013*61046927SAndroid Build Coastguard Worker assert(pipeline->cs);
5014*61046927SAndroid Build Coastguard Worker return (const struct brw_cs_prog_data *) pipeline->cs->prog_data;
5015*61046927SAndroid Build Coastguard Worker }
5016*61046927SAndroid Build Coastguard Worker
5017*61046927SAndroid Build Coastguard Worker static inline const struct brw_vue_prog_data *
anv_pipeline_get_last_vue_prog_data(const struct anv_graphics_pipeline * pipeline)5018*61046927SAndroid Build Coastguard Worker anv_pipeline_get_last_vue_prog_data(const struct anv_graphics_pipeline *pipeline)
5019*61046927SAndroid Build Coastguard Worker {
5020*61046927SAndroid Build Coastguard Worker if (anv_pipeline_has_stage(pipeline, MESA_SHADER_GEOMETRY))
5021*61046927SAndroid Build Coastguard Worker return &get_gs_prog_data(pipeline)->base;
5022*61046927SAndroid Build Coastguard Worker else if (anv_pipeline_has_stage(pipeline, MESA_SHADER_TESS_EVAL))
5023*61046927SAndroid Build Coastguard Worker return &get_tes_prog_data(pipeline)->base;
5024*61046927SAndroid Build Coastguard Worker else
5025*61046927SAndroid Build Coastguard Worker return &get_vs_prog_data(pipeline)->base;
5026*61046927SAndroid Build Coastguard Worker }
5027*61046927SAndroid Build Coastguard Worker
5028*61046927SAndroid Build Coastguard Worker VkResult
5029*61046927SAndroid Build Coastguard Worker anv_device_init_rt_shaders(struct anv_device *device);
5030*61046927SAndroid Build Coastguard Worker
5031*61046927SAndroid Build Coastguard Worker void
5032*61046927SAndroid Build Coastguard Worker anv_device_finish_rt_shaders(struct anv_device *device);
5033*61046927SAndroid Build Coastguard Worker
5034*61046927SAndroid Build Coastguard Worker struct anv_kernel_arg {
5035*61046927SAndroid Build Coastguard Worker bool is_ptr;
5036*61046927SAndroid Build Coastguard Worker uint16_t size;
5037*61046927SAndroid Build Coastguard Worker
5038*61046927SAndroid Build Coastguard Worker union {
5039*61046927SAndroid Build Coastguard Worker uint64_t u64;
5040*61046927SAndroid Build Coastguard Worker void *ptr;
5041*61046927SAndroid Build Coastguard Worker };
5042*61046927SAndroid Build Coastguard Worker };
5043*61046927SAndroid Build Coastguard Worker
5044*61046927SAndroid Build Coastguard Worker struct anv_kernel {
5045*61046927SAndroid Build Coastguard Worker #ifndef NDEBUG
5046*61046927SAndroid Build Coastguard Worker const char *name;
5047*61046927SAndroid Build Coastguard Worker #endif
5048*61046927SAndroid Build Coastguard Worker struct anv_shader_bin *bin;
5049*61046927SAndroid Build Coastguard Worker const struct intel_l3_config *l3_config;
5050*61046927SAndroid Build Coastguard Worker };
5051*61046927SAndroid Build Coastguard Worker
5052*61046927SAndroid Build Coastguard Worker struct anv_format_plane {
5053*61046927SAndroid Build Coastguard Worker enum isl_format isl_format:16;
5054*61046927SAndroid Build Coastguard Worker struct isl_swizzle swizzle;
5055*61046927SAndroid Build Coastguard Worker
5056*61046927SAndroid Build Coastguard Worker /* What aspect is associated to this plane */
5057*61046927SAndroid Build Coastguard Worker VkImageAspectFlags aspect;
5058*61046927SAndroid Build Coastguard Worker };
5059*61046927SAndroid Build Coastguard Worker
5060*61046927SAndroid Build Coastguard Worker struct anv_format {
5061*61046927SAndroid Build Coastguard Worker struct anv_format_plane planes[3];
5062*61046927SAndroid Build Coastguard Worker VkFormat vk_format;
5063*61046927SAndroid Build Coastguard Worker uint8_t n_planes;
5064*61046927SAndroid Build Coastguard Worker bool can_ycbcr;
5065*61046927SAndroid Build Coastguard Worker bool can_video;
5066*61046927SAndroid Build Coastguard Worker };
5067*61046927SAndroid Build Coastguard Worker
5068*61046927SAndroid Build Coastguard Worker static inline void
anv_assert_valid_aspect_set(VkImageAspectFlags aspects)5069*61046927SAndroid Build Coastguard Worker anv_assert_valid_aspect_set(VkImageAspectFlags aspects)
5070*61046927SAndroid Build Coastguard Worker {
5071*61046927SAndroid Build Coastguard Worker if (util_bitcount(aspects) == 1) {
5072*61046927SAndroid Build Coastguard Worker assert(aspects & (VK_IMAGE_ASPECT_COLOR_BIT |
5073*61046927SAndroid Build Coastguard Worker VK_IMAGE_ASPECT_DEPTH_BIT |
5074*61046927SAndroid Build Coastguard Worker VK_IMAGE_ASPECT_STENCIL_BIT |
5075*61046927SAndroid Build Coastguard Worker VK_IMAGE_ASPECT_PLANE_0_BIT |
5076*61046927SAndroid Build Coastguard Worker VK_IMAGE_ASPECT_PLANE_1_BIT |
5077*61046927SAndroid Build Coastguard Worker VK_IMAGE_ASPECT_PLANE_2_BIT));
5078*61046927SAndroid Build Coastguard Worker } else if (aspects & VK_IMAGE_ASPECT_PLANES_BITS_ANV) {
5079*61046927SAndroid Build Coastguard Worker assert(aspects == VK_IMAGE_ASPECT_PLANE_0_BIT ||
5080*61046927SAndroid Build Coastguard Worker aspects == (VK_IMAGE_ASPECT_PLANE_0_BIT |
5081*61046927SAndroid Build Coastguard Worker VK_IMAGE_ASPECT_PLANE_1_BIT) ||
5082*61046927SAndroid Build Coastguard Worker aspects == (VK_IMAGE_ASPECT_PLANE_0_BIT |
5083*61046927SAndroid Build Coastguard Worker VK_IMAGE_ASPECT_PLANE_1_BIT |
5084*61046927SAndroid Build Coastguard Worker VK_IMAGE_ASPECT_PLANE_2_BIT));
5085*61046927SAndroid Build Coastguard Worker } else {
5086*61046927SAndroid Build Coastguard Worker assert(aspects == (VK_IMAGE_ASPECT_DEPTH_BIT |
5087*61046927SAndroid Build Coastguard Worker VK_IMAGE_ASPECT_STENCIL_BIT));
5088*61046927SAndroid Build Coastguard Worker }
5089*61046927SAndroid Build Coastguard Worker }
5090*61046927SAndroid Build Coastguard Worker
5091*61046927SAndroid Build Coastguard Worker /**
5092*61046927SAndroid Build Coastguard Worker * Return the aspect's plane relative to all_aspects. For an image, for
5093*61046927SAndroid Build Coastguard Worker * instance, all_aspects would be the set of aspects in the image. For
5094*61046927SAndroid Build Coastguard Worker * an image view, all_aspects would be the subset of aspects represented
5095*61046927SAndroid Build Coastguard Worker * by that particular view.
5096*61046927SAndroid Build Coastguard Worker */
5097*61046927SAndroid Build Coastguard Worker static inline uint32_t
anv_aspect_to_plane(VkImageAspectFlags all_aspects,VkImageAspectFlagBits aspect)5098*61046927SAndroid Build Coastguard Worker anv_aspect_to_plane(VkImageAspectFlags all_aspects,
5099*61046927SAndroid Build Coastguard Worker VkImageAspectFlagBits aspect)
5100*61046927SAndroid Build Coastguard Worker {
5101*61046927SAndroid Build Coastguard Worker anv_assert_valid_aspect_set(all_aspects);
5102*61046927SAndroid Build Coastguard Worker assert(util_bitcount(aspect) == 1);
5103*61046927SAndroid Build Coastguard Worker assert(!(aspect & ~all_aspects));
5104*61046927SAndroid Build Coastguard Worker
5105*61046927SAndroid Build Coastguard Worker /* Because we always put image and view planes in aspect-bit-order, the
5106*61046927SAndroid Build Coastguard Worker * plane index is the number of bits in all_aspects before aspect.
5107*61046927SAndroid Build Coastguard Worker */
5108*61046927SAndroid Build Coastguard Worker return util_bitcount(all_aspects & (aspect - 1));
5109*61046927SAndroid Build Coastguard Worker }
5110*61046927SAndroid Build Coastguard Worker
5111*61046927SAndroid Build Coastguard Worker #define anv_foreach_image_aspect_bit(b, image, aspects) \
5112*61046927SAndroid Build Coastguard Worker u_foreach_bit(b, vk_image_expand_aspect_mask(&(image)->vk, aspects))
5113*61046927SAndroid Build Coastguard Worker
5114*61046927SAndroid Build Coastguard Worker const struct anv_format *
5115*61046927SAndroid Build Coastguard Worker anv_get_format(VkFormat format);
5116*61046927SAndroid Build Coastguard Worker
5117*61046927SAndroid Build Coastguard Worker static inline uint32_t
anv_get_format_planes(VkFormat vk_format)5118*61046927SAndroid Build Coastguard Worker anv_get_format_planes(VkFormat vk_format)
5119*61046927SAndroid Build Coastguard Worker {
5120*61046927SAndroid Build Coastguard Worker const struct anv_format *format = anv_get_format(vk_format);
5121*61046927SAndroid Build Coastguard Worker
5122*61046927SAndroid Build Coastguard Worker return format != NULL ? format->n_planes : 0;
5123*61046927SAndroid Build Coastguard Worker }
5124*61046927SAndroid Build Coastguard Worker
5125*61046927SAndroid Build Coastguard Worker struct anv_format_plane
5126*61046927SAndroid Build Coastguard Worker anv_get_format_plane(const struct intel_device_info *devinfo,
5127*61046927SAndroid Build Coastguard Worker VkFormat vk_format, uint32_t plane,
5128*61046927SAndroid Build Coastguard Worker VkImageTiling tiling);
5129*61046927SAndroid Build Coastguard Worker
5130*61046927SAndroid Build Coastguard Worker struct anv_format_plane
5131*61046927SAndroid Build Coastguard Worker anv_get_format_aspect(const struct intel_device_info *devinfo,
5132*61046927SAndroid Build Coastguard Worker VkFormat vk_format,
5133*61046927SAndroid Build Coastguard Worker VkImageAspectFlagBits aspect, VkImageTiling tiling);
5134*61046927SAndroid Build Coastguard Worker
5135*61046927SAndroid Build Coastguard Worker static inline enum isl_format
anv_get_isl_format(const struct intel_device_info * devinfo,VkFormat vk_format,VkImageAspectFlags aspect,VkImageTiling tiling)5136*61046927SAndroid Build Coastguard Worker anv_get_isl_format(const struct intel_device_info *devinfo, VkFormat vk_format,
5137*61046927SAndroid Build Coastguard Worker VkImageAspectFlags aspect, VkImageTiling tiling)
5138*61046927SAndroid Build Coastguard Worker {
5139*61046927SAndroid Build Coastguard Worker return anv_get_format_aspect(devinfo, vk_format, aspect, tiling).isl_format;
5140*61046927SAndroid Build Coastguard Worker }
5141*61046927SAndroid Build Coastguard Worker
5142*61046927SAndroid Build Coastguard Worker bool anv_format_supports_ccs_e(const struct intel_device_info *devinfo,
5143*61046927SAndroid Build Coastguard Worker const enum isl_format format);
5144*61046927SAndroid Build Coastguard Worker
5145*61046927SAndroid Build Coastguard Worker bool anv_formats_ccs_e_compatible(const struct intel_device_info *devinfo,
5146*61046927SAndroid Build Coastguard Worker VkImageCreateFlags create_flags,
5147*61046927SAndroid Build Coastguard Worker VkFormat vk_format, VkImageTiling vk_tiling,
5148*61046927SAndroid Build Coastguard Worker VkImageUsageFlags vk_usage,
5149*61046927SAndroid Build Coastguard Worker const VkImageFormatListCreateInfo *fmt_list);
5150*61046927SAndroid Build Coastguard Worker
5151*61046927SAndroid Build Coastguard Worker extern VkFormat
5152*61046927SAndroid Build Coastguard Worker vk_format_from_android(unsigned android_format, unsigned android_usage);
5153*61046927SAndroid Build Coastguard Worker
5154*61046927SAndroid Build Coastguard Worker static inline VkFormat
anv_get_emulation_format(const struct anv_physical_device * pdevice,VkFormat format)5155*61046927SAndroid Build Coastguard Worker anv_get_emulation_format(const struct anv_physical_device *pdevice, VkFormat format)
5156*61046927SAndroid Build Coastguard Worker {
5157*61046927SAndroid Build Coastguard Worker if (pdevice->flush_astc_ldr_void_extent_denorms) {
5158*61046927SAndroid Build Coastguard Worker const struct util_format_description *desc =
5159*61046927SAndroid Build Coastguard Worker vk_format_description(format);
5160*61046927SAndroid Build Coastguard Worker if (desc->layout == UTIL_FORMAT_LAYOUT_ASTC &&
5161*61046927SAndroid Build Coastguard Worker desc->colorspace == UTIL_FORMAT_COLORSPACE_RGB)
5162*61046927SAndroid Build Coastguard Worker return format;
5163*61046927SAndroid Build Coastguard Worker }
5164*61046927SAndroid Build Coastguard Worker
5165*61046927SAndroid Build Coastguard Worker if (pdevice->emu_astc_ldr)
5166*61046927SAndroid Build Coastguard Worker return vk_texcompress_astc_emulation_format(format);
5167*61046927SAndroid Build Coastguard Worker
5168*61046927SAndroid Build Coastguard Worker return VK_FORMAT_UNDEFINED;
5169*61046927SAndroid Build Coastguard Worker }
5170*61046927SAndroid Build Coastguard Worker
5171*61046927SAndroid Build Coastguard Worker static inline bool
anv_is_format_emulated(const struct anv_physical_device * pdevice,VkFormat format)5172*61046927SAndroid Build Coastguard Worker anv_is_format_emulated(const struct anv_physical_device *pdevice, VkFormat format)
5173*61046927SAndroid Build Coastguard Worker {
5174*61046927SAndroid Build Coastguard Worker return anv_get_emulation_format(pdevice, format) != VK_FORMAT_UNDEFINED;
5175*61046927SAndroid Build Coastguard Worker }
5176*61046927SAndroid Build Coastguard Worker
5177*61046927SAndroid Build Coastguard Worker static inline struct isl_swizzle
anv_swizzle_for_render(struct isl_swizzle swizzle)5178*61046927SAndroid Build Coastguard Worker anv_swizzle_for_render(struct isl_swizzle swizzle)
5179*61046927SAndroid Build Coastguard Worker {
5180*61046927SAndroid Build Coastguard Worker /* Sometimes the swizzle will have alpha map to one. We do this to fake
5181*61046927SAndroid Build Coastguard Worker * RGB as RGBA for texturing
5182*61046927SAndroid Build Coastguard Worker */
5183*61046927SAndroid Build Coastguard Worker assert(swizzle.a == ISL_CHANNEL_SELECT_ONE ||
5184*61046927SAndroid Build Coastguard Worker swizzle.a == ISL_CHANNEL_SELECT_ALPHA);
5185*61046927SAndroid Build Coastguard Worker
5186*61046927SAndroid Build Coastguard Worker /* But it doesn't matter what we render to that channel */
5187*61046927SAndroid Build Coastguard Worker swizzle.a = ISL_CHANNEL_SELECT_ALPHA;
5188*61046927SAndroid Build Coastguard Worker
5189*61046927SAndroid Build Coastguard Worker return swizzle;
5190*61046927SAndroid Build Coastguard Worker }
5191*61046927SAndroid Build Coastguard Worker
5192*61046927SAndroid Build Coastguard Worker void
5193*61046927SAndroid Build Coastguard Worker anv_pipeline_setup_l3_config(struct anv_pipeline *pipeline, bool needs_slm);
5194*61046927SAndroid Build Coastguard Worker
5195*61046927SAndroid Build Coastguard Worker /**
5196*61046927SAndroid Build Coastguard Worker * Describes how each part of anv_image will be bound to memory.
5197*61046927SAndroid Build Coastguard Worker */
5198*61046927SAndroid Build Coastguard Worker struct anv_image_memory_range {
5199*61046927SAndroid Build Coastguard Worker /**
5200*61046927SAndroid Build Coastguard Worker * Disjoint bindings into which each portion of the image will be bound.
5201*61046927SAndroid Build Coastguard Worker *
5202*61046927SAndroid Build Coastguard Worker * Binding images to memory can be complicated and invold binding different
5203*61046927SAndroid Build Coastguard Worker * portions of the image to different memory objects or regions. For most
5204*61046927SAndroid Build Coastguard Worker * images, everything lives in the MAIN binding and gets bound by
5205*61046927SAndroid Build Coastguard Worker * vkBindImageMemory. For disjoint multi-planar images, each plane has
5206*61046927SAndroid Build Coastguard Worker * a unique, disjoint binding and gets bound by vkBindImageMemory2 with
5207*61046927SAndroid Build Coastguard Worker * VkBindImagePlaneMemoryInfo. There may also exist bits of memory which are
5208*61046927SAndroid Build Coastguard Worker * implicit or driver-managed and live in special-case bindings.
5209*61046927SAndroid Build Coastguard Worker */
5210*61046927SAndroid Build Coastguard Worker enum anv_image_memory_binding {
5211*61046927SAndroid Build Coastguard Worker /**
5212*61046927SAndroid Build Coastguard Worker * Used if and only if image is not multi-planar disjoint. Bound by
5213*61046927SAndroid Build Coastguard Worker * vkBindImageMemory2 without VkBindImagePlaneMemoryInfo.
5214*61046927SAndroid Build Coastguard Worker */
5215*61046927SAndroid Build Coastguard Worker ANV_IMAGE_MEMORY_BINDING_MAIN,
5216*61046927SAndroid Build Coastguard Worker
5217*61046927SAndroid Build Coastguard Worker /**
5218*61046927SAndroid Build Coastguard Worker * Used if and only if image is multi-planar disjoint. Bound by
5219*61046927SAndroid Build Coastguard Worker * vkBindImageMemory2 with VkBindImagePlaneMemoryInfo.
5220*61046927SAndroid Build Coastguard Worker */
5221*61046927SAndroid Build Coastguard Worker ANV_IMAGE_MEMORY_BINDING_PLANE_0,
5222*61046927SAndroid Build Coastguard Worker ANV_IMAGE_MEMORY_BINDING_PLANE_1,
5223*61046927SAndroid Build Coastguard Worker ANV_IMAGE_MEMORY_BINDING_PLANE_2,
5224*61046927SAndroid Build Coastguard Worker
5225*61046927SAndroid Build Coastguard Worker /**
5226*61046927SAndroid Build Coastguard Worker * Driver-private bo. In special cases we may store the aux surface and/or
5227*61046927SAndroid Build Coastguard Worker * aux state in this binding.
5228*61046927SAndroid Build Coastguard Worker */
5229*61046927SAndroid Build Coastguard Worker ANV_IMAGE_MEMORY_BINDING_PRIVATE,
5230*61046927SAndroid Build Coastguard Worker
5231*61046927SAndroid Build Coastguard Worker /** Sentinel */
5232*61046927SAndroid Build Coastguard Worker ANV_IMAGE_MEMORY_BINDING_END,
5233*61046927SAndroid Build Coastguard Worker } binding;
5234*61046927SAndroid Build Coastguard Worker
5235*61046927SAndroid Build Coastguard Worker uint32_t alignment;
5236*61046927SAndroid Build Coastguard Worker uint64_t size;
5237*61046927SAndroid Build Coastguard Worker
5238*61046927SAndroid Build Coastguard Worker /**
5239*61046927SAndroid Build Coastguard Worker * Offset is relative to the start of the binding created by
5240*61046927SAndroid Build Coastguard Worker * vkBindImageMemory, not to the start of the bo.
5241*61046927SAndroid Build Coastguard Worker */
5242*61046927SAndroid Build Coastguard Worker uint64_t offset;
5243*61046927SAndroid Build Coastguard Worker };
5244*61046927SAndroid Build Coastguard Worker
5245*61046927SAndroid Build Coastguard Worker /**
5246*61046927SAndroid Build Coastguard Worker * Subsurface of an anv_image.
5247*61046927SAndroid Build Coastguard Worker */
5248*61046927SAndroid Build Coastguard Worker struct anv_surface {
5249*61046927SAndroid Build Coastguard Worker struct isl_surf isl;
5250*61046927SAndroid Build Coastguard Worker struct anv_image_memory_range memory_range;
5251*61046927SAndroid Build Coastguard Worker };
5252*61046927SAndroid Build Coastguard Worker
5253*61046927SAndroid Build Coastguard Worker static inline bool MUST_CHECK
anv_surface_is_valid(const struct anv_surface * surface)5254*61046927SAndroid Build Coastguard Worker anv_surface_is_valid(const struct anv_surface *surface)
5255*61046927SAndroid Build Coastguard Worker {
5256*61046927SAndroid Build Coastguard Worker return surface->isl.size_B > 0 && surface->memory_range.size > 0;
5257*61046927SAndroid Build Coastguard Worker }
5258*61046927SAndroid Build Coastguard Worker
5259*61046927SAndroid Build Coastguard Worker struct anv_image {
5260*61046927SAndroid Build Coastguard Worker struct vk_image vk;
5261*61046927SAndroid Build Coastguard Worker
5262*61046927SAndroid Build Coastguard Worker uint32_t n_planes;
5263*61046927SAndroid Build Coastguard Worker
5264*61046927SAndroid Build Coastguard Worker /**
5265*61046927SAndroid Build Coastguard Worker * Image has multi-planar format and was created with
5266*61046927SAndroid Build Coastguard Worker * VK_IMAGE_CREATE_DISJOINT_BIT.
5267*61046927SAndroid Build Coastguard Worker */
5268*61046927SAndroid Build Coastguard Worker bool disjoint;
5269*61046927SAndroid Build Coastguard Worker
5270*61046927SAndroid Build Coastguard Worker /**
5271*61046927SAndroid Build Coastguard Worker * Image is a WSI image
5272*61046927SAndroid Build Coastguard Worker */
5273*61046927SAndroid Build Coastguard Worker bool from_wsi;
5274*61046927SAndroid Build Coastguard Worker
5275*61046927SAndroid Build Coastguard Worker /**
5276*61046927SAndroid Build Coastguard Worker * Image was imported from an struct AHardwareBuffer. We have to delay
5277*61046927SAndroid Build Coastguard Worker * final image creation until bind time.
5278*61046927SAndroid Build Coastguard Worker */
5279*61046927SAndroid Build Coastguard Worker bool from_ahb;
5280*61046927SAndroid Build Coastguard Worker
5281*61046927SAndroid Build Coastguard Worker /**
5282*61046927SAndroid Build Coastguard Worker * Image was imported from gralloc with VkNativeBufferANDROID. The gralloc bo
5283*61046927SAndroid Build Coastguard Worker * must be released when the image is destroyed.
5284*61046927SAndroid Build Coastguard Worker */
5285*61046927SAndroid Build Coastguard Worker bool from_gralloc;
5286*61046927SAndroid Build Coastguard Worker
5287*61046927SAndroid Build Coastguard Worker /**
5288*61046927SAndroid Build Coastguard Worker * If not UNDEFINED, image has a hidden plane at planes[n_planes] for ASTC
5289*61046927SAndroid Build Coastguard Worker * LDR workaround or emulation.
5290*61046927SAndroid Build Coastguard Worker */
5291*61046927SAndroid Build Coastguard Worker VkFormat emu_plane_format;
5292*61046927SAndroid Build Coastguard Worker
5293*61046927SAndroid Build Coastguard Worker /**
5294*61046927SAndroid Build Coastguard Worker * The memory bindings created by vkCreateImage and vkBindImageMemory.
5295*61046927SAndroid Build Coastguard Worker *
5296*61046927SAndroid Build Coastguard Worker * For details on the image's memory layout, see check_memory_bindings().
5297*61046927SAndroid Build Coastguard Worker *
5298*61046927SAndroid Build Coastguard Worker * vkCreateImage constructs the `memory_range` for each
5299*61046927SAndroid Build Coastguard Worker * anv_image_memory_binding. After vkCreateImage, each binding is valid if
5300*61046927SAndroid Build Coastguard Worker * and only if `memory_range::size > 0`.
5301*61046927SAndroid Build Coastguard Worker *
5302*61046927SAndroid Build Coastguard Worker * vkBindImageMemory binds each valid `memory_range` to an `address`.
5303*61046927SAndroid Build Coastguard Worker * Usually, the app will provide the address via the parameters of
5304*61046927SAndroid Build Coastguard Worker * vkBindImageMemory. However, special-case bindings may be bound to
5305*61046927SAndroid Build Coastguard Worker * driver-private memory.
5306*61046927SAndroid Build Coastguard Worker */
5307*61046927SAndroid Build Coastguard Worker struct anv_image_binding {
5308*61046927SAndroid Build Coastguard Worker struct anv_image_memory_range memory_range;
5309*61046927SAndroid Build Coastguard Worker struct anv_address address;
5310*61046927SAndroid Build Coastguard Worker struct anv_sparse_binding_data sparse_data;
5311*61046927SAndroid Build Coastguard Worker } bindings[ANV_IMAGE_MEMORY_BINDING_END];
5312*61046927SAndroid Build Coastguard Worker
5313*61046927SAndroid Build Coastguard Worker /**
5314*61046927SAndroid Build Coastguard Worker * Image subsurfaces
5315*61046927SAndroid Build Coastguard Worker *
5316*61046927SAndroid Build Coastguard Worker * For each foo, anv_image::planes[x].surface is valid if and only if
5317*61046927SAndroid Build Coastguard Worker * anv_image::aspects has a x aspect. Refer to anv_image_aspect_to_plane()
5318*61046927SAndroid Build Coastguard Worker * to figure the number associated with a given aspect.
5319*61046927SAndroid Build Coastguard Worker *
5320*61046927SAndroid Build Coastguard Worker * The hardware requires that the depth buffer and stencil buffer be
5321*61046927SAndroid Build Coastguard Worker * separate surfaces. From Vulkan's perspective, though, depth and stencil
5322*61046927SAndroid Build Coastguard Worker * reside in the same VkImage. To satisfy both the hardware and Vulkan, we
5323*61046927SAndroid Build Coastguard Worker * allocate the depth and stencil buffers as separate surfaces in the same
5324*61046927SAndroid Build Coastguard Worker * bo.
5325*61046927SAndroid Build Coastguard Worker */
5326*61046927SAndroid Build Coastguard Worker struct anv_image_plane {
5327*61046927SAndroid Build Coastguard Worker struct anv_surface primary_surface;
5328*61046927SAndroid Build Coastguard Worker
5329*61046927SAndroid Build Coastguard Worker /**
5330*61046927SAndroid Build Coastguard Worker * The base aux usage for this image. For color images, this can be
5331*61046927SAndroid Build Coastguard Worker * either CCS_E or CCS_D depending on whether or not we can reliably
5332*61046927SAndroid Build Coastguard Worker * leave CCS on all the time.
5333*61046927SAndroid Build Coastguard Worker */
5334*61046927SAndroid Build Coastguard Worker enum isl_aux_usage aux_usage;
5335*61046927SAndroid Build Coastguard Worker
5336*61046927SAndroid Build Coastguard Worker struct anv_surface aux_surface;
5337*61046927SAndroid Build Coastguard Worker
5338*61046927SAndroid Build Coastguard Worker /** Location of the compression control surface. */
5339*61046927SAndroid Build Coastguard Worker struct anv_image_memory_range compr_ctrl_memory_range;
5340*61046927SAndroid Build Coastguard Worker
5341*61046927SAndroid Build Coastguard Worker /** Location of the fast clear state. */
5342*61046927SAndroid Build Coastguard Worker struct anv_image_memory_range fast_clear_memory_range;
5343*61046927SAndroid Build Coastguard Worker
5344*61046927SAndroid Build Coastguard Worker /**
5345*61046927SAndroid Build Coastguard Worker * Whether this image can be fast cleared with non-zero clear colors.
5346*61046927SAndroid Build Coastguard Worker * This can happen with mutable images when formats of different bit
5347*61046927SAndroid Build Coastguard Worker * sizes per components are used.
5348*61046927SAndroid Build Coastguard Worker *
5349*61046927SAndroid Build Coastguard Worker * On Gfx9+, because the clear colors are stored as a 4 components 32bit
5350*61046927SAndroid Build Coastguard Worker * values, we can clear in R16G16_UNORM (store 2 16bit values in the
5351*61046927SAndroid Build Coastguard Worker * components 0 & 1 of the clear color) and then draw in R32_UINT which
5352*61046927SAndroid Build Coastguard Worker * would interpret the clear color as a single component value, using
5353*61046927SAndroid Build Coastguard Worker * only the first 16bit component of the previous written clear color.
5354*61046927SAndroid Build Coastguard Worker *
5355*61046927SAndroid Build Coastguard Worker * On Gfx7/7.5/8, only CC_ZERO/CC_ONE clear colors are supported, this
5356*61046927SAndroid Build Coastguard Worker * boolean will prevent the usage of CC_ONE.
5357*61046927SAndroid Build Coastguard Worker */
5358*61046927SAndroid Build Coastguard Worker bool can_non_zero_fast_clear;
5359*61046927SAndroid Build Coastguard Worker
5360*61046927SAndroid Build Coastguard Worker struct {
5361*61046927SAndroid Build Coastguard Worker /** Whether the image has CCS data mapped through AUX-TT. */
5362*61046927SAndroid Build Coastguard Worker bool mapped;
5363*61046927SAndroid Build Coastguard Worker
5364*61046927SAndroid Build Coastguard Worker /** Main address of the mapping. */
5365*61046927SAndroid Build Coastguard Worker uint64_t addr;
5366*61046927SAndroid Build Coastguard Worker
5367*61046927SAndroid Build Coastguard Worker /** Size of the mapping. */
5368*61046927SAndroid Build Coastguard Worker uint64_t size;
5369*61046927SAndroid Build Coastguard Worker } aux_tt;
5370*61046927SAndroid Build Coastguard Worker } planes[3];
5371*61046927SAndroid Build Coastguard Worker
5372*61046927SAndroid Build Coastguard Worker struct anv_image_memory_range vid_dmv_top_surface;
5373*61046927SAndroid Build Coastguard Worker
5374*61046927SAndroid Build Coastguard Worker /* Link in the anv_device.image_private_objects list */
5375*61046927SAndroid Build Coastguard Worker struct list_head link;
5376*61046927SAndroid Build Coastguard Worker };
5377*61046927SAndroid Build Coastguard Worker
5378*61046927SAndroid Build Coastguard Worker static inline bool
anv_image_is_protected(const struct anv_image * image)5379*61046927SAndroid Build Coastguard Worker anv_image_is_protected(const struct anv_image *image)
5380*61046927SAndroid Build Coastguard Worker {
5381*61046927SAndroid Build Coastguard Worker return image->vk.create_flags & VK_IMAGE_CREATE_PROTECTED_BIT;
5382*61046927SAndroid Build Coastguard Worker }
5383*61046927SAndroid Build Coastguard Worker
5384*61046927SAndroid Build Coastguard Worker static inline bool
anv_image_is_sparse(const struct anv_image * image)5385*61046927SAndroid Build Coastguard Worker anv_image_is_sparse(const struct anv_image *image)
5386*61046927SAndroid Build Coastguard Worker {
5387*61046927SAndroid Build Coastguard Worker return image->vk.create_flags & VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
5388*61046927SAndroid Build Coastguard Worker }
5389*61046927SAndroid Build Coastguard Worker
5390*61046927SAndroid Build Coastguard Worker static inline bool
anv_image_is_externally_shared(const struct anv_image * image)5391*61046927SAndroid Build Coastguard Worker anv_image_is_externally_shared(const struct anv_image *image)
5392*61046927SAndroid Build Coastguard Worker {
5393*61046927SAndroid Build Coastguard Worker return image->vk.drm_format_mod != DRM_FORMAT_MOD_INVALID ||
5394*61046927SAndroid Build Coastguard Worker image->vk.external_handle_types != 0;
5395*61046927SAndroid Build Coastguard Worker }
5396*61046927SAndroid Build Coastguard Worker
5397*61046927SAndroid Build Coastguard Worker static inline bool
anv_image_has_private_binding(const struct anv_image * image)5398*61046927SAndroid Build Coastguard Worker anv_image_has_private_binding(const struct anv_image *image)
5399*61046927SAndroid Build Coastguard Worker {
5400*61046927SAndroid Build Coastguard Worker const struct anv_image_binding private_binding =
5401*61046927SAndroid Build Coastguard Worker image->bindings[ANV_IMAGE_MEMORY_BINDING_PRIVATE];
5402*61046927SAndroid Build Coastguard Worker return private_binding.memory_range.size != 0;
5403*61046927SAndroid Build Coastguard Worker }
5404*61046927SAndroid Build Coastguard Worker
5405*61046927SAndroid Build Coastguard Worker static inline bool
anv_image_format_is_d16_or_s8(const struct anv_image * image)5406*61046927SAndroid Build Coastguard Worker anv_image_format_is_d16_or_s8(const struct anv_image *image)
5407*61046927SAndroid Build Coastguard Worker {
5408*61046927SAndroid Build Coastguard Worker return image->vk.format == VK_FORMAT_D16_UNORM ||
5409*61046927SAndroid Build Coastguard Worker image->vk.format == VK_FORMAT_D16_UNORM_S8_UINT ||
5410*61046927SAndroid Build Coastguard Worker image->vk.format == VK_FORMAT_D24_UNORM_S8_UINT ||
5411*61046927SAndroid Build Coastguard Worker image->vk.format == VK_FORMAT_D32_SFLOAT_S8_UINT ||
5412*61046927SAndroid Build Coastguard Worker image->vk.format == VK_FORMAT_S8_UINT;
5413*61046927SAndroid Build Coastguard Worker }
5414*61046927SAndroid Build Coastguard Worker
5415*61046927SAndroid Build Coastguard Worker /* The ordering of this enum is important */
5416*61046927SAndroid Build Coastguard Worker enum anv_fast_clear_type {
5417*61046927SAndroid Build Coastguard Worker /** Image does not have/support any fast-clear blocks */
5418*61046927SAndroid Build Coastguard Worker ANV_FAST_CLEAR_NONE = 0,
5419*61046927SAndroid Build Coastguard Worker /** Image has/supports fast-clear but only to the default value */
5420*61046927SAndroid Build Coastguard Worker ANV_FAST_CLEAR_DEFAULT_VALUE = 1,
5421*61046927SAndroid Build Coastguard Worker /** Image has/supports fast-clear with an arbitrary fast-clear value */
5422*61046927SAndroid Build Coastguard Worker ANV_FAST_CLEAR_ANY = 2,
5423*61046927SAndroid Build Coastguard Worker };
5424*61046927SAndroid Build Coastguard Worker
5425*61046927SAndroid Build Coastguard Worker /**
5426*61046927SAndroid Build Coastguard Worker * Return the aspect's _format_ plane, not its _memory_ plane (using the
5427*61046927SAndroid Build Coastguard Worker * vocabulary of VK_EXT_image_drm_format_modifier). As a consequence, \a
5428*61046927SAndroid Build Coastguard Worker * aspect_mask may contain VK_IMAGE_ASPECT_PLANE_*, but must not contain
5429*61046927SAndroid Build Coastguard Worker * VK_IMAGE_ASPECT_MEMORY_PLANE_* .
5430*61046927SAndroid Build Coastguard Worker */
5431*61046927SAndroid Build Coastguard Worker static inline uint32_t
anv_image_aspect_to_plane(const struct anv_image * image,VkImageAspectFlagBits aspect)5432*61046927SAndroid Build Coastguard Worker anv_image_aspect_to_plane(const struct anv_image *image,
5433*61046927SAndroid Build Coastguard Worker VkImageAspectFlagBits aspect)
5434*61046927SAndroid Build Coastguard Worker {
5435*61046927SAndroid Build Coastguard Worker return anv_aspect_to_plane(image->vk.aspects, aspect);
5436*61046927SAndroid Build Coastguard Worker }
5437*61046927SAndroid Build Coastguard Worker
5438*61046927SAndroid Build Coastguard Worker /* Returns the number of auxiliary buffer levels attached to an image. */
5439*61046927SAndroid Build Coastguard Worker static inline uint8_t
anv_image_aux_levels(const struct anv_image * const image,VkImageAspectFlagBits aspect)5440*61046927SAndroid Build Coastguard Worker anv_image_aux_levels(const struct anv_image * const image,
5441*61046927SAndroid Build Coastguard Worker VkImageAspectFlagBits aspect)
5442*61046927SAndroid Build Coastguard Worker {
5443*61046927SAndroid Build Coastguard Worker uint32_t plane = anv_image_aspect_to_plane(image, aspect);
5444*61046927SAndroid Build Coastguard Worker if (image->planes[plane].aux_usage == ISL_AUX_USAGE_NONE)
5445*61046927SAndroid Build Coastguard Worker return 0;
5446*61046927SAndroid Build Coastguard Worker
5447*61046927SAndroid Build Coastguard Worker return image->vk.mip_levels;
5448*61046927SAndroid Build Coastguard Worker }
5449*61046927SAndroid Build Coastguard Worker
5450*61046927SAndroid Build Coastguard Worker /* Returns the number of auxiliary buffer layers attached to an image. */
5451*61046927SAndroid Build Coastguard Worker static inline uint32_t
anv_image_aux_layers(const struct anv_image * const image,VkImageAspectFlagBits aspect,const uint8_t miplevel)5452*61046927SAndroid Build Coastguard Worker anv_image_aux_layers(const struct anv_image * const image,
5453*61046927SAndroid Build Coastguard Worker VkImageAspectFlagBits aspect,
5454*61046927SAndroid Build Coastguard Worker const uint8_t miplevel)
5455*61046927SAndroid Build Coastguard Worker {
5456*61046927SAndroid Build Coastguard Worker assert(image);
5457*61046927SAndroid Build Coastguard Worker
5458*61046927SAndroid Build Coastguard Worker /* The miplevel must exist in the main buffer. */
5459*61046927SAndroid Build Coastguard Worker assert(miplevel < image->vk.mip_levels);
5460*61046927SAndroid Build Coastguard Worker
5461*61046927SAndroid Build Coastguard Worker if (miplevel >= anv_image_aux_levels(image, aspect)) {
5462*61046927SAndroid Build Coastguard Worker /* There are no layers with auxiliary data because the miplevel has no
5463*61046927SAndroid Build Coastguard Worker * auxiliary data.
5464*61046927SAndroid Build Coastguard Worker */
5465*61046927SAndroid Build Coastguard Worker return 0;
5466*61046927SAndroid Build Coastguard Worker }
5467*61046927SAndroid Build Coastguard Worker
5468*61046927SAndroid Build Coastguard Worker return MAX2(image->vk.array_layers, image->vk.extent.depth >> miplevel);
5469*61046927SAndroid Build Coastguard Worker }
5470*61046927SAndroid Build Coastguard Worker
5471*61046927SAndroid Build Coastguard Worker static inline struct anv_address MUST_CHECK
anv_image_address(const struct anv_image * image,const struct anv_image_memory_range * mem_range)5472*61046927SAndroid Build Coastguard Worker anv_image_address(const struct anv_image *image,
5473*61046927SAndroid Build Coastguard Worker const struct anv_image_memory_range *mem_range)
5474*61046927SAndroid Build Coastguard Worker {
5475*61046927SAndroid Build Coastguard Worker const struct anv_image_binding *binding = &image->bindings[mem_range->binding];
5476*61046927SAndroid Build Coastguard Worker assert(binding->memory_range.offset == 0);
5477*61046927SAndroid Build Coastguard Worker
5478*61046927SAndroid Build Coastguard Worker if (mem_range->size == 0)
5479*61046927SAndroid Build Coastguard Worker return ANV_NULL_ADDRESS;
5480*61046927SAndroid Build Coastguard Worker
5481*61046927SAndroid Build Coastguard Worker return anv_address_add(binding->address, mem_range->offset);
5482*61046927SAndroid Build Coastguard Worker }
5483*61046927SAndroid Build Coastguard Worker
5484*61046927SAndroid Build Coastguard Worker static inline struct anv_address
anv_image_get_clear_color_addr(UNUSED const struct anv_device * device,const struct anv_image * image,VkImageAspectFlagBits aspect)5485*61046927SAndroid Build Coastguard Worker anv_image_get_clear_color_addr(UNUSED const struct anv_device *device,
5486*61046927SAndroid Build Coastguard Worker const struct anv_image *image,
5487*61046927SAndroid Build Coastguard Worker VkImageAspectFlagBits aspect)
5488*61046927SAndroid Build Coastguard Worker {
5489*61046927SAndroid Build Coastguard Worker assert(image->vk.aspects & (VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV |
5490*61046927SAndroid Build Coastguard Worker VK_IMAGE_ASPECT_DEPTH_BIT));
5491*61046927SAndroid Build Coastguard Worker
5492*61046927SAndroid Build Coastguard Worker uint32_t plane = anv_image_aspect_to_plane(image, aspect);
5493*61046927SAndroid Build Coastguard Worker const struct anv_image_memory_range *mem_range =
5494*61046927SAndroid Build Coastguard Worker &image->planes[plane].fast_clear_memory_range;
5495*61046927SAndroid Build Coastguard Worker
5496*61046927SAndroid Build Coastguard Worker return anv_image_address(image, mem_range);
5497*61046927SAndroid Build Coastguard Worker }
5498*61046927SAndroid Build Coastguard Worker
5499*61046927SAndroid Build Coastguard Worker static inline struct anv_address
anv_image_get_fast_clear_type_addr(const struct anv_device * device,const struct anv_image * image,VkImageAspectFlagBits aspect)5500*61046927SAndroid Build Coastguard Worker anv_image_get_fast_clear_type_addr(const struct anv_device *device,
5501*61046927SAndroid Build Coastguard Worker const struct anv_image *image,
5502*61046927SAndroid Build Coastguard Worker VkImageAspectFlagBits aspect)
5503*61046927SAndroid Build Coastguard Worker {
5504*61046927SAndroid Build Coastguard Worker /* Xe2+ platforms don't need fast clear type. We shouldn't get here. */
5505*61046927SAndroid Build Coastguard Worker assert(device->info->ver < 20);
5506*61046927SAndroid Build Coastguard Worker struct anv_address addr =
5507*61046927SAndroid Build Coastguard Worker anv_image_get_clear_color_addr(device, image, aspect);
5508*61046927SAndroid Build Coastguard Worker
5509*61046927SAndroid Build Coastguard Worker unsigned clear_color_state_size;
5510*61046927SAndroid Build Coastguard Worker if (device->info->ver >= 11) {
5511*61046927SAndroid Build Coastguard Worker /* The fast clear type and the first compression state are stored in the
5512*61046927SAndroid Build Coastguard Worker * last 2 dwords of the clear color struct. Refer to the comment in
5513*61046927SAndroid Build Coastguard Worker * add_aux_state_tracking_buffer().
5514*61046927SAndroid Build Coastguard Worker */
5515*61046927SAndroid Build Coastguard Worker assert(device->isl_dev.ss.clear_color_state_size >= 32);
5516*61046927SAndroid Build Coastguard Worker clear_color_state_size = device->isl_dev.ss.clear_color_state_size - 8;
5517*61046927SAndroid Build Coastguard Worker } else
5518*61046927SAndroid Build Coastguard Worker clear_color_state_size = device->isl_dev.ss.clear_value_size;
5519*61046927SAndroid Build Coastguard Worker return anv_address_add(addr, clear_color_state_size);
5520*61046927SAndroid Build Coastguard Worker }
5521*61046927SAndroid Build Coastguard Worker
5522*61046927SAndroid Build Coastguard Worker static inline struct anv_address
anv_image_get_compression_state_addr(const struct anv_device * device,const struct anv_image * image,VkImageAspectFlagBits aspect,uint32_t level,uint32_t array_layer)5523*61046927SAndroid Build Coastguard Worker anv_image_get_compression_state_addr(const struct anv_device *device,
5524*61046927SAndroid Build Coastguard Worker const struct anv_image *image,
5525*61046927SAndroid Build Coastguard Worker VkImageAspectFlagBits aspect,
5526*61046927SAndroid Build Coastguard Worker uint32_t level, uint32_t array_layer)
5527*61046927SAndroid Build Coastguard Worker {
5528*61046927SAndroid Build Coastguard Worker /* Xe2+ platforms don't use compression state. We shouldn't get here. */
5529*61046927SAndroid Build Coastguard Worker assert(device->info->ver < 20);
5530*61046927SAndroid Build Coastguard Worker assert(level < anv_image_aux_levels(image, aspect));
5531*61046927SAndroid Build Coastguard Worker assert(array_layer < anv_image_aux_layers(image, aspect, level));
5532*61046927SAndroid Build Coastguard Worker UNUSED uint32_t plane = anv_image_aspect_to_plane(image, aspect);
5533*61046927SAndroid Build Coastguard Worker assert(isl_aux_usage_has_ccs_e(image->planes[plane].aux_usage));
5534*61046927SAndroid Build Coastguard Worker
5535*61046927SAndroid Build Coastguard Worker /* Relative to start of the plane's fast clear type */
5536*61046927SAndroid Build Coastguard Worker uint32_t offset;
5537*61046927SAndroid Build Coastguard Worker
5538*61046927SAndroid Build Coastguard Worker offset = 4; /* Go past the fast clear type */
5539*61046927SAndroid Build Coastguard Worker
5540*61046927SAndroid Build Coastguard Worker if (image->vk.image_type == VK_IMAGE_TYPE_3D) {
5541*61046927SAndroid Build Coastguard Worker for (uint32_t l = 0; l < level; l++)
5542*61046927SAndroid Build Coastguard Worker offset += u_minify(image->vk.extent.depth, l) * 4;
5543*61046927SAndroid Build Coastguard Worker } else {
5544*61046927SAndroid Build Coastguard Worker offset += level * image->vk.array_layers * 4;
5545*61046927SAndroid Build Coastguard Worker }
5546*61046927SAndroid Build Coastguard Worker
5547*61046927SAndroid Build Coastguard Worker offset += array_layer * 4;
5548*61046927SAndroid Build Coastguard Worker
5549*61046927SAndroid Build Coastguard Worker assert(offset < image->planes[plane].fast_clear_memory_range.size);
5550*61046927SAndroid Build Coastguard Worker
5551*61046927SAndroid Build Coastguard Worker return anv_address_add(
5552*61046927SAndroid Build Coastguard Worker anv_image_get_fast_clear_type_addr(device, image, aspect),
5553*61046927SAndroid Build Coastguard Worker offset);
5554*61046927SAndroid Build Coastguard Worker }
5555*61046927SAndroid Build Coastguard Worker
5556*61046927SAndroid Build Coastguard Worker static inline const struct anv_image_memory_range *
anv_image_get_aux_memory_range(const struct anv_image * image,uint32_t plane)5557*61046927SAndroid Build Coastguard Worker anv_image_get_aux_memory_range(const struct anv_image *image,
5558*61046927SAndroid Build Coastguard Worker uint32_t plane)
5559*61046927SAndroid Build Coastguard Worker {
5560*61046927SAndroid Build Coastguard Worker if (image->planes[plane].aux_surface.memory_range.size > 0)
5561*61046927SAndroid Build Coastguard Worker return &image->planes[plane].aux_surface.memory_range;
5562*61046927SAndroid Build Coastguard Worker else
5563*61046927SAndroid Build Coastguard Worker return &image->planes[plane].compr_ctrl_memory_range;
5564*61046927SAndroid Build Coastguard Worker }
5565*61046927SAndroid Build Coastguard Worker
5566*61046927SAndroid Build Coastguard Worker /* Returns true if a HiZ-enabled depth buffer can be sampled from. */
5567*61046927SAndroid Build Coastguard Worker static inline bool
anv_can_sample_with_hiz(const struct intel_device_info * const devinfo,const struct anv_image * image)5568*61046927SAndroid Build Coastguard Worker anv_can_sample_with_hiz(const struct intel_device_info * const devinfo,
5569*61046927SAndroid Build Coastguard Worker const struct anv_image *image)
5570*61046927SAndroid Build Coastguard Worker {
5571*61046927SAndroid Build Coastguard Worker if (!(image->vk.aspects & VK_IMAGE_ASPECT_DEPTH_BIT))
5572*61046927SAndroid Build Coastguard Worker return false;
5573*61046927SAndroid Build Coastguard Worker
5574*61046927SAndroid Build Coastguard Worker /* For Gfx8-11, there are some restrictions around sampling from HiZ.
5575*61046927SAndroid Build Coastguard Worker * The Skylake PRM docs for RENDER_SURFACE_STATE::AuxiliarySurfaceMode
5576*61046927SAndroid Build Coastguard Worker * say:
5577*61046927SAndroid Build Coastguard Worker *
5578*61046927SAndroid Build Coastguard Worker * "If this field is set to AUX_HIZ, Number of Multisamples must
5579*61046927SAndroid Build Coastguard Worker * be MULTISAMPLECOUNT_1, and Surface Type cannot be SURFTYPE_3D."
5580*61046927SAndroid Build Coastguard Worker */
5581*61046927SAndroid Build Coastguard Worker if (image->vk.image_type == VK_IMAGE_TYPE_3D)
5582*61046927SAndroid Build Coastguard Worker return false;
5583*61046927SAndroid Build Coastguard Worker
5584*61046927SAndroid Build Coastguard Worker if (!devinfo->has_sample_with_hiz)
5585*61046927SAndroid Build Coastguard Worker return false;
5586*61046927SAndroid Build Coastguard Worker
5587*61046927SAndroid Build Coastguard Worker return image->vk.samples == 1;
5588*61046927SAndroid Build Coastguard Worker }
5589*61046927SAndroid Build Coastguard Worker
5590*61046927SAndroid Build Coastguard Worker /* Returns true if an MCS-enabled buffer can be sampled from. */
5591*61046927SAndroid Build Coastguard Worker static inline bool
anv_can_sample_mcs_with_clear(const struct intel_device_info * const devinfo,const struct anv_image * image)5592*61046927SAndroid Build Coastguard Worker anv_can_sample_mcs_with_clear(const struct intel_device_info * const devinfo,
5593*61046927SAndroid Build Coastguard Worker const struct anv_image *image)
5594*61046927SAndroid Build Coastguard Worker {
5595*61046927SAndroid Build Coastguard Worker assert(image->vk.aspects == VK_IMAGE_ASPECT_COLOR_BIT);
5596*61046927SAndroid Build Coastguard Worker const uint32_t plane =
5597*61046927SAndroid Build Coastguard Worker anv_image_aspect_to_plane(image, VK_IMAGE_ASPECT_COLOR_BIT);
5598*61046927SAndroid Build Coastguard Worker
5599*61046927SAndroid Build Coastguard Worker assert(isl_aux_usage_has_mcs(image->planes[plane].aux_usage));
5600*61046927SAndroid Build Coastguard Worker
5601*61046927SAndroid Build Coastguard Worker const struct anv_surface *anv_surf = &image->planes[plane].primary_surface;
5602*61046927SAndroid Build Coastguard Worker
5603*61046927SAndroid Build Coastguard Worker /* On TGL, the sampler has an issue with some 8 and 16bpp MSAA fast clears.
5604*61046927SAndroid Build Coastguard Worker * See HSD 1707282275, wa_14013111325. Due to the use of
5605*61046927SAndroid Build Coastguard Worker * format-reinterpretation, a simplified workaround is implemented.
5606*61046927SAndroid Build Coastguard Worker */
5607*61046927SAndroid Build Coastguard Worker if (intel_needs_workaround(devinfo, 14013111325) &&
5608*61046927SAndroid Build Coastguard Worker isl_format_get_layout(anv_surf->isl.format)->bpb <= 16) {
5609*61046927SAndroid Build Coastguard Worker return false;
5610*61046927SAndroid Build Coastguard Worker }
5611*61046927SAndroid Build Coastguard Worker
5612*61046927SAndroid Build Coastguard Worker return true;
5613*61046927SAndroid Build Coastguard Worker }
5614*61046927SAndroid Build Coastguard Worker
5615*61046927SAndroid Build Coastguard Worker static inline bool
anv_image_plane_uses_aux_map(const struct anv_device * device,const struct anv_image * image,uint32_t plane)5616*61046927SAndroid Build Coastguard Worker anv_image_plane_uses_aux_map(const struct anv_device *device,
5617*61046927SAndroid Build Coastguard Worker const struct anv_image *image,
5618*61046927SAndroid Build Coastguard Worker uint32_t plane)
5619*61046927SAndroid Build Coastguard Worker {
5620*61046927SAndroid Build Coastguard Worker return device->info->has_aux_map &&
5621*61046927SAndroid Build Coastguard Worker isl_aux_usage_has_ccs(image->planes[plane].aux_usage);
5622*61046927SAndroid Build Coastguard Worker }
5623*61046927SAndroid Build Coastguard Worker
5624*61046927SAndroid Build Coastguard Worker static inline bool
anv_image_uses_aux_map(const struct anv_device * device,const struct anv_image * image)5625*61046927SAndroid Build Coastguard Worker anv_image_uses_aux_map(const struct anv_device *device,
5626*61046927SAndroid Build Coastguard Worker const struct anv_image *image)
5627*61046927SAndroid Build Coastguard Worker {
5628*61046927SAndroid Build Coastguard Worker for (uint32_t p = 0; p < image->n_planes; ++p) {
5629*61046927SAndroid Build Coastguard Worker if (anv_image_plane_uses_aux_map(device, image, p))
5630*61046927SAndroid Build Coastguard Worker return true;
5631*61046927SAndroid Build Coastguard Worker }
5632*61046927SAndroid Build Coastguard Worker
5633*61046927SAndroid Build Coastguard Worker return false;
5634*61046927SAndroid Build Coastguard Worker }
5635*61046927SAndroid Build Coastguard Worker
5636*61046927SAndroid Build Coastguard Worker static inline bool
anv_bo_allows_aux_map(const struct anv_device * device,const struct anv_bo * bo)5637*61046927SAndroid Build Coastguard Worker anv_bo_allows_aux_map(const struct anv_device *device,
5638*61046927SAndroid Build Coastguard Worker const struct anv_bo *bo)
5639*61046927SAndroid Build Coastguard Worker {
5640*61046927SAndroid Build Coastguard Worker if (device->aux_map_ctx == NULL)
5641*61046927SAndroid Build Coastguard Worker return false;
5642*61046927SAndroid Build Coastguard Worker
5643*61046927SAndroid Build Coastguard Worker return (bo->alloc_flags & ANV_BO_ALLOC_AUX_TT_ALIGNED) != 0;
5644*61046927SAndroid Build Coastguard Worker }
5645*61046927SAndroid Build Coastguard Worker
5646*61046927SAndroid Build Coastguard Worker static inline bool
anv_address_allows_aux_map(const struct anv_device * device,struct anv_address addr)5647*61046927SAndroid Build Coastguard Worker anv_address_allows_aux_map(const struct anv_device *device,
5648*61046927SAndroid Build Coastguard Worker struct anv_address addr)
5649*61046927SAndroid Build Coastguard Worker {
5650*61046927SAndroid Build Coastguard Worker if (device->aux_map_ctx == NULL)
5651*61046927SAndroid Build Coastguard Worker return false;
5652*61046927SAndroid Build Coastguard Worker
5653*61046927SAndroid Build Coastguard Worker /* Technically, we really only care about what offset the image is bound
5654*61046927SAndroid Build Coastguard Worker * into on the BO, but we don't have that information here. As a heuristic,
5655*61046927SAndroid Build Coastguard Worker * rely on the BO offset instead.
5656*61046927SAndroid Build Coastguard Worker */
5657*61046927SAndroid Build Coastguard Worker if (anv_address_physical(addr) %
5658*61046927SAndroid Build Coastguard Worker intel_aux_map_get_alignment(device->aux_map_ctx) != 0)
5659*61046927SAndroid Build Coastguard Worker return false;
5660*61046927SAndroid Build Coastguard Worker
5661*61046927SAndroid Build Coastguard Worker return true;
5662*61046927SAndroid Build Coastguard Worker }
5663*61046927SAndroid Build Coastguard Worker
5664*61046927SAndroid Build Coastguard Worker void
5665*61046927SAndroid Build Coastguard Worker anv_cmd_buffer_mark_image_written(struct anv_cmd_buffer *cmd_buffer,
5666*61046927SAndroid Build Coastguard Worker const struct anv_image *image,
5667*61046927SAndroid Build Coastguard Worker VkImageAspectFlagBits aspect,
5668*61046927SAndroid Build Coastguard Worker enum isl_aux_usage aux_usage,
5669*61046927SAndroid Build Coastguard Worker uint32_t level,
5670*61046927SAndroid Build Coastguard Worker uint32_t base_layer,
5671*61046927SAndroid Build Coastguard Worker uint32_t layer_count);
5672*61046927SAndroid Build Coastguard Worker
5673*61046927SAndroid Build Coastguard Worker void
5674*61046927SAndroid Build Coastguard Worker anv_cmd_buffer_mark_image_fast_cleared(struct anv_cmd_buffer *cmd_buffer,
5675*61046927SAndroid Build Coastguard Worker const struct anv_image *image,
5676*61046927SAndroid Build Coastguard Worker const enum isl_format format,
5677*61046927SAndroid Build Coastguard Worker union isl_color_value clear_color);
5678*61046927SAndroid Build Coastguard Worker
5679*61046927SAndroid Build Coastguard Worker void
5680*61046927SAndroid Build Coastguard Worker anv_cmd_buffer_load_clear_color_from_image(struct anv_cmd_buffer *cmd_buffer,
5681*61046927SAndroid Build Coastguard Worker struct anv_state state,
5682*61046927SAndroid Build Coastguard Worker const struct anv_image *image);
5683*61046927SAndroid Build Coastguard Worker
5684*61046927SAndroid Build Coastguard Worker struct anv_image_binding *
5685*61046927SAndroid Build Coastguard Worker anv_image_aspect_to_binding(struct anv_image *image,
5686*61046927SAndroid Build Coastguard Worker VkImageAspectFlags aspect);
5687*61046927SAndroid Build Coastguard Worker
5688*61046927SAndroid Build Coastguard Worker void
5689*61046927SAndroid Build Coastguard Worker anv_image_clear_color(struct anv_cmd_buffer *cmd_buffer,
5690*61046927SAndroid Build Coastguard Worker const struct anv_image *image,
5691*61046927SAndroid Build Coastguard Worker VkImageAspectFlagBits aspect,
5692*61046927SAndroid Build Coastguard Worker enum isl_aux_usage aux_usage,
5693*61046927SAndroid Build Coastguard Worker enum isl_format format, struct isl_swizzle swizzle,
5694*61046927SAndroid Build Coastguard Worker uint32_t level, uint32_t base_layer, uint32_t layer_count,
5695*61046927SAndroid Build Coastguard Worker VkRect2D area, union isl_color_value clear_color);
5696*61046927SAndroid Build Coastguard Worker void
5697*61046927SAndroid Build Coastguard Worker anv_image_clear_depth_stencil(struct anv_cmd_buffer *cmd_buffer,
5698*61046927SAndroid Build Coastguard Worker const struct anv_image *image,
5699*61046927SAndroid Build Coastguard Worker VkImageAspectFlags aspects,
5700*61046927SAndroid Build Coastguard Worker enum isl_aux_usage depth_aux_usage,
5701*61046927SAndroid Build Coastguard Worker uint32_t level,
5702*61046927SAndroid Build Coastguard Worker uint32_t base_layer, uint32_t layer_count,
5703*61046927SAndroid Build Coastguard Worker VkRect2D area,
5704*61046927SAndroid Build Coastguard Worker const VkClearDepthStencilValue *clear_value);
5705*61046927SAndroid Build Coastguard Worker void
5706*61046927SAndroid Build Coastguard Worker anv_attachment_msaa_resolve(struct anv_cmd_buffer *cmd_buffer,
5707*61046927SAndroid Build Coastguard Worker const struct anv_attachment *att,
5708*61046927SAndroid Build Coastguard Worker VkImageLayout layout,
5709*61046927SAndroid Build Coastguard Worker VkImageAspectFlagBits aspect);
5710*61046927SAndroid Build Coastguard Worker
5711*61046927SAndroid Build Coastguard Worker static inline union isl_color_value
anv_image_hiz_clear_value(const struct anv_image * image)5712*61046927SAndroid Build Coastguard Worker anv_image_hiz_clear_value(const struct anv_image *image)
5713*61046927SAndroid Build Coastguard Worker {
5714*61046927SAndroid Build Coastguard Worker /* The benchmarks we're tracking tend to prefer clearing depth buffers to
5715*61046927SAndroid Build Coastguard Worker * 0.0f when the depth buffers are part of images with multiple aspects.
5716*61046927SAndroid Build Coastguard Worker * Otherwise, they tend to prefer clearing depth buffers to 1.0f.
5717*61046927SAndroid Build Coastguard Worker */
5718*61046927SAndroid Build Coastguard Worker if (image->n_planes == 2)
5719*61046927SAndroid Build Coastguard Worker return (union isl_color_value) { .f32 = { 0.0f, } };
5720*61046927SAndroid Build Coastguard Worker else
5721*61046927SAndroid Build Coastguard Worker return (union isl_color_value) { .f32 = { 1.0f, } };
5722*61046927SAndroid Build Coastguard Worker }
5723*61046927SAndroid Build Coastguard Worker
5724*61046927SAndroid Build Coastguard Worker void
5725*61046927SAndroid Build Coastguard Worker anv_image_hiz_op(struct anv_cmd_buffer *cmd_buffer,
5726*61046927SAndroid Build Coastguard Worker const struct anv_image *image,
5727*61046927SAndroid Build Coastguard Worker VkImageAspectFlagBits aspect, uint32_t level,
5728*61046927SAndroid Build Coastguard Worker uint32_t base_layer, uint32_t layer_count,
5729*61046927SAndroid Build Coastguard Worker enum isl_aux_op hiz_op);
5730*61046927SAndroid Build Coastguard Worker void
5731*61046927SAndroid Build Coastguard Worker anv_image_hiz_clear(struct anv_cmd_buffer *cmd_buffer,
5732*61046927SAndroid Build Coastguard Worker const struct anv_image *image,
5733*61046927SAndroid Build Coastguard Worker VkImageAspectFlags aspects,
5734*61046927SAndroid Build Coastguard Worker uint32_t level,
5735*61046927SAndroid Build Coastguard Worker uint32_t base_layer, uint32_t layer_count,
5736*61046927SAndroid Build Coastguard Worker VkRect2D area,
5737*61046927SAndroid Build Coastguard Worker const VkClearDepthStencilValue *clear_value);
5738*61046927SAndroid Build Coastguard Worker void
5739*61046927SAndroid Build Coastguard Worker anv_image_mcs_op(struct anv_cmd_buffer *cmd_buffer,
5740*61046927SAndroid Build Coastguard Worker const struct anv_image *image,
5741*61046927SAndroid Build Coastguard Worker enum isl_format format, struct isl_swizzle swizzle,
5742*61046927SAndroid Build Coastguard Worker VkImageAspectFlagBits aspect,
5743*61046927SAndroid Build Coastguard Worker uint32_t base_layer, uint32_t layer_count,
5744*61046927SAndroid Build Coastguard Worker enum isl_aux_op mcs_op, union isl_color_value *clear_value,
5745*61046927SAndroid Build Coastguard Worker bool predicate);
5746*61046927SAndroid Build Coastguard Worker void
5747*61046927SAndroid Build Coastguard Worker anv_image_ccs_op(struct anv_cmd_buffer *cmd_buffer,
5748*61046927SAndroid Build Coastguard Worker const struct anv_image *image,
5749*61046927SAndroid Build Coastguard Worker enum isl_format format, struct isl_swizzle swizzle,
5750*61046927SAndroid Build Coastguard Worker VkImageAspectFlagBits aspect, uint32_t level,
5751*61046927SAndroid Build Coastguard Worker uint32_t base_layer, uint32_t layer_count,
5752*61046927SAndroid Build Coastguard Worker enum isl_aux_op ccs_op, union isl_color_value *clear_value,
5753*61046927SAndroid Build Coastguard Worker bool predicate);
5754*61046927SAndroid Build Coastguard Worker
5755*61046927SAndroid Build Coastguard Worker isl_surf_usage_flags_t
5756*61046927SAndroid Build Coastguard Worker anv_image_choose_isl_surf_usage(struct anv_physical_device *device,
5757*61046927SAndroid Build Coastguard Worker VkImageCreateFlags vk_create_flags,
5758*61046927SAndroid Build Coastguard Worker VkImageUsageFlags vk_usage,
5759*61046927SAndroid Build Coastguard Worker isl_surf_usage_flags_t isl_extra_usage,
5760*61046927SAndroid Build Coastguard Worker VkImageAspectFlagBits aspect,
5761*61046927SAndroid Build Coastguard Worker VkImageCompressionFlagsEXT comp_flags);
5762*61046927SAndroid Build Coastguard Worker
5763*61046927SAndroid Build Coastguard Worker void
5764*61046927SAndroid Build Coastguard Worker anv_cmd_buffer_fill_area(struct anv_cmd_buffer *cmd_buffer,
5765*61046927SAndroid Build Coastguard Worker struct anv_address address,
5766*61046927SAndroid Build Coastguard Worker VkDeviceSize size,
5767*61046927SAndroid Build Coastguard Worker uint32_t data,
5768*61046927SAndroid Build Coastguard Worker bool protected);
5769*61046927SAndroid Build Coastguard Worker
5770*61046927SAndroid Build Coastguard Worker VkResult
5771*61046927SAndroid Build Coastguard Worker anv_cmd_buffer_ensure_rcs_companion(struct anv_cmd_buffer *cmd_buffer);
5772*61046927SAndroid Build Coastguard Worker
5773*61046927SAndroid Build Coastguard Worker bool
5774*61046927SAndroid Build Coastguard Worker anv_can_hiz_clear_ds_view(struct anv_device *device,
5775*61046927SAndroid Build Coastguard Worker const struct anv_image_view *iview,
5776*61046927SAndroid Build Coastguard Worker VkImageLayout layout,
5777*61046927SAndroid Build Coastguard Worker VkImageAspectFlags clear_aspects,
5778*61046927SAndroid Build Coastguard Worker float depth_clear_value,
5779*61046927SAndroid Build Coastguard Worker VkRect2D render_area,
5780*61046927SAndroid Build Coastguard Worker const VkQueueFlagBits queue_flags);
5781*61046927SAndroid Build Coastguard Worker
5782*61046927SAndroid Build Coastguard Worker bool
5783*61046927SAndroid Build Coastguard Worker anv_can_fast_clear_color_view(struct anv_device *device,
5784*61046927SAndroid Build Coastguard Worker struct anv_image_view *iview,
5785*61046927SAndroid Build Coastguard Worker VkImageLayout layout,
5786*61046927SAndroid Build Coastguard Worker union isl_color_value clear_color,
5787*61046927SAndroid Build Coastguard Worker uint32_t num_layers,
5788*61046927SAndroid Build Coastguard Worker VkRect2D render_area,
5789*61046927SAndroid Build Coastguard Worker const VkQueueFlagBits queue_flags);
5790*61046927SAndroid Build Coastguard Worker
5791*61046927SAndroid Build Coastguard Worker enum isl_aux_state ATTRIBUTE_PURE
5792*61046927SAndroid Build Coastguard Worker anv_layout_to_aux_state(const struct intel_device_info * const devinfo,
5793*61046927SAndroid Build Coastguard Worker const struct anv_image *image,
5794*61046927SAndroid Build Coastguard Worker const VkImageAspectFlagBits aspect,
5795*61046927SAndroid Build Coastguard Worker const VkImageLayout layout,
5796*61046927SAndroid Build Coastguard Worker const VkQueueFlagBits queue_flags);
5797*61046927SAndroid Build Coastguard Worker
5798*61046927SAndroid Build Coastguard Worker enum isl_aux_usage ATTRIBUTE_PURE
5799*61046927SAndroid Build Coastguard Worker anv_layout_to_aux_usage(const struct intel_device_info * const devinfo,
5800*61046927SAndroid Build Coastguard Worker const struct anv_image *image,
5801*61046927SAndroid Build Coastguard Worker const VkImageAspectFlagBits aspect,
5802*61046927SAndroid Build Coastguard Worker const VkImageUsageFlagBits usage,
5803*61046927SAndroid Build Coastguard Worker const VkImageLayout layout,
5804*61046927SAndroid Build Coastguard Worker const VkQueueFlagBits queue_flags);
5805*61046927SAndroid Build Coastguard Worker
5806*61046927SAndroid Build Coastguard Worker enum anv_fast_clear_type ATTRIBUTE_PURE
5807*61046927SAndroid Build Coastguard Worker anv_layout_to_fast_clear_type(const struct intel_device_info * const devinfo,
5808*61046927SAndroid Build Coastguard Worker const struct anv_image * const image,
5809*61046927SAndroid Build Coastguard Worker const VkImageAspectFlagBits aspect,
5810*61046927SAndroid Build Coastguard Worker const VkImageLayout layout,
5811*61046927SAndroid Build Coastguard Worker const VkQueueFlagBits queue_flags);
5812*61046927SAndroid Build Coastguard Worker
5813*61046927SAndroid Build Coastguard Worker bool ATTRIBUTE_PURE
5814*61046927SAndroid Build Coastguard Worker anv_layout_has_untracked_aux_writes(const struct intel_device_info * const devinfo,
5815*61046927SAndroid Build Coastguard Worker const struct anv_image * const image,
5816*61046927SAndroid Build Coastguard Worker const VkImageAspectFlagBits aspect,
5817*61046927SAndroid Build Coastguard Worker const VkImageLayout layout,
5818*61046927SAndroid Build Coastguard Worker const VkQueueFlagBits queue_flags);
5819*61046927SAndroid Build Coastguard Worker
5820*61046927SAndroid Build Coastguard Worker static inline bool
anv_image_aspects_compatible(VkImageAspectFlags aspects1,VkImageAspectFlags aspects2)5821*61046927SAndroid Build Coastguard Worker anv_image_aspects_compatible(VkImageAspectFlags aspects1,
5822*61046927SAndroid Build Coastguard Worker VkImageAspectFlags aspects2)
5823*61046927SAndroid Build Coastguard Worker {
5824*61046927SAndroid Build Coastguard Worker if (aspects1 == aspects2)
5825*61046927SAndroid Build Coastguard Worker return true;
5826*61046927SAndroid Build Coastguard Worker
5827*61046927SAndroid Build Coastguard Worker /* Only 1 color aspects are compatibles. */
5828*61046927SAndroid Build Coastguard Worker if ((aspects1 & VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV) != 0 &&
5829*61046927SAndroid Build Coastguard Worker (aspects2 & VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV) != 0 &&
5830*61046927SAndroid Build Coastguard Worker util_bitcount(aspects1) == util_bitcount(aspects2))
5831*61046927SAndroid Build Coastguard Worker return true;
5832*61046927SAndroid Build Coastguard Worker
5833*61046927SAndroid Build Coastguard Worker return false;
5834*61046927SAndroid Build Coastguard Worker }
5835*61046927SAndroid Build Coastguard Worker
5836*61046927SAndroid Build Coastguard Worker struct anv_image_view {
5837*61046927SAndroid Build Coastguard Worker struct vk_image_view vk;
5838*61046927SAndroid Build Coastguard Worker
5839*61046927SAndroid Build Coastguard Worker const struct anv_image *image; /**< VkImageViewCreateInfo::image */
5840*61046927SAndroid Build Coastguard Worker
5841*61046927SAndroid Build Coastguard Worker unsigned n_planes;
5842*61046927SAndroid Build Coastguard Worker
5843*61046927SAndroid Build Coastguard Worker /**
5844*61046927SAndroid Build Coastguard Worker * True if the surface states (if any) are owned by some anv_state_stream
5845*61046927SAndroid Build Coastguard Worker * from internal_surface_state_pool.
5846*61046927SAndroid Build Coastguard Worker */
5847*61046927SAndroid Build Coastguard Worker bool use_surface_state_stream;
5848*61046927SAndroid Build Coastguard Worker
5849*61046927SAndroid Build Coastguard Worker struct {
5850*61046927SAndroid Build Coastguard Worker struct isl_view isl;
5851*61046927SAndroid Build Coastguard Worker
5852*61046927SAndroid Build Coastguard Worker /**
5853*61046927SAndroid Build Coastguard Worker * A version of the image view for storage usage (can apply 3D image
5854*61046927SAndroid Build Coastguard Worker * slicing).
5855*61046927SAndroid Build Coastguard Worker */
5856*61046927SAndroid Build Coastguard Worker struct isl_view isl_storage;
5857*61046927SAndroid Build Coastguard Worker
5858*61046927SAndroid Build Coastguard Worker /**
5859*61046927SAndroid Build Coastguard Worker * RENDER_SURFACE_STATE when using image as a sampler surface with an
5860*61046927SAndroid Build Coastguard Worker * image layout of SHADER_READ_ONLY_OPTIMAL or
5861*61046927SAndroid Build Coastguard Worker * DEPTH_STENCIL_READ_ONLY_OPTIMAL.
5862*61046927SAndroid Build Coastguard Worker */
5863*61046927SAndroid Build Coastguard Worker struct anv_surface_state optimal_sampler;
5864*61046927SAndroid Build Coastguard Worker
5865*61046927SAndroid Build Coastguard Worker /**
5866*61046927SAndroid Build Coastguard Worker * RENDER_SURFACE_STATE when using image as a sampler surface with an
5867*61046927SAndroid Build Coastguard Worker * image layout of GENERAL.
5868*61046927SAndroid Build Coastguard Worker */
5869*61046927SAndroid Build Coastguard Worker struct anv_surface_state general_sampler;
5870*61046927SAndroid Build Coastguard Worker
5871*61046927SAndroid Build Coastguard Worker /**
5872*61046927SAndroid Build Coastguard Worker * RENDER_SURFACE_STATE when using image as a storage image.
5873*61046927SAndroid Build Coastguard Worker */
5874*61046927SAndroid Build Coastguard Worker struct anv_surface_state storage;
5875*61046927SAndroid Build Coastguard Worker } planes[3];
5876*61046927SAndroid Build Coastguard Worker };
5877*61046927SAndroid Build Coastguard Worker
5878*61046927SAndroid Build Coastguard Worker enum anv_image_view_state_flags {
5879*61046927SAndroid Build Coastguard Worker ANV_IMAGE_VIEW_STATE_TEXTURE_OPTIMAL = (1 << 0),
5880*61046927SAndroid Build Coastguard Worker };
5881*61046927SAndroid Build Coastguard Worker
5882*61046927SAndroid Build Coastguard Worker void anv_image_fill_surface_state(struct anv_device *device,
5883*61046927SAndroid Build Coastguard Worker const struct anv_image *image,
5884*61046927SAndroid Build Coastguard Worker VkImageAspectFlagBits aspect,
5885*61046927SAndroid Build Coastguard Worker const struct isl_view *view,
5886*61046927SAndroid Build Coastguard Worker isl_surf_usage_flags_t view_usage,
5887*61046927SAndroid Build Coastguard Worker enum isl_aux_usage aux_usage,
5888*61046927SAndroid Build Coastguard Worker const union isl_color_value *clear_color,
5889*61046927SAndroid Build Coastguard Worker enum anv_image_view_state_flags flags,
5890*61046927SAndroid Build Coastguard Worker struct anv_surface_state *state_inout);
5891*61046927SAndroid Build Coastguard Worker
5892*61046927SAndroid Build Coastguard Worker
5893*61046927SAndroid Build Coastguard Worker static inline const struct anv_surface_state *
anv_image_view_texture_surface_state(const struct anv_image_view * iview,uint32_t plane,VkImageLayout layout)5894*61046927SAndroid Build Coastguard Worker anv_image_view_texture_surface_state(const struct anv_image_view *iview,
5895*61046927SAndroid Build Coastguard Worker uint32_t plane, VkImageLayout layout)
5896*61046927SAndroid Build Coastguard Worker {
5897*61046927SAndroid Build Coastguard Worker return layout == VK_IMAGE_LAYOUT_GENERAL ?
5898*61046927SAndroid Build Coastguard Worker &iview->planes[plane].general_sampler :
5899*61046927SAndroid Build Coastguard Worker &iview->planes[plane].optimal_sampler;
5900*61046927SAndroid Build Coastguard Worker }
5901*61046927SAndroid Build Coastguard Worker
5902*61046927SAndroid Build Coastguard Worker static inline const struct anv_surface_state *
anv_image_view_storage_surface_state(const struct anv_image_view * iview)5903*61046927SAndroid Build Coastguard Worker anv_image_view_storage_surface_state(const struct anv_image_view *iview)
5904*61046927SAndroid Build Coastguard Worker {
5905*61046927SAndroid Build Coastguard Worker return &iview->planes[0].storage;
5906*61046927SAndroid Build Coastguard Worker }
5907*61046927SAndroid Build Coastguard Worker
5908*61046927SAndroid Build Coastguard Worker static inline bool
anv_cmd_graphics_state_has_image_as_attachment(const struct anv_cmd_graphics_state * state,const struct anv_image * image)5909*61046927SAndroid Build Coastguard Worker anv_cmd_graphics_state_has_image_as_attachment(const struct anv_cmd_graphics_state *state,
5910*61046927SAndroid Build Coastguard Worker const struct anv_image *image)
5911*61046927SAndroid Build Coastguard Worker {
5912*61046927SAndroid Build Coastguard Worker for (unsigned a = 0; a < state->color_att_count; a++) {
5913*61046927SAndroid Build Coastguard Worker if (state->color_att[a].iview &&
5914*61046927SAndroid Build Coastguard Worker state->color_att[a].iview->image == image)
5915*61046927SAndroid Build Coastguard Worker return true;
5916*61046927SAndroid Build Coastguard Worker }
5917*61046927SAndroid Build Coastguard Worker
5918*61046927SAndroid Build Coastguard Worker if (state->depth_att.iview && state->depth_att.iview->image == image)
5919*61046927SAndroid Build Coastguard Worker return true;
5920*61046927SAndroid Build Coastguard Worker if (state->stencil_att.iview && state->stencil_att.iview->image == image)
5921*61046927SAndroid Build Coastguard Worker return true;
5922*61046927SAndroid Build Coastguard Worker
5923*61046927SAndroid Build Coastguard Worker return false;
5924*61046927SAndroid Build Coastguard Worker }
5925*61046927SAndroid Build Coastguard Worker
5926*61046927SAndroid Build Coastguard Worker struct anv_image_create_info {
5927*61046927SAndroid Build Coastguard Worker const VkImageCreateInfo *vk_info;
5928*61046927SAndroid Build Coastguard Worker
5929*61046927SAndroid Build Coastguard Worker /** An opt-in bitmask which filters an ISL-mapping of the Vulkan tiling. */
5930*61046927SAndroid Build Coastguard Worker isl_tiling_flags_t isl_tiling_flags;
5931*61046927SAndroid Build Coastguard Worker
5932*61046927SAndroid Build Coastguard Worker /** These flags will be added to any derived from VkImageCreateInfo. */
5933*61046927SAndroid Build Coastguard Worker isl_surf_usage_flags_t isl_extra_usage_flags;
5934*61046927SAndroid Build Coastguard Worker
5935*61046927SAndroid Build Coastguard Worker /** An opt-in stride in pixels, should be 0 for implicit layouts */
5936*61046927SAndroid Build Coastguard Worker uint32_t stride;
5937*61046927SAndroid Build Coastguard Worker
5938*61046927SAndroid Build Coastguard Worker /** Whether to allocate private binding */
5939*61046927SAndroid Build Coastguard Worker bool no_private_binding_alloc;
5940*61046927SAndroid Build Coastguard Worker };
5941*61046927SAndroid Build Coastguard Worker
5942*61046927SAndroid Build Coastguard Worker VkResult anv_image_init(struct anv_device *device, struct anv_image *image,
5943*61046927SAndroid Build Coastguard Worker const struct anv_image_create_info *create_info);
5944*61046927SAndroid Build Coastguard Worker
5945*61046927SAndroid Build Coastguard Worker void anv_image_finish(struct anv_image *image);
5946*61046927SAndroid Build Coastguard Worker
5947*61046927SAndroid Build Coastguard Worker void anv_image_get_memory_requirements(struct anv_device *device,
5948*61046927SAndroid Build Coastguard Worker struct anv_image *image,
5949*61046927SAndroid Build Coastguard Worker VkImageAspectFlags aspects,
5950*61046927SAndroid Build Coastguard Worker VkMemoryRequirements2 *pMemoryRequirements);
5951*61046927SAndroid Build Coastguard Worker
5952*61046927SAndroid Build Coastguard Worker void anv_image_view_init(struct anv_device *device,
5953*61046927SAndroid Build Coastguard Worker struct anv_image_view *iview,
5954*61046927SAndroid Build Coastguard Worker const VkImageViewCreateInfo *pCreateInfo,
5955*61046927SAndroid Build Coastguard Worker struct anv_state_stream *state_stream);
5956*61046927SAndroid Build Coastguard Worker
5957*61046927SAndroid Build Coastguard Worker void anv_image_view_finish(struct anv_image_view *iview);
5958*61046927SAndroid Build Coastguard Worker
5959*61046927SAndroid Build Coastguard Worker enum isl_format
5960*61046927SAndroid Build Coastguard Worker anv_isl_format_for_descriptor_type(const struct anv_device *device,
5961*61046927SAndroid Build Coastguard Worker VkDescriptorType type);
5962*61046927SAndroid Build Coastguard Worker
5963*61046927SAndroid Build Coastguard Worker static inline isl_surf_usage_flags_t
anv_isl_usage_for_descriptor_type(const VkDescriptorType type)5964*61046927SAndroid Build Coastguard Worker anv_isl_usage_for_descriptor_type(const VkDescriptorType type)
5965*61046927SAndroid Build Coastguard Worker {
5966*61046927SAndroid Build Coastguard Worker switch(type) {
5967*61046927SAndroid Build Coastguard Worker case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
5968*61046927SAndroid Build Coastguard Worker case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
5969*61046927SAndroid Build Coastguard Worker return ISL_SURF_USAGE_CONSTANT_BUFFER_BIT;
5970*61046927SAndroid Build Coastguard Worker default:
5971*61046927SAndroid Build Coastguard Worker return ISL_SURF_USAGE_STORAGE_BIT;
5972*61046927SAndroid Build Coastguard Worker }
5973*61046927SAndroid Build Coastguard Worker }
5974*61046927SAndroid Build Coastguard Worker
5975*61046927SAndroid Build Coastguard Worker static inline uint32_t
anv_rasterization_aa_mode(VkPolygonMode raster_mode,VkLineRasterizationModeKHR line_mode)5976*61046927SAndroid Build Coastguard Worker anv_rasterization_aa_mode(VkPolygonMode raster_mode,
5977*61046927SAndroid Build Coastguard Worker VkLineRasterizationModeKHR line_mode)
5978*61046927SAndroid Build Coastguard Worker {
5979*61046927SAndroid Build Coastguard Worker if (raster_mode == VK_POLYGON_MODE_LINE &&
5980*61046927SAndroid Build Coastguard Worker line_mode == VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_KHR)
5981*61046927SAndroid Build Coastguard Worker return true;
5982*61046927SAndroid Build Coastguard Worker return false;
5983*61046927SAndroid Build Coastguard Worker }
5984*61046927SAndroid Build Coastguard Worker
5985*61046927SAndroid Build Coastguard Worker static inline VkLineRasterizationModeKHR
anv_line_rasterization_mode(VkLineRasterizationModeKHR line_mode,unsigned rasterization_samples)5986*61046927SAndroid Build Coastguard Worker anv_line_rasterization_mode(VkLineRasterizationModeKHR line_mode,
5987*61046927SAndroid Build Coastguard Worker unsigned rasterization_samples)
5988*61046927SAndroid Build Coastguard Worker {
5989*61046927SAndroid Build Coastguard Worker if (line_mode == VK_LINE_RASTERIZATION_MODE_DEFAULT_KHR) {
5990*61046927SAndroid Build Coastguard Worker if (rasterization_samples > 1) {
5991*61046927SAndroid Build Coastguard Worker return VK_LINE_RASTERIZATION_MODE_RECTANGULAR_KHR;
5992*61046927SAndroid Build Coastguard Worker } else {
5993*61046927SAndroid Build Coastguard Worker return VK_LINE_RASTERIZATION_MODE_BRESENHAM_KHR;
5994*61046927SAndroid Build Coastguard Worker }
5995*61046927SAndroid Build Coastguard Worker }
5996*61046927SAndroid Build Coastguard Worker return line_mode;
5997*61046927SAndroid Build Coastguard Worker }
5998*61046927SAndroid Build Coastguard Worker
5999*61046927SAndroid Build Coastguard Worker static inline bool
anv_is_dual_src_blend_factor(VkBlendFactor factor)6000*61046927SAndroid Build Coastguard Worker anv_is_dual_src_blend_factor(VkBlendFactor factor)
6001*61046927SAndroid Build Coastguard Worker {
6002*61046927SAndroid Build Coastguard Worker return factor == VK_BLEND_FACTOR_SRC1_COLOR ||
6003*61046927SAndroid Build Coastguard Worker factor == VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR ||
6004*61046927SAndroid Build Coastguard Worker factor == VK_BLEND_FACTOR_SRC1_ALPHA ||
6005*61046927SAndroid Build Coastguard Worker factor == VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA;
6006*61046927SAndroid Build Coastguard Worker }
6007*61046927SAndroid Build Coastguard Worker
6008*61046927SAndroid Build Coastguard Worker static inline bool
anv_is_dual_src_blend_equation(const struct vk_color_blend_attachment_state * cb)6009*61046927SAndroid Build Coastguard Worker anv_is_dual_src_blend_equation(const struct vk_color_blend_attachment_state *cb)
6010*61046927SAndroid Build Coastguard Worker {
6011*61046927SAndroid Build Coastguard Worker return anv_is_dual_src_blend_factor(cb->src_color_blend_factor) &&
6012*61046927SAndroid Build Coastguard Worker anv_is_dual_src_blend_factor(cb->dst_color_blend_factor) &&
6013*61046927SAndroid Build Coastguard Worker anv_is_dual_src_blend_factor(cb->src_alpha_blend_factor) &&
6014*61046927SAndroid Build Coastguard Worker anv_is_dual_src_blend_factor(cb->dst_alpha_blend_factor);
6015*61046927SAndroid Build Coastguard Worker }
6016*61046927SAndroid Build Coastguard Worker
6017*61046927SAndroid Build Coastguard Worker VkFormatFeatureFlags2
6018*61046927SAndroid Build Coastguard Worker anv_get_image_format_features2(const struct anv_physical_device *physical_device,
6019*61046927SAndroid Build Coastguard Worker VkFormat vk_format,
6020*61046927SAndroid Build Coastguard Worker const struct anv_format *anv_format,
6021*61046927SAndroid Build Coastguard Worker VkImageTiling vk_tiling,
6022*61046927SAndroid Build Coastguard Worker const struct isl_drm_modifier_info *isl_mod_info);
6023*61046927SAndroid Build Coastguard Worker
6024*61046927SAndroid Build Coastguard Worker void anv_fill_buffer_surface_state(struct anv_device *device,
6025*61046927SAndroid Build Coastguard Worker void *surface_state_ptr,
6026*61046927SAndroid Build Coastguard Worker enum isl_format format,
6027*61046927SAndroid Build Coastguard Worker struct isl_swizzle swizzle,
6028*61046927SAndroid Build Coastguard Worker isl_surf_usage_flags_t usage,
6029*61046927SAndroid Build Coastguard Worker struct anv_address address,
6030*61046927SAndroid Build Coastguard Worker uint32_t range, uint32_t stride);
6031*61046927SAndroid Build Coastguard Worker
6032*61046927SAndroid Build Coastguard Worker
6033*61046927SAndroid Build Coastguard Worker struct gfx8_border_color {
6034*61046927SAndroid Build Coastguard Worker union {
6035*61046927SAndroid Build Coastguard Worker float float32[4];
6036*61046927SAndroid Build Coastguard Worker uint32_t uint32[4];
6037*61046927SAndroid Build Coastguard Worker };
6038*61046927SAndroid Build Coastguard Worker /* Pad out to 64 bytes */
6039*61046927SAndroid Build Coastguard Worker uint32_t _pad[12];
6040*61046927SAndroid Build Coastguard Worker };
6041*61046927SAndroid Build Coastguard Worker
6042*61046927SAndroid Build Coastguard Worker struct anv_sampler {
6043*61046927SAndroid Build Coastguard Worker struct vk_sampler vk;
6044*61046927SAndroid Build Coastguard Worker
6045*61046927SAndroid Build Coastguard Worker /* Hash of the sampler state + border color, useful for embedded samplers
6046*61046927SAndroid Build Coastguard Worker * and included in the descriptor layout hash.
6047*61046927SAndroid Build Coastguard Worker */
6048*61046927SAndroid Build Coastguard Worker unsigned char sha1[20];
6049*61046927SAndroid Build Coastguard Worker
6050*61046927SAndroid Build Coastguard Worker uint32_t state[3][4];
6051*61046927SAndroid Build Coastguard Worker /* Packed SAMPLER_STATE without the border color pointer. */
6052*61046927SAndroid Build Coastguard Worker uint32_t state_no_bc[3][4];
6053*61046927SAndroid Build Coastguard Worker uint32_t n_planes;
6054*61046927SAndroid Build Coastguard Worker
6055*61046927SAndroid Build Coastguard Worker /* Blob of sampler state data which is guaranteed to be 32-byte aligned
6056*61046927SAndroid Build Coastguard Worker * and with a 32-byte stride for use as bindless samplers.
6057*61046927SAndroid Build Coastguard Worker */
6058*61046927SAndroid Build Coastguard Worker struct anv_state bindless_state;
6059*61046927SAndroid Build Coastguard Worker
6060*61046927SAndroid Build Coastguard Worker struct anv_state custom_border_color;
6061*61046927SAndroid Build Coastguard Worker };
6062*61046927SAndroid Build Coastguard Worker
6063*61046927SAndroid Build Coastguard Worker
6064*61046927SAndroid Build Coastguard Worker struct anv_query_pool {
6065*61046927SAndroid Build Coastguard Worker struct vk_query_pool vk;
6066*61046927SAndroid Build Coastguard Worker
6067*61046927SAndroid Build Coastguard Worker /** Stride between queries, in bytes */
6068*61046927SAndroid Build Coastguard Worker uint32_t stride;
6069*61046927SAndroid Build Coastguard Worker /** Number of slots in this query pool */
6070*61046927SAndroid Build Coastguard Worker struct anv_bo * bo;
6071*61046927SAndroid Build Coastguard Worker
6072*61046927SAndroid Build Coastguard Worker /** Location for the KHR_performance_query small batch updating
6073*61046927SAndroid Build Coastguard Worker * ANV_PERF_QUERY_OFFSET_REG
6074*61046927SAndroid Build Coastguard Worker */
6075*61046927SAndroid Build Coastguard Worker uint32_t khr_perf_preambles_offset;
6076*61046927SAndroid Build Coastguard Worker
6077*61046927SAndroid Build Coastguard Worker /** Size of each small batch */
6078*61046927SAndroid Build Coastguard Worker uint32_t khr_perf_preamble_stride;
6079*61046927SAndroid Build Coastguard Worker
6080*61046927SAndroid Build Coastguard Worker /* KHR perf queries : */
6081*61046927SAndroid Build Coastguard Worker /** Query pass size in bytes(availability + padding + query data) */
6082*61046927SAndroid Build Coastguard Worker uint32_t pass_size;
6083*61046927SAndroid Build Coastguard Worker /** Offset of the query data within a pass */
6084*61046927SAndroid Build Coastguard Worker uint32_t data_offset;
6085*61046927SAndroid Build Coastguard Worker /** query data / 2 */
6086*61046927SAndroid Build Coastguard Worker uint32_t snapshot_size;
6087*61046927SAndroid Build Coastguard Worker uint32_t n_counters;
6088*61046927SAndroid Build Coastguard Worker struct intel_perf_counter_pass *counter_pass;
6089*61046927SAndroid Build Coastguard Worker uint32_t n_passes;
6090*61046927SAndroid Build Coastguard Worker struct intel_perf_query_info **pass_query;
6091*61046927SAndroid Build Coastguard Worker
6092*61046927SAndroid Build Coastguard Worker /* Video encoding queries */
6093*61046927SAndroid Build Coastguard Worker VkVideoCodecOperationFlagsKHR codec;
6094*61046927SAndroid Build Coastguard Worker };
6095*61046927SAndroid Build Coastguard Worker
khr_perf_query_preamble_offset(const struct anv_query_pool * pool,uint32_t pass)6096*61046927SAndroid Build Coastguard Worker static inline uint32_t khr_perf_query_preamble_offset(const struct anv_query_pool *pool,
6097*61046927SAndroid Build Coastguard Worker uint32_t pass)
6098*61046927SAndroid Build Coastguard Worker {
6099*61046927SAndroid Build Coastguard Worker return pool->khr_perf_preambles_offset +
6100*61046927SAndroid Build Coastguard Worker pool->khr_perf_preamble_stride * pass;
6101*61046927SAndroid Build Coastguard Worker }
6102*61046927SAndroid Build Coastguard Worker
6103*61046927SAndroid Build Coastguard Worker struct anv_vid_mem {
6104*61046927SAndroid Build Coastguard Worker struct anv_device_memory *mem;
6105*61046927SAndroid Build Coastguard Worker VkDeviceSize offset;
6106*61046927SAndroid Build Coastguard Worker VkDeviceSize size;
6107*61046927SAndroid Build Coastguard Worker };
6108*61046927SAndroid Build Coastguard Worker
6109*61046927SAndroid Build Coastguard Worker #define ANV_MB_WIDTH 16
6110*61046927SAndroid Build Coastguard Worker #define ANV_MB_HEIGHT 16
6111*61046927SAndroid Build Coastguard Worker #define ANV_VIDEO_H264_MAX_NUM_REF_FRAME 16
6112*61046927SAndroid Build Coastguard Worker #define ANV_VIDEO_H265_MAX_NUM_REF_FRAME 16
6113*61046927SAndroid Build Coastguard Worker #define ANV_VIDEO_H265_HCP_NUM_REF_FRAME 8
6114*61046927SAndroid Build Coastguard Worker #define ANV_MAX_H265_CTB_SIZE 64
6115*61046927SAndroid Build Coastguard Worker
6116*61046927SAndroid Build Coastguard Worker enum anv_vid_mem_h264_types {
6117*61046927SAndroid Build Coastguard Worker ANV_VID_MEM_H264_INTRA_ROW_STORE,
6118*61046927SAndroid Build Coastguard Worker ANV_VID_MEM_H264_DEBLOCK_FILTER_ROW_STORE,
6119*61046927SAndroid Build Coastguard Worker ANV_VID_MEM_H264_BSD_MPC_ROW_SCRATCH,
6120*61046927SAndroid Build Coastguard Worker ANV_VID_MEM_H264_MPR_ROW_SCRATCH,
6121*61046927SAndroid Build Coastguard Worker ANV_VID_MEM_H264_MAX,
6122*61046927SAndroid Build Coastguard Worker };
6123*61046927SAndroid Build Coastguard Worker
6124*61046927SAndroid Build Coastguard Worker enum anv_vid_mem_h265_types {
6125*61046927SAndroid Build Coastguard Worker ANV_VID_MEM_H265_DEBLOCK_FILTER_ROW_STORE_LINE,
6126*61046927SAndroid Build Coastguard Worker ANV_VID_MEM_H265_DEBLOCK_FILTER_ROW_STORE_TILE_LINE,
6127*61046927SAndroid Build Coastguard Worker ANV_VID_MEM_H265_DEBLOCK_FILTER_ROW_STORE_TILE_COLUMN,
6128*61046927SAndroid Build Coastguard Worker ANV_VID_MEM_H265_METADATA_LINE,
6129*61046927SAndroid Build Coastguard Worker ANV_VID_MEM_H265_METADATA_TILE_LINE,
6130*61046927SAndroid Build Coastguard Worker ANV_VID_MEM_H265_METADATA_TILE_COLUMN,
6131*61046927SAndroid Build Coastguard Worker ANV_VID_MEM_H265_SAO_LINE,
6132*61046927SAndroid Build Coastguard Worker ANV_VID_MEM_H265_SAO_TILE_LINE,
6133*61046927SAndroid Build Coastguard Worker ANV_VID_MEM_H265_SAO_TILE_COLUMN,
6134*61046927SAndroid Build Coastguard Worker ANV_VID_MEM_H265_DEC_MAX,
6135*61046927SAndroid Build Coastguard Worker ANV_VID_MEM_H265_SSE_SRC_PIX_ROW_STORE = ANV_VID_MEM_H265_DEC_MAX,
6136*61046927SAndroid Build Coastguard Worker ANV_VID_MEM_H265_ENC_MAX,
6137*61046927SAndroid Build Coastguard Worker };
6138*61046927SAndroid Build Coastguard Worker
6139*61046927SAndroid Build Coastguard Worker struct anv_video_session {
6140*61046927SAndroid Build Coastguard Worker struct vk_video_session vk;
6141*61046927SAndroid Build Coastguard Worker
6142*61046927SAndroid Build Coastguard Worker /* the decoder needs some private memory allocations */
6143*61046927SAndroid Build Coastguard Worker struct anv_vid_mem vid_mem[ANV_VID_MEM_H265_ENC_MAX];
6144*61046927SAndroid Build Coastguard Worker };
6145*61046927SAndroid Build Coastguard Worker
6146*61046927SAndroid Build Coastguard Worker struct anv_video_session_params {
6147*61046927SAndroid Build Coastguard Worker struct vk_video_session_parameters vk;
6148*61046927SAndroid Build Coastguard Worker VkVideoEncodeRateControlModeFlagBitsKHR rc_mode;
6149*61046927SAndroid Build Coastguard Worker };
6150*61046927SAndroid Build Coastguard Worker
6151*61046927SAndroid Build Coastguard Worker void
6152*61046927SAndroid Build Coastguard Worker anv_dump_pipe_bits(enum anv_pipe_bits bits, FILE *f);
6153*61046927SAndroid Build Coastguard Worker
6154*61046927SAndroid Build Coastguard Worker static inline void
anv_add_pending_pipe_bits(struct anv_cmd_buffer * cmd_buffer,enum anv_pipe_bits bits,const char * reason)6155*61046927SAndroid Build Coastguard Worker anv_add_pending_pipe_bits(struct anv_cmd_buffer* cmd_buffer,
6156*61046927SAndroid Build Coastguard Worker enum anv_pipe_bits bits,
6157*61046927SAndroid Build Coastguard Worker const char* reason)
6158*61046927SAndroid Build Coastguard Worker {
6159*61046927SAndroid Build Coastguard Worker cmd_buffer->state.pending_pipe_bits |= bits;
6160*61046927SAndroid Build Coastguard Worker if (INTEL_DEBUG(DEBUG_PIPE_CONTROL) && bits) {
6161*61046927SAndroid Build Coastguard Worker fputs("pc: add ", stdout);
6162*61046927SAndroid Build Coastguard Worker anv_dump_pipe_bits(bits, stdout);
6163*61046927SAndroid Build Coastguard Worker fprintf(stdout, "reason: %s\n", reason);
6164*61046927SAndroid Build Coastguard Worker }
6165*61046927SAndroid Build Coastguard Worker if (cmd_buffer->batch.pc_reasons_count < ARRAY_SIZE(cmd_buffer->batch.pc_reasons)) {
6166*61046927SAndroid Build Coastguard Worker cmd_buffer->batch.pc_reasons[cmd_buffer->batch.pc_reasons_count++] = reason;
6167*61046927SAndroid Build Coastguard Worker }
6168*61046927SAndroid Build Coastguard Worker }
6169*61046927SAndroid Build Coastguard Worker
6170*61046927SAndroid Build Coastguard Worker struct anv_performance_configuration_intel {
6171*61046927SAndroid Build Coastguard Worker struct vk_object_base base;
6172*61046927SAndroid Build Coastguard Worker
6173*61046927SAndroid Build Coastguard Worker struct intel_perf_registers *register_config;
6174*61046927SAndroid Build Coastguard Worker
6175*61046927SAndroid Build Coastguard Worker uint64_t config_id;
6176*61046927SAndroid Build Coastguard Worker };
6177*61046927SAndroid Build Coastguard Worker
6178*61046927SAndroid Build Coastguard Worker void anv_physical_device_init_va_ranges(struct anv_physical_device *device);
6179*61046927SAndroid Build Coastguard Worker void anv_physical_device_init_perf(struct anv_physical_device *device, int fd);
6180*61046927SAndroid Build Coastguard Worker void anv_device_perf_init(struct anv_device *device);
6181*61046927SAndroid Build Coastguard Worker void anv_device_perf_close(struct anv_device *device);
6182*61046927SAndroid Build Coastguard Worker void anv_perf_write_pass_results(struct intel_perf_config *perf,
6183*61046927SAndroid Build Coastguard Worker struct anv_query_pool *pool, uint32_t pass,
6184*61046927SAndroid Build Coastguard Worker const struct intel_perf_query_result *accumulated_results,
6185*61046927SAndroid Build Coastguard Worker union VkPerformanceCounterResultKHR *results);
6186*61046927SAndroid Build Coastguard Worker
6187*61046927SAndroid Build Coastguard Worker void anv_apply_per_prim_attr_wa(struct nir_shader *ms_nir,
6188*61046927SAndroid Build Coastguard Worker struct nir_shader *fs_nir,
6189*61046927SAndroid Build Coastguard Worker struct anv_device *device,
6190*61046927SAndroid Build Coastguard Worker const VkGraphicsPipelineCreateInfo *info);
6191*61046927SAndroid Build Coastguard Worker
6192*61046927SAndroid Build Coastguard Worker /* Use to emit a series of memcpy operations */
6193*61046927SAndroid Build Coastguard Worker struct anv_memcpy_state {
6194*61046927SAndroid Build Coastguard Worker struct anv_device *device;
6195*61046927SAndroid Build Coastguard Worker struct anv_cmd_buffer *cmd_buffer;
6196*61046927SAndroid Build Coastguard Worker struct anv_batch *batch;
6197*61046927SAndroid Build Coastguard Worker
6198*61046927SAndroid Build Coastguard Worker /* Configuration programmed by the memcpy operation */
6199*61046927SAndroid Build Coastguard Worker struct intel_urb_config urb_cfg;
6200*61046927SAndroid Build Coastguard Worker
6201*61046927SAndroid Build Coastguard Worker struct anv_vb_cache_range vb_bound;
6202*61046927SAndroid Build Coastguard Worker struct anv_vb_cache_range vb_dirty;
6203*61046927SAndroid Build Coastguard Worker };
6204*61046927SAndroid Build Coastguard Worker
6205*61046927SAndroid Build Coastguard Worker VkResult anv_device_init_internal_kernels(struct anv_device *device);
6206*61046927SAndroid Build Coastguard Worker void anv_device_finish_internal_kernels(struct anv_device *device);
6207*61046927SAndroid Build Coastguard Worker VkResult anv_device_get_internal_shader(struct anv_device *device,
6208*61046927SAndroid Build Coastguard Worker enum anv_internal_kernel_name name,
6209*61046927SAndroid Build Coastguard Worker struct anv_shader_bin **out_bin);
6210*61046927SAndroid Build Coastguard Worker
6211*61046927SAndroid Build Coastguard Worker VkResult anv_device_init_astc_emu(struct anv_device *device);
6212*61046927SAndroid Build Coastguard Worker void anv_device_finish_astc_emu(struct anv_device *device);
6213*61046927SAndroid Build Coastguard Worker void anv_astc_emu_process(struct anv_cmd_buffer *cmd_buffer,
6214*61046927SAndroid Build Coastguard Worker struct anv_image *image,
6215*61046927SAndroid Build Coastguard Worker VkImageLayout layout,
6216*61046927SAndroid Build Coastguard Worker const VkImageSubresourceLayers *subresource,
6217*61046927SAndroid Build Coastguard Worker VkOffset3D block_offset,
6218*61046927SAndroid Build Coastguard Worker VkExtent3D block_extent);
6219*61046927SAndroid Build Coastguard Worker
6220*61046927SAndroid Build Coastguard Worker /* This structure is used in 2 scenarios :
6221*61046927SAndroid Build Coastguard Worker *
6222*61046927SAndroid Build Coastguard Worker * - copy utrace timestamps from command buffer so that command buffer can
6223*61046927SAndroid Build Coastguard Worker * be resubmitted multiple times without the recorded timestamps being
6224*61046927SAndroid Build Coastguard Worker * overwritten before they're read back
6225*61046927SAndroid Build Coastguard Worker *
6226*61046927SAndroid Build Coastguard Worker * - emit trace points for queue debug tagging
6227*61046927SAndroid Build Coastguard Worker * (vkQueueBeginDebugUtilsLabelEXT/vkQueueEndDebugUtilsLabelEXT)
6228*61046927SAndroid Build Coastguard Worker */
6229*61046927SAndroid Build Coastguard Worker struct anv_utrace_submit {
6230*61046927SAndroid Build Coastguard Worker struct anv_async_submit base;
6231*61046927SAndroid Build Coastguard Worker
6232*61046927SAndroid Build Coastguard Worker /* structure used by the perfetto glue */
6233*61046927SAndroid Build Coastguard Worker struct intel_ds_flush_data ds;
6234*61046927SAndroid Build Coastguard Worker
6235*61046927SAndroid Build Coastguard Worker /* Stream for temporary allocations */
6236*61046927SAndroid Build Coastguard Worker struct anv_state_stream dynamic_state_stream;
6237*61046927SAndroid Build Coastguard Worker struct anv_state_stream general_state_stream;
6238*61046927SAndroid Build Coastguard Worker
6239*61046927SAndroid Build Coastguard Worker /* Last fully read 64bit timestamp (used to rebuild the upper bits of 32bit
6240*61046927SAndroid Build Coastguard Worker * timestamps)
6241*61046927SAndroid Build Coastguard Worker */
6242*61046927SAndroid Build Coastguard Worker uint64_t last_full_timestamp;
6243*61046927SAndroid Build Coastguard Worker
6244*61046927SAndroid Build Coastguard Worker /* Memcpy state tracking (only used for timestamp copies on render engine) */
6245*61046927SAndroid Build Coastguard Worker struct anv_memcpy_state memcpy_state;
6246*61046927SAndroid Build Coastguard Worker
6247*61046927SAndroid Build Coastguard Worker /* Memcpy state tracking (only used for timestamp copies on compute engine) */
6248*61046927SAndroid Build Coastguard Worker struct anv_simple_shader simple_state;
6249*61046927SAndroid Build Coastguard Worker };
6250*61046927SAndroid Build Coastguard Worker
6251*61046927SAndroid Build Coastguard Worker void anv_device_utrace_init(struct anv_device *device);
6252*61046927SAndroid Build Coastguard Worker void anv_device_utrace_finish(struct anv_device *device);
6253*61046927SAndroid Build Coastguard Worker VkResult
6254*61046927SAndroid Build Coastguard Worker anv_device_utrace_flush_cmd_buffers(struct anv_queue *queue,
6255*61046927SAndroid Build Coastguard Worker uint32_t cmd_buffer_count,
6256*61046927SAndroid Build Coastguard Worker struct anv_cmd_buffer **cmd_buffers,
6257*61046927SAndroid Build Coastguard Worker struct anv_utrace_submit **out_submit);
6258*61046927SAndroid Build Coastguard Worker
6259*61046927SAndroid Build Coastguard Worker void
6260*61046927SAndroid Build Coastguard Worker anv_device_utrace_emit_gfx_copy_buffer(struct u_trace_context *utctx,
6261*61046927SAndroid Build Coastguard Worker void *cmdstream,
6262*61046927SAndroid Build Coastguard Worker void *ts_from, uint64_t from_offset_B,
6263*61046927SAndroid Build Coastguard Worker void *ts_to, uint64_t to_offset_B,
6264*61046927SAndroid Build Coastguard Worker uint64_t size_B);
6265*61046927SAndroid Build Coastguard Worker
6266*61046927SAndroid Build Coastguard Worker static bool
anv_has_cooperative_matrix(const struct anv_physical_device * device)6267*61046927SAndroid Build Coastguard Worker anv_has_cooperative_matrix(const struct anv_physical_device *device)
6268*61046927SAndroid Build Coastguard Worker {
6269*61046927SAndroid Build Coastguard Worker return device->has_cooperative_matrix;
6270*61046927SAndroid Build Coastguard Worker }
6271*61046927SAndroid Build Coastguard Worker
6272*61046927SAndroid Build Coastguard Worker #define ANV_FROM_HANDLE(__anv_type, __name, __handle) \
6273*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(__anv_type, __name, __handle)
6274*61046927SAndroid Build Coastguard Worker
6275*61046927SAndroid Build Coastguard Worker VK_DEFINE_HANDLE_CASTS(anv_cmd_buffer, vk.base, VkCommandBuffer,
6276*61046927SAndroid Build Coastguard Worker VK_OBJECT_TYPE_COMMAND_BUFFER)
6277*61046927SAndroid Build Coastguard Worker VK_DEFINE_HANDLE_CASTS(anv_device, vk.base, VkDevice, VK_OBJECT_TYPE_DEVICE)
6278*61046927SAndroid Build Coastguard Worker VK_DEFINE_HANDLE_CASTS(anv_instance, vk.base, VkInstance, VK_OBJECT_TYPE_INSTANCE)
6279*61046927SAndroid Build Coastguard Worker VK_DEFINE_HANDLE_CASTS(anv_physical_device, vk.base, VkPhysicalDevice,
6280*61046927SAndroid Build Coastguard Worker VK_OBJECT_TYPE_PHYSICAL_DEVICE)
6281*61046927SAndroid Build Coastguard Worker VK_DEFINE_HANDLE_CASTS(anv_queue, vk.base, VkQueue, VK_OBJECT_TYPE_QUEUE)
6282*61046927SAndroid Build Coastguard Worker
6283*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(anv_buffer, vk.base, VkBuffer,
6284*61046927SAndroid Build Coastguard Worker VK_OBJECT_TYPE_BUFFER)
6285*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(anv_buffer_view, vk.base, VkBufferView,
6286*61046927SAndroid Build Coastguard Worker VK_OBJECT_TYPE_BUFFER_VIEW)
6287*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(anv_descriptor_pool, base, VkDescriptorPool,
6288*61046927SAndroid Build Coastguard Worker VK_OBJECT_TYPE_DESCRIPTOR_POOL)
6289*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(anv_descriptor_set, base, VkDescriptorSet,
6290*61046927SAndroid Build Coastguard Worker VK_OBJECT_TYPE_DESCRIPTOR_SET)
6291*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(anv_descriptor_set_layout, base,
6292*61046927SAndroid Build Coastguard Worker VkDescriptorSetLayout,
6293*61046927SAndroid Build Coastguard Worker VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT)
6294*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(anv_device_memory, vk.base, VkDeviceMemory,
6295*61046927SAndroid Build Coastguard Worker VK_OBJECT_TYPE_DEVICE_MEMORY)
6296*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(anv_event, base, VkEvent, VK_OBJECT_TYPE_EVENT)
6297*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(anv_image, vk.base, VkImage, VK_OBJECT_TYPE_IMAGE)
6298*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(anv_image_view, vk.base, VkImageView,
6299*61046927SAndroid Build Coastguard Worker VK_OBJECT_TYPE_IMAGE_VIEW);
6300*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(anv_pipeline, base, VkPipeline,
6301*61046927SAndroid Build Coastguard Worker VK_OBJECT_TYPE_PIPELINE)
6302*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(anv_pipeline_layout, base, VkPipelineLayout,
6303*61046927SAndroid Build Coastguard Worker VK_OBJECT_TYPE_PIPELINE_LAYOUT)
6304*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(anv_query_pool, vk.base, VkQueryPool,
6305*61046927SAndroid Build Coastguard Worker VK_OBJECT_TYPE_QUERY_POOL)
6306*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(anv_sampler, vk.base, VkSampler,
6307*61046927SAndroid Build Coastguard Worker VK_OBJECT_TYPE_SAMPLER)
6308*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(anv_performance_configuration_intel, base,
6309*61046927SAndroid Build Coastguard Worker VkPerformanceConfigurationINTEL,
6310*61046927SAndroid Build Coastguard Worker VK_OBJECT_TYPE_PERFORMANCE_CONFIGURATION_INTEL)
6311*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(anv_video_session, vk.base,
6312*61046927SAndroid Build Coastguard Worker VkVideoSessionKHR,
6313*61046927SAndroid Build Coastguard Worker VK_OBJECT_TYPE_VIDEO_SESSION_KHR)
6314*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(anv_video_session_params, vk.base,
6315*61046927SAndroid Build Coastguard Worker VkVideoSessionParametersKHR,
6316*61046927SAndroid Build Coastguard Worker VK_OBJECT_TYPE_VIDEO_SESSION_PARAMETERS_KHR)
6317*61046927SAndroid Build Coastguard Worker
6318*61046927SAndroid Build Coastguard Worker #define anv_genX(devinfo, thing) ({ \
6319*61046927SAndroid Build Coastguard Worker __typeof(&gfx9_##thing) genX_thing; \
6320*61046927SAndroid Build Coastguard Worker switch ((devinfo)->verx10) { \
6321*61046927SAndroid Build Coastguard Worker case 90: \
6322*61046927SAndroid Build Coastguard Worker genX_thing = &gfx9_##thing; \
6323*61046927SAndroid Build Coastguard Worker break; \
6324*61046927SAndroid Build Coastguard Worker case 110: \
6325*61046927SAndroid Build Coastguard Worker genX_thing = &gfx11_##thing; \
6326*61046927SAndroid Build Coastguard Worker break; \
6327*61046927SAndroid Build Coastguard Worker case 120: \
6328*61046927SAndroid Build Coastguard Worker genX_thing = &gfx12_##thing; \
6329*61046927SAndroid Build Coastguard Worker break; \
6330*61046927SAndroid Build Coastguard Worker case 125: \
6331*61046927SAndroid Build Coastguard Worker genX_thing = &gfx125_##thing; \
6332*61046927SAndroid Build Coastguard Worker break; \
6333*61046927SAndroid Build Coastguard Worker case 200: \
6334*61046927SAndroid Build Coastguard Worker genX_thing = &gfx20_##thing; \
6335*61046927SAndroid Build Coastguard Worker break; \
6336*61046927SAndroid Build Coastguard Worker default: \
6337*61046927SAndroid Build Coastguard Worker unreachable("Unknown hardware generation"); \
6338*61046927SAndroid Build Coastguard Worker } \
6339*61046927SAndroid Build Coastguard Worker genX_thing; \
6340*61046927SAndroid Build Coastguard Worker })
6341*61046927SAndroid Build Coastguard Worker
6342*61046927SAndroid Build Coastguard Worker /* Gen-specific function declarations */
6343*61046927SAndroid Build Coastguard Worker #ifdef genX
6344*61046927SAndroid Build Coastguard Worker # include "anv_genX.h"
6345*61046927SAndroid Build Coastguard Worker #else
6346*61046927SAndroid Build Coastguard Worker # define genX(x) gfx9_##x
6347*61046927SAndroid Build Coastguard Worker # include "anv_genX.h"
6348*61046927SAndroid Build Coastguard Worker # undef genX
6349*61046927SAndroid Build Coastguard Worker # define genX(x) gfx11_##x
6350*61046927SAndroid Build Coastguard Worker # include "anv_genX.h"
6351*61046927SAndroid Build Coastguard Worker # undef genX
6352*61046927SAndroid Build Coastguard Worker # define genX(x) gfx12_##x
6353*61046927SAndroid Build Coastguard Worker # include "anv_genX.h"
6354*61046927SAndroid Build Coastguard Worker # undef genX
6355*61046927SAndroid Build Coastguard Worker # define genX(x) gfx125_##x
6356*61046927SAndroid Build Coastguard Worker # include "anv_genX.h"
6357*61046927SAndroid Build Coastguard Worker # undef genX
6358*61046927SAndroid Build Coastguard Worker # define genX(x) gfx20_##x
6359*61046927SAndroid Build Coastguard Worker # include "anv_genX.h"
6360*61046927SAndroid Build Coastguard Worker # undef genX
6361*61046927SAndroid Build Coastguard Worker #endif
6362*61046927SAndroid Build Coastguard Worker
6363*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus
6364*61046927SAndroid Build Coastguard Worker }
6365*61046927SAndroid Build Coastguard Worker #endif
6366*61046927SAndroid Build Coastguard Worker
6367*61046927SAndroid Build Coastguard Worker #endif /* ANV_PRIVATE_H */
6368