xref: /aosp_15_r20/external/mesa3d/src/broadcom/vulkan/v3dv_private.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2019 Raspberry Pi Ltd
3*61046927SAndroid Build Coastguard Worker  *
4*61046927SAndroid Build Coastguard Worker  * based in part on anv driver which is:
5*61046927SAndroid Build Coastguard Worker  * Copyright © 2015 Intel Corporation
6*61046927SAndroid Build Coastguard Worker  *
7*61046927SAndroid Build Coastguard Worker  * based in part on radv driver which is:
8*61046927SAndroid Build Coastguard Worker  * Copyright © 2016 Red Hat.
9*61046927SAndroid Build Coastguard Worker  * Copyright © 2016 Bas Nieuwenhuizen
10*61046927SAndroid Build Coastguard Worker  *
11*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
12*61046927SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
13*61046927SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
14*61046927SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
15*61046927SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
16*61046927SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
17*61046927SAndroid Build Coastguard Worker  *
18*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
19*61046927SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
20*61046927SAndroid Build Coastguard Worker  * Software.
21*61046927SAndroid Build Coastguard Worker  *
22*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23*61046927SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24*61046927SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
25*61046927SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26*61046927SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
27*61046927SAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
28*61046927SAndroid Build Coastguard Worker  * IN THE SOFTWARE.
29*61046927SAndroid Build Coastguard Worker  */
30*61046927SAndroid Build Coastguard Worker #ifndef V3DV_PRIVATE_H
31*61046927SAndroid Build Coastguard Worker #define V3DV_PRIVATE_H
32*61046927SAndroid Build Coastguard Worker 
33*61046927SAndroid Build Coastguard Worker #include <stdio.h>
34*61046927SAndroid Build Coastguard Worker #include <string.h>
35*61046927SAndroid Build Coastguard Worker #include <vulkan/vulkan.h>
36*61046927SAndroid Build Coastguard Worker #include <vulkan/vk_icd.h>
37*61046927SAndroid Build Coastguard Worker #include <vk_enum_to_str.h>
38*61046927SAndroid Build Coastguard Worker 
39*61046927SAndroid Build Coastguard Worker #include "vk_descriptor_update_template.h"
40*61046927SAndroid Build Coastguard Worker #include "vk_device.h"
41*61046927SAndroid Build Coastguard Worker #include "vk_device_memory.h"
42*61046927SAndroid Build Coastguard Worker #include "vk_format.h"
43*61046927SAndroid Build Coastguard Worker #include "vk_instance.h"
44*61046927SAndroid Build Coastguard Worker #include "vk_image.h"
45*61046927SAndroid Build Coastguard Worker #include "vk_log.h"
46*61046927SAndroid Build Coastguard Worker #include "vk_physical_device.h"
47*61046927SAndroid Build Coastguard Worker #include "vk_shader_module.h"
48*61046927SAndroid Build Coastguard Worker #include "vk_sync.h"
49*61046927SAndroid Build Coastguard Worker #include "vk_sync_timeline.h"
50*61046927SAndroid Build Coastguard Worker #include "vk_util.h"
51*61046927SAndroid Build Coastguard Worker #include "vk_ycbcr_conversion.h"
52*61046927SAndroid Build Coastguard Worker 
53*61046927SAndroid Build Coastguard Worker #include "vk_command_buffer.h"
54*61046927SAndroid Build Coastguard Worker #include "vk_command_pool.h"
55*61046927SAndroid Build Coastguard Worker #include "vk_queue.h"
56*61046927SAndroid Build Coastguard Worker #include "vk_pipeline.h"
57*61046927SAndroid Build Coastguard Worker 
58*61046927SAndroid Build Coastguard Worker #include <xf86drm.h>
59*61046927SAndroid Build Coastguard Worker 
60*61046927SAndroid Build Coastguard Worker #ifdef HAVE_VALGRIND
61*61046927SAndroid Build Coastguard Worker #include <valgrind.h>
62*61046927SAndroid Build Coastguard Worker #include <memcheck.h>
63*61046927SAndroid Build Coastguard Worker #define VG(x) x
64*61046927SAndroid Build Coastguard Worker #else
65*61046927SAndroid Build Coastguard Worker #define VG(x) ((void)0)
66*61046927SAndroid Build Coastguard Worker #endif
67*61046927SAndroid Build Coastguard Worker 
68*61046927SAndroid Build Coastguard Worker #include "util/detect_os.h"
69*61046927SAndroid Build Coastguard Worker 
70*61046927SAndroid Build Coastguard Worker #include "v3dv_limits.h"
71*61046927SAndroid Build Coastguard Worker 
72*61046927SAndroid Build Coastguard Worker #include "common/v3d_device_info.h"
73*61046927SAndroid Build Coastguard Worker #include "common/v3d_limits.h"
74*61046927SAndroid Build Coastguard Worker #include "common/v3d_tiling.h"
75*61046927SAndroid Build Coastguard Worker #include "common/v3d_util.h"
76*61046927SAndroid Build Coastguard Worker 
77*61046927SAndroid Build Coastguard Worker #include "compiler/shader_enums.h"
78*61046927SAndroid Build Coastguard Worker #include "compiler/spirv/nir_spirv.h"
79*61046927SAndroid Build Coastguard Worker 
80*61046927SAndroid Build Coastguard Worker #include "compiler/v3d_compiler.h"
81*61046927SAndroid Build Coastguard Worker 
82*61046927SAndroid Build Coastguard Worker #include "vk_debug_report.h"
83*61046927SAndroid Build Coastguard Worker #include "util/set.h"
84*61046927SAndroid Build Coastguard Worker #include "util/hash_table.h"
85*61046927SAndroid Build Coastguard Worker #include "util/sparse_array.h"
86*61046927SAndroid Build Coastguard Worker #include "util/xmlconfig.h"
87*61046927SAndroid Build Coastguard Worker #include "util/u_atomic.h"
88*61046927SAndroid Build Coastguard Worker 
89*61046927SAndroid Build Coastguard Worker #include "v3dv_entrypoints.h"
90*61046927SAndroid Build Coastguard Worker #include "v3dv_bo.h"
91*61046927SAndroid Build Coastguard Worker 
92*61046927SAndroid Build Coastguard Worker #include "drm-uapi/v3d_drm.h"
93*61046927SAndroid Build Coastguard Worker 
94*61046927SAndroid Build Coastguard Worker #include "vk_alloc.h"
95*61046927SAndroid Build Coastguard Worker #include "simulator/v3d_simulator.h"
96*61046927SAndroid Build Coastguard Worker 
97*61046927SAndroid Build Coastguard Worker #include "v3dv_cl.h"
98*61046927SAndroid Build Coastguard Worker 
99*61046927SAndroid Build Coastguard Worker #include "wsi_common.h"
100*61046927SAndroid Build Coastguard Worker 
101*61046927SAndroid Build Coastguard Worker /* A non-fatal assert.  Useful for debugging. */
102*61046927SAndroid Build Coastguard Worker #if MESA_DEBUG
103*61046927SAndroid Build Coastguard Worker #define v3dv_assert(x) ({ \
104*61046927SAndroid Build Coastguard Worker    if (unlikely(!(x))) \
105*61046927SAndroid Build Coastguard Worker       fprintf(stderr, "%s:%d ASSERT: %s", __FILE__, __LINE__, #x); \
106*61046927SAndroid Build Coastguard Worker })
107*61046927SAndroid Build Coastguard Worker #else
108*61046927SAndroid Build Coastguard Worker #define v3dv_assert(x)
109*61046927SAndroid Build Coastguard Worker #endif
110*61046927SAndroid Build Coastguard Worker 
111*61046927SAndroid Build Coastguard Worker #define perf_debug(...) do {                       \
112*61046927SAndroid Build Coastguard Worker    if (V3D_DBG(PERF))                            \
113*61046927SAndroid Build Coastguard Worker       fprintf(stderr, __VA_ARGS__);                \
114*61046927SAndroid Build Coastguard Worker } while (0)
115*61046927SAndroid Build Coastguard Worker 
116*61046927SAndroid Build Coastguard Worker struct v3dv_instance;
117*61046927SAndroid Build Coastguard Worker 
118*61046927SAndroid Build Coastguard Worker struct v3d_simulator_file;
119*61046927SAndroid Build Coastguard Worker 
120*61046927SAndroid Build Coastguard Worker /* Minimum required by the Vulkan 1.1 spec */
121*61046927SAndroid Build Coastguard Worker #define MAX_MEMORY_ALLOCATION_SIZE (1ull << 30)
122*61046927SAndroid Build Coastguard Worker 
123*61046927SAndroid Build Coastguard Worker /* Maximum performance counters number */
124*61046927SAndroid Build Coastguard Worker #define V3D_MAX_PERFCNT 93
125*61046927SAndroid Build Coastguard Worker 
126*61046927SAndroid Build Coastguard Worker struct v3dv_physical_device {
127*61046927SAndroid Build Coastguard Worker    struct vk_physical_device vk;
128*61046927SAndroid Build Coastguard Worker 
129*61046927SAndroid Build Coastguard Worker    char *name;
130*61046927SAndroid Build Coastguard Worker    int32_t render_fd;
131*61046927SAndroid Build Coastguard Worker    int32_t display_fd;
132*61046927SAndroid Build Coastguard Worker 
133*61046927SAndroid Build Coastguard Worker    /* We need these because it is not clear how to detect
134*61046927SAndroid Build Coastguard Worker     * valid devids in a portable way
135*61046927SAndroid Build Coastguard Worker      */
136*61046927SAndroid Build Coastguard Worker    bool has_primary;
137*61046927SAndroid Build Coastguard Worker    bool has_render;
138*61046927SAndroid Build Coastguard Worker 
139*61046927SAndroid Build Coastguard Worker    dev_t primary_devid;
140*61046927SAndroid Build Coastguard Worker    dev_t render_devid;
141*61046927SAndroid Build Coastguard Worker 
142*61046927SAndroid Build Coastguard Worker #if USE_V3D_SIMULATOR
143*61046927SAndroid Build Coastguard Worker    uint32_t device_id;
144*61046927SAndroid Build Coastguard Worker #endif
145*61046927SAndroid Build Coastguard Worker 
146*61046927SAndroid Build Coastguard Worker    uint8_t driver_build_sha1[20];
147*61046927SAndroid Build Coastguard Worker    uint8_t pipeline_cache_uuid[VK_UUID_SIZE];
148*61046927SAndroid Build Coastguard Worker    uint8_t device_uuid[VK_UUID_SIZE];
149*61046927SAndroid Build Coastguard Worker    uint8_t driver_uuid[VK_UUID_SIZE];
150*61046927SAndroid Build Coastguard Worker 
151*61046927SAndroid Build Coastguard Worker    struct vk_sync_type drm_syncobj_type;
152*61046927SAndroid Build Coastguard Worker    struct vk_sync_timeline_type sync_timeline_type;
153*61046927SAndroid Build Coastguard Worker    const struct vk_sync_type *sync_types[3];
154*61046927SAndroid Build Coastguard Worker 
155*61046927SAndroid Build Coastguard Worker    struct disk_cache *disk_cache;
156*61046927SAndroid Build Coastguard Worker 
157*61046927SAndroid Build Coastguard Worker    mtx_t mutex;
158*61046927SAndroid Build Coastguard Worker 
159*61046927SAndroid Build Coastguard Worker    struct wsi_device wsi_device;
160*61046927SAndroid Build Coastguard Worker 
161*61046927SAndroid Build Coastguard Worker    VkPhysicalDeviceMemoryProperties memory;
162*61046927SAndroid Build Coastguard Worker 
163*61046927SAndroid Build Coastguard Worker    struct v3d_device_info devinfo;
164*61046927SAndroid Build Coastguard Worker 
165*61046927SAndroid Build Coastguard Worker #if USE_V3D_SIMULATOR
166*61046927SAndroid Build Coastguard Worker    struct v3d_simulator_file *sim_file;
167*61046927SAndroid Build Coastguard Worker #endif
168*61046927SAndroid Build Coastguard Worker 
169*61046927SAndroid Build Coastguard Worker    const struct v3d_compiler *compiler;
170*61046927SAndroid Build Coastguard Worker    uint32_t next_program_id;
171*61046927SAndroid Build Coastguard Worker 
172*61046927SAndroid Build Coastguard Worker    alignas(8) uint64_t heap_used;
173*61046927SAndroid Build Coastguard Worker 
174*61046927SAndroid Build Coastguard Worker    /* This array holds all our 'struct v3dv_bo' allocations. We use this
175*61046927SAndroid Build Coastguard Worker     * so we can add a refcount to our BOs and check if a particular BO
176*61046927SAndroid Build Coastguard Worker     * was already allocated in this device using its GEM handle. This is
177*61046927SAndroid Build Coastguard Worker     * necessary to properly manage BO imports, because the kernel doesn't
178*61046927SAndroid Build Coastguard Worker     * refcount the underlying BO memory.
179*61046927SAndroid Build Coastguard Worker     *
180*61046927SAndroid Build Coastguard Worker     * Specifically, when self-importing (i.e. importing a BO into the same
181*61046927SAndroid Build Coastguard Worker     * device that created it), the kernel will give us the same BO handle
182*61046927SAndroid Build Coastguard Worker     * for both BOs and we must only free it once when  both references are
183*61046927SAndroid Build Coastguard Worker     * freed. Otherwise, if we are not self-importing, we get two different BO
184*61046927SAndroid Build Coastguard Worker     * handles, and we want to free each one individually.
185*61046927SAndroid Build Coastguard Worker     *
186*61046927SAndroid Build Coastguard Worker     * The BOs in this map all have a refcnt with the reference counter and
187*61046927SAndroid Build Coastguard Worker     * only self-imported BOs will ever have a refcnt > 1.
188*61046927SAndroid Build Coastguard Worker     */
189*61046927SAndroid Build Coastguard Worker    struct util_sparse_array bo_map;
190*61046927SAndroid Build Coastguard Worker 
191*61046927SAndroid Build Coastguard Worker    struct {
192*61046927SAndroid Build Coastguard Worker       bool merge_jobs;
193*61046927SAndroid Build Coastguard Worker    } options;
194*61046927SAndroid Build Coastguard Worker 
195*61046927SAndroid Build Coastguard Worker    struct {
196*61046927SAndroid Build Coastguard Worker       bool cpu_queue;
197*61046927SAndroid Build Coastguard Worker       bool multisync;
198*61046927SAndroid Build Coastguard Worker       bool perfmon;
199*61046927SAndroid Build Coastguard Worker    } caps;
200*61046927SAndroid Build Coastguard Worker };
201*61046927SAndroid Build Coastguard Worker 
202*61046927SAndroid Build Coastguard Worker static inline struct v3dv_bo *
v3dv_device_lookup_bo(struct v3dv_physical_device * device,uint32_t handle)203*61046927SAndroid Build Coastguard Worker v3dv_device_lookup_bo(struct v3dv_physical_device *device, uint32_t handle)
204*61046927SAndroid Build Coastguard Worker {
205*61046927SAndroid Build Coastguard Worker    return (struct v3dv_bo *) util_sparse_array_get(&device->bo_map, handle);
206*61046927SAndroid Build Coastguard Worker }
207*61046927SAndroid Build Coastguard Worker 
208*61046927SAndroid Build Coastguard Worker VkResult v3dv_wsi_init(struct v3dv_physical_device *physical_device);
209*61046927SAndroid Build Coastguard Worker void v3dv_wsi_finish(struct v3dv_physical_device *physical_device);
210*61046927SAndroid Build Coastguard Worker struct v3dv_image *v3dv_wsi_get_image_from_swapchain(VkSwapchainKHR swapchain,
211*61046927SAndroid Build Coastguard Worker                                                      uint32_t index);
212*61046927SAndroid Build Coastguard Worker 
213*61046927SAndroid Build Coastguard Worker void v3dv_meta_clear_init(struct v3dv_device *device);
214*61046927SAndroid Build Coastguard Worker void v3dv_meta_clear_finish(struct v3dv_device *device);
215*61046927SAndroid Build Coastguard Worker 
216*61046927SAndroid Build Coastguard Worker void v3dv_meta_blit_init(struct v3dv_device *device);
217*61046927SAndroid Build Coastguard Worker void v3dv_meta_blit_finish(struct v3dv_device *device);
218*61046927SAndroid Build Coastguard Worker 
219*61046927SAndroid Build Coastguard Worker void v3dv_meta_texel_buffer_copy_init(struct v3dv_device *device);
220*61046927SAndroid Build Coastguard Worker void v3dv_meta_texel_buffer_copy_finish(struct v3dv_device *device);
221*61046927SAndroid Build Coastguard Worker 
222*61046927SAndroid Build Coastguard Worker bool v3dv_meta_can_use_tlb(struct v3dv_image *image,
223*61046927SAndroid Build Coastguard Worker                            uint8_t plane,
224*61046927SAndroid Build Coastguard Worker                            uint8_t miplevel,
225*61046927SAndroid Build Coastguard Worker                            const VkOffset3D *offset,
226*61046927SAndroid Build Coastguard Worker                            const VkExtent3D *extent,
227*61046927SAndroid Build Coastguard Worker                            VkFormat *compat_format);
228*61046927SAndroid Build Coastguard Worker 
229*61046927SAndroid Build Coastguard Worker struct v3dv_instance {
230*61046927SAndroid Build Coastguard Worker    struct vk_instance vk;
231*61046927SAndroid Build Coastguard Worker 
232*61046927SAndroid Build Coastguard Worker    bool pipeline_cache_enabled;
233*61046927SAndroid Build Coastguard Worker    bool default_pipeline_cache_enabled;
234*61046927SAndroid Build Coastguard Worker    bool meta_cache_enabled;
235*61046927SAndroid Build Coastguard Worker };
236*61046927SAndroid Build Coastguard Worker 
237*61046927SAndroid Build Coastguard Worker /* FIXME: In addition to tracking the last job submitted by GPU queue (cl, csd,
238*61046927SAndroid Build Coastguard Worker  * tfu), we still need a syncobj to track the last overall job submitted
239*61046927SAndroid Build Coastguard Worker  * (V3DV_QUEUE_ANY) for the case we don't support multisync. Someday we can
240*61046927SAndroid Build Coastguard Worker  * start expecting multisync to be present and drop the legacy implementation
241*61046927SAndroid Build Coastguard Worker  * together with this V3DV_QUEUE_ANY tracker.
242*61046927SAndroid Build Coastguard Worker  */
243*61046927SAndroid Build Coastguard Worker enum v3dv_queue_type {
244*61046927SAndroid Build Coastguard Worker    V3DV_QUEUE_CL = 0,
245*61046927SAndroid Build Coastguard Worker    V3DV_QUEUE_CSD,
246*61046927SAndroid Build Coastguard Worker    V3DV_QUEUE_TFU,
247*61046927SAndroid Build Coastguard Worker    V3DV_QUEUE_CPU,
248*61046927SAndroid Build Coastguard Worker    V3DV_QUEUE_ANY,
249*61046927SAndroid Build Coastguard Worker    V3DV_QUEUE_COUNT,
250*61046927SAndroid Build Coastguard Worker };
251*61046927SAndroid Build Coastguard Worker 
252*61046927SAndroid Build Coastguard Worker /* For each GPU queue, we use a syncobj to track the last job submitted. We
253*61046927SAndroid Build Coastguard Worker  * set the flag `first` to determine when we are starting a new cmd buffer
254*61046927SAndroid Build Coastguard Worker  * batch and therefore a job submitted to a given queue will be the first in a
255*61046927SAndroid Build Coastguard Worker  * cmd buf batch.
256*61046927SAndroid Build Coastguard Worker  */
257*61046927SAndroid Build Coastguard Worker struct v3dv_last_job_sync {
258*61046927SAndroid Build Coastguard Worker    /* If the job is the first submitted to a GPU queue in a cmd buffer batch.
259*61046927SAndroid Build Coastguard Worker     *
260*61046927SAndroid Build Coastguard Worker     * We use V3DV_QUEUE_{CL,CSD,TFU} both with and without multisync.
261*61046927SAndroid Build Coastguard Worker     */
262*61046927SAndroid Build Coastguard Worker    bool first[V3DV_QUEUE_COUNT];
263*61046927SAndroid Build Coastguard Worker    /* Array of syncobj to track the last job submitted to a GPU queue.
264*61046927SAndroid Build Coastguard Worker     *
265*61046927SAndroid Build Coastguard Worker     * With multisync we use V3DV_QUEUE_{CL,CSD,TFU} to track syncobjs for each
266*61046927SAndroid Build Coastguard Worker     * queue, but without multisync we only track the last job submitted to any
267*61046927SAndroid Build Coastguard Worker     * queue in V3DV_QUEUE_ANY.
268*61046927SAndroid Build Coastguard Worker     */
269*61046927SAndroid Build Coastguard Worker    uint32_t syncs[V3DV_QUEUE_COUNT];
270*61046927SAndroid Build Coastguard Worker };
271*61046927SAndroid Build Coastguard Worker 
272*61046927SAndroid Build Coastguard Worker struct v3dv_queue {
273*61046927SAndroid Build Coastguard Worker    struct vk_queue vk;
274*61046927SAndroid Build Coastguard Worker 
275*61046927SAndroid Build Coastguard Worker    struct v3dv_device *device;
276*61046927SAndroid Build Coastguard Worker 
277*61046927SAndroid Build Coastguard Worker    struct v3dv_last_job_sync last_job_syncs;
278*61046927SAndroid Build Coastguard Worker 
279*61046927SAndroid Build Coastguard Worker    struct v3dv_job *noop_job;
280*61046927SAndroid Build Coastguard Worker 
281*61046927SAndroid Build Coastguard Worker    /* The last active perfmon ID to prevent mixing of counter results when a
282*61046927SAndroid Build Coastguard Worker     * job is submitted with a different perfmon id.
283*61046927SAndroid Build Coastguard Worker     */
284*61046927SAndroid Build Coastguard Worker    uint32_t last_perfmon_id;
285*61046927SAndroid Build Coastguard Worker };
286*61046927SAndroid Build Coastguard Worker 
287*61046927SAndroid Build Coastguard Worker VkResult v3dv_queue_driver_submit(struct vk_queue *vk_queue,
288*61046927SAndroid Build Coastguard Worker                                   struct vk_queue_submit *submit);
289*61046927SAndroid Build Coastguard Worker 
290*61046927SAndroid Build Coastguard Worker #define V3DV_META_BLIT_CACHE_KEY_SIZE              (4 * sizeof(uint32_t))
291*61046927SAndroid Build Coastguard Worker #define V3DV_META_TEXEL_BUFFER_COPY_CACHE_KEY_SIZE (3 * sizeof(uint32_t) + \
292*61046927SAndroid Build Coastguard Worker                                                     sizeof(VkComponentMapping))
293*61046927SAndroid Build Coastguard Worker 
294*61046927SAndroid Build Coastguard Worker struct v3dv_meta_color_clear_pipeline {
295*61046927SAndroid Build Coastguard Worker    VkPipeline pipeline;
296*61046927SAndroid Build Coastguard Worker    VkRenderPass pass;
297*61046927SAndroid Build Coastguard Worker    bool cached;
298*61046927SAndroid Build Coastguard Worker    uint64_t key;
299*61046927SAndroid Build Coastguard Worker };
300*61046927SAndroid Build Coastguard Worker 
301*61046927SAndroid Build Coastguard Worker struct v3dv_meta_depth_clear_pipeline {
302*61046927SAndroid Build Coastguard Worker    VkPipeline pipeline;
303*61046927SAndroid Build Coastguard Worker    uint64_t key;
304*61046927SAndroid Build Coastguard Worker };
305*61046927SAndroid Build Coastguard Worker 
306*61046927SAndroid Build Coastguard Worker struct v3dv_meta_blit_pipeline {
307*61046927SAndroid Build Coastguard Worker    VkPipeline pipeline;
308*61046927SAndroid Build Coastguard Worker    VkRenderPass pass;
309*61046927SAndroid Build Coastguard Worker    VkRenderPass pass_no_load;
310*61046927SAndroid Build Coastguard Worker    uint8_t key[V3DV_META_BLIT_CACHE_KEY_SIZE];
311*61046927SAndroid Build Coastguard Worker };
312*61046927SAndroid Build Coastguard Worker 
313*61046927SAndroid Build Coastguard Worker struct v3dv_meta_texel_buffer_copy_pipeline {
314*61046927SAndroid Build Coastguard Worker    VkPipeline pipeline;
315*61046927SAndroid Build Coastguard Worker    VkRenderPass pass;
316*61046927SAndroid Build Coastguard Worker    VkRenderPass pass_no_load;
317*61046927SAndroid Build Coastguard Worker    uint8_t key[V3DV_META_TEXEL_BUFFER_COPY_CACHE_KEY_SIZE];
318*61046927SAndroid Build Coastguard Worker };
319*61046927SAndroid Build Coastguard Worker 
320*61046927SAndroid Build Coastguard Worker struct v3dv_pipeline_key {
321*61046927SAndroid Build Coastguard Worker    uint8_t topology;
322*61046927SAndroid Build Coastguard Worker    uint8_t logicop_func;
323*61046927SAndroid Build Coastguard Worker    bool msaa;
324*61046927SAndroid Build Coastguard Worker    bool sample_alpha_to_coverage;
325*61046927SAndroid Build Coastguard Worker    bool sample_alpha_to_one;
326*61046927SAndroid Build Coastguard Worker    uint8_t cbufs;
327*61046927SAndroid Build Coastguard Worker    struct {
328*61046927SAndroid Build Coastguard Worker       enum pipe_format format;
329*61046927SAndroid Build Coastguard Worker       uint8_t swizzle[4];
330*61046927SAndroid Build Coastguard Worker    } color_fmt[V3D_MAX_DRAW_BUFFERS];
331*61046927SAndroid Build Coastguard Worker    uint8_t f32_color_rb;
332*61046927SAndroid Build Coastguard Worker    uint32_t va_swap_rb_mask;
333*61046927SAndroid Build Coastguard Worker    bool has_multiview;
334*61046927SAndroid Build Coastguard Worker    bool line_smooth;
335*61046927SAndroid Build Coastguard Worker };
336*61046927SAndroid Build Coastguard Worker 
337*61046927SAndroid Build Coastguard Worker struct v3dv_pipeline_cache_stats {
338*61046927SAndroid Build Coastguard Worker    uint32_t miss;
339*61046927SAndroid Build Coastguard Worker    uint32_t hit;
340*61046927SAndroid Build Coastguard Worker    uint32_t count;
341*61046927SAndroid Build Coastguard Worker    uint32_t on_disk_hit;
342*61046927SAndroid Build Coastguard Worker };
343*61046927SAndroid Build Coastguard Worker 
344*61046927SAndroid Build Coastguard Worker /* Equivalent to gl_shader_stage, but including the coordinate shaders
345*61046927SAndroid Build Coastguard Worker  *
346*61046927SAndroid Build Coastguard Worker  * FIXME: perhaps move to common
347*61046927SAndroid Build Coastguard Worker  */
348*61046927SAndroid Build Coastguard Worker enum broadcom_shader_stage {
349*61046927SAndroid Build Coastguard Worker    BROADCOM_SHADER_VERTEX,
350*61046927SAndroid Build Coastguard Worker    BROADCOM_SHADER_VERTEX_BIN,
351*61046927SAndroid Build Coastguard Worker    BROADCOM_SHADER_GEOMETRY,
352*61046927SAndroid Build Coastguard Worker    BROADCOM_SHADER_GEOMETRY_BIN,
353*61046927SAndroid Build Coastguard Worker    BROADCOM_SHADER_FRAGMENT,
354*61046927SAndroid Build Coastguard Worker    BROADCOM_SHADER_COMPUTE,
355*61046927SAndroid Build Coastguard Worker };
356*61046927SAndroid Build Coastguard Worker 
357*61046927SAndroid Build Coastguard Worker #define BROADCOM_SHADER_STAGES (BROADCOM_SHADER_COMPUTE + 1)
358*61046927SAndroid Build Coastguard Worker 
359*61046927SAndroid Build Coastguard Worker /* Assumes that coordinate shaders will be custom-handled by the caller */
360*61046927SAndroid Build Coastguard Worker static inline enum broadcom_shader_stage
gl_shader_stage_to_broadcom(gl_shader_stage stage)361*61046927SAndroid Build Coastguard Worker gl_shader_stage_to_broadcom(gl_shader_stage stage)
362*61046927SAndroid Build Coastguard Worker {
363*61046927SAndroid Build Coastguard Worker    switch (stage) {
364*61046927SAndroid Build Coastguard Worker    case MESA_SHADER_VERTEX:
365*61046927SAndroid Build Coastguard Worker       return BROADCOM_SHADER_VERTEX;
366*61046927SAndroid Build Coastguard Worker    case MESA_SHADER_GEOMETRY:
367*61046927SAndroid Build Coastguard Worker       return BROADCOM_SHADER_GEOMETRY;
368*61046927SAndroid Build Coastguard Worker    case MESA_SHADER_FRAGMENT:
369*61046927SAndroid Build Coastguard Worker       return BROADCOM_SHADER_FRAGMENT;
370*61046927SAndroid Build Coastguard Worker    case MESA_SHADER_COMPUTE:
371*61046927SAndroid Build Coastguard Worker       return BROADCOM_SHADER_COMPUTE;
372*61046927SAndroid Build Coastguard Worker    default:
373*61046927SAndroid Build Coastguard Worker       unreachable("Unknown gl shader stage");
374*61046927SAndroid Build Coastguard Worker    }
375*61046927SAndroid Build Coastguard Worker }
376*61046927SAndroid Build Coastguard Worker 
377*61046927SAndroid Build Coastguard Worker static inline gl_shader_stage
broadcom_shader_stage_to_gl(enum broadcom_shader_stage stage)378*61046927SAndroid Build Coastguard Worker broadcom_shader_stage_to_gl(enum broadcom_shader_stage stage)
379*61046927SAndroid Build Coastguard Worker {
380*61046927SAndroid Build Coastguard Worker    switch (stage) {
381*61046927SAndroid Build Coastguard Worker    case BROADCOM_SHADER_VERTEX:
382*61046927SAndroid Build Coastguard Worker    case BROADCOM_SHADER_VERTEX_BIN:
383*61046927SAndroid Build Coastguard Worker       return MESA_SHADER_VERTEX;
384*61046927SAndroid Build Coastguard Worker    case BROADCOM_SHADER_GEOMETRY:
385*61046927SAndroid Build Coastguard Worker    case BROADCOM_SHADER_GEOMETRY_BIN:
386*61046927SAndroid Build Coastguard Worker       return MESA_SHADER_GEOMETRY;
387*61046927SAndroid Build Coastguard Worker    case BROADCOM_SHADER_FRAGMENT:
388*61046927SAndroid Build Coastguard Worker       return MESA_SHADER_FRAGMENT;
389*61046927SAndroid Build Coastguard Worker    case BROADCOM_SHADER_COMPUTE:
390*61046927SAndroid Build Coastguard Worker       return MESA_SHADER_COMPUTE;
391*61046927SAndroid Build Coastguard Worker    default:
392*61046927SAndroid Build Coastguard Worker       unreachable("Unknown broadcom shader stage");
393*61046927SAndroid Build Coastguard Worker    }
394*61046927SAndroid Build Coastguard Worker }
395*61046927SAndroid Build Coastguard Worker 
396*61046927SAndroid Build Coastguard Worker static inline bool
broadcom_shader_stage_is_binning(enum broadcom_shader_stage stage)397*61046927SAndroid Build Coastguard Worker broadcom_shader_stage_is_binning(enum broadcom_shader_stage stage)
398*61046927SAndroid Build Coastguard Worker {
399*61046927SAndroid Build Coastguard Worker    switch (stage) {
400*61046927SAndroid Build Coastguard Worker    case BROADCOM_SHADER_VERTEX_BIN:
401*61046927SAndroid Build Coastguard Worker    case BROADCOM_SHADER_GEOMETRY_BIN:
402*61046927SAndroid Build Coastguard Worker       return true;
403*61046927SAndroid Build Coastguard Worker    default:
404*61046927SAndroid Build Coastguard Worker       return false;
405*61046927SAndroid Build Coastguard Worker    }
406*61046927SAndroid Build Coastguard Worker }
407*61046927SAndroid Build Coastguard Worker 
408*61046927SAndroid Build Coastguard Worker static inline bool
broadcom_shader_stage_is_render_with_binning(enum broadcom_shader_stage stage)409*61046927SAndroid Build Coastguard Worker broadcom_shader_stage_is_render_with_binning(enum broadcom_shader_stage stage)
410*61046927SAndroid Build Coastguard Worker {
411*61046927SAndroid Build Coastguard Worker    switch (stage) {
412*61046927SAndroid Build Coastguard Worker    case BROADCOM_SHADER_VERTEX:
413*61046927SAndroid Build Coastguard Worker    case BROADCOM_SHADER_GEOMETRY:
414*61046927SAndroid Build Coastguard Worker       return true;
415*61046927SAndroid Build Coastguard Worker    default:
416*61046927SAndroid Build Coastguard Worker       return false;
417*61046927SAndroid Build Coastguard Worker    }
418*61046927SAndroid Build Coastguard Worker }
419*61046927SAndroid Build Coastguard Worker 
420*61046927SAndroid Build Coastguard Worker static inline enum broadcom_shader_stage
broadcom_binning_shader_stage_for_render_stage(enum broadcom_shader_stage stage)421*61046927SAndroid Build Coastguard Worker broadcom_binning_shader_stage_for_render_stage(enum broadcom_shader_stage stage)
422*61046927SAndroid Build Coastguard Worker {
423*61046927SAndroid Build Coastguard Worker    switch (stage) {
424*61046927SAndroid Build Coastguard Worker    case BROADCOM_SHADER_VERTEX:
425*61046927SAndroid Build Coastguard Worker       return BROADCOM_SHADER_VERTEX_BIN;
426*61046927SAndroid Build Coastguard Worker    case BROADCOM_SHADER_GEOMETRY:
427*61046927SAndroid Build Coastguard Worker       return BROADCOM_SHADER_GEOMETRY_BIN;
428*61046927SAndroid Build Coastguard Worker    default:
429*61046927SAndroid Build Coastguard Worker       unreachable("Invalid shader stage");
430*61046927SAndroid Build Coastguard Worker    }
431*61046927SAndroid Build Coastguard Worker }
432*61046927SAndroid Build Coastguard Worker 
433*61046927SAndroid Build Coastguard Worker static inline const char *
broadcom_shader_stage_name(enum broadcom_shader_stage stage)434*61046927SAndroid Build Coastguard Worker broadcom_shader_stage_name(enum broadcom_shader_stage stage)
435*61046927SAndroid Build Coastguard Worker {
436*61046927SAndroid Build Coastguard Worker    switch(stage) {
437*61046927SAndroid Build Coastguard Worker    case BROADCOM_SHADER_VERTEX_BIN:
438*61046927SAndroid Build Coastguard Worker       return "MESA_SHADER_VERTEX_BIN";
439*61046927SAndroid Build Coastguard Worker    case BROADCOM_SHADER_GEOMETRY_BIN:
440*61046927SAndroid Build Coastguard Worker       return "MESA_SHADER_GEOMETRY_BIN";
441*61046927SAndroid Build Coastguard Worker    default:
442*61046927SAndroid Build Coastguard Worker       return gl_shader_stage_name(broadcom_shader_stage_to_gl(stage));
443*61046927SAndroid Build Coastguard Worker    }
444*61046927SAndroid Build Coastguard Worker }
445*61046927SAndroid Build Coastguard Worker 
446*61046927SAndroid Build Coastguard Worker struct v3dv_pipeline_cache {
447*61046927SAndroid Build Coastguard Worker    struct vk_object_base base;
448*61046927SAndroid Build Coastguard Worker 
449*61046927SAndroid Build Coastguard Worker    struct v3dv_device *device;
450*61046927SAndroid Build Coastguard Worker    mtx_t mutex;
451*61046927SAndroid Build Coastguard Worker 
452*61046927SAndroid Build Coastguard Worker    struct hash_table *nir_cache;
453*61046927SAndroid Build Coastguard Worker    struct v3dv_pipeline_cache_stats nir_stats;
454*61046927SAndroid Build Coastguard Worker 
455*61046927SAndroid Build Coastguard Worker    struct hash_table *cache;
456*61046927SAndroid Build Coastguard Worker    struct v3dv_pipeline_cache_stats stats;
457*61046927SAndroid Build Coastguard Worker 
458*61046927SAndroid Build Coastguard Worker    /* For VK_EXT_pipeline_creation_cache_control. */
459*61046927SAndroid Build Coastguard Worker    bool externally_synchronized;
460*61046927SAndroid Build Coastguard Worker };
461*61046927SAndroid Build Coastguard Worker 
462*61046927SAndroid Build Coastguard Worker struct v3dv_device {
463*61046927SAndroid Build Coastguard Worker    struct vk_device vk;
464*61046927SAndroid Build Coastguard Worker 
465*61046927SAndroid Build Coastguard Worker    struct v3dv_instance *instance;
466*61046927SAndroid Build Coastguard Worker    struct v3dv_physical_device *pdevice;
467*61046927SAndroid Build Coastguard Worker 
468*61046927SAndroid Build Coastguard Worker    struct v3d_device_info devinfo;
469*61046927SAndroid Build Coastguard Worker    struct v3dv_queue queue;
470*61046927SAndroid Build Coastguard Worker 
471*61046927SAndroid Build Coastguard Worker    /* Guards query->maybe_available and value for timestamps */
472*61046927SAndroid Build Coastguard Worker    mtx_t query_mutex;
473*61046927SAndroid Build Coastguard Worker 
474*61046927SAndroid Build Coastguard Worker    /* Signaled whenever a query is ended */
475*61046927SAndroid Build Coastguard Worker    cnd_t query_ended;
476*61046927SAndroid Build Coastguard Worker 
477*61046927SAndroid Build Coastguard Worker    /* Resources used for meta operations */
478*61046927SAndroid Build Coastguard Worker    struct {
479*61046927SAndroid Build Coastguard Worker       mtx_t mtx;
480*61046927SAndroid Build Coastguard Worker       struct {
481*61046927SAndroid Build Coastguard Worker          VkPipelineLayout p_layout;
482*61046927SAndroid Build Coastguard Worker          struct hash_table *cache; /* v3dv_meta_color_clear_pipeline */
483*61046927SAndroid Build Coastguard Worker       } color_clear;
484*61046927SAndroid Build Coastguard Worker       struct {
485*61046927SAndroid Build Coastguard Worker          VkPipelineLayout p_layout;
486*61046927SAndroid Build Coastguard Worker          struct hash_table *cache; /* v3dv_meta_depth_clear_pipeline */
487*61046927SAndroid Build Coastguard Worker       } depth_clear;
488*61046927SAndroid Build Coastguard Worker       struct {
489*61046927SAndroid Build Coastguard Worker          VkDescriptorSetLayout ds_layout;
490*61046927SAndroid Build Coastguard Worker          VkPipelineLayout p_layout;
491*61046927SAndroid Build Coastguard Worker          struct hash_table *cache[3]; /* v3dv_meta_blit_pipeline for 1d, 2d, 3d */
492*61046927SAndroid Build Coastguard Worker       } blit;
493*61046927SAndroid Build Coastguard Worker       struct {
494*61046927SAndroid Build Coastguard Worker          VkDescriptorSetLayout ds_layout;
495*61046927SAndroid Build Coastguard Worker          VkPipelineLayout p_layout;
496*61046927SAndroid Build Coastguard Worker          struct hash_table *cache[3]; /* v3dv_meta_texel_buffer_copy_pipeline for 1d, 2d, 3d */
497*61046927SAndroid Build Coastguard Worker       } texel_buffer_copy;
498*61046927SAndroid Build Coastguard Worker    } meta;
499*61046927SAndroid Build Coastguard Worker 
500*61046927SAndroid Build Coastguard Worker    struct v3dv_bo_cache {
501*61046927SAndroid Build Coastguard Worker       /** List of struct v3d_bo freed, by age. */
502*61046927SAndroid Build Coastguard Worker       struct list_head time_list;
503*61046927SAndroid Build Coastguard Worker       /** List of struct v3d_bo freed, per size, by age. */
504*61046927SAndroid Build Coastguard Worker       struct list_head *size_list;
505*61046927SAndroid Build Coastguard Worker       uint32_t size_list_size;
506*61046927SAndroid Build Coastguard Worker 
507*61046927SAndroid Build Coastguard Worker       mtx_t lock;
508*61046927SAndroid Build Coastguard Worker 
509*61046927SAndroid Build Coastguard Worker       uint32_t cache_size;
510*61046927SAndroid Build Coastguard Worker       uint32_t cache_count;
511*61046927SAndroid Build Coastguard Worker       uint32_t max_cache_size;
512*61046927SAndroid Build Coastguard Worker    } bo_cache;
513*61046927SAndroid Build Coastguard Worker 
514*61046927SAndroid Build Coastguard Worker    uint32_t bo_size;
515*61046927SAndroid Build Coastguard Worker    uint32_t bo_count;
516*61046927SAndroid Build Coastguard Worker 
517*61046927SAndroid Build Coastguard Worker    /* Event handling resources.
518*61046927SAndroid Build Coastguard Worker     *
519*61046927SAndroid Build Coastguard Worker     * Our implementation of events uses a BO to store event state (signaled vs
520*61046927SAndroid Build Coastguard Worker     * reset) and dispatches compute shaders to handle GPU event functions
521*61046927SAndroid Build Coastguard Worker     * (signal, reset, wait). This struct holds all the resources required
522*61046927SAndroid Build Coastguard Worker     * by the implementation.
523*61046927SAndroid Build Coastguard Worker     */
524*61046927SAndroid Build Coastguard Worker    struct {
525*61046927SAndroid Build Coastguard Worker       mtx_t lock;
526*61046927SAndroid Build Coastguard Worker 
527*61046927SAndroid Build Coastguard Worker       /* BO for the event states: signaled (1) or reset (0) */
528*61046927SAndroid Build Coastguard Worker       struct v3dv_bo *bo;
529*61046927SAndroid Build Coastguard Worker 
530*61046927SAndroid Build Coastguard Worker       /* We pre-allocate all the events we can fit for the size of the BO we
531*61046927SAndroid Build Coastguard Worker        * create to track their states, where each event has an index which is
532*61046927SAndroid Build Coastguard Worker        * basically the offset of its state in that BO. We keep a free list with
533*61046927SAndroid Build Coastguard Worker        * the pre-allocated events that are available.
534*61046927SAndroid Build Coastguard Worker        */
535*61046927SAndroid Build Coastguard Worker       uint32_t event_count;
536*61046927SAndroid Build Coastguard Worker       struct v3dv_event *events;
537*61046927SAndroid Build Coastguard Worker       struct list_head free_list;
538*61046927SAndroid Build Coastguard Worker 
539*61046927SAndroid Build Coastguard Worker       /* Vulkan resources to access the event BO from shaders. We have a
540*61046927SAndroid Build Coastguard Worker        * pipeline that sets the state of an event and another that waits on
541*61046927SAndroid Build Coastguard Worker        * a single event. Both pipelines require access to the event state BO,
542*61046927SAndroid Build Coastguard Worker        * for which we need to allocate a single descripot set.
543*61046927SAndroid Build Coastguard Worker        */
544*61046927SAndroid Build Coastguard Worker       VkBuffer buffer;
545*61046927SAndroid Build Coastguard Worker       VkDeviceMemory mem;
546*61046927SAndroid Build Coastguard Worker       VkDescriptorSetLayout descriptor_set_layout;
547*61046927SAndroid Build Coastguard Worker       VkPipelineLayout pipeline_layout;
548*61046927SAndroid Build Coastguard Worker       VkDescriptorPool descriptor_pool;
549*61046927SAndroid Build Coastguard Worker       VkDescriptorSet descriptor_set;
550*61046927SAndroid Build Coastguard Worker       VkPipeline set_event_pipeline;
551*61046927SAndroid Build Coastguard Worker       VkPipeline wait_event_pipeline;
552*61046927SAndroid Build Coastguard Worker    } events;
553*61046927SAndroid Build Coastguard Worker 
554*61046927SAndroid Build Coastguard Worker    /* Query handling resources.
555*61046927SAndroid Build Coastguard Worker     *
556*61046927SAndroid Build Coastguard Worker     * Our implementation of occlusion queries uses a BO per pool to keep track
557*61046927SAndroid Build Coastguard Worker     * of the per-query availability state and dispatches compute shaders to
558*61046927SAndroid Build Coastguard Worker     * handle GPU query functions that read and write that state. This struct
559*61046927SAndroid Build Coastguard Worker     * holds Vulkan resources that can be shared across all query pools to
560*61046927SAndroid Build Coastguard Worker     * implement this. This framework may be extended in the future to handle
561*61046927SAndroid Build Coastguard Worker     * more query types.
562*61046927SAndroid Build Coastguard Worker     */
563*61046927SAndroid Build Coastguard Worker    struct {
564*61046927SAndroid Build Coastguard Worker       VkDescriptorSetLayout buf_descriptor_set_layout;
565*61046927SAndroid Build Coastguard Worker 
566*61046927SAndroid Build Coastguard Worker       /* Set query availability */
567*61046927SAndroid Build Coastguard Worker       VkPipelineLayout avail_pipeline_layout;
568*61046927SAndroid Build Coastguard Worker       VkPipeline avail_pipeline;
569*61046927SAndroid Build Coastguard Worker 
570*61046927SAndroid Build Coastguard Worker       /* Reset query availability and clear occlusion counters */
571*61046927SAndroid Build Coastguard Worker       VkPipelineLayout reset_occlusion_pipeline_layout;
572*61046927SAndroid Build Coastguard Worker       VkPipeline reset_occlusion_pipeline;
573*61046927SAndroid Build Coastguard Worker 
574*61046927SAndroid Build Coastguard Worker       /* Copy query results */
575*61046927SAndroid Build Coastguard Worker       VkPipelineLayout copy_pipeline_layout;
576*61046927SAndroid Build Coastguard Worker       VkPipeline copy_pipeline[8];
577*61046927SAndroid Build Coastguard Worker    } queries;
578*61046927SAndroid Build Coastguard Worker 
579*61046927SAndroid Build Coastguard Worker    struct v3dv_pipeline_cache default_pipeline_cache;
580*61046927SAndroid Build Coastguard Worker 
581*61046927SAndroid Build Coastguard Worker    /* GL_SHADER_STATE_RECORD needs to specify default attribute values. The
582*61046927SAndroid Build Coastguard Worker     * following covers the most common case, that is all attributes format
583*61046927SAndroid Build Coastguard Worker     * being float being float, allowing us to reuse the same BO for all
584*61046927SAndroid Build Coastguard Worker     * pipelines matching this requirement. Pipelines that need integer
585*61046927SAndroid Build Coastguard Worker     * attributes will create their own BO.
586*61046927SAndroid Build Coastguard Worker     *
587*61046927SAndroid Build Coastguard Worker     * Note that since v71 the default attribute values are not needed, so this
588*61046927SAndroid Build Coastguard Worker     * can be NULL.
589*61046927SAndroid Build Coastguard Worker     */
590*61046927SAndroid Build Coastguard Worker    struct v3dv_bo *default_attribute_float;
591*61046927SAndroid Build Coastguard Worker 
592*61046927SAndroid Build Coastguard Worker    void *device_address_mem_ctx;
593*61046927SAndroid Build Coastguard Worker    struct util_dynarray device_address_bo_list; /* Array of struct v3dv_bo * */
594*61046927SAndroid Build Coastguard Worker };
595*61046927SAndroid Build Coastguard Worker 
596*61046927SAndroid Build Coastguard Worker struct v3dv_device_memory {
597*61046927SAndroid Build Coastguard Worker    struct vk_device_memory vk;
598*61046927SAndroid Build Coastguard Worker 
599*61046927SAndroid Build Coastguard Worker    struct v3dv_bo *bo;
600*61046927SAndroid Build Coastguard Worker    const VkMemoryType *type;
601*61046927SAndroid Build Coastguard Worker    bool is_for_wsi;
602*61046927SAndroid Build Coastguard Worker    bool is_for_device_address;
603*61046927SAndroid Build Coastguard Worker };
604*61046927SAndroid Build Coastguard Worker 
605*61046927SAndroid Build Coastguard Worker #define V3D_OUTPUT_IMAGE_FORMAT_NO 255
606*61046927SAndroid Build Coastguard Worker #define TEXTURE_DATA_FORMAT_NO     255
607*61046927SAndroid Build Coastguard Worker 
608*61046927SAndroid Build Coastguard Worker #define V3DV_MAX_PLANE_COUNT 3
609*61046927SAndroid Build Coastguard Worker struct v3dv_format_plane {
610*61046927SAndroid Build Coastguard Worker    /* One of V3D42_OUTPUT_IMAGE_FORMAT_*, or OUTPUT_IMAGE_FORMAT_NO */
611*61046927SAndroid Build Coastguard Worker    uint8_t rt_type;
612*61046927SAndroid Build Coastguard Worker 
613*61046927SAndroid Build Coastguard Worker    /* One of V3D42_TEXTURE_DATA_FORMAT_*. */
614*61046927SAndroid Build Coastguard Worker    uint8_t tex_type;
615*61046927SAndroid Build Coastguard Worker 
616*61046927SAndroid Build Coastguard Worker    /* Swizzle to apply to the RGBA shader output for storing to the tile
617*61046927SAndroid Build Coastguard Worker     * buffer, to the RGBA tile buffer to produce shader input (for
618*61046927SAndroid Build Coastguard Worker     * blending), and for turning the rgba8888 texture sampler return
619*61046927SAndroid Build Coastguard Worker     * value into shader rgba values.
620*61046927SAndroid Build Coastguard Worker     */
621*61046927SAndroid Build Coastguard Worker    uint8_t swizzle[4];
622*61046927SAndroid Build Coastguard Worker 
623*61046927SAndroid Build Coastguard Worker    /* Whether the return value is 16F/I/UI or 32F/I/UI. */
624*61046927SAndroid Build Coastguard Worker    uint8_t return_size;
625*61046927SAndroid Build Coastguard Worker };
626*61046927SAndroid Build Coastguard Worker 
627*61046927SAndroid Build Coastguard Worker struct v3dv_format {
628*61046927SAndroid Build Coastguard Worker    /* Non 0 plane count implies supported */
629*61046927SAndroid Build Coastguard Worker    uint8_t plane_count;
630*61046927SAndroid Build Coastguard Worker 
631*61046927SAndroid Build Coastguard Worker    struct v3dv_format_plane planes[V3DV_MAX_PLANE_COUNT];
632*61046927SAndroid Build Coastguard Worker 
633*61046927SAndroid Build Coastguard Worker    /* If the format supports (linear) filtering when texturing. */
634*61046927SAndroid Build Coastguard Worker    bool supports_filtering;
635*61046927SAndroid Build Coastguard Worker };
636*61046927SAndroid Build Coastguard Worker 
637*61046927SAndroid Build Coastguard Worker /* Note that although VkImageAspectFlags would allow to combine more than one
638*61046927SAndroid Build Coastguard Worker  * PLANE bit, for all the use cases we implement that use VkImageAspectFlags,
639*61046927SAndroid Build Coastguard Worker  * only one plane is allowed, like for example vkCmdCopyImage:
640*61046927SAndroid Build Coastguard Worker  *
641*61046927SAndroid Build Coastguard Worker  *   "If srcImage has a VkFormat with two planes then for each element of
642*61046927SAndroid Build Coastguard Worker  *    pRegions, srcSubresource.aspectMask must be VK_IMAGE_ASPECT_PLANE_0_BIT
643*61046927SAndroid Build Coastguard Worker  *    or VK_IMAGE_ASPECT_PLANE_1_BIT"
644*61046927SAndroid Build Coastguard Worker  *
645*61046927SAndroid Build Coastguard Worker  */
v3dv_plane_from_aspect(VkImageAspectFlags aspect)646*61046927SAndroid Build Coastguard Worker static uint8_t v3dv_plane_from_aspect(VkImageAspectFlags aspect)
647*61046927SAndroid Build Coastguard Worker {
648*61046927SAndroid Build Coastguard Worker    switch (aspect) {
649*61046927SAndroid Build Coastguard Worker    case VK_IMAGE_ASPECT_COLOR_BIT:
650*61046927SAndroid Build Coastguard Worker    case VK_IMAGE_ASPECT_DEPTH_BIT:
651*61046927SAndroid Build Coastguard Worker    case VK_IMAGE_ASPECT_STENCIL_BIT:
652*61046927SAndroid Build Coastguard Worker    case VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT:
653*61046927SAndroid Build Coastguard Worker    case VK_IMAGE_ASPECT_PLANE_0_BIT:
654*61046927SAndroid Build Coastguard Worker    case VK_IMAGE_ASPECT_MEMORY_PLANE_0_BIT_EXT:
655*61046927SAndroid Build Coastguard Worker       return 0;
656*61046927SAndroid Build Coastguard Worker    case VK_IMAGE_ASPECT_PLANE_1_BIT:
657*61046927SAndroid Build Coastguard Worker    case VK_IMAGE_ASPECT_MEMORY_PLANE_1_BIT_EXT:
658*61046927SAndroid Build Coastguard Worker       return 1;
659*61046927SAndroid Build Coastguard Worker    case VK_IMAGE_ASPECT_PLANE_2_BIT:
660*61046927SAndroid Build Coastguard Worker    case VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT:
661*61046927SAndroid Build Coastguard Worker       return 2;
662*61046927SAndroid Build Coastguard Worker    default:
663*61046927SAndroid Build Coastguard Worker       unreachable("invalid image aspect");
664*61046927SAndroid Build Coastguard Worker    }
665*61046927SAndroid Build Coastguard Worker }
666*61046927SAndroid Build Coastguard Worker 
667*61046927SAndroid Build Coastguard Worker struct v3d_resource_slice {
668*61046927SAndroid Build Coastguard Worker    uint32_t offset;
669*61046927SAndroid Build Coastguard Worker    uint32_t stride;
670*61046927SAndroid Build Coastguard Worker    uint32_t padded_height;
671*61046927SAndroid Build Coastguard Worker    uint32_t width;
672*61046927SAndroid Build Coastguard Worker    uint32_t height;
673*61046927SAndroid Build Coastguard Worker    /* Size of a single pane of the slice.  For 3D textures, there will be
674*61046927SAndroid Build Coastguard Worker     * a number of panes equal to the minified, power-of-two-aligned
675*61046927SAndroid Build Coastguard Worker     * depth.
676*61046927SAndroid Build Coastguard Worker     */
677*61046927SAndroid Build Coastguard Worker    uint32_t size;
678*61046927SAndroid Build Coastguard Worker    uint8_t ub_pad;
679*61046927SAndroid Build Coastguard Worker    enum v3d_tiling_mode tiling;
680*61046927SAndroid Build Coastguard Worker    uint32_t padded_height_of_output_image_in_uif_blocks;
681*61046927SAndroid Build Coastguard Worker };
682*61046927SAndroid Build Coastguard Worker 
683*61046927SAndroid Build Coastguard Worker bool v3dv_format_swizzle_needs_rb_swap(const uint8_t *swizzle);
684*61046927SAndroid Build Coastguard Worker bool v3dv_format_swizzle_needs_reverse(const uint8_t *swizzle);
685*61046927SAndroid Build Coastguard Worker 
686*61046927SAndroid Build Coastguard Worker struct v3dv_image {
687*61046927SAndroid Build Coastguard Worker    struct vk_image vk;
688*61046927SAndroid Build Coastguard Worker 
689*61046927SAndroid Build Coastguard Worker    const struct v3dv_format *format;
690*61046927SAndroid Build Coastguard Worker    bool tiled;
691*61046927SAndroid Build Coastguard Worker 
692*61046927SAndroid Build Coastguard Worker    uint8_t plane_count;
693*61046927SAndroid Build Coastguard Worker 
694*61046927SAndroid Build Coastguard Worker    /* If 0, this is a multi-plane image with use disjoint memory, where each
695*61046927SAndroid Build Coastguard Worker     * plane binds a different device memory. Otherwise, all the planes share
696*61046927SAndroid Build Coastguard Worker     * the same device memory and this stores the total size of the image in
697*61046927SAndroid Build Coastguard Worker     * bytes.
698*61046927SAndroid Build Coastguard Worker     */
699*61046927SAndroid Build Coastguard Worker    uint32_t non_disjoint_size;
700*61046927SAndroid Build Coastguard Worker 
701*61046927SAndroid Build Coastguard Worker    struct {
702*61046927SAndroid Build Coastguard Worker       uint32_t cpp;
703*61046927SAndroid Build Coastguard Worker 
704*61046927SAndroid Build Coastguard Worker       struct v3d_resource_slice slices[V3D_MAX_MIP_LEVELS];
705*61046927SAndroid Build Coastguard Worker       /* Total size of the plane in bytes. */
706*61046927SAndroid Build Coastguard Worker       uint64_t size;
707*61046927SAndroid Build Coastguard Worker       uint32_t cube_map_stride;
708*61046927SAndroid Build Coastguard Worker 
709*61046927SAndroid Build Coastguard Worker       /* If not using disjoint memory, mem and mem_offset is the same for all
710*61046927SAndroid Build Coastguard Worker        * planes, in which case mem_offset is the offset of plane 0.
711*61046927SAndroid Build Coastguard Worker        */
712*61046927SAndroid Build Coastguard Worker       struct v3dv_device_memory *mem;
713*61046927SAndroid Build Coastguard Worker       VkDeviceSize mem_offset;
714*61046927SAndroid Build Coastguard Worker       uint32_t alignment;
715*61046927SAndroid Build Coastguard Worker 
716*61046927SAndroid Build Coastguard Worker       /* Pre-subsampled per plane width and height
717*61046927SAndroid Build Coastguard Worker        */
718*61046927SAndroid Build Coastguard Worker       uint32_t width;
719*61046927SAndroid Build Coastguard Worker       uint32_t height;
720*61046927SAndroid Build Coastguard Worker 
721*61046927SAndroid Build Coastguard Worker       /* Even if we can get it from the parent image format, we keep the
722*61046927SAndroid Build Coastguard Worker        * format here for convenience
723*61046927SAndroid Build Coastguard Worker        */
724*61046927SAndroid Build Coastguard Worker       VkFormat vk_format;
725*61046927SAndroid Build Coastguard Worker    } planes[V3DV_MAX_PLANE_COUNT];
726*61046927SAndroid Build Coastguard Worker 
727*61046927SAndroid Build Coastguard Worker    /* Used only when sampling a linear texture (which V3D doesn't support).
728*61046927SAndroid Build Coastguard Worker     * This holds a tiled copy of the image we can use for that purpose.
729*61046927SAndroid Build Coastguard Worker     */
730*61046927SAndroid Build Coastguard Worker    struct v3dv_image *shadow;
731*61046927SAndroid Build Coastguard Worker };
732*61046927SAndroid Build Coastguard Worker 
733*61046927SAndroid Build Coastguard Worker VkResult
734*61046927SAndroid Build Coastguard Worker v3dv_image_init(struct v3dv_device *device,
735*61046927SAndroid Build Coastguard Worker                 const VkImageCreateInfo *pCreateInfo,
736*61046927SAndroid Build Coastguard Worker                 const VkAllocationCallbacks *pAllocator,
737*61046927SAndroid Build Coastguard Worker                 struct v3dv_image *image);
738*61046927SAndroid Build Coastguard Worker 
739*61046927SAndroid Build Coastguard Worker VkImageViewType v3dv_image_type_to_view_type(VkImageType type);
740*61046927SAndroid Build Coastguard Worker 
741*61046927SAndroid Build Coastguard Worker static uint32_t
v3dv_image_aspect_to_plane(const struct v3dv_image * image,VkImageAspectFlagBits aspect)742*61046927SAndroid Build Coastguard Worker v3dv_image_aspect_to_plane(const struct v3dv_image *image,
743*61046927SAndroid Build Coastguard Worker                            VkImageAspectFlagBits aspect)
744*61046927SAndroid Build Coastguard Worker {
745*61046927SAndroid Build Coastguard Worker    assert(util_bitcount(aspect) == 1 && (aspect & image->vk.aspects));
746*61046927SAndroid Build Coastguard Worker 
747*61046927SAndroid Build Coastguard Worker    /* Because we always put image and view planes in aspect-bit-order, the
748*61046927SAndroid Build Coastguard Worker     * plane index is the number of bits in the image aspect before aspect.
749*61046927SAndroid Build Coastguard Worker     */
750*61046927SAndroid Build Coastguard Worker    return util_bitcount(image->vk.aspects & (aspect - 1));
751*61046927SAndroid Build Coastguard Worker }
752*61046927SAndroid Build Coastguard Worker 
753*61046927SAndroid Build Coastguard Worker /* Pre-generating packets needs to consider changes in packet sizes across hw
754*61046927SAndroid Build Coastguard Worker  * versions. Keep things simple and allocate enough space for any supported
755*61046927SAndroid Build Coastguard Worker  * version. We ensure the size is large enough through static asserts.
756*61046927SAndroid Build Coastguard Worker  */
757*61046927SAndroid Build Coastguard Worker #define V3DV_TEXTURE_SHADER_STATE_LENGTH 32
758*61046927SAndroid Build Coastguard Worker #define V3DV_SAMPLER_STATE_LENGTH 24
759*61046927SAndroid Build Coastguard Worker #define V3DV_BLEND_CFG_LENGTH 5
760*61046927SAndroid Build Coastguard Worker #define V3DV_CFG_BITS_LENGTH 4
761*61046927SAndroid Build Coastguard Worker #define V3DV_GL_SHADER_STATE_RECORD_LENGTH 36
762*61046927SAndroid Build Coastguard Worker #define V3DV_VCM_CACHE_SIZE_LENGTH 2
763*61046927SAndroid Build Coastguard Worker #define V3DV_GL_SHADER_STATE_ATTRIBUTE_RECORD_LENGTH 16
764*61046927SAndroid Build Coastguard Worker #define V3DV_STENCIL_CFG_LENGTH 6
765*61046927SAndroid Build Coastguard Worker 
766*61046927SAndroid Build Coastguard Worker struct v3dv_image_view {
767*61046927SAndroid Build Coastguard Worker    struct vk_image_view vk;
768*61046927SAndroid Build Coastguard Worker 
769*61046927SAndroid Build Coastguard Worker    const struct v3dv_format *format;
770*61046927SAndroid Build Coastguard Worker 
771*61046927SAndroid Build Coastguard Worker    uint8_t view_swizzle[4];
772*61046927SAndroid Build Coastguard Worker 
773*61046927SAndroid Build Coastguard Worker    uint8_t plane_count;
774*61046927SAndroid Build Coastguard Worker    struct {
775*61046927SAndroid Build Coastguard Worker       uint8_t image_plane;
776*61046927SAndroid Build Coastguard Worker 
777*61046927SAndroid Build Coastguard Worker       bool swap_rb;
778*61046927SAndroid Build Coastguard Worker       bool channel_reverse;
779*61046927SAndroid Build Coastguard Worker       uint32_t internal_bpp;
780*61046927SAndroid Build Coastguard Worker       uint32_t internal_type;
781*61046927SAndroid Build Coastguard Worker       uint32_t offset;
782*61046927SAndroid Build Coastguard Worker 
783*61046927SAndroid Build Coastguard Worker       /* Precomputed swizzle (composed from the view swizzle and the format
784*61046927SAndroid Build Coastguard Worker        * swizzle).
785*61046927SAndroid Build Coastguard Worker        *
786*61046927SAndroid Build Coastguard Worker        * This could be also included on the descriptor bo, but the shader state
787*61046927SAndroid Build Coastguard Worker        * packet doesn't need it on a bo, so we can just avoid a memory copy
788*61046927SAndroid Build Coastguard Worker        */
789*61046927SAndroid Build Coastguard Worker       uint8_t swizzle[4];
790*61046927SAndroid Build Coastguard Worker 
791*61046927SAndroid Build Coastguard Worker       /* Prepacked TEXTURE_SHADER_STATE. It will be copied to the descriptor info
792*61046927SAndroid Build Coastguard Worker        * during UpdateDescriptorSets.
793*61046927SAndroid Build Coastguard Worker        *
794*61046927SAndroid Build Coastguard Worker        * Empirical tests show that cube arrays need a different shader state
795*61046927SAndroid Build Coastguard Worker        * depending on whether they are used with a sampler or not, so for these
796*61046927SAndroid Build Coastguard Worker        * we generate two states and select the one to use based on the descriptor
797*61046927SAndroid Build Coastguard Worker        * type.
798*61046927SAndroid Build Coastguard Worker        */
799*61046927SAndroid Build Coastguard Worker       uint8_t texture_shader_state[2][V3DV_TEXTURE_SHADER_STATE_LENGTH];
800*61046927SAndroid Build Coastguard Worker    } planes[V3DV_MAX_PLANE_COUNT];
801*61046927SAndroid Build Coastguard Worker 
802*61046927SAndroid Build Coastguard Worker    /* Used only when sampling a linear texture (which V3D doesn't support).
803*61046927SAndroid Build Coastguard Worker     * This would represent a view over the tiled shadow image.
804*61046927SAndroid Build Coastguard Worker     */
805*61046927SAndroid Build Coastguard Worker    struct v3dv_image_view *shadow;
806*61046927SAndroid Build Coastguard Worker };
807*61046927SAndroid Build Coastguard Worker 
808*61046927SAndroid Build Coastguard Worker VkResult v3dv_create_image_view(struct v3dv_device *device,
809*61046927SAndroid Build Coastguard Worker                                 const VkImageViewCreateInfo *pCreateInfo,
810*61046927SAndroid Build Coastguard Worker                                 VkImageView *pView);
811*61046927SAndroid Build Coastguard Worker 
812*61046927SAndroid Build Coastguard Worker uint32_t v3dv_layer_offset(const struct v3dv_image *image, uint32_t level, uint32_t layer,
813*61046927SAndroid Build Coastguard Worker                            uint8_t plane);
814*61046927SAndroid Build Coastguard Worker 
815*61046927SAndroid Build Coastguard Worker struct v3dv_buffer {
816*61046927SAndroid Build Coastguard Worker    struct vk_object_base base;
817*61046927SAndroid Build Coastguard Worker 
818*61046927SAndroid Build Coastguard Worker    VkDeviceSize size;
819*61046927SAndroid Build Coastguard Worker    VkBufferUsageFlagBits2KHR usage;
820*61046927SAndroid Build Coastguard Worker    uint32_t alignment;
821*61046927SAndroid Build Coastguard Worker 
822*61046927SAndroid Build Coastguard Worker    struct v3dv_device_memory *mem;
823*61046927SAndroid Build Coastguard Worker    VkDeviceSize mem_offset;
824*61046927SAndroid Build Coastguard Worker };
825*61046927SAndroid Build Coastguard Worker 
826*61046927SAndroid Build Coastguard Worker void
827*61046927SAndroid Build Coastguard Worker v3dv_buffer_init(struct v3dv_device *device,
828*61046927SAndroid Build Coastguard Worker                  const VkBufferCreateInfo *pCreateInfo,
829*61046927SAndroid Build Coastguard Worker                  struct v3dv_buffer *buffer,
830*61046927SAndroid Build Coastguard Worker                  uint32_t alignment);
831*61046927SAndroid Build Coastguard Worker 
832*61046927SAndroid Build Coastguard Worker void
833*61046927SAndroid Build Coastguard Worker v3dv_buffer_bind_memory(const VkBindBufferMemoryInfo *info);
834*61046927SAndroid Build Coastguard Worker 
835*61046927SAndroid Build Coastguard Worker struct v3dv_buffer_view {
836*61046927SAndroid Build Coastguard Worker    struct vk_object_base base;
837*61046927SAndroid Build Coastguard Worker 
838*61046927SAndroid Build Coastguard Worker    struct v3dv_buffer *buffer;
839*61046927SAndroid Build Coastguard Worker 
840*61046927SAndroid Build Coastguard Worker    VkFormat vk_format;
841*61046927SAndroid Build Coastguard Worker    const struct v3dv_format *format;
842*61046927SAndroid Build Coastguard Worker    uint32_t internal_bpp;
843*61046927SAndroid Build Coastguard Worker    uint32_t internal_type;
844*61046927SAndroid Build Coastguard Worker 
845*61046927SAndroid Build Coastguard Worker    uint32_t offset;
846*61046927SAndroid Build Coastguard Worker    uint32_t size;
847*61046927SAndroid Build Coastguard Worker    uint32_t num_elements;
848*61046927SAndroid Build Coastguard Worker 
849*61046927SAndroid Build Coastguard Worker    /* Prepacked TEXTURE_SHADER_STATE. */
850*61046927SAndroid Build Coastguard Worker    uint8_t texture_shader_state[V3DV_TEXTURE_SHADER_STATE_LENGTH];
851*61046927SAndroid Build Coastguard Worker };
852*61046927SAndroid Build Coastguard Worker 
853*61046927SAndroid Build Coastguard Worker struct v3dv_subpass_attachment {
854*61046927SAndroid Build Coastguard Worker    uint32_t attachment;
855*61046927SAndroid Build Coastguard Worker    VkImageLayout layout;
856*61046927SAndroid Build Coastguard Worker };
857*61046927SAndroid Build Coastguard Worker 
858*61046927SAndroid Build Coastguard Worker struct v3dv_subpass {
859*61046927SAndroid Build Coastguard Worker    uint32_t input_count;
860*61046927SAndroid Build Coastguard Worker    struct v3dv_subpass_attachment *input_attachments;
861*61046927SAndroid Build Coastguard Worker 
862*61046927SAndroid Build Coastguard Worker    uint32_t color_count;
863*61046927SAndroid Build Coastguard Worker    struct v3dv_subpass_attachment *color_attachments;
864*61046927SAndroid Build Coastguard Worker    struct v3dv_subpass_attachment *resolve_attachments;
865*61046927SAndroid Build Coastguard Worker 
866*61046927SAndroid Build Coastguard Worker    struct v3dv_subpass_attachment ds_attachment;
867*61046927SAndroid Build Coastguard Worker    struct v3dv_subpass_attachment ds_resolve_attachment;
868*61046927SAndroid Build Coastguard Worker    bool resolve_depth, resolve_stencil;
869*61046927SAndroid Build Coastguard Worker 
870*61046927SAndroid Build Coastguard Worker    /* If we need to emit the clear of the depth/stencil attachment using a
871*61046927SAndroid Build Coastguard Worker     * a draw call instead of using the TLB (GFXH-1461).
872*61046927SAndroid Build Coastguard Worker     */
873*61046927SAndroid Build Coastguard Worker    bool do_depth_clear_with_draw;
874*61046927SAndroid Build Coastguard Worker    bool do_stencil_clear_with_draw;
875*61046927SAndroid Build Coastguard Worker 
876*61046927SAndroid Build Coastguard Worker    /* Multiview */
877*61046927SAndroid Build Coastguard Worker    uint32_t view_mask;
878*61046927SAndroid Build Coastguard Worker };
879*61046927SAndroid Build Coastguard Worker 
880*61046927SAndroid Build Coastguard Worker struct v3dv_render_pass_attachment {
881*61046927SAndroid Build Coastguard Worker    VkAttachmentDescription2 desc;
882*61046927SAndroid Build Coastguard Worker 
883*61046927SAndroid Build Coastguard Worker    uint32_t first_subpass;
884*61046927SAndroid Build Coastguard Worker    uint32_t last_subpass;
885*61046927SAndroid Build Coastguard Worker 
886*61046927SAndroid Build Coastguard Worker    /* When multiview is enabled, we no longer care about when a particular
887*61046927SAndroid Build Coastguard Worker     * attachment is first or last used in a render pass, since not all views
888*61046927SAndroid Build Coastguard Worker     * in the attachment will meet that criteria. Instead, we need to track
889*61046927SAndroid Build Coastguard Worker     * each individual view (layer) in each attachment and emit our stores,
890*61046927SAndroid Build Coastguard Worker     * loads and clears accordingly.
891*61046927SAndroid Build Coastguard Worker     */
892*61046927SAndroid Build Coastguard Worker    struct {
893*61046927SAndroid Build Coastguard Worker       uint32_t first_subpass;
894*61046927SAndroid Build Coastguard Worker       uint32_t last_subpass;
895*61046927SAndroid Build Coastguard Worker    } views[MAX_MULTIVIEW_VIEW_COUNT];
896*61046927SAndroid Build Coastguard Worker 
897*61046927SAndroid Build Coastguard Worker    /* If this is a multisampled attachment that is going to be resolved,
898*61046927SAndroid Build Coastguard Worker     * whether we may be able to use the TLB hardware resolve based on the
899*61046927SAndroid Build Coastguard Worker     * attachment format.
900*61046927SAndroid Build Coastguard Worker     */
901*61046927SAndroid Build Coastguard Worker    bool try_tlb_resolve;
902*61046927SAndroid Build Coastguard Worker };
903*61046927SAndroid Build Coastguard Worker 
904*61046927SAndroid Build Coastguard Worker struct v3dv_render_pass {
905*61046927SAndroid Build Coastguard Worker    struct vk_object_base base;
906*61046927SAndroid Build Coastguard Worker 
907*61046927SAndroid Build Coastguard Worker    bool multiview_enabled;
908*61046927SAndroid Build Coastguard Worker 
909*61046927SAndroid Build Coastguard Worker    uint32_t attachment_count;
910*61046927SAndroid Build Coastguard Worker    struct v3dv_render_pass_attachment *attachments;
911*61046927SAndroid Build Coastguard Worker 
912*61046927SAndroid Build Coastguard Worker    uint32_t subpass_count;
913*61046927SAndroid Build Coastguard Worker    struct v3dv_subpass *subpasses;
914*61046927SAndroid Build Coastguard Worker 
915*61046927SAndroid Build Coastguard Worker    struct v3dv_subpass_attachment *subpass_attachments;
916*61046927SAndroid Build Coastguard Worker };
917*61046927SAndroid Build Coastguard Worker 
918*61046927SAndroid Build Coastguard Worker struct v3dv_framebuffer {
919*61046927SAndroid Build Coastguard Worker    struct vk_object_base base;
920*61046927SAndroid Build Coastguard Worker 
921*61046927SAndroid Build Coastguard Worker    uint32_t width;
922*61046927SAndroid Build Coastguard Worker    uint32_t height;
923*61046927SAndroid Build Coastguard Worker    uint32_t layers;
924*61046927SAndroid Build Coastguard Worker 
925*61046927SAndroid Build Coastguard Worker    /* Typically, edge tiles in the framebuffer have padding depending on the
926*61046927SAndroid Build Coastguard Worker     * underlying tiling layout. One consequence of this is that when the
927*61046927SAndroid Build Coastguard Worker     * framebuffer dimensions are not aligned to tile boundaries, tile stores
928*61046927SAndroid Build Coastguard Worker     * would still write full tiles on the edges and write to the padded area.
929*61046927SAndroid Build Coastguard Worker     * If the framebuffer is aliasing a smaller region of a larger image, then
930*61046927SAndroid Build Coastguard Worker     * we need to be careful with this though, as we won't have padding on the
931*61046927SAndroid Build Coastguard Worker     * edge tiles (which typically means that we need to load the tile buffer
932*61046927SAndroid Build Coastguard Worker     * before we store).
933*61046927SAndroid Build Coastguard Worker     */
934*61046927SAndroid Build Coastguard Worker    bool has_edge_padding;
935*61046927SAndroid Build Coastguard Worker 
936*61046927SAndroid Build Coastguard Worker    uint32_t attachment_count;
937*61046927SAndroid Build Coastguard Worker    uint32_t color_attachment_count;
938*61046927SAndroid Build Coastguard Worker 
939*61046927SAndroid Build Coastguard Worker    /* Notice that elements in 'attachments' will be NULL if the framebuffer
940*61046927SAndroid Build Coastguard Worker     * was created imageless. The driver is expected to access attachment info
941*61046927SAndroid Build Coastguard Worker     * from the command buffer state instead.
942*61046927SAndroid Build Coastguard Worker     */
943*61046927SAndroid Build Coastguard Worker    struct v3dv_image_view *attachments[0];
944*61046927SAndroid Build Coastguard Worker };
945*61046927SAndroid Build Coastguard Worker 
946*61046927SAndroid Build Coastguard Worker struct v3dv_frame_tiling {
947*61046927SAndroid Build Coastguard Worker    uint32_t width;
948*61046927SAndroid Build Coastguard Worker    uint32_t height;
949*61046927SAndroid Build Coastguard Worker    uint32_t layers;
950*61046927SAndroid Build Coastguard Worker    uint32_t render_target_count;
951*61046927SAndroid Build Coastguard Worker    uint32_t internal_bpp;
952*61046927SAndroid Build Coastguard Worker    uint32_t total_color_bpp;
953*61046927SAndroid Build Coastguard Worker    bool     msaa;
954*61046927SAndroid Build Coastguard Worker    bool     double_buffer;
955*61046927SAndroid Build Coastguard Worker    uint32_t tile_width;
956*61046927SAndroid Build Coastguard Worker    uint32_t tile_height;
957*61046927SAndroid Build Coastguard Worker    uint32_t draw_tiles_x;
958*61046927SAndroid Build Coastguard Worker    uint32_t draw_tiles_y;
959*61046927SAndroid Build Coastguard Worker    uint32_t supertile_width;
960*61046927SAndroid Build Coastguard Worker    uint32_t supertile_height;
961*61046927SAndroid Build Coastguard Worker    uint32_t frame_width_in_supertiles;
962*61046927SAndroid Build Coastguard Worker    uint32_t frame_height_in_supertiles;
963*61046927SAndroid Build Coastguard Worker };
964*61046927SAndroid Build Coastguard Worker 
965*61046927SAndroid Build Coastguard Worker bool v3dv_subpass_area_is_tile_aligned(struct v3dv_device *device,
966*61046927SAndroid Build Coastguard Worker                                        const VkRect2D *area,
967*61046927SAndroid Build Coastguard Worker                                        struct v3dv_framebuffer *fb,
968*61046927SAndroid Build Coastguard Worker                                        struct v3dv_render_pass *pass,
969*61046927SAndroid Build Coastguard Worker                                        uint32_t subpass_idx);
970*61046927SAndroid Build Coastguard Worker 
971*61046927SAndroid Build Coastguard Worker /* Checks if we need to emit 2 initial tile clears for double buffer mode.
972*61046927SAndroid Build Coastguard Worker  * This happens when we render at least 2 tiles, because in this mode each
973*61046927SAndroid Build Coastguard Worker  * tile uses a different half of the tile buffer memory so we can have 2 tiles
974*61046927SAndroid Build Coastguard Worker  * in flight (one being stored to memory and the next being rendered). In this
975*61046927SAndroid Build Coastguard Worker  * scenario, if we emit a single initial tile clear we would only clear the
976*61046927SAndroid Build Coastguard Worker  * first half of the tile buffer.
977*61046927SAndroid Build Coastguard Worker  */
978*61046927SAndroid Build Coastguard Worker static inline bool
v3dv_do_double_initial_tile_clear(const struct v3dv_frame_tiling * tiling)979*61046927SAndroid Build Coastguard Worker v3dv_do_double_initial_tile_clear(const struct v3dv_frame_tiling *tiling)
980*61046927SAndroid Build Coastguard Worker {
981*61046927SAndroid Build Coastguard Worker    return tiling->double_buffer &&
982*61046927SAndroid Build Coastguard Worker           (tiling->draw_tiles_x > 1 || tiling->draw_tiles_y > 1 ||
983*61046927SAndroid Build Coastguard Worker            tiling->layers > 1);
984*61046927SAndroid Build Coastguard Worker }
985*61046927SAndroid Build Coastguard Worker 
986*61046927SAndroid Build Coastguard Worker enum v3dv_cmd_buffer_status {
987*61046927SAndroid Build Coastguard Worker    V3DV_CMD_BUFFER_STATUS_NEW           = 0,
988*61046927SAndroid Build Coastguard Worker    V3DV_CMD_BUFFER_STATUS_INITIALIZED   = 1,
989*61046927SAndroid Build Coastguard Worker    V3DV_CMD_BUFFER_STATUS_RECORDING     = 2,
990*61046927SAndroid Build Coastguard Worker    V3DV_CMD_BUFFER_STATUS_EXECUTABLE    = 3
991*61046927SAndroid Build Coastguard Worker };
992*61046927SAndroid Build Coastguard Worker 
993*61046927SAndroid Build Coastguard Worker union v3dv_clear_value {
994*61046927SAndroid Build Coastguard Worker    uint32_t color[4];
995*61046927SAndroid Build Coastguard Worker    struct {
996*61046927SAndroid Build Coastguard Worker       float z;
997*61046927SAndroid Build Coastguard Worker       uint8_t s;
998*61046927SAndroid Build Coastguard Worker    };
999*61046927SAndroid Build Coastguard Worker };
1000*61046927SAndroid Build Coastguard Worker 
1001*61046927SAndroid Build Coastguard Worker struct v3dv_cmd_buffer_attachment_state {
1002*61046927SAndroid Build Coastguard Worker    /* The original clear value as provided by the Vulkan API */
1003*61046927SAndroid Build Coastguard Worker    VkClearValue vk_clear_value;
1004*61046927SAndroid Build Coastguard Worker 
1005*61046927SAndroid Build Coastguard Worker    /* The hardware clear value */
1006*61046927SAndroid Build Coastguard Worker    union v3dv_clear_value clear_value;
1007*61046927SAndroid Build Coastguard Worker 
1008*61046927SAndroid Build Coastguard Worker    /* The underlying image view (from the framebuffer or, if imageless
1009*61046927SAndroid Build Coastguard Worker     * framebuffer is used, from VkRenderPassAttachmentBeginInfo.
1010*61046927SAndroid Build Coastguard Worker     */
1011*61046927SAndroid Build Coastguard Worker    struct v3dv_image_view *image_view;
1012*61046927SAndroid Build Coastguard Worker 
1013*61046927SAndroid Build Coastguard Worker    /* If this is a multisampled attachment with a resolve operation. */
1014*61046927SAndroid Build Coastguard Worker    bool has_resolve;
1015*61046927SAndroid Build Coastguard Worker 
1016*61046927SAndroid Build Coastguard Worker    /* If this is a multisampled attachment with a resolve operation,
1017*61046927SAndroid Build Coastguard Worker     * whether we can use the TLB for the resolve.
1018*61046927SAndroid Build Coastguard Worker     */
1019*61046927SAndroid Build Coastguard Worker    bool use_tlb_resolve;
1020*61046927SAndroid Build Coastguard Worker };
1021*61046927SAndroid Build Coastguard Worker 
1022*61046927SAndroid Build Coastguard Worker /* Cached values derived from Vulkan viewport/count */
1023*61046927SAndroid Build Coastguard Worker struct v3dv_viewport_state {
1024*61046927SAndroid Build Coastguard Worker    float translate[MAX_VIEWPORTS][3];
1025*61046927SAndroid Build Coastguard Worker    float scale[MAX_VIEWPORTS][3];
1026*61046927SAndroid Build Coastguard Worker };
1027*61046927SAndroid Build Coastguard Worker 
1028*61046927SAndroid Build Coastguard Worker /* Flags for custom dirty state, that could lead to packet emission.
1029*61046927SAndroid Build Coastguard Worker  *
1030*61046927SAndroid Build Coastguard Worker  * Note *custom*, for all the dynamic state tracking coming from the Vulkan
1031*61046927SAndroid Build Coastguard Worker  * API, we use the Mesa runtime framework and their predefined flags
1032*61046927SAndroid Build Coastguard Worker  * (MESA_VK_DYNAMIC_XXX).
1033*61046927SAndroid Build Coastguard Worker  *
1034*61046927SAndroid Build Coastguard Worker  * Here we defined additional flags used to track dirty state.
1035*61046927SAndroid Build Coastguard Worker  */
1036*61046927SAndroid Build Coastguard Worker enum v3dv_cmd_dirty_bits {
1037*61046927SAndroid Build Coastguard Worker    V3DV_CMD_DIRTY_PIPELINE                  = 1 << 0,
1038*61046927SAndroid Build Coastguard Worker    V3DV_CMD_DIRTY_COMPUTE_PIPELINE          = 1 << 1,
1039*61046927SAndroid Build Coastguard Worker    V3DV_CMD_DIRTY_VERTEX_BUFFER             = 1 << 2,
1040*61046927SAndroid Build Coastguard Worker    V3DV_CMD_DIRTY_INDEX_BUFFER              = 1 << 3,
1041*61046927SAndroid Build Coastguard Worker    V3DV_CMD_DIRTY_DESCRIPTOR_SETS           = 1 << 4,
1042*61046927SAndroid Build Coastguard Worker    V3DV_CMD_DIRTY_COMPUTE_DESCRIPTOR_SETS   = 1 << 5,
1043*61046927SAndroid Build Coastguard Worker    V3DV_CMD_DIRTY_PUSH_CONSTANTS            = 1 << 6,
1044*61046927SAndroid Build Coastguard Worker    V3DV_CMD_DIRTY_PUSH_CONSTANTS_UBO        = 1 << 7,
1045*61046927SAndroid Build Coastguard Worker    V3DV_CMD_DIRTY_OCCLUSION_QUERY           = 1 << 8,
1046*61046927SAndroid Build Coastguard Worker    V3DV_CMD_DIRTY_VIEW_INDEX                = 1 << 9,
1047*61046927SAndroid Build Coastguard Worker    V3DV_CMD_DIRTY_DRAW_ID                   = 1 << 10,
1048*61046927SAndroid Build Coastguard Worker    V3DV_CMD_DIRTY_ALL                       = (1 << 10) - 1,
1049*61046927SAndroid Build Coastguard Worker };
1050*61046927SAndroid Build Coastguard Worker 
1051*61046927SAndroid Build Coastguard Worker struct v3dv_dynamic_state {
1052*61046927SAndroid Build Coastguard Worker    /* FIXME: we keep some viewport info cached (translate, scale) because we
1053*61046927SAndroid Build Coastguard Worker     * use that on more that one place. But note that translate_z and scale_z
1054*61046927SAndroid Build Coastguard Worker     * is also used in several places, and we recompute it based on
1055*61046927SAndroid Build Coastguard Worker     * scissor/viewport info all time. So perhaps we could do the same with the
1056*61046927SAndroid Build Coastguard Worker     * x and y component.
1057*61046927SAndroid Build Coastguard Worker     */
1058*61046927SAndroid Build Coastguard Worker    struct v3dv_viewport_state viewport;
1059*61046927SAndroid Build Coastguard Worker 
1060*61046927SAndroid Build Coastguard Worker    /* We cache the color_write_enable as the vulkan runtime keeps a 8-bit
1061*61046927SAndroid Build Coastguard Worker     * bitset with a bit per attachment, but in order to combine with the
1062*61046927SAndroid Build Coastguard Worker     * color_write_masks is easier to cache a 32-bit bitset with 4 bits per
1063*61046927SAndroid Build Coastguard Worker     * attachment.
1064*61046927SAndroid Build Coastguard Worker     */
1065*61046927SAndroid Build Coastguard Worker    uint32_t color_write_enable;
1066*61046927SAndroid Build Coastguard Worker };
1067*61046927SAndroid Build Coastguard Worker 
1068*61046927SAndroid Build Coastguard Worker void v3dv_viewport_compute_xform(const VkViewport *viewport,
1069*61046927SAndroid Build Coastguard Worker                                  float scale[3],
1070*61046927SAndroid Build Coastguard Worker                                  float translate[3]);
1071*61046927SAndroid Build Coastguard Worker 
1072*61046927SAndroid Build Coastguard Worker enum v3dv_ez_state {
1073*61046927SAndroid Build Coastguard Worker    V3D_EZ_UNDECIDED = 0,
1074*61046927SAndroid Build Coastguard Worker    V3D_EZ_GT_GE,
1075*61046927SAndroid Build Coastguard Worker    V3D_EZ_LT_LE,
1076*61046927SAndroid Build Coastguard Worker    V3D_EZ_DISABLED,
1077*61046927SAndroid Build Coastguard Worker };
1078*61046927SAndroid Build Coastguard Worker 
1079*61046927SAndroid Build Coastguard Worker enum v3dv_job_type {
1080*61046927SAndroid Build Coastguard Worker    V3DV_JOB_TYPE_GPU_CL = 0,
1081*61046927SAndroid Build Coastguard Worker    V3DV_JOB_TYPE_GPU_CL_INCOMPLETE,
1082*61046927SAndroid Build Coastguard Worker    V3DV_JOB_TYPE_GPU_TFU,
1083*61046927SAndroid Build Coastguard Worker    V3DV_JOB_TYPE_GPU_CSD,
1084*61046927SAndroid Build Coastguard Worker    V3DV_JOB_TYPE_CPU_RESET_QUERIES,
1085*61046927SAndroid Build Coastguard Worker    V3DV_JOB_TYPE_CPU_END_QUERY,
1086*61046927SAndroid Build Coastguard Worker    V3DV_JOB_TYPE_CPU_COPY_QUERY_RESULTS,
1087*61046927SAndroid Build Coastguard Worker    V3DV_JOB_TYPE_CPU_CSD_INDIRECT,
1088*61046927SAndroid Build Coastguard Worker    V3DV_JOB_TYPE_CPU_TIMESTAMP_QUERY,
1089*61046927SAndroid Build Coastguard Worker };
1090*61046927SAndroid Build Coastguard Worker 
1091*61046927SAndroid Build Coastguard Worker struct v3dv_reset_query_cpu_job_info {
1092*61046927SAndroid Build Coastguard Worker    struct v3dv_query_pool *pool;
1093*61046927SAndroid Build Coastguard Worker    uint32_t first;
1094*61046927SAndroid Build Coastguard Worker    uint32_t count;
1095*61046927SAndroid Build Coastguard Worker };
1096*61046927SAndroid Build Coastguard Worker 
1097*61046927SAndroid Build Coastguard Worker struct v3dv_end_query_info {
1098*61046927SAndroid Build Coastguard Worker    struct v3dv_query_pool *pool;
1099*61046927SAndroid Build Coastguard Worker    uint32_t query;
1100*61046927SAndroid Build Coastguard Worker 
1101*61046927SAndroid Build Coastguard Worker    /* This is one unless multiview is used */
1102*61046927SAndroid Build Coastguard Worker    uint32_t count;
1103*61046927SAndroid Build Coastguard Worker };
1104*61046927SAndroid Build Coastguard Worker 
1105*61046927SAndroid Build Coastguard Worker struct v3dv_copy_query_results_cpu_job_info {
1106*61046927SAndroid Build Coastguard Worker    struct v3dv_query_pool *pool;
1107*61046927SAndroid Build Coastguard Worker    uint32_t first;
1108*61046927SAndroid Build Coastguard Worker    uint32_t count;
1109*61046927SAndroid Build Coastguard Worker    struct v3dv_buffer *dst;
1110*61046927SAndroid Build Coastguard Worker    uint32_t offset;
1111*61046927SAndroid Build Coastguard Worker    uint32_t stride;
1112*61046927SAndroid Build Coastguard Worker    VkQueryResultFlags flags;
1113*61046927SAndroid Build Coastguard Worker };
1114*61046927SAndroid Build Coastguard Worker 
1115*61046927SAndroid Build Coastguard Worker struct v3dv_submit_sync_info {
1116*61046927SAndroid Build Coastguard Worker    /* List of syncs to wait before running a job */
1117*61046927SAndroid Build Coastguard Worker    uint32_t wait_count;
1118*61046927SAndroid Build Coastguard Worker    struct vk_sync_wait *waits;
1119*61046927SAndroid Build Coastguard Worker 
1120*61046927SAndroid Build Coastguard Worker    /* List of syncs to signal when all jobs complete */
1121*61046927SAndroid Build Coastguard Worker    uint32_t signal_count;
1122*61046927SAndroid Build Coastguard Worker    struct vk_sync_signal *signals;
1123*61046927SAndroid Build Coastguard Worker };
1124*61046927SAndroid Build Coastguard Worker 
1125*61046927SAndroid Build Coastguard Worker struct v3dv_csd_indirect_cpu_job_info {
1126*61046927SAndroid Build Coastguard Worker    struct v3dv_buffer *buffer;
1127*61046927SAndroid Build Coastguard Worker    uint32_t offset;
1128*61046927SAndroid Build Coastguard Worker    struct v3dv_job *csd_job;
1129*61046927SAndroid Build Coastguard Worker    uint32_t wg_size;
1130*61046927SAndroid Build Coastguard Worker    uint32_t *wg_uniform_offsets[3];
1131*61046927SAndroid Build Coastguard Worker    bool needs_wg_uniform_rewrite;
1132*61046927SAndroid Build Coastguard Worker };
1133*61046927SAndroid Build Coastguard Worker 
1134*61046927SAndroid Build Coastguard Worker struct v3dv_timestamp_query_cpu_job_info {
1135*61046927SAndroid Build Coastguard Worker    struct v3dv_query_pool *pool;
1136*61046927SAndroid Build Coastguard Worker    uint32_t query;
1137*61046927SAndroid Build Coastguard Worker 
1138*61046927SAndroid Build Coastguard Worker    /* This is one unless multiview is used */
1139*61046927SAndroid Build Coastguard Worker    uint32_t count;
1140*61046927SAndroid Build Coastguard Worker };
1141*61046927SAndroid Build Coastguard Worker 
1142*61046927SAndroid Build Coastguard Worker /* Number of perfmons required to handle all supported performance counters */
1143*61046927SAndroid Build Coastguard Worker #define V3DV_MAX_PERFMONS DIV_ROUND_UP(V3D_MAX_PERFCNT, \
1144*61046927SAndroid Build Coastguard Worker                                        DRM_V3D_MAX_PERF_COUNTERS)
1145*61046927SAndroid Build Coastguard Worker 
1146*61046927SAndroid Build Coastguard Worker struct v3dv_perf_query {
1147*61046927SAndroid Build Coastguard Worker    uint32_t kperfmon_ids[V3DV_MAX_PERFMONS];
1148*61046927SAndroid Build Coastguard Worker 
1149*61046927SAndroid Build Coastguard Worker    /* A DRM syncobj to wait on the GPU jobs for which we are collecting
1150*61046927SAndroid Build Coastguard Worker     * performance data.
1151*61046927SAndroid Build Coastguard Worker     */
1152*61046927SAndroid Build Coastguard Worker    struct vk_sync *last_job_sync;
1153*61046927SAndroid Build Coastguard Worker };
1154*61046927SAndroid Build Coastguard Worker 
1155*61046927SAndroid Build Coastguard Worker struct v3dv_job {
1156*61046927SAndroid Build Coastguard Worker    struct list_head list_link;
1157*61046927SAndroid Build Coastguard Worker 
1158*61046927SAndroid Build Coastguard Worker    /* We only create job clones when executing secondary command buffers into
1159*61046927SAndroid Build Coastguard Worker     * primaries. These clones don't make deep copies of the original object
1160*61046927SAndroid Build Coastguard Worker     * so we want to flag them to avoid freeing resources they don't own.
1161*61046927SAndroid Build Coastguard Worker     */
1162*61046927SAndroid Build Coastguard Worker    bool is_clone;
1163*61046927SAndroid Build Coastguard Worker 
1164*61046927SAndroid Build Coastguard Worker    /* If this is a cloned job, if it has its own BCL resource. This happens
1165*61046927SAndroid Build Coastguard Worker     * when we suspend jobs with in command buffers with the
1166*61046927SAndroid Build Coastguard Worker     * VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT flag.
1167*61046927SAndroid Build Coastguard Worker     */
1168*61046927SAndroid Build Coastguard Worker    bool clone_owns_bcl;
1169*61046927SAndroid Build Coastguard Worker 
1170*61046927SAndroid Build Coastguard Worker    /* VK_KHR_dynamic_rendering */
1171*61046927SAndroid Build Coastguard Worker    bool suspending;
1172*61046927SAndroid Build Coastguard Worker    bool resuming;
1173*61046927SAndroid Build Coastguard Worker    struct v3dv_cl_out *suspend_branch_inst_ptr;
1174*61046927SAndroid Build Coastguard Worker    uint32_t suspended_bcl_end;
1175*61046927SAndroid Build Coastguard Worker 
1176*61046927SAndroid Build Coastguard Worker    /* If the job executes on the transfer stage of the pipeline */
1177*61046927SAndroid Build Coastguard Worker    bool is_transfer;
1178*61046927SAndroid Build Coastguard Worker 
1179*61046927SAndroid Build Coastguard Worker    /* VK_KHR_buffer_device_address allows shaders to use pointers that can
1180*61046927SAndroid Build Coastguard Worker     * dereference memory in any buffer that has been flagged with
1181*61046927SAndroid Build Coastguard Worker     * VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT. These buffers may not
1182*61046927SAndroid Build Coastguard Worker     * be bound via descriptor sets, so we need to make sure that a job that
1183*61046927SAndroid Build Coastguard Worker     * uses this functionality includes all these buffers in its kernel
1184*61046927SAndroid Build Coastguard Worker     * submission.
1185*61046927SAndroid Build Coastguard Worker     */
1186*61046927SAndroid Build Coastguard Worker    bool uses_buffer_device_address;
1187*61046927SAndroid Build Coastguard Worker 
1188*61046927SAndroid Build Coastguard Worker    /* True if we have not identified anything that would be incompatible
1189*61046927SAndroid Build Coastguard Worker     * with double-buffer (like MSAA) or that would make double-buffer mode
1190*61046927SAndroid Build Coastguard Worker     * not efficient (like tile loads or not having any stores).
1191*61046927SAndroid Build Coastguard Worker     */
1192*61046927SAndroid Build Coastguard Worker    bool can_use_double_buffer;
1193*61046927SAndroid Build Coastguard Worker 
1194*61046927SAndroid Build Coastguard Worker    /* This structure keeps track of various scores to inform a heuristic
1195*61046927SAndroid Build Coastguard Worker     * for double-buffer mode.
1196*61046927SAndroid Build Coastguard Worker     */
1197*61046927SAndroid Build Coastguard Worker    struct {
1198*61046927SAndroid Build Coastguard Worker       /* Cost of geometry shading */
1199*61046927SAndroid Build Coastguard Worker       uint32_t geom;
1200*61046927SAndroid Build Coastguard Worker       /* Cost of shader rendering */
1201*61046927SAndroid Build Coastguard Worker       uint32_t render;
1202*61046927SAndroid Build Coastguard Worker    } double_buffer_score;
1203*61046927SAndroid Build Coastguard Worker 
1204*61046927SAndroid Build Coastguard Worker    /* We only need to allocate tile state for all layers if the binner
1205*61046927SAndroid Build Coastguard Worker     * writes primitives to layers other than the first. This can only be
1206*61046927SAndroid Build Coastguard Worker     * done using layered rendering (writing gl_Layer from a geometry shader),
1207*61046927SAndroid Build Coastguard Worker     * so for other cases of multilayered framebuffers (typically with
1208*61046927SAndroid Build Coastguard Worker     * meta copy/clear operations) that won't use layered rendering, we only
1209*61046927SAndroid Build Coastguard Worker     * need one layer worth of of tile state for the binner.
1210*61046927SAndroid Build Coastguard Worker     */
1211*61046927SAndroid Build Coastguard Worker    bool allocate_tile_state_for_all_layers;
1212*61046927SAndroid Build Coastguard Worker 
1213*61046927SAndroid Build Coastguard Worker    /* A pointer to the location of the TILE_BINNING_MODE_CFG packet so we can
1214*61046927SAndroid Build Coastguard Worker     * rewrite it to enable double-buffer mode by the time we have enough info
1215*61046927SAndroid Build Coastguard Worker     * about the job to make that decision.
1216*61046927SAndroid Build Coastguard Worker     */
1217*61046927SAndroid Build Coastguard Worker    struct v3dv_cl_out *bcl_tile_binning_mode_ptr;
1218*61046927SAndroid Build Coastguard Worker 
1219*61046927SAndroid Build Coastguard Worker    enum v3dv_job_type type;
1220*61046927SAndroid Build Coastguard Worker 
1221*61046927SAndroid Build Coastguard Worker    struct v3dv_device *device;
1222*61046927SAndroid Build Coastguard Worker 
1223*61046927SAndroid Build Coastguard Worker    struct v3dv_cmd_buffer *cmd_buffer;
1224*61046927SAndroid Build Coastguard Worker 
1225*61046927SAndroid Build Coastguard Worker    struct v3dv_cl bcl;
1226*61046927SAndroid Build Coastguard Worker    struct v3dv_cl rcl;
1227*61046927SAndroid Build Coastguard Worker    struct v3dv_cl indirect;
1228*61046927SAndroid Build Coastguard Worker 
1229*61046927SAndroid Build Coastguard Worker    /* Set of all BOs referenced by the job. This will be used for making
1230*61046927SAndroid Build Coastguard Worker     * the list of BOs that the kernel will need to have paged in to
1231*61046927SAndroid Build Coastguard Worker     * execute our job.
1232*61046927SAndroid Build Coastguard Worker     */
1233*61046927SAndroid Build Coastguard Worker    struct set *bos;
1234*61046927SAndroid Build Coastguard Worker    uint32_t bo_count;
1235*61046927SAndroid Build Coastguard Worker    uint64_t bo_handle_mask;
1236*61046927SAndroid Build Coastguard Worker 
1237*61046927SAndroid Build Coastguard Worker    struct v3dv_bo *tile_alloc;
1238*61046927SAndroid Build Coastguard Worker    struct v3dv_bo *tile_state;
1239*61046927SAndroid Build Coastguard Worker 
1240*61046927SAndroid Build Coastguard Worker    bool tmu_dirty_rcl;
1241*61046927SAndroid Build Coastguard Worker 
1242*61046927SAndroid Build Coastguard Worker    uint32_t first_subpass;
1243*61046927SAndroid Build Coastguard Worker 
1244*61046927SAndroid Build Coastguard Worker    /* When the current subpass is split into multiple jobs, this flag is set
1245*61046927SAndroid Build Coastguard Worker     * to true for any jobs after the first in the same subpass.
1246*61046927SAndroid Build Coastguard Worker     */
1247*61046927SAndroid Build Coastguard Worker    bool is_subpass_continue;
1248*61046927SAndroid Build Coastguard Worker 
1249*61046927SAndroid Build Coastguard Worker    /* If this job is the last job emitted for a subpass. */
1250*61046927SAndroid Build Coastguard Worker    bool is_subpass_finish;
1251*61046927SAndroid Build Coastguard Worker 
1252*61046927SAndroid Build Coastguard Worker    struct v3dv_frame_tiling frame_tiling;
1253*61046927SAndroid Build Coastguard Worker 
1254*61046927SAndroid Build Coastguard Worker    enum v3dv_ez_state ez_state;
1255*61046927SAndroid Build Coastguard Worker    enum v3dv_ez_state first_ez_state;
1256*61046927SAndroid Build Coastguard Worker 
1257*61046927SAndroid Build Coastguard Worker    /* If we have already decided if we need to disable Early Z/S completely
1258*61046927SAndroid Build Coastguard Worker     * for this job.
1259*61046927SAndroid Build Coastguard Worker     */
1260*61046927SAndroid Build Coastguard Worker    bool decided_global_ez_enable;
1261*61046927SAndroid Build Coastguard Worker 
1262*61046927SAndroid Build Coastguard Worker    /* If the job emitted any draw calls with Early Z/S enabled */
1263*61046927SAndroid Build Coastguard Worker    bool has_ez_draws;
1264*61046927SAndroid Build Coastguard Worker 
1265*61046927SAndroid Build Coastguard Worker    /* If this job has been configured to use early Z/S clear */
1266*61046927SAndroid Build Coastguard Worker    bool early_zs_clear;
1267*61046927SAndroid Build Coastguard Worker 
1268*61046927SAndroid Build Coastguard Worker    /* Number of draw calls recorded into the job */
1269*61046927SAndroid Build Coastguard Worker    uint32_t draw_count;
1270*61046927SAndroid Build Coastguard Worker 
1271*61046927SAndroid Build Coastguard Worker    /* A flag indicating whether we want to flush every draw separately. This
1272*61046927SAndroid Build Coastguard Worker     * can be used for debugging, or for cases where special circumstances
1273*61046927SAndroid Build Coastguard Worker     * require this behavior.
1274*61046927SAndroid Build Coastguard Worker     */
1275*61046927SAndroid Build Coastguard Worker    bool always_flush;
1276*61046927SAndroid Build Coastguard Worker 
1277*61046927SAndroid Build Coastguard Worker    /* A mask of V3DV_BARRIER_* indicating the source(s) of the barrier. We
1278*61046927SAndroid Build Coastguard Worker     * can use this to select the hw queues where we need to serialize the job.
1279*61046927SAndroid Build Coastguard Worker     */
1280*61046927SAndroid Build Coastguard Worker    uint8_t serialize;
1281*61046927SAndroid Build Coastguard Worker 
1282*61046927SAndroid Build Coastguard Worker    /* If this is a CL job, whether we should sync before binning */
1283*61046927SAndroid Build Coastguard Worker    bool needs_bcl_sync;
1284*61046927SAndroid Build Coastguard Worker 
1285*61046927SAndroid Build Coastguard Worker    /* If we have emitted a (default) point size packet in this job */
1286*61046927SAndroid Build Coastguard Worker    bool emitted_default_point_size;
1287*61046927SAndroid Build Coastguard Worker 
1288*61046927SAndroid Build Coastguard Worker    /* Job specs for CPU jobs */
1289*61046927SAndroid Build Coastguard Worker    union {
1290*61046927SAndroid Build Coastguard Worker       struct v3dv_reset_query_cpu_job_info          query_reset;
1291*61046927SAndroid Build Coastguard Worker       struct v3dv_end_query_info                    query_end;
1292*61046927SAndroid Build Coastguard Worker       struct v3dv_copy_query_results_cpu_job_info   query_copy_results;
1293*61046927SAndroid Build Coastguard Worker       struct v3dv_csd_indirect_cpu_job_info         csd_indirect;
1294*61046927SAndroid Build Coastguard Worker       struct v3dv_timestamp_query_cpu_job_info      query_timestamp;
1295*61046927SAndroid Build Coastguard Worker    } cpu;
1296*61046927SAndroid Build Coastguard Worker 
1297*61046927SAndroid Build Coastguard Worker    /* Job specs for TFU jobs */
1298*61046927SAndroid Build Coastguard Worker    struct drm_v3d_submit_tfu tfu;
1299*61046927SAndroid Build Coastguard Worker 
1300*61046927SAndroid Build Coastguard Worker    /* Job specs for CSD jobs */
1301*61046927SAndroid Build Coastguard Worker    struct {
1302*61046927SAndroid Build Coastguard Worker       struct v3dv_bo *shared_memory;
1303*61046927SAndroid Build Coastguard Worker       uint32_t wg_count[3];
1304*61046927SAndroid Build Coastguard Worker       uint32_t wg_base[3];
1305*61046927SAndroid Build Coastguard Worker       struct drm_v3d_submit_csd submit;
1306*61046927SAndroid Build Coastguard Worker    } csd;
1307*61046927SAndroid Build Coastguard Worker 
1308*61046927SAndroid Build Coastguard Worker    /* Perfmons with last job sync for CSD and CL jobs */
1309*61046927SAndroid Build Coastguard Worker    struct v3dv_perf_query *perf;
1310*61046927SAndroid Build Coastguard Worker };
1311*61046927SAndroid Build Coastguard Worker 
1312*61046927SAndroid Build Coastguard Worker void v3dv_job_init(struct v3dv_job *job,
1313*61046927SAndroid Build Coastguard Worker                    enum v3dv_job_type type,
1314*61046927SAndroid Build Coastguard Worker                    struct v3dv_device *device,
1315*61046927SAndroid Build Coastguard Worker                    struct v3dv_cmd_buffer *cmd_buffer,
1316*61046927SAndroid Build Coastguard Worker                    int32_t subpass_idx);
1317*61046927SAndroid Build Coastguard Worker void v3dv_job_destroy(struct v3dv_job *job);
1318*61046927SAndroid Build Coastguard Worker 
1319*61046927SAndroid Build Coastguard Worker void v3dv_job_add_bo(struct v3dv_job *job, struct v3dv_bo *bo);
1320*61046927SAndroid Build Coastguard Worker void v3dv_job_add_bo_unchecked(struct v3dv_job *job, struct v3dv_bo *bo);
1321*61046927SAndroid Build Coastguard Worker 
1322*61046927SAndroid Build Coastguard Worker void v3dv_job_start_frame(struct v3dv_job *job,
1323*61046927SAndroid Build Coastguard Worker                           uint32_t width,
1324*61046927SAndroid Build Coastguard Worker                           uint32_t height,
1325*61046927SAndroid Build Coastguard Worker                           uint32_t layers,
1326*61046927SAndroid Build Coastguard Worker                           bool allocate_tile_state_for_all_layers,
1327*61046927SAndroid Build Coastguard Worker                           bool allocate_tile_state_now,
1328*61046927SAndroid Build Coastguard Worker                           uint32_t render_target_count,
1329*61046927SAndroid Build Coastguard Worker                           uint8_t max_internal_bpp,
1330*61046927SAndroid Build Coastguard Worker                           uint8_t total_color_bpp,
1331*61046927SAndroid Build Coastguard Worker                           bool msaa);
1332*61046927SAndroid Build Coastguard Worker 
1333*61046927SAndroid Build Coastguard Worker bool v3dv_job_type_is_gpu(struct v3dv_job *job);
1334*61046927SAndroid Build Coastguard Worker 
1335*61046927SAndroid Build Coastguard Worker struct v3dv_job *
1336*61046927SAndroid Build Coastguard Worker v3dv_job_clone(struct v3dv_job *job, bool skip_bcl);
1337*61046927SAndroid Build Coastguard Worker 
1338*61046927SAndroid Build Coastguard Worker struct v3dv_job *
1339*61046927SAndroid Build Coastguard Worker v3dv_job_clone_in_cmd_buffer(struct v3dv_job *job,
1340*61046927SAndroid Build Coastguard Worker                              struct v3dv_cmd_buffer *cmd_buffer);
1341*61046927SAndroid Build Coastguard Worker 
1342*61046927SAndroid Build Coastguard Worker struct v3dv_job *v3dv_cmd_buffer_create_cpu_job(struct v3dv_device *device,
1343*61046927SAndroid Build Coastguard Worker                                                 enum v3dv_job_type type,
1344*61046927SAndroid Build Coastguard Worker                                                 struct v3dv_cmd_buffer *cmd_buffer,
1345*61046927SAndroid Build Coastguard Worker                                                 uint32_t subpass_idx);
1346*61046927SAndroid Build Coastguard Worker 
1347*61046927SAndroid Build Coastguard Worker void
1348*61046927SAndroid Build Coastguard Worker v3dv_cmd_buffer_ensure_array_state(struct v3dv_cmd_buffer *cmd_buffer,
1349*61046927SAndroid Build Coastguard Worker                                    uint32_t slot_size,
1350*61046927SAndroid Build Coastguard Worker                                    uint32_t used_count,
1351*61046927SAndroid Build Coastguard Worker                                    uint32_t *alloc_count,
1352*61046927SAndroid Build Coastguard Worker                                    void **ptr);
1353*61046927SAndroid Build Coastguard Worker 
1354*61046927SAndroid Build Coastguard Worker void v3dv_cmd_buffer_emit_pre_draw(struct v3dv_cmd_buffer *cmd_buffer,
1355*61046927SAndroid Build Coastguard Worker                                    bool indexed, bool indirect,
1356*61046927SAndroid Build Coastguard Worker                                    uint32_t vertex_count);
1357*61046927SAndroid Build Coastguard Worker 
1358*61046927SAndroid Build Coastguard Worker bool v3dv_job_allocate_tile_state(struct v3dv_job *job);
1359*61046927SAndroid Build Coastguard Worker 
1360*61046927SAndroid Build Coastguard Worker void
1361*61046927SAndroid Build Coastguard Worker v3dv_setup_dynamic_framebuffer(struct v3dv_cmd_buffer *cmd_buffer,
1362*61046927SAndroid Build Coastguard Worker                                const VkRenderingInfoKHR *pRenderingInfo);
1363*61046927SAndroid Build Coastguard Worker 
1364*61046927SAndroid Build Coastguard Worker void
1365*61046927SAndroid Build Coastguard Worker v3dv_destroy_dynamic_framebuffer(struct v3dv_cmd_buffer *cmd_buffer);
1366*61046927SAndroid Build Coastguard Worker 
1367*61046927SAndroid Build Coastguard Worker void
1368*61046927SAndroid Build Coastguard Worker v3dv_setup_dynamic_render_pass(struct v3dv_cmd_buffer *cmd_buffer,
1369*61046927SAndroid Build Coastguard Worker                                const VkRenderingInfoKHR *pRenderingInfo);
1370*61046927SAndroid Build Coastguard Worker 
1371*61046927SAndroid Build Coastguard Worker void
1372*61046927SAndroid Build Coastguard Worker v3dv_setup_dynamic_render_pass_inheritance(struct v3dv_cmd_buffer *cmd_buffer,
1373*61046927SAndroid Build Coastguard Worker                                            const VkCommandBufferInheritanceRenderingInfo *info);
1374*61046927SAndroid Build Coastguard Worker 
1375*61046927SAndroid Build Coastguard Worker /* FIXME: only used on v3dv_cmd_buffer and v3dvx_cmd_buffer, perhaps move to a
1376*61046927SAndroid Build Coastguard Worker  * cmd_buffer specific header?
1377*61046927SAndroid Build Coastguard Worker  */
1378*61046927SAndroid Build Coastguard Worker struct v3dv_draw_info {
1379*61046927SAndroid Build Coastguard Worker    uint32_t vertex_count;
1380*61046927SAndroid Build Coastguard Worker    uint32_t instance_count;
1381*61046927SAndroid Build Coastguard Worker    uint32_t first_vertex;
1382*61046927SAndroid Build Coastguard Worker    uint32_t first_instance;
1383*61046927SAndroid Build Coastguard Worker };
1384*61046927SAndroid Build Coastguard Worker 
1385*61046927SAndroid Build Coastguard Worker struct v3dv_vertex_binding {
1386*61046927SAndroid Build Coastguard Worker    struct v3dv_buffer *buffer;
1387*61046927SAndroid Build Coastguard Worker    VkDeviceSize offset;
1388*61046927SAndroid Build Coastguard Worker    VkDeviceSize size;
1389*61046927SAndroid Build Coastguard Worker };
1390*61046927SAndroid Build Coastguard Worker 
1391*61046927SAndroid Build Coastguard Worker struct v3dv_descriptor_state {
1392*61046927SAndroid Build Coastguard Worker    struct v3dv_descriptor_set *descriptor_sets[MAX_SETS];
1393*61046927SAndroid Build Coastguard Worker    uint32_t valid;
1394*61046927SAndroid Build Coastguard Worker    uint32_t dynamic_offsets[MAX_DYNAMIC_BUFFERS];
1395*61046927SAndroid Build Coastguard Worker };
1396*61046927SAndroid Build Coastguard Worker 
1397*61046927SAndroid Build Coastguard Worker struct v3dv_cmd_pipeline_state {
1398*61046927SAndroid Build Coastguard Worker    struct v3dv_pipeline *pipeline;
1399*61046927SAndroid Build Coastguard Worker 
1400*61046927SAndroid Build Coastguard Worker    struct v3dv_descriptor_state descriptor_state;
1401*61046927SAndroid Build Coastguard Worker };
1402*61046927SAndroid Build Coastguard Worker 
1403*61046927SAndroid Build Coastguard Worker enum {
1404*61046927SAndroid Build Coastguard Worker    V3DV_BARRIER_GRAPHICS_BIT = (1 << 0),
1405*61046927SAndroid Build Coastguard Worker    V3DV_BARRIER_COMPUTE_BIT  = (1 << 1),
1406*61046927SAndroid Build Coastguard Worker    V3DV_BARRIER_TRANSFER_BIT = (1 << 2),
1407*61046927SAndroid Build Coastguard Worker    V3DV_BARRIER_CPU_BIT      = (1 << 3),
1408*61046927SAndroid Build Coastguard Worker };
1409*61046927SAndroid Build Coastguard Worker #define V3DV_BARRIER_ALL (V3DV_BARRIER_GRAPHICS_BIT | \
1410*61046927SAndroid Build Coastguard Worker                           V3DV_BARRIER_TRANSFER_BIT | \
1411*61046927SAndroid Build Coastguard Worker                           V3DV_BARRIER_COMPUTE_BIT | \
1412*61046927SAndroid Build Coastguard Worker                           V3DV_BARRIER_CPU_BIT);
1413*61046927SAndroid Build Coastguard Worker 
1414*61046927SAndroid Build Coastguard Worker struct v3dv_barrier_state {
1415*61046927SAndroid Build Coastguard Worker    /* Mask of V3DV_BARRIER_* indicating where we consume a barrier. */
1416*61046927SAndroid Build Coastguard Worker    uint8_t dst_mask;
1417*61046927SAndroid Build Coastguard Worker 
1418*61046927SAndroid Build Coastguard Worker    /* For each possible consumer of a barrier, a mask of V3DV_BARRIER_*
1419*61046927SAndroid Build Coastguard Worker     * indicating the sources of the dependency.
1420*61046927SAndroid Build Coastguard Worker     */
1421*61046927SAndroid Build Coastguard Worker    uint8_t src_mask_graphics;
1422*61046927SAndroid Build Coastguard Worker    uint8_t src_mask_transfer;
1423*61046927SAndroid Build Coastguard Worker    uint8_t src_mask_compute;
1424*61046927SAndroid Build Coastguard Worker 
1425*61046927SAndroid Build Coastguard Worker    /* For graphics barriers, access masks involved. Used to decide if we need
1426*61046927SAndroid Build Coastguard Worker     * to execute a binning or render barrier.
1427*61046927SAndroid Build Coastguard Worker     */
1428*61046927SAndroid Build Coastguard Worker    VkAccessFlags2 bcl_buffer_access;
1429*61046927SAndroid Build Coastguard Worker    VkAccessFlags2 bcl_image_access;
1430*61046927SAndroid Build Coastguard Worker };
1431*61046927SAndroid Build Coastguard Worker 
1432*61046927SAndroid Build Coastguard Worker struct v3dv_cmd_buffer_state {
1433*61046927SAndroid Build Coastguard Worker    struct v3dv_render_pass *pass;
1434*61046927SAndroid Build Coastguard Worker    struct v3dv_framebuffer *framebuffer;
1435*61046927SAndroid Build Coastguard Worker 
1436*61046927SAndroid Build Coastguard Worker    /* VK_KHR_dynamic_rendering */
1437*61046927SAndroid Build Coastguard Worker    struct v3dv_render_pass dynamic_pass;
1438*61046927SAndroid Build Coastguard Worker    struct v3dv_subpass dynamic_subpass;
1439*61046927SAndroid Build Coastguard Worker    struct v3dv_render_pass_attachment dynamic_attachments[18 /* (8 color + D/S) x 2 (for resolves) */];
1440*61046927SAndroid Build Coastguard Worker    struct v3dv_subpass_attachment dynamic_subpass_attachments[18];
1441*61046927SAndroid Build Coastguard Worker    struct v3dv_framebuffer *dynamic_framebuffer;
1442*61046927SAndroid Build Coastguard Worker 
1443*61046927SAndroid Build Coastguard Worker    VkRect2D render_area;
1444*61046927SAndroid Build Coastguard Worker 
1445*61046927SAndroid Build Coastguard Worker    /* Current job being recorded */
1446*61046927SAndroid Build Coastguard Worker    struct v3dv_job *job;
1447*61046927SAndroid Build Coastguard Worker 
1448*61046927SAndroid Build Coastguard Worker    uint32_t subpass_idx;
1449*61046927SAndroid Build Coastguard Worker 
1450*61046927SAndroid Build Coastguard Worker    struct v3dv_cmd_pipeline_state gfx;
1451*61046927SAndroid Build Coastguard Worker    struct v3dv_cmd_pipeline_state compute;
1452*61046927SAndroid Build Coastguard Worker 
1453*61046927SAndroid Build Coastguard Worker    /* For most state tracking we rely on vk_dynamic_graphics_state, but we
1454*61046927SAndroid Build Coastguard Worker     * maintain a custom structure for some state-related data that we want to
1455*61046927SAndroid Build Coastguard Worker     * cache.
1456*61046927SAndroid Build Coastguard Worker     */
1457*61046927SAndroid Build Coastguard Worker    struct v3dv_dynamic_state dynamic;
1458*61046927SAndroid Build Coastguard Worker 
1459*61046927SAndroid Build Coastguard Worker    /* This dirty is for v3dv_cmd_dirty_bits (FIXME: perhaps we should be more
1460*61046927SAndroid Build Coastguard Worker     * explicit about it). For dirty flags coming from Vulkan dynamic state,
1461*61046927SAndroid Build Coastguard Worker     * use the vk_dynamic_graphics_state handled by the vk_cmd_buffer
1462*61046927SAndroid Build Coastguard Worker     */
1463*61046927SAndroid Build Coastguard Worker    uint32_t dirty;
1464*61046927SAndroid Build Coastguard Worker    VkShaderStageFlagBits dirty_descriptor_stages;
1465*61046927SAndroid Build Coastguard Worker    VkShaderStageFlagBits dirty_push_constants_stages;
1466*61046927SAndroid Build Coastguard Worker 
1467*61046927SAndroid Build Coastguard Worker    /* Current clip window. We use this to check whether we have an active
1468*61046927SAndroid Build Coastguard Worker     * scissor, since in that case we can't use TLB clears and need to fallback
1469*61046927SAndroid Build Coastguard Worker     * to drawing rects.
1470*61046927SAndroid Build Coastguard Worker     */
1471*61046927SAndroid Build Coastguard Worker    VkRect2D clip_window;
1472*61046927SAndroid Build Coastguard Worker 
1473*61046927SAndroid Build Coastguard Worker    /* Whether our render area is aligned to tile boundaries. If this is false
1474*61046927SAndroid Build Coastguard Worker     * then we have tiles that are only partially covered by the render area,
1475*61046927SAndroid Build Coastguard Worker     * and therefore, we need to be careful with our loads and stores so we don't
1476*61046927SAndroid Build Coastguard Worker     * modify pixels for the tile area that is not covered by the render area.
1477*61046927SAndroid Build Coastguard Worker     * This means, for example, that we can't use the TLB to clear, since that
1478*61046927SAndroid Build Coastguard Worker     * always clears full tiles.
1479*61046927SAndroid Build Coastguard Worker     */
1480*61046927SAndroid Build Coastguard Worker    bool tile_aligned_render_area;
1481*61046927SAndroid Build Coastguard Worker 
1482*61046927SAndroid Build Coastguard Worker    /* FIXME: we have just one client-side BO for the push constants,
1483*61046927SAndroid Build Coastguard Worker     * independently of the stageFlags in vkCmdPushConstants, and the
1484*61046927SAndroid Build Coastguard Worker     * pipelineBindPoint in vkCmdBindPipeline. We could probably do more stage
1485*61046927SAndroid Build Coastguard Worker     * tuning in the future if it makes sense.
1486*61046927SAndroid Build Coastguard Worker     */
1487*61046927SAndroid Build Coastguard Worker    uint32_t push_constants_size;
1488*61046927SAndroid Build Coastguard Worker    uint32_t push_constants_data[MAX_PUSH_CONSTANTS_SIZE / 4];
1489*61046927SAndroid Build Coastguard Worker 
1490*61046927SAndroid Build Coastguard Worker    uint32_t attachment_alloc_count;
1491*61046927SAndroid Build Coastguard Worker    struct v3dv_cmd_buffer_attachment_state *attachments;
1492*61046927SAndroid Build Coastguard Worker 
1493*61046927SAndroid Build Coastguard Worker    struct v3dv_vertex_binding vertex_bindings[MAX_VBS];
1494*61046927SAndroid Build Coastguard Worker 
1495*61046927SAndroid Build Coastguard Worker    struct {
1496*61046927SAndroid Build Coastguard Worker       VkBuffer buffer;
1497*61046927SAndroid Build Coastguard Worker       VkDeviceSize offset;
1498*61046927SAndroid Build Coastguard Worker       VkDeviceSize size;
1499*61046927SAndroid Build Coastguard Worker       uint8_t index_size;
1500*61046927SAndroid Build Coastguard Worker    } index_buffer;
1501*61046927SAndroid Build Coastguard Worker 
1502*61046927SAndroid Build Coastguard Worker    /* Current uniforms */
1503*61046927SAndroid Build Coastguard Worker    struct {
1504*61046927SAndroid Build Coastguard Worker       struct v3dv_cl_reloc vs_bin;
1505*61046927SAndroid Build Coastguard Worker       struct v3dv_cl_reloc vs;
1506*61046927SAndroid Build Coastguard Worker       struct v3dv_cl_reloc gs_bin;
1507*61046927SAndroid Build Coastguard Worker       struct v3dv_cl_reloc gs;
1508*61046927SAndroid Build Coastguard Worker       struct v3dv_cl_reloc fs;
1509*61046927SAndroid Build Coastguard Worker    } uniforms;
1510*61046927SAndroid Build Coastguard Worker 
1511*61046927SAndroid Build Coastguard Worker    /* Current view index for multiview rendering */
1512*61046927SAndroid Build Coastguard Worker    uint32_t view_index;
1513*61046927SAndroid Build Coastguard Worker 
1514*61046927SAndroid Build Coastguard Worker    /* Current draw ID for multidraw */
1515*61046927SAndroid Build Coastguard Worker    uint32_t draw_id;
1516*61046927SAndroid Build Coastguard Worker 
1517*61046927SAndroid Build Coastguard Worker    /* Used to flag OOM conditions during command buffer recording */
1518*61046927SAndroid Build Coastguard Worker    bool oom;
1519*61046927SAndroid Build Coastguard Worker 
1520*61046927SAndroid Build Coastguard Worker    /* If we are currently recording job(s) for a transfer operation */
1521*61046927SAndroid Build Coastguard Worker    bool is_transfer;
1522*61046927SAndroid Build Coastguard Worker 
1523*61046927SAndroid Build Coastguard Worker    /* VK_KHR_dynamic_rendering */
1524*61046927SAndroid Build Coastguard Worker    bool suspending;
1525*61046927SAndroid Build Coastguard Worker    bool resuming;
1526*61046927SAndroid Build Coastguard Worker 
1527*61046927SAndroid Build Coastguard Worker    /* Barrier state tracking */
1528*61046927SAndroid Build Coastguard Worker    struct v3dv_barrier_state barrier;
1529*61046927SAndroid Build Coastguard Worker 
1530*61046927SAndroid Build Coastguard Worker    /* Secondary command buffer state */
1531*61046927SAndroid Build Coastguard Worker    struct {
1532*61046927SAndroid Build Coastguard Worker       bool occlusion_query_enable;
1533*61046927SAndroid Build Coastguard Worker    } inheritance;
1534*61046927SAndroid Build Coastguard Worker 
1535*61046927SAndroid Build Coastguard Worker    /* Command buffer state saved during a meta operation */
1536*61046927SAndroid Build Coastguard Worker    struct {
1537*61046927SAndroid Build Coastguard Worker       uint32_t subpass_idx;
1538*61046927SAndroid Build Coastguard Worker       VkRenderPass pass;
1539*61046927SAndroid Build Coastguard Worker       VkFramebuffer framebuffer;
1540*61046927SAndroid Build Coastguard Worker 
1541*61046927SAndroid Build Coastguard Worker       uint32_t attachment_alloc_count;
1542*61046927SAndroid Build Coastguard Worker       uint32_t attachment_count;
1543*61046927SAndroid Build Coastguard Worker       struct v3dv_cmd_buffer_attachment_state *attachments;
1544*61046927SAndroid Build Coastguard Worker 
1545*61046927SAndroid Build Coastguard Worker       bool tile_aligned_render_area;
1546*61046927SAndroid Build Coastguard Worker       VkRect2D render_area;
1547*61046927SAndroid Build Coastguard Worker 
1548*61046927SAndroid Build Coastguard Worker       struct vk_dynamic_graphics_state dynamic_graphics_state;
1549*61046927SAndroid Build Coastguard Worker       struct v3dv_dynamic_state dynamic;
1550*61046927SAndroid Build Coastguard Worker 
1551*61046927SAndroid Build Coastguard Worker       struct v3dv_cmd_pipeline_state gfx;
1552*61046927SAndroid Build Coastguard Worker       bool has_descriptor_state;
1553*61046927SAndroid Build Coastguard Worker 
1554*61046927SAndroid Build Coastguard Worker       uint32_t push_constants[MAX_PUSH_CONSTANTS_SIZE / 4];
1555*61046927SAndroid Build Coastguard Worker       uint32_t push_constants_size;
1556*61046927SAndroid Build Coastguard Worker    } meta;
1557*61046927SAndroid Build Coastguard Worker 
1558*61046927SAndroid Build Coastguard Worker    /* Command buffer state for queries */
1559*61046927SAndroid Build Coastguard Worker    struct {
1560*61046927SAndroid Build Coastguard Worker       /* A list of vkCmdQueryEnd commands recorded in the command buffer during
1561*61046927SAndroid Build Coastguard Worker        * a render pass. We queue these here and then schedule the corresponding
1562*61046927SAndroid Build Coastguard Worker        * CPU jobs for them at the time we finish the GPU job in which they have
1563*61046927SAndroid Build Coastguard Worker        * been recorded.
1564*61046927SAndroid Build Coastguard Worker        */
1565*61046927SAndroid Build Coastguard Worker       struct {
1566*61046927SAndroid Build Coastguard Worker          uint32_t used_count;
1567*61046927SAndroid Build Coastguard Worker          uint32_t alloc_count;
1568*61046927SAndroid Build Coastguard Worker          struct v3dv_end_query_info *states;
1569*61046927SAndroid Build Coastguard Worker       } end;
1570*61046927SAndroid Build Coastguard Worker 
1571*61046927SAndroid Build Coastguard Worker       struct {
1572*61046927SAndroid Build Coastguard Worker          /* This BO is not NULL if we have an active occlusion query, that is,
1573*61046927SAndroid Build Coastguard Worker           * we have called vkCmdBeginQuery but not vkCmdEndQuery.
1574*61046927SAndroid Build Coastguard Worker           */
1575*61046927SAndroid Build Coastguard Worker          struct v3dv_bo *bo;
1576*61046927SAndroid Build Coastguard Worker          uint32_t offset;
1577*61046927SAndroid Build Coastguard Worker          /* When the driver emits draw calls to implement other operations in
1578*61046927SAndroid Build Coastguard Worker           * the middle of a render pass (such as an attachment clear), we need
1579*61046927SAndroid Build Coastguard Worker           * to pause occlusion query recording and resume it later so that
1580*61046927SAndroid Build Coastguard Worker           * these draw calls don't register in occlussion counters. We use
1581*61046927SAndroid Build Coastguard Worker           * this to store the BO reference in which we should resume occlusion
1582*61046927SAndroid Build Coastguard Worker           * query counters after the driver is done emitting its draw calls.
1583*61046927SAndroid Build Coastguard Worker            */
1584*61046927SAndroid Build Coastguard Worker          struct v3dv_bo *paused_bo;
1585*61046927SAndroid Build Coastguard Worker 
1586*61046927SAndroid Build Coastguard Worker          /* This pointer is not NULL if we have an active performance query */
1587*61046927SAndroid Build Coastguard Worker          struct v3dv_perf_query *perf;
1588*61046927SAndroid Build Coastguard Worker       } active_query;
1589*61046927SAndroid Build Coastguard Worker    } query;
1590*61046927SAndroid Build Coastguard Worker 
1591*61046927SAndroid Build Coastguard Worker    /* This is dynamic state since VK_EXT_extended_dynamic_state. */
1592*61046927SAndroid Build Coastguard Worker    bool z_updates_enable;
1593*61046927SAndroid Build Coastguard Worker 
1594*61046927SAndroid Build Coastguard Worker    /* ez_state can be dynamic since VK_EXT_extended_dynamic_state so we need
1595*61046927SAndroid Build Coastguard Worker     * to keep track of it in the cmd_buffer state
1596*61046927SAndroid Build Coastguard Worker     */
1597*61046927SAndroid Build Coastguard Worker    enum v3dv_ez_state ez_state;
1598*61046927SAndroid Build Coastguard Worker 
1599*61046927SAndroid Build Coastguard Worker    /* incompatible_ez_test can be dynamic since VK_EXT_extended_dynamic_state
1600*61046927SAndroid Build Coastguard Worker     * so we need to keep track of it in the cmd_buffer state
1601*61046927SAndroid Build Coastguard Worker     */
1602*61046927SAndroid Build Coastguard Worker    bool incompatible_ez_test;
1603*61046927SAndroid Build Coastguard Worker };
1604*61046927SAndroid Build Coastguard Worker 
1605*61046927SAndroid Build Coastguard Worker void
1606*61046927SAndroid Build Coastguard Worker v3dv_cmd_buffer_state_get_viewport_z_xform(struct v3dv_cmd_buffer *cmd_buffer,
1607*61046927SAndroid Build Coastguard Worker                                            uint32_t vp_idx,
1608*61046927SAndroid Build Coastguard Worker                                            float *translate_z, float *scale_z);
1609*61046927SAndroid Build Coastguard Worker 
1610*61046927SAndroid Build Coastguard Worker /* The following struct represents the info from a descriptor that we store on
1611*61046927SAndroid Build Coastguard Worker  * the host memory. They are mostly links to other existing vulkan objects,
1612*61046927SAndroid Build Coastguard Worker  * like the image_view in order to access to swizzle info, or the buffer used
1613*61046927SAndroid Build Coastguard Worker  * for a UBO/SSBO, for example.
1614*61046927SAndroid Build Coastguard Worker  *
1615*61046927SAndroid Build Coastguard Worker  * FIXME: revisit if makes sense to just move everything that would be needed
1616*61046927SAndroid Build Coastguard Worker  * from a descriptor to the bo.
1617*61046927SAndroid Build Coastguard Worker  */
1618*61046927SAndroid Build Coastguard Worker struct v3dv_descriptor {
1619*61046927SAndroid Build Coastguard Worker    VkDescriptorType type;
1620*61046927SAndroid Build Coastguard Worker 
1621*61046927SAndroid Build Coastguard Worker    union {
1622*61046927SAndroid Build Coastguard Worker       struct {
1623*61046927SAndroid Build Coastguard Worker          struct v3dv_image_view *image_view;
1624*61046927SAndroid Build Coastguard Worker          struct v3dv_sampler *sampler;
1625*61046927SAndroid Build Coastguard Worker       };
1626*61046927SAndroid Build Coastguard Worker 
1627*61046927SAndroid Build Coastguard Worker       struct {
1628*61046927SAndroid Build Coastguard Worker          struct v3dv_buffer *buffer;
1629*61046927SAndroid Build Coastguard Worker          size_t offset;
1630*61046927SAndroid Build Coastguard Worker          size_t range;
1631*61046927SAndroid Build Coastguard Worker       };
1632*61046927SAndroid Build Coastguard Worker 
1633*61046927SAndroid Build Coastguard Worker       struct v3dv_buffer_view *buffer_view;
1634*61046927SAndroid Build Coastguard Worker    };
1635*61046927SAndroid Build Coastguard Worker };
1636*61046927SAndroid Build Coastguard Worker 
1637*61046927SAndroid Build Coastguard Worker struct v3dv_query {
1638*61046927SAndroid Build Coastguard Worker    /* Used by queries where we implement result copying in the CPU so we can
1639*61046927SAndroid Build Coastguard Worker     * tell if the relevant jobs have been submitted for execution. Currently
1640*61046927SAndroid Build Coastguard Worker     * these are all but occlusion queries.
1641*61046927SAndroid Build Coastguard Worker     */
1642*61046927SAndroid Build Coastguard Worker    bool maybe_available;
1643*61046927SAndroid Build Coastguard Worker 
1644*61046927SAndroid Build Coastguard Worker    union {
1645*61046927SAndroid Build Coastguard Worker       /* Used by occlusion queries */
1646*61046927SAndroid Build Coastguard Worker       struct {
1647*61046927SAndroid Build Coastguard Worker          /* Offset of this query in the occlusion query counter BO */
1648*61046927SAndroid Build Coastguard Worker          uint32_t offset;
1649*61046927SAndroid Build Coastguard Worker       } occlusion;
1650*61046927SAndroid Build Coastguard Worker 
1651*61046927SAndroid Build Coastguard Worker       /* Used by timestamp queries */
1652*61046927SAndroid Build Coastguard Worker       struct {
1653*61046927SAndroid Build Coastguard Worker          /* Offset of this query in the timestamp BO for its value */
1654*61046927SAndroid Build Coastguard Worker          uint32_t offset;
1655*61046927SAndroid Build Coastguard Worker 
1656*61046927SAndroid Build Coastguard Worker          /* Syncobj to signal timestamp query availability */
1657*61046927SAndroid Build Coastguard Worker          struct vk_sync *sync;
1658*61046927SAndroid Build Coastguard Worker       } timestamp;
1659*61046927SAndroid Build Coastguard Worker 
1660*61046927SAndroid Build Coastguard Worker       /* Used by performance queries */
1661*61046927SAndroid Build Coastguard Worker       struct v3dv_perf_query perf;
1662*61046927SAndroid Build Coastguard Worker    };
1663*61046927SAndroid Build Coastguard Worker };
1664*61046927SAndroid Build Coastguard Worker 
1665*61046927SAndroid Build Coastguard Worker struct v3dv_query_pool {
1666*61046927SAndroid Build Coastguard Worker    struct vk_object_base base;
1667*61046927SAndroid Build Coastguard Worker 
1668*61046927SAndroid Build Coastguard Worker    /* Per-pool Vulkan resources required to implement GPU-side query
1669*61046927SAndroid Build Coastguard Worker     * functions (only occlusion queries for now).
1670*61046927SAndroid Build Coastguard Worker     */
1671*61046927SAndroid Build Coastguard Worker    struct {
1672*61046927SAndroid Build Coastguard Worker       /* Buffer to access the BO with the occlusion query results and
1673*61046927SAndroid Build Coastguard Worker        * availability info.
1674*61046927SAndroid Build Coastguard Worker        */
1675*61046927SAndroid Build Coastguard Worker       VkBuffer buf;
1676*61046927SAndroid Build Coastguard Worker       VkDeviceMemory mem;
1677*61046927SAndroid Build Coastguard Worker 
1678*61046927SAndroid Build Coastguard Worker       /* Descriptor set for accessing the buffer from a pipeline. */
1679*61046927SAndroid Build Coastguard Worker       VkDescriptorPool descriptor_pool;
1680*61046927SAndroid Build Coastguard Worker       VkDescriptorSet descriptor_set;
1681*61046927SAndroid Build Coastguard Worker    } meta;
1682*61046927SAndroid Build Coastguard Worker 
1683*61046927SAndroid Build Coastguard Worker    /* Only used with occlusion queries */
1684*61046927SAndroid Build Coastguard Worker    struct {
1685*61046927SAndroid Build Coastguard Worker       /* BO with the occlusion counters and query availability */
1686*61046927SAndroid Build Coastguard Worker       struct v3dv_bo *bo;
1687*61046927SAndroid Build Coastguard Worker       /* Offset of the availability info in the BO */
1688*61046927SAndroid Build Coastguard Worker       uint32_t avail_offset;
1689*61046927SAndroid Build Coastguard Worker    } occlusion;
1690*61046927SAndroid Build Coastguard Worker 
1691*61046927SAndroid Build Coastguard Worker    /* Only used with timestamp queries */
1692*61046927SAndroid Build Coastguard Worker    struct {
1693*61046927SAndroid Build Coastguard Worker       /* BO with the query timestamp values */
1694*61046927SAndroid Build Coastguard Worker       struct v3dv_bo *bo;
1695*61046927SAndroid Build Coastguard Worker    } timestamp;
1696*61046927SAndroid Build Coastguard Worker 
1697*61046927SAndroid Build Coastguard Worker    /* Only used with performance queries */
1698*61046927SAndroid Build Coastguard Worker    struct {
1699*61046927SAndroid Build Coastguard Worker       uint32_t ncounters;
1700*61046927SAndroid Build Coastguard Worker       uint8_t counters[V3D_MAX_PERFCNT];
1701*61046927SAndroid Build Coastguard Worker 
1702*61046927SAndroid Build Coastguard Worker       /* V3D has a limit on the number of counters we can track in a
1703*61046927SAndroid Build Coastguard Worker        * single performance monitor, so if too many counters are requested
1704*61046927SAndroid Build Coastguard Worker        * we need to create multiple monitors to record all of them. This
1705*61046927SAndroid Build Coastguard Worker        * field represents the number of monitors required for the number
1706*61046927SAndroid Build Coastguard Worker        * of counters requested.
1707*61046927SAndroid Build Coastguard Worker        */
1708*61046927SAndroid Build Coastguard Worker       uint8_t nperfmons;
1709*61046927SAndroid Build Coastguard Worker    } perfmon;
1710*61046927SAndroid Build Coastguard Worker 
1711*61046927SAndroid Build Coastguard Worker    VkQueryType query_type;
1712*61046927SAndroid Build Coastguard Worker    uint32_t query_count;
1713*61046927SAndroid Build Coastguard Worker    struct v3dv_query *queries;
1714*61046927SAndroid Build Coastguard Worker };
1715*61046927SAndroid Build Coastguard Worker 
1716*61046927SAndroid Build Coastguard Worker VkResult
1717*61046927SAndroid Build Coastguard Worker v3dv_query_allocate_resources(struct v3dv_device *decice);
1718*61046927SAndroid Build Coastguard Worker 
1719*61046927SAndroid Build Coastguard Worker void
1720*61046927SAndroid Build Coastguard Worker v3dv_query_free_resources(struct v3dv_device *decice);
1721*61046927SAndroid Build Coastguard Worker 
1722*61046927SAndroid Build Coastguard Worker VkResult v3dv_get_query_pool_results_cpu(struct v3dv_device *device,
1723*61046927SAndroid Build Coastguard Worker                                          struct v3dv_query_pool *pool,
1724*61046927SAndroid Build Coastguard Worker                                          uint32_t first,
1725*61046927SAndroid Build Coastguard Worker                                          uint32_t count,
1726*61046927SAndroid Build Coastguard Worker                                          void *data,
1727*61046927SAndroid Build Coastguard Worker                                          VkDeviceSize stride,
1728*61046927SAndroid Build Coastguard Worker                                          VkQueryResultFlags flags);
1729*61046927SAndroid Build Coastguard Worker 
1730*61046927SAndroid Build Coastguard Worker void v3dv_reset_query_pool_cpu(struct v3dv_device *device,
1731*61046927SAndroid Build Coastguard Worker                                struct v3dv_query_pool *query_pool,
1732*61046927SAndroid Build Coastguard Worker                                uint32_t first,
1733*61046927SAndroid Build Coastguard Worker                                uint32_t last);
1734*61046927SAndroid Build Coastguard Worker 
1735*61046927SAndroid Build Coastguard Worker void v3dv_cmd_buffer_emit_set_query_availability(struct v3dv_cmd_buffer *cmd_buffer,
1736*61046927SAndroid Build Coastguard Worker                                                  struct v3dv_query_pool *pool,
1737*61046927SAndroid Build Coastguard Worker                                                  uint32_t query, uint32_t count,
1738*61046927SAndroid Build Coastguard Worker                                                  uint8_t availability);
1739*61046927SAndroid Build Coastguard Worker 
1740*61046927SAndroid Build Coastguard Worker typedef void (*v3dv_cmd_buffer_private_obj_destroy_cb)(VkDevice device,
1741*61046927SAndroid Build Coastguard Worker                                                        uint64_t pobj,
1742*61046927SAndroid Build Coastguard Worker                                                        VkAllocationCallbacks *alloc);
1743*61046927SAndroid Build Coastguard Worker struct v3dv_cmd_buffer_private_obj {
1744*61046927SAndroid Build Coastguard Worker    struct list_head list_link;
1745*61046927SAndroid Build Coastguard Worker    uint64_t obj;
1746*61046927SAndroid Build Coastguard Worker    v3dv_cmd_buffer_private_obj_destroy_cb destroy_cb;
1747*61046927SAndroid Build Coastguard Worker };
1748*61046927SAndroid Build Coastguard Worker 
1749*61046927SAndroid Build Coastguard Worker extern const struct vk_command_buffer_ops v3dv_cmd_buffer_ops;
1750*61046927SAndroid Build Coastguard Worker 
1751*61046927SAndroid Build Coastguard Worker struct v3dv_cmd_buffer {
1752*61046927SAndroid Build Coastguard Worker    struct vk_command_buffer vk;
1753*61046927SAndroid Build Coastguard Worker 
1754*61046927SAndroid Build Coastguard Worker    struct v3dv_device *device;
1755*61046927SAndroid Build Coastguard Worker 
1756*61046927SAndroid Build Coastguard Worker    VkCommandBufferUsageFlags usage_flags;
1757*61046927SAndroid Build Coastguard Worker 
1758*61046927SAndroid Build Coastguard Worker    enum v3dv_cmd_buffer_status status;
1759*61046927SAndroid Build Coastguard Worker 
1760*61046927SAndroid Build Coastguard Worker    struct v3dv_cmd_buffer_state state;
1761*61046927SAndroid Build Coastguard Worker 
1762*61046927SAndroid Build Coastguard Worker    /* Buffer where we upload push constant data to resolve indirect indexing */
1763*61046927SAndroid Build Coastguard Worker    struct v3dv_cl_reloc push_constants_resource;
1764*61046927SAndroid Build Coastguard Worker 
1765*61046927SAndroid Build Coastguard Worker    /* Collection of Vulkan objects created internally by the driver (typically
1766*61046927SAndroid Build Coastguard Worker     * during recording of meta operations) that are part of the command buffer
1767*61046927SAndroid Build Coastguard Worker     * and should be destroyed with it.
1768*61046927SAndroid Build Coastguard Worker     */
1769*61046927SAndroid Build Coastguard Worker    struct list_head private_objs; /* v3dv_cmd_buffer_private_obj */
1770*61046927SAndroid Build Coastguard Worker 
1771*61046927SAndroid Build Coastguard Worker    /* Per-command buffer resources for meta operations. */
1772*61046927SAndroid Build Coastguard Worker    struct {
1773*61046927SAndroid Build Coastguard Worker       struct {
1774*61046927SAndroid Build Coastguard Worker          /* The current descriptor pool for blit sources */
1775*61046927SAndroid Build Coastguard Worker          VkDescriptorPool dspool;
1776*61046927SAndroid Build Coastguard Worker       } blit;
1777*61046927SAndroid Build Coastguard Worker       struct {
1778*61046927SAndroid Build Coastguard Worker          /* The current descriptor pool for texel buffer copy sources */
1779*61046927SAndroid Build Coastguard Worker          VkDescriptorPool dspool;
1780*61046927SAndroid Build Coastguard Worker       } texel_buffer_copy;
1781*61046927SAndroid Build Coastguard Worker       struct {
1782*61046927SAndroid Build Coastguard Worker          /* The current descriptor pool for the copy query results output buffer */
1783*61046927SAndroid Build Coastguard Worker          VkDescriptorPool dspool;
1784*61046927SAndroid Build Coastguard Worker       } query;
1785*61046927SAndroid Build Coastguard Worker    } meta;
1786*61046927SAndroid Build Coastguard Worker 
1787*61046927SAndroid Build Coastguard Worker    /* List of jobs in the command buffer. For primary command buffers it
1788*61046927SAndroid Build Coastguard Worker     * represents the jobs we want to submit to the GPU. For secondary command
1789*61046927SAndroid Build Coastguard Worker     * buffers it represents jobs that will be merged into a primary command
1790*61046927SAndroid Build Coastguard Worker     * buffer via vkCmdExecuteCommands.
1791*61046927SAndroid Build Coastguard Worker     */
1792*61046927SAndroid Build Coastguard Worker    struct list_head jobs;
1793*61046927SAndroid Build Coastguard Worker };
1794*61046927SAndroid Build Coastguard Worker 
1795*61046927SAndroid Build Coastguard Worker struct v3dv_job *v3dv_cmd_buffer_start_job(struct v3dv_cmd_buffer *cmd_buffer,
1796*61046927SAndroid Build Coastguard Worker                                            int32_t subpass_idx,
1797*61046927SAndroid Build Coastguard Worker                                            enum v3dv_job_type type);
1798*61046927SAndroid Build Coastguard Worker void v3dv_cmd_buffer_finish_job(struct v3dv_cmd_buffer *cmd_buffer);
1799*61046927SAndroid Build Coastguard Worker 
1800*61046927SAndroid Build Coastguard Worker struct v3dv_job *v3dv_cmd_buffer_subpass_start(struct v3dv_cmd_buffer *cmd_buffer,
1801*61046927SAndroid Build Coastguard Worker                                                uint32_t subpass_idx);
1802*61046927SAndroid Build Coastguard Worker struct v3dv_job *v3dv_cmd_buffer_subpass_resume(struct v3dv_cmd_buffer *cmd_buffer,
1803*61046927SAndroid Build Coastguard Worker                                                 uint32_t subpass_idx);
1804*61046927SAndroid Build Coastguard Worker 
1805*61046927SAndroid Build Coastguard Worker void v3dv_cmd_buffer_subpass_finish(struct v3dv_cmd_buffer *cmd_buffer);
1806*61046927SAndroid Build Coastguard Worker 
1807*61046927SAndroid Build Coastguard Worker void v3dv_cmd_buffer_meta_state_push(struct v3dv_cmd_buffer *cmd_buffer,
1808*61046927SAndroid Build Coastguard Worker                                      bool push_descriptor_state);
1809*61046927SAndroid Build Coastguard Worker void v3dv_cmd_buffer_meta_state_pop(struct v3dv_cmd_buffer *cmd_buffer,
1810*61046927SAndroid Build Coastguard Worker                                     bool needs_subpass_resume);
1811*61046927SAndroid Build Coastguard Worker 
1812*61046927SAndroid Build Coastguard Worker void v3dv_cmd_buffer_begin_query(struct v3dv_cmd_buffer *cmd_buffer,
1813*61046927SAndroid Build Coastguard Worker                                  struct v3dv_query_pool *pool,
1814*61046927SAndroid Build Coastguard Worker                                  uint32_t query,
1815*61046927SAndroid Build Coastguard Worker                                  VkQueryControlFlags flags);
1816*61046927SAndroid Build Coastguard Worker 
1817*61046927SAndroid Build Coastguard Worker void v3dv_cmd_buffer_pause_occlusion_query(struct v3dv_cmd_buffer *cmd_buffer);
1818*61046927SAndroid Build Coastguard Worker void v3dv_cmd_buffer_resume_occlusion_query(struct v3dv_cmd_buffer *cmd_buffer);
1819*61046927SAndroid Build Coastguard Worker 
1820*61046927SAndroid Build Coastguard Worker void v3dv_cmd_buffer_end_query(struct v3dv_cmd_buffer *cmd_buffer,
1821*61046927SAndroid Build Coastguard Worker                                struct v3dv_query_pool *pool,
1822*61046927SAndroid Build Coastguard Worker                                uint32_t query);
1823*61046927SAndroid Build Coastguard Worker 
1824*61046927SAndroid Build Coastguard Worker void v3dv_cmd_buffer_copy_query_results(struct v3dv_cmd_buffer *cmd_buffer,
1825*61046927SAndroid Build Coastguard Worker                                         struct v3dv_query_pool *pool,
1826*61046927SAndroid Build Coastguard Worker                                         uint32_t first,
1827*61046927SAndroid Build Coastguard Worker                                         uint32_t count,
1828*61046927SAndroid Build Coastguard Worker                                         struct v3dv_buffer *dst,
1829*61046927SAndroid Build Coastguard Worker                                         uint32_t offset,
1830*61046927SAndroid Build Coastguard Worker                                         uint32_t stride,
1831*61046927SAndroid Build Coastguard Worker                                         VkQueryResultFlags flags);
1832*61046927SAndroid Build Coastguard Worker 
1833*61046927SAndroid Build Coastguard Worker void v3dv_cmd_buffer_add_tfu_job(struct v3dv_cmd_buffer *cmd_buffer,
1834*61046927SAndroid Build Coastguard Worker                                  struct drm_v3d_submit_tfu *tfu);
1835*61046927SAndroid Build Coastguard Worker 
1836*61046927SAndroid Build Coastguard Worker void v3dv_cmd_buffer_rewrite_indirect_csd_job(struct v3dv_device *device,
1837*61046927SAndroid Build Coastguard Worker                                               struct v3dv_csd_indirect_cpu_job_info *info,
1838*61046927SAndroid Build Coastguard Worker                                               const uint32_t *wg_counts);
1839*61046927SAndroid Build Coastguard Worker 
1840*61046927SAndroid Build Coastguard Worker void v3dv_cmd_buffer_add_private_obj(struct v3dv_cmd_buffer *cmd_buffer,
1841*61046927SAndroid Build Coastguard Worker                                      uint64_t obj,
1842*61046927SAndroid Build Coastguard Worker                                      v3dv_cmd_buffer_private_obj_destroy_cb destroy_cb);
1843*61046927SAndroid Build Coastguard Worker 
1844*61046927SAndroid Build Coastguard Worker void v3dv_cmd_buffer_merge_barrier_state(struct v3dv_barrier_state *dst,
1845*61046927SAndroid Build Coastguard Worker                                          struct v3dv_barrier_state *src);
1846*61046927SAndroid Build Coastguard Worker 
1847*61046927SAndroid Build Coastguard Worker void v3dv_cmd_buffer_consume_bcl_sync(struct v3dv_cmd_buffer *cmd_buffer,
1848*61046927SAndroid Build Coastguard Worker                                       struct v3dv_job *job);
1849*61046927SAndroid Build Coastguard Worker 
1850*61046927SAndroid Build Coastguard Worker bool v3dv_cmd_buffer_check_needs_load(const struct v3dv_cmd_buffer_state *state,
1851*61046927SAndroid Build Coastguard Worker                                       VkImageAspectFlags aspect,
1852*61046927SAndroid Build Coastguard Worker                                       uint32_t first_subpass_idx,
1853*61046927SAndroid Build Coastguard Worker                                       VkAttachmentLoadOp load_op,
1854*61046927SAndroid Build Coastguard Worker                                       uint32_t last_subpass_idx,
1855*61046927SAndroid Build Coastguard Worker                                       VkAttachmentStoreOp store_op);
1856*61046927SAndroid Build Coastguard Worker 
1857*61046927SAndroid Build Coastguard Worker bool v3dv_cmd_buffer_check_needs_store(const struct v3dv_cmd_buffer_state *state,
1858*61046927SAndroid Build Coastguard Worker                                        VkImageAspectFlags aspect,
1859*61046927SAndroid Build Coastguard Worker                                        uint32_t last_subpass_idx,
1860*61046927SAndroid Build Coastguard Worker                                        VkAttachmentStoreOp store_op);
1861*61046927SAndroid Build Coastguard Worker 
1862*61046927SAndroid Build Coastguard Worker void v3dv_cmd_buffer_emit_pipeline_barrier(struct v3dv_cmd_buffer *cmd_buffer,
1863*61046927SAndroid Build Coastguard Worker                                            const VkDependencyInfo *info);
1864*61046927SAndroid Build Coastguard Worker 
1865*61046927SAndroid Build Coastguard Worker bool v3dv_cmd_buffer_copy_image_tfu(struct v3dv_cmd_buffer *cmd_buffer,
1866*61046927SAndroid Build Coastguard Worker                                     struct v3dv_image *dst,
1867*61046927SAndroid Build Coastguard Worker                                     struct v3dv_image *src,
1868*61046927SAndroid Build Coastguard Worker                                     const VkImageCopy2 *region);
1869*61046927SAndroid Build Coastguard Worker 
1870*61046927SAndroid Build Coastguard Worker struct v3dv_event {
1871*61046927SAndroid Build Coastguard Worker    struct vk_object_base base;
1872*61046927SAndroid Build Coastguard Worker 
1873*61046927SAndroid Build Coastguard Worker    /* Link in the device list of pre-allocated free events */
1874*61046927SAndroid Build Coastguard Worker    struct list_head link;
1875*61046927SAndroid Build Coastguard Worker 
1876*61046927SAndroid Build Coastguard Worker    /* Each event gets a different index, which we use to compute the offset
1877*61046927SAndroid Build Coastguard Worker     * in the BO we use to track their state (signaled vs reset).
1878*61046927SAndroid Build Coastguard Worker     */
1879*61046927SAndroid Build Coastguard Worker    uint32_t index;
1880*61046927SAndroid Build Coastguard Worker };
1881*61046927SAndroid Build Coastguard Worker 
1882*61046927SAndroid Build Coastguard Worker VkResult
1883*61046927SAndroid Build Coastguard Worker v3dv_event_allocate_resources(struct v3dv_device *device);
1884*61046927SAndroid Build Coastguard Worker 
1885*61046927SAndroid Build Coastguard Worker void
1886*61046927SAndroid Build Coastguard Worker v3dv_event_free_resources(struct v3dv_device *device);
1887*61046927SAndroid Build Coastguard Worker 
1888*61046927SAndroid Build Coastguard Worker struct v3dv_shader_variant {
1889*61046927SAndroid Build Coastguard Worker    enum broadcom_shader_stage stage;
1890*61046927SAndroid Build Coastguard Worker 
1891*61046927SAndroid Build Coastguard Worker    union {
1892*61046927SAndroid Build Coastguard Worker       struct v3d_prog_data *base;
1893*61046927SAndroid Build Coastguard Worker       struct v3d_vs_prog_data *vs;
1894*61046927SAndroid Build Coastguard Worker       struct v3d_gs_prog_data *gs;
1895*61046927SAndroid Build Coastguard Worker       struct v3d_fs_prog_data *fs;
1896*61046927SAndroid Build Coastguard Worker       struct v3d_compute_prog_data *cs;
1897*61046927SAndroid Build Coastguard Worker    } prog_data;
1898*61046927SAndroid Build Coastguard Worker 
1899*61046927SAndroid Build Coastguard Worker    /* We explicitly save the prog_data_size as it would make easier to
1900*61046927SAndroid Build Coastguard Worker     * serialize
1901*61046927SAndroid Build Coastguard Worker     */
1902*61046927SAndroid Build Coastguard Worker    uint32_t prog_data_size;
1903*61046927SAndroid Build Coastguard Worker 
1904*61046927SAndroid Build Coastguard Worker    /* The assembly for this variant will be uploaded to a BO shared with all
1905*61046927SAndroid Build Coastguard Worker     * other shader stages in that pipeline. This is the offset in that BO.
1906*61046927SAndroid Build Coastguard Worker     */
1907*61046927SAndroid Build Coastguard Worker    uint32_t assembly_offset;
1908*61046927SAndroid Build Coastguard Worker 
1909*61046927SAndroid Build Coastguard Worker    /* Note: don't assume qpu_insts to be always NULL or not-NULL. In general
1910*61046927SAndroid Build Coastguard Worker     * we will try to free it as soon as we upload it to the shared bo while we
1911*61046927SAndroid Build Coastguard Worker     * compile the different stages. But we can decide to keep it around based
1912*61046927SAndroid Build Coastguard Worker     * on some pipeline creation flags, like
1913*61046927SAndroid Build Coastguard Worker     * VK_PIPELINE_CREATE_CAPTURE_INTERNAL_REPRESENTATIONS_BIT.
1914*61046927SAndroid Build Coastguard Worker     */
1915*61046927SAndroid Build Coastguard Worker    uint64_t *qpu_insts;
1916*61046927SAndroid Build Coastguard Worker    uint32_t qpu_insts_size;
1917*61046927SAndroid Build Coastguard Worker };
1918*61046927SAndroid Build Coastguard Worker 
1919*61046927SAndroid Build Coastguard Worker /*
1920*61046927SAndroid Build Coastguard Worker  * Per-stage info for each stage, useful so shader_module_compile_to_nir and
1921*61046927SAndroid Build Coastguard Worker  * other methods doesn't have so many parameters.
1922*61046927SAndroid Build Coastguard Worker  *
1923*61046927SAndroid Build Coastguard Worker  * FIXME: for the case of the coordinate shader and the vertex shader, module,
1924*61046927SAndroid Build Coastguard Worker  * entrypoint, spec_info and nir are the same. There are also info only
1925*61046927SAndroid Build Coastguard Worker  * relevant to some stages. But seemed too much a hassle to create a new
1926*61046927SAndroid Build Coastguard Worker  * struct only to handle that. Revisit if such kind of info starts to grow.
1927*61046927SAndroid Build Coastguard Worker  */
1928*61046927SAndroid Build Coastguard Worker struct v3dv_pipeline_stage {
1929*61046927SAndroid Build Coastguard Worker    struct v3dv_pipeline *pipeline;
1930*61046927SAndroid Build Coastguard Worker 
1931*61046927SAndroid Build Coastguard Worker    enum broadcom_shader_stage stage;
1932*61046927SAndroid Build Coastguard Worker 
1933*61046927SAndroid Build Coastguard Worker    const struct vk_shader_module *module;
1934*61046927SAndroid Build Coastguard Worker    const char *entrypoint;
1935*61046927SAndroid Build Coastguard Worker    const VkSpecializationInfo *spec_info;
1936*61046927SAndroid Build Coastguard Worker    const VkShaderModuleCreateInfo *module_info;
1937*61046927SAndroid Build Coastguard Worker 
1938*61046927SAndroid Build Coastguard Worker    nir_shader *nir;
1939*61046927SAndroid Build Coastguard Worker 
1940*61046927SAndroid Build Coastguard Worker    /* The following is the combined hash of module+entrypoint+spec_info+nir */
1941*61046927SAndroid Build Coastguard Worker    unsigned char shader_sha1[20];
1942*61046927SAndroid Build Coastguard Worker 
1943*61046927SAndroid Build Coastguard Worker    /** A name for this program, so you can track it in shader-db output. */
1944*61046927SAndroid Build Coastguard Worker    uint32_t program_id;
1945*61046927SAndroid Build Coastguard Worker 
1946*61046927SAndroid Build Coastguard Worker    VkPipelineCreationFeedback feedback;
1947*61046927SAndroid Build Coastguard Worker 
1948*61046927SAndroid Build Coastguard Worker    struct vk_pipeline_robustness_state robustness;
1949*61046927SAndroid Build Coastguard Worker };
1950*61046927SAndroid Build Coastguard Worker 
1951*61046927SAndroid Build Coastguard Worker /* We are using the descriptor pool entry for two things:
1952*61046927SAndroid Build Coastguard Worker  * * Track the allocated sets, so we can properly free it if needed
1953*61046927SAndroid Build Coastguard Worker  * * Track the suballocated pool bo regions, so if some descriptor set is
1954*61046927SAndroid Build Coastguard Worker  *   freed, the gap could be reallocated later.
1955*61046927SAndroid Build Coastguard Worker  *
1956*61046927SAndroid Build Coastguard Worker  * Those only make sense if the pool was not created with the flag
1957*61046927SAndroid Build Coastguard Worker  * VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT
1958*61046927SAndroid Build Coastguard Worker  */
1959*61046927SAndroid Build Coastguard Worker struct v3dv_descriptor_pool_entry
1960*61046927SAndroid Build Coastguard Worker {
1961*61046927SAndroid Build Coastguard Worker    struct v3dv_descriptor_set *set;
1962*61046927SAndroid Build Coastguard Worker    /* Offset and size of the subregion allocated for this entry from the
1963*61046927SAndroid Build Coastguard Worker     * pool->bo
1964*61046927SAndroid Build Coastguard Worker     */
1965*61046927SAndroid Build Coastguard Worker    uint32_t offset;
1966*61046927SAndroid Build Coastguard Worker    uint32_t size;
1967*61046927SAndroid Build Coastguard Worker };
1968*61046927SAndroid Build Coastguard Worker 
1969*61046927SAndroid Build Coastguard Worker struct v3dv_descriptor_pool {
1970*61046927SAndroid Build Coastguard Worker    struct vk_object_base base;
1971*61046927SAndroid Build Coastguard Worker 
1972*61046927SAndroid Build Coastguard Worker    /* A list with all descriptor sets allocated from the pool. */
1973*61046927SAndroid Build Coastguard Worker    struct list_head set_list;
1974*61046927SAndroid Build Coastguard Worker 
1975*61046927SAndroid Build Coastguard Worker    /* If this descriptor pool has been allocated for the driver for internal
1976*61046927SAndroid Build Coastguard Worker     * use, typically to implement meta operations.
1977*61046927SAndroid Build Coastguard Worker     */
1978*61046927SAndroid Build Coastguard Worker    bool is_driver_internal;
1979*61046927SAndroid Build Coastguard Worker 
1980*61046927SAndroid Build Coastguard Worker    struct v3dv_bo *bo;
1981*61046927SAndroid Build Coastguard Worker    /* Current offset at the descriptor bo. 0 means that we didn't use it for
1982*61046927SAndroid Build Coastguard Worker     * any descriptor. If the descriptor bo is NULL, current offset is
1983*61046927SAndroid Build Coastguard Worker     * meaningless
1984*61046927SAndroid Build Coastguard Worker     */
1985*61046927SAndroid Build Coastguard Worker    uint32_t current_offset;
1986*61046927SAndroid Build Coastguard Worker 
1987*61046927SAndroid Build Coastguard Worker    /* If VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT is not set the
1988*61046927SAndroid Build Coastguard Worker     * descriptor sets are handled as a whole as pool memory and handled by the
1989*61046927SAndroid Build Coastguard Worker     * following pointers. If set, they are not used, and individually
1990*61046927SAndroid Build Coastguard Worker     * descriptor sets are allocated/freed.
1991*61046927SAndroid Build Coastguard Worker     */
1992*61046927SAndroid Build Coastguard Worker    uint8_t *host_memory_base;
1993*61046927SAndroid Build Coastguard Worker    uint8_t *host_memory_ptr;
1994*61046927SAndroid Build Coastguard Worker    uint8_t *host_memory_end;
1995*61046927SAndroid Build Coastguard Worker 
1996*61046927SAndroid Build Coastguard Worker    uint32_t entry_count;
1997*61046927SAndroid Build Coastguard Worker    uint32_t max_entry_count;
1998*61046927SAndroid Build Coastguard Worker    struct v3dv_descriptor_pool_entry entries[0];
1999*61046927SAndroid Build Coastguard Worker };
2000*61046927SAndroid Build Coastguard Worker 
2001*61046927SAndroid Build Coastguard Worker struct v3dv_descriptor_set {
2002*61046927SAndroid Build Coastguard Worker    struct vk_object_base base;
2003*61046927SAndroid Build Coastguard Worker 
2004*61046927SAndroid Build Coastguard Worker    /* List link into the list of all sets allocated from the pool */
2005*61046927SAndroid Build Coastguard Worker    struct list_head pool_link;
2006*61046927SAndroid Build Coastguard Worker 
2007*61046927SAndroid Build Coastguard Worker    struct v3dv_descriptor_pool *pool;
2008*61046927SAndroid Build Coastguard Worker 
2009*61046927SAndroid Build Coastguard Worker    struct v3dv_descriptor_set_layout *layout;
2010*61046927SAndroid Build Coastguard Worker 
2011*61046927SAndroid Build Coastguard Worker    /* Offset relative to the descriptor pool bo for this set */
2012*61046927SAndroid Build Coastguard Worker    uint32_t base_offset;
2013*61046927SAndroid Build Coastguard Worker 
2014*61046927SAndroid Build Coastguard Worker    /* The descriptors below can be indexed (set/binding) using the set_layout
2015*61046927SAndroid Build Coastguard Worker     */
2016*61046927SAndroid Build Coastguard Worker    struct v3dv_descriptor descriptors[0];
2017*61046927SAndroid Build Coastguard Worker };
2018*61046927SAndroid Build Coastguard Worker 
2019*61046927SAndroid Build Coastguard Worker struct v3dv_descriptor_set_binding_layout {
2020*61046927SAndroid Build Coastguard Worker    VkDescriptorType type;
2021*61046927SAndroid Build Coastguard Worker 
2022*61046927SAndroid Build Coastguard Worker    /* Number of array elements in this binding */
2023*61046927SAndroid Build Coastguard Worker    uint32_t array_size;
2024*61046927SAndroid Build Coastguard Worker 
2025*61046927SAndroid Build Coastguard Worker    /* Index into the flattened descriptor set */
2026*61046927SAndroid Build Coastguard Worker    uint32_t descriptor_index;
2027*61046927SAndroid Build Coastguard Worker 
2028*61046927SAndroid Build Coastguard Worker    uint32_t dynamic_offset_count;
2029*61046927SAndroid Build Coastguard Worker    uint32_t dynamic_offset_index;
2030*61046927SAndroid Build Coastguard Worker 
2031*61046927SAndroid Build Coastguard Worker    /* Offset into the descriptor set where this descriptor lives (final offset
2032*61046927SAndroid Build Coastguard Worker     * on the descriptor bo need to take into account set->base_offset)
2033*61046927SAndroid Build Coastguard Worker     */
2034*61046927SAndroid Build Coastguard Worker    uint32_t descriptor_offset;
2035*61046927SAndroid Build Coastguard Worker 
2036*61046927SAndroid Build Coastguard Worker    /* Offset in the v3dv_descriptor_set_layout of the immutable samplers, or 0
2037*61046927SAndroid Build Coastguard Worker     * if there are no immutable samplers.
2038*61046927SAndroid Build Coastguard Worker     */
2039*61046927SAndroid Build Coastguard Worker    uint32_t immutable_samplers_offset;
2040*61046927SAndroid Build Coastguard Worker 
2041*61046927SAndroid Build Coastguard Worker    /* Descriptors for multiplanar combined image samplers are larger.
2042*61046927SAndroid Build Coastguard Worker     * For mutable descriptors, this is always 1.
2043*61046927SAndroid Build Coastguard Worker     */
2044*61046927SAndroid Build Coastguard Worker    uint8_t plane_stride;
2045*61046927SAndroid Build Coastguard Worker };
2046*61046927SAndroid Build Coastguard Worker 
2047*61046927SAndroid Build Coastguard Worker struct v3dv_descriptor_set_layout {
2048*61046927SAndroid Build Coastguard Worker    struct vk_object_base base;
2049*61046927SAndroid Build Coastguard Worker 
2050*61046927SAndroid Build Coastguard Worker    VkDescriptorSetLayoutCreateFlags flags;
2051*61046927SAndroid Build Coastguard Worker 
2052*61046927SAndroid Build Coastguard Worker    /* Number of bindings in this descriptor set */
2053*61046927SAndroid Build Coastguard Worker    uint32_t binding_count;
2054*61046927SAndroid Build Coastguard Worker 
2055*61046927SAndroid Build Coastguard Worker    /* Total bo size needed for this descriptor set
2056*61046927SAndroid Build Coastguard Worker     */
2057*61046927SAndroid Build Coastguard Worker    uint32_t bo_size;
2058*61046927SAndroid Build Coastguard Worker 
2059*61046927SAndroid Build Coastguard Worker    /* Shader stages affected by this descriptor set */
2060*61046927SAndroid Build Coastguard Worker    uint16_t shader_stages;
2061*61046927SAndroid Build Coastguard Worker 
2062*61046927SAndroid Build Coastguard Worker    /* Number of dynamic offsets used by this descriptor set */
2063*61046927SAndroid Build Coastguard Worker    uint16_t dynamic_offset_count;
2064*61046927SAndroid Build Coastguard Worker 
2065*61046927SAndroid Build Coastguard Worker    /* Number of descriptors in this descriptor set */
2066*61046927SAndroid Build Coastguard Worker    uint32_t descriptor_count;
2067*61046927SAndroid Build Coastguard Worker 
2068*61046927SAndroid Build Coastguard Worker    /* Descriptor set layouts can be destroyed even if they are still being
2069*61046927SAndroid Build Coastguard Worker     * used.
2070*61046927SAndroid Build Coastguard Worker     */
2071*61046927SAndroid Build Coastguard Worker    uint32_t ref_cnt;
2072*61046927SAndroid Build Coastguard Worker 
2073*61046927SAndroid Build Coastguard Worker    /* Bindings in this descriptor set */
2074*61046927SAndroid Build Coastguard Worker    struct v3dv_descriptor_set_binding_layout binding[0];
2075*61046927SAndroid Build Coastguard Worker };
2076*61046927SAndroid Build Coastguard Worker 
2077*61046927SAndroid Build Coastguard Worker void
2078*61046927SAndroid Build Coastguard Worker v3dv_descriptor_set_layout_destroy(struct v3dv_device *device,
2079*61046927SAndroid Build Coastguard Worker                                    struct v3dv_descriptor_set_layout *set_layout);
2080*61046927SAndroid Build Coastguard Worker 
2081*61046927SAndroid Build Coastguard Worker static inline void
v3dv_descriptor_set_layout_ref(struct v3dv_descriptor_set_layout * set_layout)2082*61046927SAndroid Build Coastguard Worker v3dv_descriptor_set_layout_ref(struct v3dv_descriptor_set_layout *set_layout)
2083*61046927SAndroid Build Coastguard Worker {
2084*61046927SAndroid Build Coastguard Worker    assert(set_layout && set_layout->ref_cnt >= 1);
2085*61046927SAndroid Build Coastguard Worker    p_atomic_inc(&set_layout->ref_cnt);
2086*61046927SAndroid Build Coastguard Worker }
2087*61046927SAndroid Build Coastguard Worker 
2088*61046927SAndroid Build Coastguard Worker static inline void
v3dv_descriptor_set_layout_unref(struct v3dv_device * device,struct v3dv_descriptor_set_layout * set_layout)2089*61046927SAndroid Build Coastguard Worker v3dv_descriptor_set_layout_unref(struct v3dv_device *device,
2090*61046927SAndroid Build Coastguard Worker                                  struct v3dv_descriptor_set_layout *set_layout)
2091*61046927SAndroid Build Coastguard Worker {
2092*61046927SAndroid Build Coastguard Worker    assert(set_layout && set_layout->ref_cnt >= 1);
2093*61046927SAndroid Build Coastguard Worker    if (p_atomic_dec_zero(&set_layout->ref_cnt))
2094*61046927SAndroid Build Coastguard Worker       v3dv_descriptor_set_layout_destroy(device, set_layout);
2095*61046927SAndroid Build Coastguard Worker }
2096*61046927SAndroid Build Coastguard Worker 
2097*61046927SAndroid Build Coastguard Worker struct v3dv_pipeline_layout {
2098*61046927SAndroid Build Coastguard Worker    struct vk_object_base base;
2099*61046927SAndroid Build Coastguard Worker 
2100*61046927SAndroid Build Coastguard Worker    struct {
2101*61046927SAndroid Build Coastguard Worker       struct v3dv_descriptor_set_layout *layout;
2102*61046927SAndroid Build Coastguard Worker       uint32_t dynamic_offset_start;
2103*61046927SAndroid Build Coastguard Worker    } set[MAX_SETS];
2104*61046927SAndroid Build Coastguard Worker 
2105*61046927SAndroid Build Coastguard Worker    uint32_t num_sets;
2106*61046927SAndroid Build Coastguard Worker 
2107*61046927SAndroid Build Coastguard Worker    /* Shader stages that are declared to use descriptors from this layout */
2108*61046927SAndroid Build Coastguard Worker    uint32_t shader_stages;
2109*61046927SAndroid Build Coastguard Worker 
2110*61046927SAndroid Build Coastguard Worker    uint32_t dynamic_offset_count;
2111*61046927SAndroid Build Coastguard Worker    uint32_t push_constant_size;
2112*61046927SAndroid Build Coastguard Worker 
2113*61046927SAndroid Build Coastguard Worker    /* Pipeline layouts can be destroyed after creating pipelines since
2114*61046927SAndroid Build Coastguard Worker     * maintenance4.
2115*61046927SAndroid Build Coastguard Worker     */
2116*61046927SAndroid Build Coastguard Worker    uint32_t ref_cnt;
2117*61046927SAndroid Build Coastguard Worker 
2118*61046927SAndroid Build Coastguard Worker    unsigned char sha1[20];
2119*61046927SAndroid Build Coastguard Worker };
2120*61046927SAndroid Build Coastguard Worker 
2121*61046927SAndroid Build Coastguard Worker void
2122*61046927SAndroid Build Coastguard Worker v3dv_pipeline_layout_destroy(struct v3dv_device *device,
2123*61046927SAndroid Build Coastguard Worker                              struct v3dv_pipeline_layout *layout,
2124*61046927SAndroid Build Coastguard Worker                              const VkAllocationCallbacks *alloc);
2125*61046927SAndroid Build Coastguard Worker 
2126*61046927SAndroid Build Coastguard Worker static inline void
v3dv_pipeline_layout_ref(struct v3dv_pipeline_layout * layout)2127*61046927SAndroid Build Coastguard Worker v3dv_pipeline_layout_ref(struct v3dv_pipeline_layout *layout)
2128*61046927SAndroid Build Coastguard Worker {
2129*61046927SAndroid Build Coastguard Worker    assert(layout && layout->ref_cnt >= 1);
2130*61046927SAndroid Build Coastguard Worker    p_atomic_inc(&layout->ref_cnt);
2131*61046927SAndroid Build Coastguard Worker }
2132*61046927SAndroid Build Coastguard Worker 
2133*61046927SAndroid Build Coastguard Worker static inline void
v3dv_pipeline_layout_unref(struct v3dv_device * device,struct v3dv_pipeline_layout * layout,const VkAllocationCallbacks * alloc)2134*61046927SAndroid Build Coastguard Worker v3dv_pipeline_layout_unref(struct v3dv_device *device,
2135*61046927SAndroid Build Coastguard Worker                            struct v3dv_pipeline_layout *layout,
2136*61046927SAndroid Build Coastguard Worker                            const VkAllocationCallbacks *alloc)
2137*61046927SAndroid Build Coastguard Worker {
2138*61046927SAndroid Build Coastguard Worker    assert(layout && layout->ref_cnt >= 1);
2139*61046927SAndroid Build Coastguard Worker    if (p_atomic_dec_zero(&layout->ref_cnt))
2140*61046927SAndroid Build Coastguard Worker       v3dv_pipeline_layout_destroy(device, layout, alloc);
2141*61046927SAndroid Build Coastguard Worker }
2142*61046927SAndroid Build Coastguard Worker 
2143*61046927SAndroid Build Coastguard Worker /*
2144*61046927SAndroid Build Coastguard Worker  * We are using descriptor maps for ubo/ssbo and texture/samplers, so we need
2145*61046927SAndroid Build Coastguard Worker  * it to be big enough to include the max value for all of them.
2146*61046927SAndroid Build Coastguard Worker  *
2147*61046927SAndroid Build Coastguard Worker  * FIXME: one alternative would be to allocate the map as big as you need for
2148*61046927SAndroid Build Coastguard Worker  * each descriptor type. That would means more individual allocations.
2149*61046927SAndroid Build Coastguard Worker  */
2150*61046927SAndroid Build Coastguard Worker #define DESCRIPTOR_MAP_SIZE MAX3(V3D_MAX_TEXTURE_SAMPLERS,                         \
2151*61046927SAndroid Build Coastguard Worker                                  MAX_UNIFORM_BUFFERS + MAX_INLINE_UNIFORM_BUFFERS, \
2152*61046927SAndroid Build Coastguard Worker                                  MAX_STORAGE_BUFFERS)
2153*61046927SAndroid Build Coastguard Worker 
2154*61046927SAndroid Build Coastguard Worker 
2155*61046927SAndroid Build Coastguard Worker struct v3dv_descriptor_map {
2156*61046927SAndroid Build Coastguard Worker    /* FIXME: avoid fixed size array/justify the size */
2157*61046927SAndroid Build Coastguard Worker    unsigned num_desc; /* Number of descriptors  */
2158*61046927SAndroid Build Coastguard Worker    int set[DESCRIPTOR_MAP_SIZE];
2159*61046927SAndroid Build Coastguard Worker    int binding[DESCRIPTOR_MAP_SIZE];
2160*61046927SAndroid Build Coastguard Worker    int array_index[DESCRIPTOR_MAP_SIZE];
2161*61046927SAndroid Build Coastguard Worker    int array_size[DESCRIPTOR_MAP_SIZE];
2162*61046927SAndroid Build Coastguard Worker    uint8_t plane[DESCRIPTOR_MAP_SIZE];
2163*61046927SAndroid Build Coastguard Worker    bool used[DESCRIPTOR_MAP_SIZE];
2164*61046927SAndroid Build Coastguard Worker 
2165*61046927SAndroid Build Coastguard Worker    /* NOTE: the following is only for sampler, but this is the easier place to
2166*61046927SAndroid Build Coastguard Worker     * put it.
2167*61046927SAndroid Build Coastguard Worker     */
2168*61046927SAndroid Build Coastguard Worker    uint8_t return_size[DESCRIPTOR_MAP_SIZE];
2169*61046927SAndroid Build Coastguard Worker };
2170*61046927SAndroid Build Coastguard Worker 
2171*61046927SAndroid Build Coastguard Worker struct v3dv_sampler {
2172*61046927SAndroid Build Coastguard Worker    struct vk_object_base base;
2173*61046927SAndroid Build Coastguard Worker    struct vk_ycbcr_conversion *conversion;
2174*61046927SAndroid Build Coastguard Worker 
2175*61046927SAndroid Build Coastguard Worker    bool compare_enable;
2176*61046927SAndroid Build Coastguard Worker    bool unnormalized_coordinates;
2177*61046927SAndroid Build Coastguard Worker 
2178*61046927SAndroid Build Coastguard Worker    /* Prepacked per plane SAMPLER_STATE, that is referenced as part of the tmu
2179*61046927SAndroid Build Coastguard Worker     * configuration. If needed it will be copied to the descriptor info during
2180*61046927SAndroid Build Coastguard Worker     * UpdateDescriptorSets
2181*61046927SAndroid Build Coastguard Worker     */
2182*61046927SAndroid Build Coastguard Worker    uint8_t plane_count;
2183*61046927SAndroid Build Coastguard Worker    uint8_t sampler_state[V3DV_SAMPLER_STATE_LENGTH];
2184*61046927SAndroid Build Coastguard Worker };
2185*61046927SAndroid Build Coastguard Worker 
2186*61046927SAndroid Build Coastguard Worker /* We keep two special values for the sampler idx that represents exactly when a
2187*61046927SAndroid Build Coastguard Worker  * sampler is not needed/provided. The main use is that even if we don't have
2188*61046927SAndroid Build Coastguard Worker  * sampler, we still need to do the output unpacking (through
2189*61046927SAndroid Build Coastguard Worker  * nir_lower_tex). The easier way to do this is to add those special "no
2190*61046927SAndroid Build Coastguard Worker  * sampler" in the sampler_map, and then use the proper unpacking for that
2191*61046927SAndroid Build Coastguard Worker  * case.
2192*61046927SAndroid Build Coastguard Worker  *
2193*61046927SAndroid Build Coastguard Worker  * We have one when we want a 16bit output size, and other when we want a
2194*61046927SAndroid Build Coastguard Worker  * 32bit output size. We use the info coming from the RelaxedPrecision
2195*61046927SAndroid Build Coastguard Worker  * decoration to decide between one and the other.
2196*61046927SAndroid Build Coastguard Worker  */
2197*61046927SAndroid Build Coastguard Worker #define V3DV_NO_SAMPLER_16BIT_IDX 0
2198*61046927SAndroid Build Coastguard Worker #define V3DV_NO_SAMPLER_32BIT_IDX 1
2199*61046927SAndroid Build Coastguard Worker 
2200*61046927SAndroid Build Coastguard Worker struct v3dv_descriptor_maps {
2201*61046927SAndroid Build Coastguard Worker    struct v3dv_descriptor_map ubo_map;
2202*61046927SAndroid Build Coastguard Worker    struct v3dv_descriptor_map ssbo_map;
2203*61046927SAndroid Build Coastguard Worker    struct v3dv_descriptor_map sampler_map;
2204*61046927SAndroid Build Coastguard Worker    struct v3dv_descriptor_map texture_map;
2205*61046927SAndroid Build Coastguard Worker };
2206*61046927SAndroid Build Coastguard Worker 
2207*61046927SAndroid Build Coastguard Worker /* The structure represents data shared between different objects, like the
2208*61046927SAndroid Build Coastguard Worker  * pipeline and the pipeline cache, so we ref count it to know when it should
2209*61046927SAndroid Build Coastguard Worker  * be freed.
2210*61046927SAndroid Build Coastguard Worker  */
2211*61046927SAndroid Build Coastguard Worker struct v3dv_pipeline_shared_data {
2212*61046927SAndroid Build Coastguard Worker    uint32_t ref_cnt;
2213*61046927SAndroid Build Coastguard Worker 
2214*61046927SAndroid Build Coastguard Worker    unsigned char sha1_key[20];
2215*61046927SAndroid Build Coastguard Worker 
2216*61046927SAndroid Build Coastguard Worker    struct v3dv_descriptor_maps *maps[BROADCOM_SHADER_STAGES];
2217*61046927SAndroid Build Coastguard Worker    struct v3dv_shader_variant *variants[BROADCOM_SHADER_STAGES];
2218*61046927SAndroid Build Coastguard Worker 
2219*61046927SAndroid Build Coastguard Worker    struct v3dv_bo *assembly_bo;
2220*61046927SAndroid Build Coastguard Worker };
2221*61046927SAndroid Build Coastguard Worker 
2222*61046927SAndroid Build Coastguard Worker struct v3dv_pipeline_executable_data {
2223*61046927SAndroid Build Coastguard Worker    enum broadcom_shader_stage stage;
2224*61046927SAndroid Build Coastguard Worker    char *nir_str;
2225*61046927SAndroid Build Coastguard Worker    char *qpu_str;
2226*61046927SAndroid Build Coastguard Worker };
2227*61046927SAndroid Build Coastguard Worker 
2228*61046927SAndroid Build Coastguard Worker struct v3dv_pipeline {
2229*61046927SAndroid Build Coastguard Worker    struct vk_object_base base;
2230*61046927SAndroid Build Coastguard Worker 
2231*61046927SAndroid Build Coastguard Worker    struct v3dv_device *device;
2232*61046927SAndroid Build Coastguard Worker 
2233*61046927SAndroid Build Coastguard Worker    VkShaderStageFlags active_stages;
2234*61046927SAndroid Build Coastguard Worker    VkPipelineCreateFlagBits2KHR flags;
2235*61046927SAndroid Build Coastguard Worker 
2236*61046927SAndroid Build Coastguard Worker    struct v3dv_render_pass *pass;
2237*61046927SAndroid Build Coastguard Worker    struct v3dv_subpass *subpass;
2238*61046927SAndroid Build Coastguard Worker 
2239*61046927SAndroid Build Coastguard Worker    struct v3dv_pipeline_stage *stages[BROADCOM_SHADER_STAGES];
2240*61046927SAndroid Build Coastguard Worker 
2241*61046927SAndroid Build Coastguard Worker    /* For VK_KHR_dynamic_rendering */
2242*61046927SAndroid Build Coastguard Worker    struct vk_render_pass_state rendering_info;
2243*61046927SAndroid Build Coastguard Worker 
2244*61046927SAndroid Build Coastguard Worker    /* Flags for whether optional pipeline stages are present, for convenience */
2245*61046927SAndroid Build Coastguard Worker    bool has_gs;
2246*61046927SAndroid Build Coastguard Worker 
2247*61046927SAndroid Build Coastguard Worker    /* Whether any stage in this pipeline uses VK_KHR_buffer_device_address */
2248*61046927SAndroid Build Coastguard Worker    bool uses_buffer_device_address;
2249*61046927SAndroid Build Coastguard Worker 
2250*61046927SAndroid Build Coastguard Worker    /* Spilling memory requirements */
2251*61046927SAndroid Build Coastguard Worker    struct {
2252*61046927SAndroid Build Coastguard Worker       struct v3dv_bo *bo;
2253*61046927SAndroid Build Coastguard Worker       uint32_t size_per_thread;
2254*61046927SAndroid Build Coastguard Worker    } spill;
2255*61046927SAndroid Build Coastguard Worker 
2256*61046927SAndroid Build Coastguard Worker    struct vk_dynamic_graphics_state dynamic_graphics_state;
2257*61046927SAndroid Build Coastguard Worker    struct v3dv_dynamic_state dynamic;
2258*61046927SAndroid Build Coastguard Worker 
2259*61046927SAndroid Build Coastguard Worker    struct v3dv_pipeline_layout *layout;
2260*61046927SAndroid Build Coastguard Worker 
2261*61046927SAndroid Build Coastguard Worker    enum v3dv_ez_state ez_state;
2262*61046927SAndroid Build Coastguard Worker 
2263*61046927SAndroid Build Coastguard Worker    /* If ez_state is V3D_EZ_DISABLED, if the reason for disabling is that the
2264*61046927SAndroid Build Coastguard Worker     * pipeline selects an incompatible depth test function.
2265*61046927SAndroid Build Coastguard Worker     */
2266*61046927SAndroid Build Coastguard Worker    bool incompatible_ez_test;
2267*61046927SAndroid Build Coastguard Worker 
2268*61046927SAndroid Build Coastguard Worker    bool rasterization_enabled;
2269*61046927SAndroid Build Coastguard Worker    bool msaa;
2270*61046927SAndroid Build Coastguard Worker    bool sample_rate_shading;
2271*61046927SAndroid Build Coastguard Worker    uint32_t sample_mask;
2272*61046927SAndroid Build Coastguard Worker 
2273*61046927SAndroid Build Coastguard Worker    bool negative_one_to_one;
2274*61046927SAndroid Build Coastguard Worker 
2275*61046927SAndroid Build Coastguard Worker    /* Indexed by vertex binding. */
2276*61046927SAndroid Build Coastguard Worker    struct v3dv_pipeline_vertex_binding {
2277*61046927SAndroid Build Coastguard Worker       uint32_t instance_divisor;
2278*61046927SAndroid Build Coastguard Worker    } vb[MAX_VBS];
2279*61046927SAndroid Build Coastguard Worker    uint32_t vb_count;
2280*61046927SAndroid Build Coastguard Worker 
2281*61046927SAndroid Build Coastguard Worker    /* Note that a lot of info from VkVertexInputAttributeDescription is
2282*61046927SAndroid Build Coastguard Worker     * already prepacked, so here we are only storing those that need recheck
2283*61046927SAndroid Build Coastguard Worker     * later. The array must be indexed by driver location, since that is the
2284*61046927SAndroid Build Coastguard Worker     * order in which we need to emit the attributes.
2285*61046927SAndroid Build Coastguard Worker     */
2286*61046927SAndroid Build Coastguard Worker    struct v3dv_pipeline_vertex_attrib {
2287*61046927SAndroid Build Coastguard Worker       uint32_t binding;
2288*61046927SAndroid Build Coastguard Worker       uint32_t offset;
2289*61046927SAndroid Build Coastguard Worker       VkFormat vk_format;
2290*61046927SAndroid Build Coastguard Worker    } va[MAX_VERTEX_ATTRIBS];
2291*61046927SAndroid Build Coastguard Worker    uint32_t va_count;
2292*61046927SAndroid Build Coastguard Worker 
2293*61046927SAndroid Build Coastguard Worker    enum mesa_prim topology;
2294*61046927SAndroid Build Coastguard Worker 
2295*61046927SAndroid Build Coastguard Worker    bool line_smooth;
2296*61046927SAndroid Build Coastguard Worker 
2297*61046927SAndroid Build Coastguard Worker    struct v3dv_pipeline_shared_data *shared_data;
2298*61046927SAndroid Build Coastguard Worker 
2299*61046927SAndroid Build Coastguard Worker    /* It is the combined stages sha1, layout sha1, plus the pipeline key sha1. */
2300*61046927SAndroid Build Coastguard Worker    unsigned char sha1[20];
2301*61046927SAndroid Build Coastguard Worker 
2302*61046927SAndroid Build Coastguard Worker    /* In general we can reuse v3dv_device->default_attribute_float, so note
2303*61046927SAndroid Build Coastguard Worker     * that the following can be NULL. In 7.x this is not used, so it will be
2304*61046927SAndroid Build Coastguard Worker     * always NULL.
2305*61046927SAndroid Build Coastguard Worker     *
2306*61046927SAndroid Build Coastguard Worker     * FIXME: the content of this BO will be small, so it could be improved to
2307*61046927SAndroid Build Coastguard Worker     * be uploaded to a common BO. But as in most cases it will be NULL, it is
2308*61046927SAndroid Build Coastguard Worker     * not a priority.
2309*61046927SAndroid Build Coastguard Worker     */
2310*61046927SAndroid Build Coastguard Worker    struct v3dv_bo *default_attribute_values;
2311*61046927SAndroid Build Coastguard Worker 
2312*61046927SAndroid Build Coastguard Worker    struct vpm_config vpm_cfg;
2313*61046927SAndroid Build Coastguard Worker    struct vpm_config vpm_cfg_bin;
2314*61046927SAndroid Build Coastguard Worker 
2315*61046927SAndroid Build Coastguard Worker    /* If the pipeline should emit any of the stencil configuration packets */
2316*61046927SAndroid Build Coastguard Worker    bool emit_stencil_cfg[2];
2317*61046927SAndroid Build Coastguard Worker 
2318*61046927SAndroid Build Coastguard Worker    /* Blend state */
2319*61046927SAndroid Build Coastguard Worker    struct {
2320*61046927SAndroid Build Coastguard Worker       /* Per-RT bit mask with blend enables */
2321*61046927SAndroid Build Coastguard Worker       uint8_t enables;
2322*61046927SAndroid Build Coastguard Worker       /* Per-RT prepacked blend config packets */
2323*61046927SAndroid Build Coastguard Worker       uint8_t cfg[V3D_MAX_DRAW_BUFFERS][V3DV_BLEND_CFG_LENGTH];
2324*61046927SAndroid Build Coastguard Worker       /* Flag indicating whether the blend factors in use require
2325*61046927SAndroid Build Coastguard Worker        * color constants.
2326*61046927SAndroid Build Coastguard Worker        */
2327*61046927SAndroid Build Coastguard Worker       bool needs_color_constants;
2328*61046927SAndroid Build Coastguard Worker       /* Mask with enabled color channels for each RT (4 bits per RT) */
2329*61046927SAndroid Build Coastguard Worker       uint32_t color_write_masks;
2330*61046927SAndroid Build Coastguard Worker    } blend;
2331*61046927SAndroid Build Coastguard Worker 
2332*61046927SAndroid Build Coastguard Worker    struct {
2333*61046927SAndroid Build Coastguard Worker       void *mem_ctx;
2334*61046927SAndroid Build Coastguard Worker       struct util_dynarray data; /* Array of v3dv_pipeline_executable_data */
2335*61046927SAndroid Build Coastguard Worker    } executables;
2336*61046927SAndroid Build Coastguard Worker 
2337*61046927SAndroid Build Coastguard Worker    /* Packets prepacked during pipeline creation
2338*61046927SAndroid Build Coastguard Worker     */
2339*61046927SAndroid Build Coastguard Worker    uint8_t cfg_bits[V3DV_CFG_BITS_LENGTH];
2340*61046927SAndroid Build Coastguard Worker    uint8_t shader_state_record[V3DV_GL_SHADER_STATE_RECORD_LENGTH];
2341*61046927SAndroid Build Coastguard Worker    uint8_t vcm_cache_size[V3DV_VCM_CACHE_SIZE_LENGTH];
2342*61046927SAndroid Build Coastguard Worker    uint8_t vertex_attrs[V3DV_GL_SHADER_STATE_ATTRIBUTE_RECORD_LENGTH *
2343*61046927SAndroid Build Coastguard Worker                         MAX_VERTEX_ATTRIBS];
2344*61046927SAndroid Build Coastguard Worker    uint8_t stencil_cfg[2][V3DV_STENCIL_CFG_LENGTH];
2345*61046927SAndroid Build Coastguard Worker };
2346*61046927SAndroid Build Coastguard Worker 
2347*61046927SAndroid Build Coastguard Worker static inline bool
v3dv_texture_shader_state_has_rb_swap_reverse_bits(const struct v3dv_device * device)2348*61046927SAndroid Build Coastguard Worker v3dv_texture_shader_state_has_rb_swap_reverse_bits(const struct v3dv_device *device)
2349*61046927SAndroid Build Coastguard Worker {
2350*61046927SAndroid Build Coastguard Worker    return device->devinfo.ver > 71 ||
2351*61046927SAndroid Build Coastguard Worker           (device->devinfo.ver == 71 && device->devinfo.rev >= 5);
2352*61046927SAndroid Build Coastguard Worker }
2353*61046927SAndroid Build Coastguard Worker 
2354*61046927SAndroid Build Coastguard Worker static inline VkPipelineBindPoint
v3dv_pipeline_get_binding_point(struct v3dv_pipeline * pipeline)2355*61046927SAndroid Build Coastguard Worker v3dv_pipeline_get_binding_point(struct v3dv_pipeline *pipeline)
2356*61046927SAndroid Build Coastguard Worker {
2357*61046927SAndroid Build Coastguard Worker    assert(pipeline->active_stages == VK_SHADER_STAGE_COMPUTE_BIT ||
2358*61046927SAndroid Build Coastguard Worker           !(pipeline->active_stages & VK_SHADER_STAGE_COMPUTE_BIT));
2359*61046927SAndroid Build Coastguard Worker    return pipeline->active_stages == VK_SHADER_STAGE_COMPUTE_BIT ?
2360*61046927SAndroid Build Coastguard Worker       VK_PIPELINE_BIND_POINT_COMPUTE : VK_PIPELINE_BIND_POINT_GRAPHICS;
2361*61046927SAndroid Build Coastguard Worker }
2362*61046927SAndroid Build Coastguard Worker 
2363*61046927SAndroid Build Coastguard Worker static inline struct v3dv_descriptor_state*
v3dv_cmd_buffer_get_descriptor_state(struct v3dv_cmd_buffer * cmd_buffer,struct v3dv_pipeline * pipeline)2364*61046927SAndroid Build Coastguard Worker v3dv_cmd_buffer_get_descriptor_state(struct v3dv_cmd_buffer *cmd_buffer,
2365*61046927SAndroid Build Coastguard Worker                                      struct v3dv_pipeline *pipeline)
2366*61046927SAndroid Build Coastguard Worker {
2367*61046927SAndroid Build Coastguard Worker    if (v3dv_pipeline_get_binding_point(pipeline) == VK_PIPELINE_BIND_POINT_COMPUTE)
2368*61046927SAndroid Build Coastguard Worker       return &cmd_buffer->state.compute.descriptor_state;
2369*61046927SAndroid Build Coastguard Worker    else
2370*61046927SAndroid Build Coastguard Worker       return &cmd_buffer->state.gfx.descriptor_state;
2371*61046927SAndroid Build Coastguard Worker }
2372*61046927SAndroid Build Coastguard Worker 
2373*61046927SAndroid Build Coastguard Worker const nir_shader_compiler_options *v3dv_pipeline_get_nir_options(const struct v3d_device_info *devinfo);
2374*61046927SAndroid Build Coastguard Worker 
2375*61046927SAndroid Build Coastguard Worker uint32_t v3dv_physical_device_vendor_id(const struct v3dv_physical_device *dev);
2376*61046927SAndroid Build Coastguard Worker uint32_t v3dv_physical_device_device_id(const struct v3dv_physical_device *dev);
2377*61046927SAndroid Build Coastguard Worker 
2378*61046927SAndroid Build Coastguard Worker const uint8_t *v3dv_get_format_swizzle(struct v3dv_device *device, VkFormat f,
2379*61046927SAndroid Build Coastguard Worker                                        uint8_t plane);
2380*61046927SAndroid Build Coastguard Worker const struct v3dv_format *
2381*61046927SAndroid Build Coastguard Worker v3dv_get_compatible_tfu_format(struct v3dv_device *device,
2382*61046927SAndroid Build Coastguard Worker                                uint32_t bpp, VkFormat *out_vk_format);
2383*61046927SAndroid Build Coastguard Worker bool v3dv_buffer_format_supports_features(struct v3dv_device *device,
2384*61046927SAndroid Build Coastguard Worker                                           VkFormat vk_format,
2385*61046927SAndroid Build Coastguard Worker                                           VkFormatFeatureFlags2 features);
2386*61046927SAndroid Build Coastguard Worker 
2387*61046927SAndroid Build Coastguard Worker struct v3dv_cl_reloc v3dv_write_uniforms(struct v3dv_cmd_buffer *cmd_buffer,
2388*61046927SAndroid Build Coastguard Worker                                          struct v3dv_pipeline *pipeline,
2389*61046927SAndroid Build Coastguard Worker                                          struct v3dv_shader_variant *variant);
2390*61046927SAndroid Build Coastguard Worker 
2391*61046927SAndroid Build Coastguard Worker struct v3dv_cl_reloc v3dv_write_uniforms_wg_offsets(struct v3dv_cmd_buffer *cmd_buffer,
2392*61046927SAndroid Build Coastguard Worker                                                     struct v3dv_pipeline *pipeline,
2393*61046927SAndroid Build Coastguard Worker                                                     struct v3dv_shader_variant *variant,
2394*61046927SAndroid Build Coastguard Worker                                                     uint32_t **wg_count_offsets);
2395*61046927SAndroid Build Coastguard Worker 
2396*61046927SAndroid Build Coastguard Worker struct v3dv_shader_variant *
2397*61046927SAndroid Build Coastguard Worker v3dv_get_shader_variant(struct v3dv_pipeline_stage *p_stage,
2398*61046927SAndroid Build Coastguard Worker                         struct v3dv_pipeline_cache *cache,
2399*61046927SAndroid Build Coastguard Worker                         struct v3d_key *key,
2400*61046927SAndroid Build Coastguard Worker                         size_t key_size,
2401*61046927SAndroid Build Coastguard Worker                         const VkAllocationCallbacks *pAllocator,
2402*61046927SAndroid Build Coastguard Worker                         VkResult *out_vk_result);
2403*61046927SAndroid Build Coastguard Worker 
2404*61046927SAndroid Build Coastguard Worker struct v3dv_shader_variant *
2405*61046927SAndroid Build Coastguard Worker v3dv_shader_variant_create(struct v3dv_device *device,
2406*61046927SAndroid Build Coastguard Worker                            enum broadcom_shader_stage stage,
2407*61046927SAndroid Build Coastguard Worker                            struct v3d_prog_data *prog_data,
2408*61046927SAndroid Build Coastguard Worker                            uint32_t prog_data_size,
2409*61046927SAndroid Build Coastguard Worker                            uint32_t assembly_offset,
2410*61046927SAndroid Build Coastguard Worker                            uint64_t *qpu_insts,
2411*61046927SAndroid Build Coastguard Worker                            uint32_t qpu_insts_size,
2412*61046927SAndroid Build Coastguard Worker                            VkResult *out_vk_result);
2413*61046927SAndroid Build Coastguard Worker 
2414*61046927SAndroid Build Coastguard Worker void
2415*61046927SAndroid Build Coastguard Worker v3dv_shader_variant_destroy(struct v3dv_device *device,
2416*61046927SAndroid Build Coastguard Worker                             struct v3dv_shader_variant *variant);
2417*61046927SAndroid Build Coastguard Worker 
2418*61046927SAndroid Build Coastguard Worker static inline void
v3dv_pipeline_shared_data_ref(struct v3dv_pipeline_shared_data * shared_data)2419*61046927SAndroid Build Coastguard Worker v3dv_pipeline_shared_data_ref(struct v3dv_pipeline_shared_data *shared_data)
2420*61046927SAndroid Build Coastguard Worker {
2421*61046927SAndroid Build Coastguard Worker    assert(shared_data && shared_data->ref_cnt >= 1);
2422*61046927SAndroid Build Coastguard Worker    p_atomic_inc(&shared_data->ref_cnt);
2423*61046927SAndroid Build Coastguard Worker }
2424*61046927SAndroid Build Coastguard Worker 
2425*61046927SAndroid Build Coastguard Worker void
2426*61046927SAndroid Build Coastguard Worker v3dv_pipeline_shared_data_destroy(struct v3dv_device *device,
2427*61046927SAndroid Build Coastguard Worker                                   struct v3dv_pipeline_shared_data *shared_data);
2428*61046927SAndroid Build Coastguard Worker 
2429*61046927SAndroid Build Coastguard Worker static inline void
v3dv_pipeline_shared_data_unref(struct v3dv_device * device,struct v3dv_pipeline_shared_data * shared_data)2430*61046927SAndroid Build Coastguard Worker v3dv_pipeline_shared_data_unref(struct v3dv_device *device,
2431*61046927SAndroid Build Coastguard Worker                                 struct v3dv_pipeline_shared_data *shared_data)
2432*61046927SAndroid Build Coastguard Worker {
2433*61046927SAndroid Build Coastguard Worker    assert(shared_data && shared_data->ref_cnt >= 1);
2434*61046927SAndroid Build Coastguard Worker    if (p_atomic_dec_zero(&shared_data->ref_cnt))
2435*61046927SAndroid Build Coastguard Worker       v3dv_pipeline_shared_data_destroy(device, shared_data);
2436*61046927SAndroid Build Coastguard Worker }
2437*61046927SAndroid Build Coastguard Worker 
2438*61046927SAndroid Build Coastguard Worker struct v3dv_descriptor *
2439*61046927SAndroid Build Coastguard Worker v3dv_descriptor_map_get_descriptor(struct v3dv_descriptor_state *descriptor_state,
2440*61046927SAndroid Build Coastguard Worker                                    struct v3dv_descriptor_map *map,
2441*61046927SAndroid Build Coastguard Worker                                    struct v3dv_pipeline_layout *pipeline_layout,
2442*61046927SAndroid Build Coastguard Worker                                    uint32_t index,
2443*61046927SAndroid Build Coastguard Worker                                    uint32_t *dynamic_offset);
2444*61046927SAndroid Build Coastguard Worker 
2445*61046927SAndroid Build Coastguard Worker struct v3dv_cl_reloc
2446*61046927SAndroid Build Coastguard Worker v3dv_descriptor_map_get_descriptor_bo(struct v3dv_device *device,
2447*61046927SAndroid Build Coastguard Worker                                       struct v3dv_descriptor_state *descriptor_state,
2448*61046927SAndroid Build Coastguard Worker                                       struct v3dv_descriptor_map *map,
2449*61046927SAndroid Build Coastguard Worker                                       struct v3dv_pipeline_layout *pipeline_layout,
2450*61046927SAndroid Build Coastguard Worker                                       uint32_t index,
2451*61046927SAndroid Build Coastguard Worker                                       VkDescriptorType *out_type);
2452*61046927SAndroid Build Coastguard Worker 
2453*61046927SAndroid Build Coastguard Worker const struct v3dv_sampler *
2454*61046927SAndroid Build Coastguard Worker v3dv_descriptor_map_get_sampler(struct v3dv_descriptor_state *descriptor_state,
2455*61046927SAndroid Build Coastguard Worker                                 struct v3dv_descriptor_map *map,
2456*61046927SAndroid Build Coastguard Worker                                 struct v3dv_pipeline_layout *pipeline_layout,
2457*61046927SAndroid Build Coastguard Worker                                 uint32_t index);
2458*61046927SAndroid Build Coastguard Worker 
2459*61046927SAndroid Build Coastguard Worker struct v3dv_cl_reloc
2460*61046927SAndroid Build Coastguard Worker v3dv_descriptor_map_get_sampler_state(struct v3dv_device *device,
2461*61046927SAndroid Build Coastguard Worker                                       struct v3dv_descriptor_state *descriptor_state,
2462*61046927SAndroid Build Coastguard Worker                                       struct v3dv_descriptor_map *map,
2463*61046927SAndroid Build Coastguard Worker                                       struct v3dv_pipeline_layout *pipeline_layout,
2464*61046927SAndroid Build Coastguard Worker                                       uint32_t index);
2465*61046927SAndroid Build Coastguard Worker 
2466*61046927SAndroid Build Coastguard Worker struct v3dv_cl_reloc
2467*61046927SAndroid Build Coastguard Worker v3dv_descriptor_map_get_texture_shader_state(struct v3dv_device *device,
2468*61046927SAndroid Build Coastguard Worker                                              struct v3dv_descriptor_state *descriptor_state,
2469*61046927SAndroid Build Coastguard Worker                                              struct v3dv_descriptor_map *map,
2470*61046927SAndroid Build Coastguard Worker                                              struct v3dv_pipeline_layout *pipeline_layout,
2471*61046927SAndroid Build Coastguard Worker                                              uint32_t index);
2472*61046927SAndroid Build Coastguard Worker 
2473*61046927SAndroid Build Coastguard Worker struct v3dv_bo*
2474*61046927SAndroid Build Coastguard Worker v3dv_descriptor_map_get_texture_bo(struct v3dv_descriptor_state *descriptor_state,
2475*61046927SAndroid Build Coastguard Worker                                    struct v3dv_descriptor_map *map,
2476*61046927SAndroid Build Coastguard Worker                                    struct v3dv_pipeline_layout *pipeline_layout,
2477*61046927SAndroid Build Coastguard Worker                                    uint32_t index);
2478*61046927SAndroid Build Coastguard Worker 
2479*61046927SAndroid Build Coastguard Worker static inline const struct v3dv_sampler *
v3dv_immutable_samplers(const struct v3dv_descriptor_set_layout * set,const struct v3dv_descriptor_set_binding_layout * binding)2480*61046927SAndroid Build Coastguard Worker v3dv_immutable_samplers(const struct v3dv_descriptor_set_layout *set,
2481*61046927SAndroid Build Coastguard Worker                         const struct v3dv_descriptor_set_binding_layout *binding)
2482*61046927SAndroid Build Coastguard Worker {
2483*61046927SAndroid Build Coastguard Worker    assert(binding->immutable_samplers_offset);
2484*61046927SAndroid Build Coastguard Worker    return (const struct v3dv_sampler *) ((const char *) set + binding->immutable_samplers_offset);
2485*61046927SAndroid Build Coastguard Worker }
2486*61046927SAndroid Build Coastguard Worker 
2487*61046927SAndroid Build Coastguard Worker void v3dv_pipeline_cache_init(struct v3dv_pipeline_cache *cache,
2488*61046927SAndroid Build Coastguard Worker                               struct v3dv_device *device,
2489*61046927SAndroid Build Coastguard Worker                               VkPipelineCacheCreateFlags,
2490*61046927SAndroid Build Coastguard Worker                               bool cache_enabled);
2491*61046927SAndroid Build Coastguard Worker 
2492*61046927SAndroid Build Coastguard Worker void v3dv_pipeline_cache_finish(struct v3dv_pipeline_cache *cache);
2493*61046927SAndroid Build Coastguard Worker 
2494*61046927SAndroid Build Coastguard Worker void v3dv_pipeline_cache_upload_nir(struct v3dv_pipeline *pipeline,
2495*61046927SAndroid Build Coastguard Worker                                     struct v3dv_pipeline_cache *cache,
2496*61046927SAndroid Build Coastguard Worker                                     nir_shader *nir,
2497*61046927SAndroid Build Coastguard Worker                                     unsigned char sha1_key[20]);
2498*61046927SAndroid Build Coastguard Worker 
2499*61046927SAndroid Build Coastguard Worker nir_shader* v3dv_pipeline_cache_search_for_nir(struct v3dv_pipeline *pipeline,
2500*61046927SAndroid Build Coastguard Worker                                                struct v3dv_pipeline_cache *cache,
2501*61046927SAndroid Build Coastguard Worker                                                const nir_shader_compiler_options *nir_options,
2502*61046927SAndroid Build Coastguard Worker                                                unsigned char sha1_key[20]);
2503*61046927SAndroid Build Coastguard Worker 
2504*61046927SAndroid Build Coastguard Worker struct v3dv_pipeline_shared_data *
2505*61046927SAndroid Build Coastguard Worker v3dv_pipeline_cache_search_for_pipeline(struct v3dv_pipeline_cache *cache,
2506*61046927SAndroid Build Coastguard Worker                                         unsigned char sha1_key[20],
2507*61046927SAndroid Build Coastguard Worker                                         bool *cache_hit);
2508*61046927SAndroid Build Coastguard Worker 
2509*61046927SAndroid Build Coastguard Worker void
2510*61046927SAndroid Build Coastguard Worker v3dv_pipeline_cache_upload_pipeline(struct v3dv_pipeline *pipeline,
2511*61046927SAndroid Build Coastguard Worker                                     struct v3dv_pipeline_cache *cache);
2512*61046927SAndroid Build Coastguard Worker 
2513*61046927SAndroid Build Coastguard Worker VkResult
2514*61046927SAndroid Build Coastguard Worker v3dv_create_compute_pipeline_from_nir(struct v3dv_device *device,
2515*61046927SAndroid Build Coastguard Worker                                       nir_shader *nir,
2516*61046927SAndroid Build Coastguard Worker                                       VkPipelineLayout pipeline_layout,
2517*61046927SAndroid Build Coastguard Worker                                       VkPipeline *pipeline);
2518*61046927SAndroid Build Coastguard Worker 
2519*61046927SAndroid Build Coastguard Worker #define V3DV_FROM_HANDLE(__v3dv_type, __name, __handle)			\
2520*61046927SAndroid Build Coastguard Worker    VK_FROM_HANDLE(__v3dv_type, __name, __handle)
2521*61046927SAndroid Build Coastguard Worker 
2522*61046927SAndroid Build Coastguard Worker VK_DEFINE_HANDLE_CASTS(v3dv_cmd_buffer, vk.base, VkCommandBuffer,
2523*61046927SAndroid Build Coastguard Worker                        VK_OBJECT_TYPE_COMMAND_BUFFER)
2524*61046927SAndroid Build Coastguard Worker VK_DEFINE_HANDLE_CASTS(v3dv_device, vk.base, VkDevice, VK_OBJECT_TYPE_DEVICE)
2525*61046927SAndroid Build Coastguard Worker VK_DEFINE_HANDLE_CASTS(v3dv_instance, vk.base, VkInstance,
2526*61046927SAndroid Build Coastguard Worker                        VK_OBJECT_TYPE_INSTANCE)
2527*61046927SAndroid Build Coastguard Worker VK_DEFINE_HANDLE_CASTS(v3dv_physical_device, vk.base, VkPhysicalDevice,
2528*61046927SAndroid Build Coastguard Worker                        VK_OBJECT_TYPE_PHYSICAL_DEVICE)
2529*61046927SAndroid Build Coastguard Worker VK_DEFINE_HANDLE_CASTS(v3dv_queue, vk.base, VkQueue, VK_OBJECT_TYPE_QUEUE)
2530*61046927SAndroid Build Coastguard Worker 
VK_DEFINE_NONDISP_HANDLE_CASTS(v3dv_buffer,base,VkBuffer,VK_OBJECT_TYPE_BUFFER)2531*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(v3dv_buffer, base, VkBuffer,
2532*61046927SAndroid Build Coastguard Worker                                VK_OBJECT_TYPE_BUFFER)
2533*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(v3dv_buffer_view, base, VkBufferView,
2534*61046927SAndroid Build Coastguard Worker                                VK_OBJECT_TYPE_BUFFER_VIEW)
2535*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(v3dv_device_memory, vk.base, VkDeviceMemory,
2536*61046927SAndroid Build Coastguard Worker                                VK_OBJECT_TYPE_DEVICE_MEMORY)
2537*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(v3dv_descriptor_pool, base, VkDescriptorPool,
2538*61046927SAndroid Build Coastguard Worker                                VK_OBJECT_TYPE_DESCRIPTOR_POOL)
2539*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(v3dv_descriptor_set, base, VkDescriptorSet,
2540*61046927SAndroid Build Coastguard Worker                                VK_OBJECT_TYPE_DESCRIPTOR_SET)
2541*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(v3dv_descriptor_set_layout, base,
2542*61046927SAndroid Build Coastguard Worker                                VkDescriptorSetLayout,
2543*61046927SAndroid Build Coastguard Worker                                VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT)
2544*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(v3dv_event, base, VkEvent, VK_OBJECT_TYPE_EVENT)
2545*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(v3dv_framebuffer, base, VkFramebuffer,
2546*61046927SAndroid Build Coastguard Worker                                VK_OBJECT_TYPE_FRAMEBUFFER)
2547*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(v3dv_image, vk.base, VkImage,
2548*61046927SAndroid Build Coastguard Worker                                VK_OBJECT_TYPE_IMAGE)
2549*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(v3dv_image_view, vk.base, VkImageView,
2550*61046927SAndroid Build Coastguard Worker                                VK_OBJECT_TYPE_IMAGE_VIEW)
2551*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(v3dv_pipeline, base, VkPipeline,
2552*61046927SAndroid Build Coastguard Worker                                VK_OBJECT_TYPE_PIPELINE)
2553*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(v3dv_pipeline_cache, base, VkPipelineCache,
2554*61046927SAndroid Build Coastguard Worker                                VK_OBJECT_TYPE_PIPELINE_CACHE)
2555*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(v3dv_pipeline_layout, base, VkPipelineLayout,
2556*61046927SAndroid Build Coastguard Worker                                VK_OBJECT_TYPE_PIPELINE_LAYOUT)
2557*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(v3dv_query_pool, base, VkQueryPool,
2558*61046927SAndroid Build Coastguard Worker                                VK_OBJECT_TYPE_QUERY_POOL)
2559*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(v3dv_render_pass, base, VkRenderPass,
2560*61046927SAndroid Build Coastguard Worker                                VK_OBJECT_TYPE_RENDER_PASS)
2561*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(v3dv_sampler, base, VkSampler,
2562*61046927SAndroid Build Coastguard Worker                                VK_OBJECT_TYPE_SAMPLER)
2563*61046927SAndroid Build Coastguard Worker 
2564*61046927SAndroid Build Coastguard Worker static inline int
2565*61046927SAndroid Build Coastguard Worker v3dv_ioctl(int fd, unsigned long request, void *arg)
2566*61046927SAndroid Build Coastguard Worker {
2567*61046927SAndroid Build Coastguard Worker #if USE_V3D_SIMULATOR
2568*61046927SAndroid Build Coastguard Worker    return v3d_simulator_ioctl(fd, request, arg);
2569*61046927SAndroid Build Coastguard Worker #else
2570*61046927SAndroid Build Coastguard Worker    return drmIoctl(fd, request, arg);
2571*61046927SAndroid Build Coastguard Worker #endif
2572*61046927SAndroid Build Coastguard Worker }
2573*61046927SAndroid Build Coastguard Worker 
2574*61046927SAndroid Build Coastguard Worker /* Flags OOM conditions in command buffer state.
2575*61046927SAndroid Build Coastguard Worker  *
2576*61046927SAndroid Build Coastguard Worker  * Note: notice that no-op jobs don't have a command buffer reference.
2577*61046927SAndroid Build Coastguard Worker  */
2578*61046927SAndroid Build Coastguard Worker static inline void
v3dv_flag_oom(struct v3dv_cmd_buffer * cmd_buffer,struct v3dv_job * job)2579*61046927SAndroid Build Coastguard Worker v3dv_flag_oom(struct v3dv_cmd_buffer *cmd_buffer, struct v3dv_job *job)
2580*61046927SAndroid Build Coastguard Worker {
2581*61046927SAndroid Build Coastguard Worker    if (cmd_buffer) {
2582*61046927SAndroid Build Coastguard Worker       cmd_buffer->state.oom = true;
2583*61046927SAndroid Build Coastguard Worker    } else {
2584*61046927SAndroid Build Coastguard Worker       assert(job);
2585*61046927SAndroid Build Coastguard Worker       if (job->cmd_buffer)
2586*61046927SAndroid Build Coastguard Worker          job->cmd_buffer->state.oom = true;
2587*61046927SAndroid Build Coastguard Worker    }
2588*61046927SAndroid Build Coastguard Worker }
2589*61046927SAndroid Build Coastguard Worker 
2590*61046927SAndroid Build Coastguard Worker #define v3dv_return_if_oom(_cmd_buffer, _job) do {                  \
2591*61046927SAndroid Build Coastguard Worker    const struct v3dv_cmd_buffer *__cmd_buffer = _cmd_buffer;        \
2592*61046927SAndroid Build Coastguard Worker    if (__cmd_buffer && __cmd_buffer->state.oom)                     \
2593*61046927SAndroid Build Coastguard Worker       return;                                                       \
2594*61046927SAndroid Build Coastguard Worker    const struct v3dv_job *__job = _job;                             \
2595*61046927SAndroid Build Coastguard Worker    if (__job && __job->cmd_buffer && __job->cmd_buffer->state.oom)  \
2596*61046927SAndroid Build Coastguard Worker       return;                                                       \
2597*61046927SAndroid Build Coastguard Worker } while(0)                                                          \
2598*61046927SAndroid Build Coastguard Worker 
2599*61046927SAndroid Build Coastguard Worker static inline uint32_t
u64_hash(const void * key)2600*61046927SAndroid Build Coastguard Worker u64_hash(const void *key)
2601*61046927SAndroid Build Coastguard Worker {
2602*61046927SAndroid Build Coastguard Worker    return _mesa_hash_data(key, sizeof(uint64_t));
2603*61046927SAndroid Build Coastguard Worker }
2604*61046927SAndroid Build Coastguard Worker 
2605*61046927SAndroid Build Coastguard Worker static inline bool
u64_compare(const void * key1,const void * key2)2606*61046927SAndroid Build Coastguard Worker u64_compare(const void *key1, const void *key2)
2607*61046927SAndroid Build Coastguard Worker {
2608*61046927SAndroid Build Coastguard Worker    return memcmp(key1, key2, sizeof(uint64_t)) == 0;
2609*61046927SAndroid Build Coastguard Worker }
2610*61046927SAndroid Build Coastguard Worker 
2611*61046927SAndroid Build Coastguard Worker /* Helper to call hw ver specific functions */
2612*61046927SAndroid Build Coastguard Worker #define v3dv_X(device, thing) ({                      \
2613*61046927SAndroid Build Coastguard Worker    __typeof(&v3d42_##thing) v3d_X_thing;              \
2614*61046927SAndroid Build Coastguard Worker    switch (device->devinfo.ver) {                     \
2615*61046927SAndroid Build Coastguard Worker    case 42:                                           \
2616*61046927SAndroid Build Coastguard Worker       v3d_X_thing = &v3d42_##thing;                   \
2617*61046927SAndroid Build Coastguard Worker       break;                                          \
2618*61046927SAndroid Build Coastguard Worker    case 71:                                           \
2619*61046927SAndroid Build Coastguard Worker       v3d_X_thing = &v3d71_##thing;                   \
2620*61046927SAndroid Build Coastguard Worker       break;                                          \
2621*61046927SAndroid Build Coastguard Worker    default:                                           \
2622*61046927SAndroid Build Coastguard Worker       unreachable("Unsupported hardware generation"); \
2623*61046927SAndroid Build Coastguard Worker    }                                                  \
2624*61046927SAndroid Build Coastguard Worker    v3d_X_thing;                                       \
2625*61046927SAndroid Build Coastguard Worker })
2626*61046927SAndroid Build Coastguard Worker 
2627*61046927SAndroid Build Coastguard Worker /* v3d_macros from common requires v3dX and V3DX definitions. Below we need to
2628*61046927SAndroid Build Coastguard Worker  * define v3dX for each version supported, because when we compile code that
2629*61046927SAndroid Build Coastguard Worker  * is not version-specific, all version-specific macros need to be already
2630*61046927SAndroid Build Coastguard Worker  * defined.
2631*61046927SAndroid Build Coastguard Worker  */
2632*61046927SAndroid Build Coastguard Worker #ifdef v3dX
2633*61046927SAndroid Build Coastguard Worker #  include "v3dvx_private.h"
2634*61046927SAndroid Build Coastguard Worker #else
2635*61046927SAndroid Build Coastguard Worker #  define v3dX(x) v3d42_##x
2636*61046927SAndroid Build Coastguard Worker #  include "v3dvx_private.h"
2637*61046927SAndroid Build Coastguard Worker #  undef v3dX
2638*61046927SAndroid Build Coastguard Worker 
2639*61046927SAndroid Build Coastguard Worker #  define v3dX(x) v3d71_##x
2640*61046927SAndroid Build Coastguard Worker #  include "v3dvx_private.h"
2641*61046927SAndroid Build Coastguard Worker #  undef v3dX
2642*61046927SAndroid Build Coastguard Worker #endif
2643*61046927SAndroid Build Coastguard Worker 
2644*61046927SAndroid Build Coastguard Worker VkResult
2645*61046927SAndroid Build Coastguard Worker v3dv_update_image_layout(struct v3dv_device *device,
2646*61046927SAndroid Build Coastguard Worker                          struct v3dv_image *image,
2647*61046927SAndroid Build Coastguard Worker                          uint64_t modifier,
2648*61046927SAndroid Build Coastguard Worker                          bool disjoint,
2649*61046927SAndroid Build Coastguard Worker                          const VkImageDrmFormatModifierExplicitCreateInfoEXT *explicit_mod_info);
2650*61046927SAndroid Build Coastguard Worker 
2651*61046927SAndroid Build Coastguard Worker float
2652*61046927SAndroid Build Coastguard Worker v3dv_get_aa_line_width(struct v3dv_pipeline *pipeline,
2653*61046927SAndroid Build Coastguard Worker                        struct v3dv_cmd_buffer *buffer);
2654*61046927SAndroid Build Coastguard Worker 
2655*61046927SAndroid Build Coastguard Worker 
2656*61046927SAndroid Build Coastguard Worker void
2657*61046927SAndroid Build Coastguard Worker v3dv_compute_ez_state(struct vk_dynamic_graphics_state *dyn,
2658*61046927SAndroid Build Coastguard Worker                       struct v3dv_pipeline *pipeline,
2659*61046927SAndroid Build Coastguard Worker                       enum v3dv_ez_state *ez_state,
2660*61046927SAndroid Build Coastguard Worker                       bool *incompatible_ez_test);
2661*61046927SAndroid Build Coastguard Worker 
2662*61046927SAndroid Build Coastguard Worker uint32_t v3dv_pipeline_primitive(VkPrimitiveTopology vk_prim);
2663*61046927SAndroid Build Coastguard Worker 
2664*61046927SAndroid Build Coastguard Worker #endif /* V3DV_PRIVATE_H */
2665