xref: /aosp_15_r20/external/mesa3d/src/imagination/vulkan/pvr_private.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2022 Imagination Technologies 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 copy
12*61046927SAndroid Build Coastguard Worker  * of this software and associated documentation files (the "Software"), to deal
13*61046927SAndroid Build Coastguard Worker  * in the Software without restriction, including without limitation the rights
14*61046927SAndroid Build Coastguard Worker  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15*61046927SAndroid Build Coastguard Worker  * copies of the Software, and to permit persons to whom the Software is
16*61046927SAndroid Build Coastguard Worker  * 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 THE
25*61046927SAndroid Build Coastguard Worker  * 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 FROM,
27*61046927SAndroid Build Coastguard Worker  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
28*61046927SAndroid Build Coastguard Worker  * SOFTWARE.
29*61046927SAndroid Build Coastguard Worker  */
30*61046927SAndroid Build Coastguard Worker 
31*61046927SAndroid Build Coastguard Worker #ifndef PVR_PRIVATE_H
32*61046927SAndroid Build Coastguard Worker #define PVR_PRIVATE_H
33*61046927SAndroid Build Coastguard Worker 
34*61046927SAndroid Build Coastguard Worker #include <assert.h>
35*61046927SAndroid Build Coastguard Worker #include <stdbool.h>
36*61046927SAndroid Build Coastguard Worker #include <stdint.h>
37*61046927SAndroid Build Coastguard Worker #include <vulkan/vulkan.h>
38*61046927SAndroid Build Coastguard Worker 
39*61046927SAndroid Build Coastguard Worker #include "compiler/shader_enums.h"
40*61046927SAndroid Build Coastguard Worker #include "hwdef/rogue_hw_defs.h"
41*61046927SAndroid Build Coastguard Worker #include "pvr_border.h"
42*61046927SAndroid Build Coastguard Worker #include "pvr_clear.h"
43*61046927SAndroid Build Coastguard Worker #include "pvr_common.h"
44*61046927SAndroid Build Coastguard Worker #include "pvr_csb.h"
45*61046927SAndroid Build Coastguard Worker #include "pvr_device_info.h"
46*61046927SAndroid Build Coastguard Worker #include "pvr_entrypoints.h"
47*61046927SAndroid Build Coastguard Worker #include "pvr_hw_pass.h"
48*61046927SAndroid Build Coastguard Worker #include "pvr_job_render.h"
49*61046927SAndroid Build Coastguard Worker #include "pvr_limits.h"
50*61046927SAndroid Build Coastguard Worker #include "pvr_pds.h"
51*61046927SAndroid Build Coastguard Worker #include "pvr_shader_factory.h"
52*61046927SAndroid Build Coastguard Worker #include "pvr_spm.h"
53*61046927SAndroid Build Coastguard Worker #include "pvr_types.h"
54*61046927SAndroid Build Coastguard Worker #include "pvr_winsys.h"
55*61046927SAndroid Build Coastguard Worker #include "rogue/rogue.h"
56*61046927SAndroid Build Coastguard Worker #include "util/bitscan.h"
57*61046927SAndroid Build Coastguard Worker #include "util/format/u_format.h"
58*61046927SAndroid Build Coastguard Worker #include "util/log.h"
59*61046927SAndroid Build Coastguard Worker #include "util/macros.h"
60*61046927SAndroid Build Coastguard Worker #include "util/simple_mtx.h"
61*61046927SAndroid Build Coastguard Worker #include "util/u_dynarray.h"
62*61046927SAndroid Build Coastguard Worker #include "util/u_math.h"
63*61046927SAndroid Build Coastguard Worker #include "vk_buffer.h"
64*61046927SAndroid Build Coastguard Worker #include "vk_command_buffer.h"
65*61046927SAndroid Build Coastguard Worker #include "vk_device.h"
66*61046927SAndroid Build Coastguard Worker #include "vk_enum_to_str.h"
67*61046927SAndroid Build Coastguard Worker #include "vk_graphics_state.h"
68*61046927SAndroid Build Coastguard Worker #include "vk_image.h"
69*61046927SAndroid Build Coastguard Worker #include "vk_instance.h"
70*61046927SAndroid Build Coastguard Worker #include "vk_log.h"
71*61046927SAndroid Build Coastguard Worker #include "vk_physical_device.h"
72*61046927SAndroid Build Coastguard Worker #include "vk_queue.h"
73*61046927SAndroid Build Coastguard Worker #include "vk_sync.h"
74*61046927SAndroid Build Coastguard Worker #include "wsi_common.h"
75*61046927SAndroid Build Coastguard Worker 
76*61046927SAndroid Build Coastguard Worker #ifdef HAVE_VALGRIND
77*61046927SAndroid Build Coastguard Worker #   include <valgrind/valgrind.h>
78*61046927SAndroid Build Coastguard Worker #   include <valgrind/memcheck.h>
79*61046927SAndroid Build Coastguard Worker #   define VG(x) x
80*61046927SAndroid Build Coastguard Worker #else
81*61046927SAndroid Build Coastguard Worker #   define VG(x) ((void)0)
82*61046927SAndroid Build Coastguard Worker #endif
83*61046927SAndroid Build Coastguard Worker 
84*61046927SAndroid Build Coastguard Worker struct pvr_bo;
85*61046927SAndroid Build Coastguard Worker struct pvr_bo_store;
86*61046927SAndroid Build Coastguard Worker struct pvr_compute_ctx;
87*61046927SAndroid Build Coastguard Worker struct pvr_compute_pipeline;
88*61046927SAndroid Build Coastguard Worker struct pvr_free_list;
89*61046927SAndroid Build Coastguard Worker struct pvr_graphics_pipeline;
90*61046927SAndroid Build Coastguard Worker struct pvr_instance;
91*61046927SAndroid Build Coastguard Worker struct pvr_render_ctx;
92*61046927SAndroid Build Coastguard Worker struct rogue_compiler;
93*61046927SAndroid Build Coastguard Worker 
94*61046927SAndroid Build Coastguard Worker struct pvr_physical_device {
95*61046927SAndroid Build Coastguard Worker    struct vk_physical_device vk;
96*61046927SAndroid Build Coastguard Worker 
97*61046927SAndroid Build Coastguard Worker    /* Back-pointer to instance */
98*61046927SAndroid Build Coastguard Worker    struct pvr_instance *instance;
99*61046927SAndroid Build Coastguard Worker 
100*61046927SAndroid Build Coastguard Worker    char *render_path;
101*61046927SAndroid Build Coastguard Worker    char *display_path;
102*61046927SAndroid Build Coastguard Worker 
103*61046927SAndroid Build Coastguard Worker    struct pvr_winsys *ws;
104*61046927SAndroid Build Coastguard Worker    struct pvr_device_info dev_info;
105*61046927SAndroid Build Coastguard Worker    struct pvr_device_runtime_info dev_runtime_info;
106*61046927SAndroid Build Coastguard Worker 
107*61046927SAndroid Build Coastguard Worker    VkPhysicalDeviceMemoryProperties memory;
108*61046927SAndroid Build Coastguard Worker 
109*61046927SAndroid Build Coastguard Worker    uint64_t heap_used;
110*61046927SAndroid Build Coastguard Worker 
111*61046927SAndroid Build Coastguard Worker    struct wsi_device wsi_device;
112*61046927SAndroid Build Coastguard Worker 
113*61046927SAndroid Build Coastguard Worker    struct rogue_compiler *compiler;
114*61046927SAndroid Build Coastguard Worker };
115*61046927SAndroid Build Coastguard Worker 
116*61046927SAndroid Build Coastguard Worker struct pvr_instance {
117*61046927SAndroid Build Coastguard Worker    struct vk_instance vk;
118*61046927SAndroid Build Coastguard Worker 
119*61046927SAndroid Build Coastguard Worker    uint32_t active_device_count;
120*61046927SAndroid Build Coastguard Worker };
121*61046927SAndroid Build Coastguard Worker 
122*61046927SAndroid Build Coastguard Worker struct pvr_queue {
123*61046927SAndroid Build Coastguard Worker    struct vk_queue vk;
124*61046927SAndroid Build Coastguard Worker 
125*61046927SAndroid Build Coastguard Worker    struct pvr_device *device;
126*61046927SAndroid Build Coastguard Worker 
127*61046927SAndroid Build Coastguard Worker    struct pvr_render_ctx *gfx_ctx;
128*61046927SAndroid Build Coastguard Worker    struct pvr_compute_ctx *compute_ctx;
129*61046927SAndroid Build Coastguard Worker    struct pvr_compute_ctx *query_ctx;
130*61046927SAndroid Build Coastguard Worker    struct pvr_transfer_ctx *transfer_ctx;
131*61046927SAndroid Build Coastguard Worker 
132*61046927SAndroid Build Coastguard Worker    struct vk_sync *last_job_signal_sync[PVR_JOB_TYPE_MAX];
133*61046927SAndroid Build Coastguard Worker    struct vk_sync *next_job_wait_sync[PVR_JOB_TYPE_MAX];
134*61046927SAndroid Build Coastguard Worker };
135*61046927SAndroid Build Coastguard Worker 
136*61046927SAndroid Build Coastguard Worker struct pvr_vertex_binding {
137*61046927SAndroid Build Coastguard Worker    struct pvr_buffer *buffer;
138*61046927SAndroid Build Coastguard Worker    VkDeviceSize offset;
139*61046927SAndroid Build Coastguard Worker };
140*61046927SAndroid Build Coastguard Worker 
141*61046927SAndroid Build Coastguard Worker struct pvr_pds_upload {
142*61046927SAndroid Build Coastguard Worker    struct pvr_suballoc_bo *pvr_bo;
143*61046927SAndroid Build Coastguard Worker    /* Offset from the pds heap base address. */
144*61046927SAndroid Build Coastguard Worker    uint32_t data_offset;
145*61046927SAndroid Build Coastguard Worker    /* Offset from the pds heap base address. */
146*61046927SAndroid Build Coastguard Worker    uint32_t code_offset;
147*61046927SAndroid Build Coastguard Worker 
148*61046927SAndroid Build Coastguard Worker    /* data_size + code_size = program_size. */
149*61046927SAndroid Build Coastguard Worker    uint32_t data_size;
150*61046927SAndroid Build Coastguard Worker    uint32_t code_size;
151*61046927SAndroid Build Coastguard Worker };
152*61046927SAndroid Build Coastguard Worker 
153*61046927SAndroid Build Coastguard Worker struct pvr_compute_query_shader {
154*61046927SAndroid Build Coastguard Worker    struct pvr_suballoc_bo *usc_bo;
155*61046927SAndroid Build Coastguard Worker 
156*61046927SAndroid Build Coastguard Worker    struct pvr_pds_upload pds_prim_code;
157*61046927SAndroid Build Coastguard Worker    uint32_t primary_data_size_dw;
158*61046927SAndroid Build Coastguard Worker    uint32_t primary_num_temps;
159*61046927SAndroid Build Coastguard Worker 
160*61046927SAndroid Build Coastguard Worker    struct pvr_pds_info info;
161*61046927SAndroid Build Coastguard Worker    struct pvr_pds_upload pds_sec_code;
162*61046927SAndroid Build Coastguard Worker };
163*61046927SAndroid Build Coastguard Worker 
164*61046927SAndroid Build Coastguard Worker struct pvr_device {
165*61046927SAndroid Build Coastguard Worker    struct vk_device vk;
166*61046927SAndroid Build Coastguard Worker    struct pvr_instance *instance;
167*61046927SAndroid Build Coastguard Worker    struct pvr_physical_device *pdevice;
168*61046927SAndroid Build Coastguard Worker 
169*61046927SAndroid Build Coastguard Worker    struct pvr_winsys *ws;
170*61046927SAndroid Build Coastguard Worker    struct pvr_winsys_heaps heaps;
171*61046927SAndroid Build Coastguard Worker 
172*61046927SAndroid Build Coastguard Worker    struct pvr_free_list *global_free_list;
173*61046927SAndroid Build Coastguard Worker 
174*61046927SAndroid Build Coastguard Worker    struct pvr_queue *queues;
175*61046927SAndroid Build Coastguard Worker    uint32_t queue_count;
176*61046927SAndroid Build Coastguard Worker 
177*61046927SAndroid Build Coastguard Worker    /* Running count of the number of job submissions across all queue. */
178*61046927SAndroid Build Coastguard Worker    uint32_t global_cmd_buffer_submit_count;
179*61046927SAndroid Build Coastguard Worker 
180*61046927SAndroid Build Coastguard Worker    /* Running count of the number of presentations across all queues. */
181*61046927SAndroid Build Coastguard Worker    uint32_t global_queue_present_count;
182*61046927SAndroid Build Coastguard Worker 
183*61046927SAndroid Build Coastguard Worker    uint32_t pixel_event_data_size_in_dwords;
184*61046927SAndroid Build Coastguard Worker 
185*61046927SAndroid Build Coastguard Worker    uint64_t input_attachment_sampler;
186*61046927SAndroid Build Coastguard Worker 
187*61046927SAndroid Build Coastguard Worker    struct pvr_pds_upload pds_compute_fence_program;
188*61046927SAndroid Build Coastguard Worker    struct pvr_pds_upload pds_compute_empty_program;
189*61046927SAndroid Build Coastguard Worker 
190*61046927SAndroid Build Coastguard Worker    /* Compute shaders for queries. */
191*61046927SAndroid Build Coastguard Worker    struct pvr_compute_query_shader availability_shader;
192*61046927SAndroid Build Coastguard Worker    struct pvr_compute_query_shader *copy_results_shaders;
193*61046927SAndroid Build Coastguard Worker    struct pvr_compute_query_shader *reset_queries_shaders;
194*61046927SAndroid Build Coastguard Worker 
195*61046927SAndroid Build Coastguard Worker    struct pvr_suballocator suballoc_general;
196*61046927SAndroid Build Coastguard Worker    struct pvr_suballocator suballoc_pds;
197*61046927SAndroid Build Coastguard Worker    struct pvr_suballocator suballoc_transfer;
198*61046927SAndroid Build Coastguard Worker    struct pvr_suballocator suballoc_usc;
199*61046927SAndroid Build Coastguard Worker    struct pvr_suballocator suballoc_vis_test;
200*61046927SAndroid Build Coastguard Worker 
201*61046927SAndroid Build Coastguard Worker    struct {
202*61046927SAndroid Build Coastguard Worker       struct pvr_pds_upload pds;
203*61046927SAndroid Build Coastguard Worker       struct pvr_suballoc_bo *usc;
204*61046927SAndroid Build Coastguard Worker    } nop_program;
205*61046927SAndroid Build Coastguard Worker 
206*61046927SAndroid Build Coastguard Worker    /* Issue Data Fence, Wait for Data Fence state. */
207*61046927SAndroid Build Coastguard Worker    struct {
208*61046927SAndroid Build Coastguard Worker       uint32_t usc_shareds;
209*61046927SAndroid Build Coastguard Worker       struct pvr_suballoc_bo *usc;
210*61046927SAndroid Build Coastguard Worker 
211*61046927SAndroid Build Coastguard Worker       /* Buffer in which the IDF/WDF program performs store ops. */
212*61046927SAndroid Build Coastguard Worker       struct pvr_bo *store_bo;
213*61046927SAndroid Build Coastguard Worker       /* Contains the initialization values for the shared registers. */
214*61046927SAndroid Build Coastguard Worker       struct pvr_bo *shareds_bo;
215*61046927SAndroid Build Coastguard Worker 
216*61046927SAndroid Build Coastguard Worker       struct pvr_pds_upload pds;
217*61046927SAndroid Build Coastguard Worker       struct pvr_pds_upload sw_compute_barrier_pds;
218*61046927SAndroid Build Coastguard Worker    } idfwdf_state;
219*61046927SAndroid Build Coastguard Worker 
220*61046927SAndroid Build Coastguard Worker    struct pvr_device_static_clear_state {
221*61046927SAndroid Build Coastguard Worker       struct pvr_suballoc_bo *usc_vertex_shader_bo;
222*61046927SAndroid Build Coastguard Worker       struct pvr_suballoc_bo *vertices_bo;
223*61046927SAndroid Build Coastguard Worker       struct pvr_pds_upload pds;
224*61046927SAndroid Build Coastguard Worker 
225*61046927SAndroid Build Coastguard Worker       /* Only valid if PVR_HAS_FEATURE(dev_info, gs_rta_support). */
226*61046927SAndroid Build Coastguard Worker       struct pvr_suballoc_bo *usc_multi_layer_vertex_shader_bo;
227*61046927SAndroid Build Coastguard Worker 
228*61046927SAndroid Build Coastguard Worker       struct pvr_static_clear_ppp_base ppp_base;
229*61046927SAndroid Build Coastguard Worker       /* Indexable using VkImageAspectFlags. */
230*61046927SAndroid Build Coastguard Worker       struct pvr_static_clear_ppp_template
231*61046927SAndroid Build Coastguard Worker          ppp_templates[PVR_STATIC_CLEAR_VARIANT_COUNT];
232*61046927SAndroid Build Coastguard Worker 
233*61046927SAndroid Build Coastguard Worker       const uint32_t *vdm_words;
234*61046927SAndroid Build Coastguard Worker       const uint32_t *large_clear_vdm_words;
235*61046927SAndroid Build Coastguard Worker 
236*61046927SAndroid Build Coastguard Worker       struct pvr_suballoc_bo *usc_clear_attachment_programs;
237*61046927SAndroid Build Coastguard Worker       struct pvr_suballoc_bo *pds_clear_attachment_programs;
238*61046927SAndroid Build Coastguard Worker       /* TODO: See if we can use PVR_CLEAR_ATTACHMENT_PROGRAM_COUNT to save some
239*61046927SAndroid Build Coastguard Worker        * memory.
240*61046927SAndroid Build Coastguard Worker        */
241*61046927SAndroid Build Coastguard Worker       struct pvr_pds_clear_attachment_program_info {
242*61046927SAndroid Build Coastguard Worker          pvr_dev_addr_t texture_program_offset;
243*61046927SAndroid Build Coastguard Worker          pvr_dev_addr_t pixel_program_offset;
244*61046927SAndroid Build Coastguard Worker 
245*61046927SAndroid Build Coastguard Worker          uint32_t texture_program_pds_temps_count;
246*61046927SAndroid Build Coastguard Worker          /* Size in dwords. */
247*61046927SAndroid Build Coastguard Worker          uint32_t texture_program_data_size;
248*61046927SAndroid Build Coastguard Worker       } pds_clear_attachment_program_info
249*61046927SAndroid Build Coastguard Worker          [PVR_CLEAR_ATTACHMENT_PROGRAM_COUNT_WITH_HOLES];
250*61046927SAndroid Build Coastguard Worker    } static_clear_state;
251*61046927SAndroid Build Coastguard Worker 
252*61046927SAndroid Build Coastguard Worker    struct {
253*61046927SAndroid Build Coastguard Worker       struct pvr_suballoc_bo *usc_programs;
254*61046927SAndroid Build Coastguard Worker       struct pvr_suballoc_bo *pds_programs;
255*61046927SAndroid Build Coastguard Worker 
256*61046927SAndroid Build Coastguard Worker       struct pvr_spm_per_load_program_state {
257*61046927SAndroid Build Coastguard Worker          pvr_dev_addr_t pds_pixel_program_offset;
258*61046927SAndroid Build Coastguard Worker          pvr_dev_addr_t pds_uniform_program_offset;
259*61046927SAndroid Build Coastguard Worker 
260*61046927SAndroid Build Coastguard Worker          uint32_t pds_texture_program_data_size;
261*61046927SAndroid Build Coastguard Worker          uint32_t pds_texture_program_temps_count;
262*61046927SAndroid Build Coastguard Worker       } load_program[PVR_SPM_LOAD_PROGRAM_COUNT];
263*61046927SAndroid Build Coastguard Worker    } spm_load_state;
264*61046927SAndroid Build Coastguard Worker 
265*61046927SAndroid Build Coastguard Worker    struct pvr_device_tile_buffer_state {
266*61046927SAndroid Build Coastguard Worker       simple_mtx_t mtx;
267*61046927SAndroid Build Coastguard Worker 
268*61046927SAndroid Build Coastguard Worker #define PVR_MAX_TILE_BUFFER_COUNT 7U
269*61046927SAndroid Build Coastguard Worker       struct pvr_bo *buffers[PVR_MAX_TILE_BUFFER_COUNT];
270*61046927SAndroid Build Coastguard Worker       uint32_t buffer_count;
271*61046927SAndroid Build Coastguard Worker    } tile_buffer_state;
272*61046927SAndroid Build Coastguard Worker 
273*61046927SAndroid Build Coastguard Worker    struct pvr_spm_scratch_buffer_store spm_scratch_buffer_store;
274*61046927SAndroid Build Coastguard Worker 
275*61046927SAndroid Build Coastguard Worker    struct pvr_bo_store *bo_store;
276*61046927SAndroid Build Coastguard Worker 
277*61046927SAndroid Build Coastguard Worker    struct pvr_bo *robustness_buffer;
278*61046927SAndroid Build Coastguard Worker 
279*61046927SAndroid Build Coastguard Worker    struct vk_sync *presignaled_sync;
280*61046927SAndroid Build Coastguard Worker 
281*61046927SAndroid Build Coastguard Worker    struct pvr_border_color_table border_color_table;
282*61046927SAndroid Build Coastguard Worker };
283*61046927SAndroid Build Coastguard Worker 
284*61046927SAndroid Build Coastguard Worker struct pvr_device_memory {
285*61046927SAndroid Build Coastguard Worker    struct vk_object_base base;
286*61046927SAndroid Build Coastguard Worker    struct pvr_winsys_bo *bo;
287*61046927SAndroid Build Coastguard Worker };
288*61046927SAndroid Build Coastguard Worker 
289*61046927SAndroid Build Coastguard Worker struct pvr_mip_level {
290*61046927SAndroid Build Coastguard Worker    /* Offset of the mip level in bytes */
291*61046927SAndroid Build Coastguard Worker    uint32_t offset;
292*61046927SAndroid Build Coastguard Worker 
293*61046927SAndroid Build Coastguard Worker    /* Aligned mip level size in bytes */
294*61046927SAndroid Build Coastguard Worker    uint32_t size;
295*61046927SAndroid Build Coastguard Worker 
296*61046927SAndroid Build Coastguard Worker    /* Aligned row length in bytes */
297*61046927SAndroid Build Coastguard Worker    uint32_t pitch;
298*61046927SAndroid Build Coastguard Worker 
299*61046927SAndroid Build Coastguard Worker    /* Aligned height in bytes */
300*61046927SAndroid Build Coastguard Worker    uint32_t height_pitch;
301*61046927SAndroid Build Coastguard Worker };
302*61046927SAndroid Build Coastguard Worker 
303*61046927SAndroid Build Coastguard Worker struct pvr_image {
304*61046927SAndroid Build Coastguard Worker    struct vk_image vk;
305*61046927SAndroid Build Coastguard Worker 
306*61046927SAndroid Build Coastguard Worker    /* vma this image is bound to */
307*61046927SAndroid Build Coastguard Worker    struct pvr_winsys_vma *vma;
308*61046927SAndroid Build Coastguard Worker 
309*61046927SAndroid Build Coastguard Worker    /* Device address the image is mapped to in device virtual address space */
310*61046927SAndroid Build Coastguard Worker    pvr_dev_addr_t dev_addr;
311*61046927SAndroid Build Coastguard Worker 
312*61046927SAndroid Build Coastguard Worker    /* Derived and other state */
313*61046927SAndroid Build Coastguard Worker    VkExtent3D physical_extent;
314*61046927SAndroid Build Coastguard Worker    enum pvr_memlayout memlayout;
315*61046927SAndroid Build Coastguard Worker    VkDeviceSize layer_size;
316*61046927SAndroid Build Coastguard Worker    VkDeviceSize size;
317*61046927SAndroid Build Coastguard Worker 
318*61046927SAndroid Build Coastguard Worker    VkDeviceSize alignment;
319*61046927SAndroid Build Coastguard Worker 
320*61046927SAndroid Build Coastguard Worker    struct pvr_mip_level mip_levels[14];
321*61046927SAndroid Build Coastguard Worker };
322*61046927SAndroid Build Coastguard Worker 
323*61046927SAndroid Build Coastguard Worker struct pvr_buffer {
324*61046927SAndroid Build Coastguard Worker    struct vk_buffer vk;
325*61046927SAndroid Build Coastguard Worker 
326*61046927SAndroid Build Coastguard Worker    /* Derived and other state */
327*61046927SAndroid Build Coastguard Worker    uint32_t alignment;
328*61046927SAndroid Build Coastguard Worker    /* vma this buffer is bound to */
329*61046927SAndroid Build Coastguard Worker    struct pvr_winsys_vma *vma;
330*61046927SAndroid Build Coastguard Worker    /* Device address the buffer is mapped to in device virtual address space */
331*61046927SAndroid Build Coastguard Worker    pvr_dev_addr_t dev_addr;
332*61046927SAndroid Build Coastguard Worker };
333*61046927SAndroid Build Coastguard Worker 
334*61046927SAndroid Build Coastguard Worker struct pvr_image_view {
335*61046927SAndroid Build Coastguard Worker    struct vk_image_view vk;
336*61046927SAndroid Build Coastguard Worker 
337*61046927SAndroid Build Coastguard Worker    /* Prepacked Texture Image dword 0 and 1. It will be copied to the
338*61046927SAndroid Build Coastguard Worker     * descriptor info during pvr_UpdateDescriptorSets().
339*61046927SAndroid Build Coastguard Worker     *
340*61046927SAndroid Build Coastguard Worker     * We create separate texture states for sampling, storage and input
341*61046927SAndroid Build Coastguard Worker     * attachment cases.
342*61046927SAndroid Build Coastguard Worker     */
343*61046927SAndroid Build Coastguard Worker    uint64_t texture_state[PVR_TEXTURE_STATE_MAX_ENUM][2];
344*61046927SAndroid Build Coastguard Worker };
345*61046927SAndroid Build Coastguard Worker 
346*61046927SAndroid Build Coastguard Worker struct pvr_buffer_view {
347*61046927SAndroid Build Coastguard Worker    struct vk_object_base base;
348*61046927SAndroid Build Coastguard Worker 
349*61046927SAndroid Build Coastguard Worker    uint64_t range;
350*61046927SAndroid Build Coastguard Worker    VkFormat format;
351*61046927SAndroid Build Coastguard Worker 
352*61046927SAndroid Build Coastguard Worker    /* Prepacked Texture dword 0 and 1. It will be copied to the descriptor
353*61046927SAndroid Build Coastguard Worker     * during pvr_UpdateDescriptorSets().
354*61046927SAndroid Build Coastguard Worker     */
355*61046927SAndroid Build Coastguard Worker    uint64_t texture_state[2];
356*61046927SAndroid Build Coastguard Worker };
357*61046927SAndroid Build Coastguard Worker 
358*61046927SAndroid Build Coastguard Worker #define PVR_TRANSFER_MAX_SOURCES 10U
359*61046927SAndroid Build Coastguard Worker #define PVR_TRANSFER_MAX_CUSTOM_MAPPINGS 6U
360*61046927SAndroid Build Coastguard Worker 
361*61046927SAndroid Build Coastguard Worker /** A surface describes a source or destination for a transfer operation. */
362*61046927SAndroid Build Coastguard Worker struct pvr_transfer_cmd_surface {
363*61046927SAndroid Build Coastguard Worker    pvr_dev_addr_t dev_addr;
364*61046927SAndroid Build Coastguard Worker 
365*61046927SAndroid Build Coastguard Worker    /* Memory address for extra U/V planes. */
366*61046927SAndroid Build Coastguard Worker    pvr_dev_addr_t uv_address[2];
367*61046927SAndroid Build Coastguard Worker 
368*61046927SAndroid Build Coastguard Worker    /* Surface width in texels. */
369*61046927SAndroid Build Coastguard Worker    uint32_t width;
370*61046927SAndroid Build Coastguard Worker 
371*61046927SAndroid Build Coastguard Worker    /* Surface height in texels. */
372*61046927SAndroid Build Coastguard Worker    uint32_t height;
373*61046927SAndroid Build Coastguard Worker 
374*61046927SAndroid Build Coastguard Worker    uint32_t depth;
375*61046927SAndroid Build Coastguard Worker 
376*61046927SAndroid Build Coastguard Worker    /* Z position in a 3D tecture. 0.0f <= z_position <= depth. */
377*61046927SAndroid Build Coastguard Worker    float z_position;
378*61046927SAndroid Build Coastguard Worker 
379*61046927SAndroid Build Coastguard Worker    /* Stride in texels. */
380*61046927SAndroid Build Coastguard Worker    uint32_t stride;
381*61046927SAndroid Build Coastguard Worker 
382*61046927SAndroid Build Coastguard Worker    VkFormat vk_format;
383*61046927SAndroid Build Coastguard Worker 
384*61046927SAndroid Build Coastguard Worker    enum pvr_memlayout mem_layout;
385*61046927SAndroid Build Coastguard Worker 
386*61046927SAndroid Build Coastguard Worker    uint32_t sample_count;
387*61046927SAndroid Build Coastguard Worker };
388*61046927SAndroid Build Coastguard Worker 
389*61046927SAndroid Build Coastguard Worker struct pvr_rect_mapping {
390*61046927SAndroid Build Coastguard Worker    VkRect2D src_rect;
391*61046927SAndroid Build Coastguard Worker    VkRect2D dst_rect;
392*61046927SAndroid Build Coastguard Worker    bool flip_x;
393*61046927SAndroid Build Coastguard Worker    bool flip_y;
394*61046927SAndroid Build Coastguard Worker };
395*61046927SAndroid Build Coastguard Worker 
396*61046927SAndroid Build Coastguard Worker struct pvr_transfer_cmd_source {
397*61046927SAndroid Build Coastguard Worker    struct pvr_transfer_cmd_surface surface;
398*61046927SAndroid Build Coastguard Worker 
399*61046927SAndroid Build Coastguard Worker    uint32_t mapping_count;
400*61046927SAndroid Build Coastguard Worker    struct pvr_rect_mapping mappings[PVR_TRANSFER_MAX_CUSTOM_MAPPINGS];
401*61046927SAndroid Build Coastguard Worker 
402*61046927SAndroid Build Coastguard Worker    /* In the case of a simple 1:1 copy, this setting does not affect the output
403*61046927SAndroid Build Coastguard Worker     * but will affect performance. Use clamp to edge when possible.
404*61046927SAndroid Build Coastguard Worker     */
405*61046927SAndroid Build Coastguard Worker    /* This is of type enum PVRX(TEXSTATE_ADDRMODE). */
406*61046927SAndroid Build Coastguard Worker    int addr_mode;
407*61046927SAndroid Build Coastguard Worker 
408*61046927SAndroid Build Coastguard Worker    /* Source filtering method. */
409*61046927SAndroid Build Coastguard Worker    enum pvr_filter filter;
410*61046927SAndroid Build Coastguard Worker 
411*61046927SAndroid Build Coastguard Worker    /* MSAA resolve operation. */
412*61046927SAndroid Build Coastguard Worker    enum pvr_resolve_op resolve_op;
413*61046927SAndroid Build Coastguard Worker };
414*61046927SAndroid Build Coastguard Worker 
415*61046927SAndroid Build Coastguard Worker struct pvr_transfer_cmd {
416*61046927SAndroid Build Coastguard Worker    /* Node to link this cmd into the transfer_cmds list in
417*61046927SAndroid Build Coastguard Worker     * pvr_sub_cmd::transfer structure.
418*61046927SAndroid Build Coastguard Worker     */
419*61046927SAndroid Build Coastguard Worker    struct list_head link;
420*61046927SAndroid Build Coastguard Worker 
421*61046927SAndroid Build Coastguard Worker    uint32_t flags;
422*61046927SAndroid Build Coastguard Worker 
423*61046927SAndroid Build Coastguard Worker    uint32_t source_count;
424*61046927SAndroid Build Coastguard Worker 
425*61046927SAndroid Build Coastguard Worker    struct pvr_transfer_cmd_source sources[PVR_TRANSFER_MAX_SOURCES];
426*61046927SAndroid Build Coastguard Worker 
427*61046927SAndroid Build Coastguard Worker    union fi clear_color[4];
428*61046927SAndroid Build Coastguard Worker 
429*61046927SAndroid Build Coastguard Worker    struct pvr_transfer_cmd_surface dst;
430*61046927SAndroid Build Coastguard Worker 
431*61046927SAndroid Build Coastguard Worker    VkRect2D scissor;
432*61046927SAndroid Build Coastguard Worker 
433*61046927SAndroid Build Coastguard Worker    /* Pointer to cmd buffer this transfer cmd belongs to. This is mainly used
434*61046927SAndroid Build Coastguard Worker     * to link buffer objects allocated during job submission into
435*61046927SAndroid Build Coastguard Worker     * cmd_buffer::bo_list head.
436*61046927SAndroid Build Coastguard Worker     */
437*61046927SAndroid Build Coastguard Worker    struct pvr_cmd_buffer *cmd_buffer;
438*61046927SAndroid Build Coastguard Worker 
439*61046927SAndroid Build Coastguard Worker    /* Deferred RTA clears are allocated from pvr_cmd_buffer->deferred_clears and
440*61046927SAndroid Build Coastguard Worker     * cannot be freed directly.
441*61046927SAndroid Build Coastguard Worker     */
442*61046927SAndroid Build Coastguard Worker    bool is_deferred_clear;
443*61046927SAndroid Build Coastguard Worker };
444*61046927SAndroid Build Coastguard Worker 
445*61046927SAndroid Build Coastguard Worker struct pvr_sub_cmd_gfx {
446*61046927SAndroid Build Coastguard Worker    const struct pvr_framebuffer *framebuffer;
447*61046927SAndroid Build Coastguard Worker 
448*61046927SAndroid Build Coastguard Worker    struct pvr_render_job job;
449*61046927SAndroid Build Coastguard Worker 
450*61046927SAndroid Build Coastguard Worker    struct pvr_suballoc_bo *depth_bias_bo;
451*61046927SAndroid Build Coastguard Worker    struct pvr_suballoc_bo *scissor_bo;
452*61046927SAndroid Build Coastguard Worker 
453*61046927SAndroid Build Coastguard Worker    /* Tracking how the loaded depth/stencil values are being used. */
454*61046927SAndroid Build Coastguard Worker    enum pvr_depth_stencil_usage depth_usage;
455*61046927SAndroid Build Coastguard Worker    enum pvr_depth_stencil_usage stencil_usage;
456*61046927SAndroid Build Coastguard Worker 
457*61046927SAndroid Build Coastguard Worker    /* Tracking whether the subcommand modifies depth/stencil. */
458*61046927SAndroid Build Coastguard Worker    bool modifies_depth;
459*61046927SAndroid Build Coastguard Worker    bool modifies_stencil;
460*61046927SAndroid Build Coastguard Worker 
461*61046927SAndroid Build Coastguard Worker    /* Store the render to a scratch buffer. */
462*61046927SAndroid Build Coastguard Worker    bool barrier_store;
463*61046927SAndroid Build Coastguard Worker    /* Load the render (stored with a `barrier_store`) as a background to the
464*61046927SAndroid Build Coastguard Worker     * current render.
465*61046927SAndroid Build Coastguard Worker     */
466*61046927SAndroid Build Coastguard Worker    bool barrier_load;
467*61046927SAndroid Build Coastguard Worker 
468*61046927SAndroid Build Coastguard Worker    const struct pvr_query_pool *query_pool;
469*61046927SAndroid Build Coastguard Worker    struct util_dynarray sec_query_indices;
470*61046927SAndroid Build Coastguard Worker 
471*61046927SAndroid Build Coastguard Worker    /* Control stream builder object */
472*61046927SAndroid Build Coastguard Worker    struct pvr_csb control_stream;
473*61046927SAndroid Build Coastguard Worker 
474*61046927SAndroid Build Coastguard Worker    /* Required iff pvr_sub_cmd_gfx_requires_split_submit() returns true. */
475*61046927SAndroid Build Coastguard Worker    struct pvr_bo *terminate_ctrl_stream;
476*61046927SAndroid Build Coastguard Worker 
477*61046927SAndroid Build Coastguard Worker    uint32_t hw_render_idx;
478*61046927SAndroid Build Coastguard Worker 
479*61046927SAndroid Build Coastguard Worker    uint32_t max_tiles_in_flight;
480*61046927SAndroid Build Coastguard Worker 
481*61046927SAndroid Build Coastguard Worker    bool empty_cmd;
482*61046927SAndroid Build Coastguard Worker 
483*61046927SAndroid Build Coastguard Worker    /* True if any fragment shader used in this sub command uses atomic
484*61046927SAndroid Build Coastguard Worker     * operations.
485*61046927SAndroid Build Coastguard Worker     */
486*61046927SAndroid Build Coastguard Worker    bool frag_uses_atomic_ops;
487*61046927SAndroid Build Coastguard Worker 
488*61046927SAndroid Build Coastguard Worker    bool disable_compute_overlap;
489*61046927SAndroid Build Coastguard Worker 
490*61046927SAndroid Build Coastguard Worker    /* True if any fragment shader used in this sub command has side
491*61046927SAndroid Build Coastguard Worker     * effects.
492*61046927SAndroid Build Coastguard Worker     */
493*61046927SAndroid Build Coastguard Worker    bool frag_has_side_effects;
494*61046927SAndroid Build Coastguard Worker 
495*61046927SAndroid Build Coastguard Worker    /* True if any vertex shader used in this sub command contains both
496*61046927SAndroid Build Coastguard Worker     * texture reads and texture writes.
497*61046927SAndroid Build Coastguard Worker     */
498*61046927SAndroid Build Coastguard Worker    bool vertex_uses_texture_rw;
499*61046927SAndroid Build Coastguard Worker 
500*61046927SAndroid Build Coastguard Worker    /* True if any fragment shader used in this sub command contains
501*61046927SAndroid Build Coastguard Worker     * both texture reads and texture writes.
502*61046927SAndroid Build Coastguard Worker     */
503*61046927SAndroid Build Coastguard Worker    bool frag_uses_texture_rw;
504*61046927SAndroid Build Coastguard Worker 
505*61046927SAndroid Build Coastguard Worker    bool has_occlusion_query;
506*61046927SAndroid Build Coastguard Worker 
507*61046927SAndroid Build Coastguard Worker    bool wait_on_previous_transfer;
508*61046927SAndroid Build Coastguard Worker };
509*61046927SAndroid Build Coastguard Worker 
510*61046927SAndroid Build Coastguard Worker struct pvr_sub_cmd_compute {
511*61046927SAndroid Build Coastguard Worker    /* Control stream builder object. */
512*61046927SAndroid Build Coastguard Worker    struct pvr_csb control_stream;
513*61046927SAndroid Build Coastguard Worker 
514*61046927SAndroid Build Coastguard Worker    uint32_t num_shared_regs;
515*61046927SAndroid Build Coastguard Worker 
516*61046927SAndroid Build Coastguard Worker    /* True if any shader used in this sub command uses atomic
517*61046927SAndroid Build Coastguard Worker     * operations.
518*61046927SAndroid Build Coastguard Worker     */
519*61046927SAndroid Build Coastguard Worker    bool uses_atomic_ops;
520*61046927SAndroid Build Coastguard Worker 
521*61046927SAndroid Build Coastguard Worker    bool uses_barrier;
522*61046927SAndroid Build Coastguard Worker 
523*61046927SAndroid Build Coastguard Worker    bool pds_sw_barrier_requires_clearing;
524*61046927SAndroid Build Coastguard Worker };
525*61046927SAndroid Build Coastguard Worker 
526*61046927SAndroid Build Coastguard Worker struct pvr_sub_cmd_transfer {
527*61046927SAndroid Build Coastguard Worker    bool serialize_with_frag;
528*61046927SAndroid Build Coastguard Worker 
529*61046927SAndroid Build Coastguard Worker    /* Pointer to the actual transfer command list, allowing primary and
530*61046927SAndroid Build Coastguard Worker     * secondary sub-commands to share the same list.
531*61046927SAndroid Build Coastguard Worker     */
532*61046927SAndroid Build Coastguard Worker    struct list_head *transfer_cmds;
533*61046927SAndroid Build Coastguard Worker 
534*61046927SAndroid Build Coastguard Worker    /* List of pvr_transfer_cmd type structures. Do not access the list
535*61046927SAndroid Build Coastguard Worker     * directly, but always use the transfer_cmds pointer above.
536*61046927SAndroid Build Coastguard Worker     */
537*61046927SAndroid Build Coastguard Worker    struct list_head transfer_cmds_priv;
538*61046927SAndroid Build Coastguard Worker };
539*61046927SAndroid Build Coastguard Worker 
540*61046927SAndroid Build Coastguard Worker struct pvr_sub_cmd_event {
541*61046927SAndroid Build Coastguard Worker    enum pvr_event_type type;
542*61046927SAndroid Build Coastguard Worker 
543*61046927SAndroid Build Coastguard Worker    union {
544*61046927SAndroid Build Coastguard Worker       struct pvr_sub_cmd_event_set_reset {
545*61046927SAndroid Build Coastguard Worker          struct pvr_event *event;
546*61046927SAndroid Build Coastguard Worker          /* Stages to wait for until the event is set or reset. */
547*61046927SAndroid Build Coastguard Worker          uint32_t wait_for_stage_mask;
548*61046927SAndroid Build Coastguard Worker       } set_reset;
549*61046927SAndroid Build Coastguard Worker 
550*61046927SAndroid Build Coastguard Worker       struct pvr_sub_cmd_event_wait {
551*61046927SAndroid Build Coastguard Worker          uint32_t count;
552*61046927SAndroid Build Coastguard Worker          /* Events to wait for before resuming. */
553*61046927SAndroid Build Coastguard Worker          struct pvr_event **events;
554*61046927SAndroid Build Coastguard Worker          /* Stages to wait at. */
555*61046927SAndroid Build Coastguard Worker          uint32_t *wait_at_stage_masks;
556*61046927SAndroid Build Coastguard Worker       } wait;
557*61046927SAndroid Build Coastguard Worker 
558*61046927SAndroid Build Coastguard Worker       struct pvr_sub_cmd_event_barrier {
559*61046927SAndroid Build Coastguard Worker          bool in_render_pass;
560*61046927SAndroid Build Coastguard Worker 
561*61046927SAndroid Build Coastguard Worker          /* Stages to wait for. */
562*61046927SAndroid Build Coastguard Worker          uint32_t wait_for_stage_mask;
563*61046927SAndroid Build Coastguard Worker          /* Stages to wait at. */
564*61046927SAndroid Build Coastguard Worker          uint32_t wait_at_stage_mask;
565*61046927SAndroid Build Coastguard Worker       } barrier;
566*61046927SAndroid Build Coastguard Worker    };
567*61046927SAndroid Build Coastguard Worker };
568*61046927SAndroid Build Coastguard Worker 
569*61046927SAndroid Build Coastguard Worker struct pvr_sub_cmd {
570*61046927SAndroid Build Coastguard Worker    /* This links the subcommand in pvr_cmd_buffer:sub_cmds list. */
571*61046927SAndroid Build Coastguard Worker    struct list_head link;
572*61046927SAndroid Build Coastguard Worker 
573*61046927SAndroid Build Coastguard Worker    enum pvr_sub_cmd_type type;
574*61046927SAndroid Build Coastguard Worker 
575*61046927SAndroid Build Coastguard Worker    /* True if the sub_cmd is owned by this command buffer. False if taken from
576*61046927SAndroid Build Coastguard Worker     * a secondary command buffer, in that case we are not supposed to free any
577*61046927SAndroid Build Coastguard Worker     * resources associated with the sub_cmd.
578*61046927SAndroid Build Coastguard Worker     */
579*61046927SAndroid Build Coastguard Worker    bool owned;
580*61046927SAndroid Build Coastguard Worker 
581*61046927SAndroid Build Coastguard Worker    union {
582*61046927SAndroid Build Coastguard Worker       struct pvr_sub_cmd_gfx gfx;
583*61046927SAndroid Build Coastguard Worker       struct pvr_sub_cmd_compute compute;
584*61046927SAndroid Build Coastguard Worker       struct pvr_sub_cmd_transfer transfer;
585*61046927SAndroid Build Coastguard Worker       struct pvr_sub_cmd_event event;
586*61046927SAndroid Build Coastguard Worker    };
587*61046927SAndroid Build Coastguard Worker };
588*61046927SAndroid Build Coastguard Worker 
589*61046927SAndroid Build Coastguard Worker struct pvr_render_pass_info {
590*61046927SAndroid Build Coastguard Worker    const struct pvr_render_pass *pass;
591*61046927SAndroid Build Coastguard Worker    struct pvr_framebuffer *framebuffer;
592*61046927SAndroid Build Coastguard Worker 
593*61046927SAndroid Build Coastguard Worker    struct pvr_image_view **attachments;
594*61046927SAndroid Build Coastguard Worker 
595*61046927SAndroid Build Coastguard Worker    uint32_t subpass_idx;
596*61046927SAndroid Build Coastguard Worker    uint32_t current_hw_subpass;
597*61046927SAndroid Build Coastguard Worker 
598*61046927SAndroid Build Coastguard Worker    VkRect2D render_area;
599*61046927SAndroid Build Coastguard Worker 
600*61046927SAndroid Build Coastguard Worker    uint32_t clear_value_count;
601*61046927SAndroid Build Coastguard Worker    VkClearValue *clear_values;
602*61046927SAndroid Build Coastguard Worker 
603*61046927SAndroid Build Coastguard Worker    VkPipelineBindPoint pipeline_bind_point;
604*61046927SAndroid Build Coastguard Worker 
605*61046927SAndroid Build Coastguard Worker    bool process_empty_tiles;
606*61046927SAndroid Build Coastguard Worker    bool enable_bg_tag;
607*61046927SAndroid Build Coastguard Worker    uint32_t isp_userpass;
608*61046927SAndroid Build Coastguard Worker };
609*61046927SAndroid Build Coastguard Worker 
610*61046927SAndroid Build Coastguard Worker struct pvr_ppp_state {
611*61046927SAndroid Build Coastguard Worker    uint32_t header;
612*61046927SAndroid Build Coastguard Worker 
613*61046927SAndroid Build Coastguard Worker    struct {
614*61046927SAndroid Build Coastguard Worker       /* TODO: Can we get rid of the "control" field? */
615*61046927SAndroid Build Coastguard Worker       struct PVRX(TA_STATE_ISPCTL) control_struct;
616*61046927SAndroid Build Coastguard Worker       uint32_t control;
617*61046927SAndroid Build Coastguard Worker 
618*61046927SAndroid Build Coastguard Worker       uint32_t front_a;
619*61046927SAndroid Build Coastguard Worker       uint32_t front_b;
620*61046927SAndroid Build Coastguard Worker       uint32_t back_a;
621*61046927SAndroid Build Coastguard Worker       uint32_t back_b;
622*61046927SAndroid Build Coastguard Worker    } isp;
623*61046927SAndroid Build Coastguard Worker 
624*61046927SAndroid Build Coastguard Worker    struct pvr_ppp_dbsc {
625*61046927SAndroid Build Coastguard Worker       uint16_t scissor_index;
626*61046927SAndroid Build Coastguard Worker       uint16_t depthbias_index;
627*61046927SAndroid Build Coastguard Worker    } depthbias_scissor_indices;
628*61046927SAndroid Build Coastguard Worker 
629*61046927SAndroid Build Coastguard Worker    struct {
630*61046927SAndroid Build Coastguard Worker       uint32_t pixel_shader_base;
631*61046927SAndroid Build Coastguard Worker       uint32_t texture_uniform_code_base;
632*61046927SAndroid Build Coastguard Worker       uint32_t size_info1;
633*61046927SAndroid Build Coastguard Worker       uint32_t size_info2;
634*61046927SAndroid Build Coastguard Worker       uint32_t varying_base;
635*61046927SAndroid Build Coastguard Worker       uint32_t texture_state_data_base;
636*61046927SAndroid Build Coastguard Worker       uint32_t uniform_state_data_base;
637*61046927SAndroid Build Coastguard Worker    } pds;
638*61046927SAndroid Build Coastguard Worker 
639*61046927SAndroid Build Coastguard Worker    struct {
640*61046927SAndroid Build Coastguard Worker       uint32_t word0;
641*61046927SAndroid Build Coastguard Worker       uint32_t word1;
642*61046927SAndroid Build Coastguard Worker    } region_clipping;
643*61046927SAndroid Build Coastguard Worker 
644*61046927SAndroid Build Coastguard Worker    struct {
645*61046927SAndroid Build Coastguard Worker       uint32_t a0;
646*61046927SAndroid Build Coastguard Worker       uint32_t m0;
647*61046927SAndroid Build Coastguard Worker       uint32_t a1;
648*61046927SAndroid Build Coastguard Worker       uint32_t m1;
649*61046927SAndroid Build Coastguard Worker       uint32_t a2;
650*61046927SAndroid Build Coastguard Worker       uint32_t m2;
651*61046927SAndroid Build Coastguard Worker    } viewports[PVR_MAX_VIEWPORTS];
652*61046927SAndroid Build Coastguard Worker 
653*61046927SAndroid Build Coastguard Worker    uint32_t viewport_count;
654*61046927SAndroid Build Coastguard Worker 
655*61046927SAndroid Build Coastguard Worker    uint32_t output_selects;
656*61046927SAndroid Build Coastguard Worker 
657*61046927SAndroid Build Coastguard Worker    uint32_t varying_word[2];
658*61046927SAndroid Build Coastguard Worker 
659*61046927SAndroid Build Coastguard Worker    uint32_t ppp_control;
660*61046927SAndroid Build Coastguard Worker };
661*61046927SAndroid Build Coastguard Worker 
662*61046927SAndroid Build Coastguard Worker /* Represents a control stream related command that is deferred for execution in
663*61046927SAndroid Build Coastguard Worker  * a secondary command buffer.
664*61046927SAndroid Build Coastguard Worker  */
665*61046927SAndroid Build Coastguard Worker struct pvr_deferred_cs_command {
666*61046927SAndroid Build Coastguard Worker    enum pvr_deferred_cs_command_type type;
667*61046927SAndroid Build Coastguard Worker    union {
668*61046927SAndroid Build Coastguard Worker       struct {
669*61046927SAndroid Build Coastguard Worker          struct pvr_ppp_dbsc state;
670*61046927SAndroid Build Coastguard Worker 
671*61046927SAndroid Build Coastguard Worker          uint32_t *vdm_state;
672*61046927SAndroid Build Coastguard Worker       } dbsc;
673*61046927SAndroid Build Coastguard Worker 
674*61046927SAndroid Build Coastguard Worker       struct {
675*61046927SAndroid Build Coastguard Worker          struct pvr_ppp_dbsc state;
676*61046927SAndroid Build Coastguard Worker 
677*61046927SAndroid Build Coastguard Worker          struct pvr_suballoc_bo *ppp_cs_bo;
678*61046927SAndroid Build Coastguard Worker          uint32_t patch_offset;
679*61046927SAndroid Build Coastguard Worker       } dbsc2;
680*61046927SAndroid Build Coastguard Worker    };
681*61046927SAndroid Build Coastguard Worker };
682*61046927SAndroid Build Coastguard Worker 
683*61046927SAndroid Build Coastguard Worker struct pvr_cmd_buffer_draw_state {
684*61046927SAndroid Build Coastguard Worker    uint32_t base_instance;
685*61046927SAndroid Build Coastguard Worker    uint32_t base_vertex;
686*61046927SAndroid Build Coastguard Worker    bool draw_indirect;
687*61046927SAndroid Build Coastguard Worker    bool draw_indexed;
688*61046927SAndroid Build Coastguard Worker };
689*61046927SAndroid Build Coastguard Worker 
690*61046927SAndroid Build Coastguard Worker struct pvr_cmd_buffer_state {
691*61046927SAndroid Build Coastguard Worker    /* Pipeline binding. */
692*61046927SAndroid Build Coastguard Worker    const struct pvr_graphics_pipeline *gfx_pipeline;
693*61046927SAndroid Build Coastguard Worker 
694*61046927SAndroid Build Coastguard Worker    const struct pvr_compute_pipeline *compute_pipeline;
695*61046927SAndroid Build Coastguard Worker 
696*61046927SAndroid Build Coastguard Worker    struct pvr_render_pass_info render_pass_info;
697*61046927SAndroid Build Coastguard Worker 
698*61046927SAndroid Build Coastguard Worker    struct pvr_sub_cmd *current_sub_cmd;
699*61046927SAndroid Build Coastguard Worker 
700*61046927SAndroid Build Coastguard Worker    struct pvr_ppp_state ppp_state;
701*61046927SAndroid Build Coastguard Worker 
702*61046927SAndroid Build Coastguard Worker    struct PVRX(TA_STATE_HEADER) emit_header;
703*61046927SAndroid Build Coastguard Worker 
704*61046927SAndroid Build Coastguard Worker    struct pvr_vertex_binding vertex_bindings[PVR_MAX_VERTEX_INPUT_BINDINGS];
705*61046927SAndroid Build Coastguard Worker 
706*61046927SAndroid Build Coastguard Worker    struct {
707*61046927SAndroid Build Coastguard Worker       struct pvr_buffer *buffer;
708*61046927SAndroid Build Coastguard Worker       VkDeviceSize offset;
709*61046927SAndroid Build Coastguard Worker       VkIndexType type;
710*61046927SAndroid Build Coastguard Worker    } index_buffer_binding;
711*61046927SAndroid Build Coastguard Worker 
712*61046927SAndroid Build Coastguard Worker    struct {
713*61046927SAndroid Build Coastguard Worker       uint8_t data[PVR_MAX_PUSH_CONSTANTS_SIZE];
714*61046927SAndroid Build Coastguard Worker       VkShaderStageFlags dirty_stages;
715*61046927SAndroid Build Coastguard Worker       /* Indicates if the whole push constants buffer was uploaded. This avoids
716*61046927SAndroid Build Coastguard Worker        * having to upload the same stuff twice when the push constant range
717*61046927SAndroid Build Coastguard Worker        * covers both gfx and compute.
718*61046927SAndroid Build Coastguard Worker        */
719*61046927SAndroid Build Coastguard Worker       bool uploaded;
720*61046927SAndroid Build Coastguard Worker       pvr_dev_addr_t dev_addr;
721*61046927SAndroid Build Coastguard Worker    } push_constants;
722*61046927SAndroid Build Coastguard Worker 
723*61046927SAndroid Build Coastguard Worker    /* Array size of barriers_needed is based on number of sync pipeline
724*61046927SAndroid Build Coastguard Worker     * stages.
725*61046927SAndroid Build Coastguard Worker     */
726*61046927SAndroid Build Coastguard Worker    uint32_t barriers_needed[PVR_NUM_SYNC_PIPELINE_STAGES];
727*61046927SAndroid Build Coastguard Worker 
728*61046927SAndroid Build Coastguard Worker    struct pvr_descriptor_state gfx_desc_state;
729*61046927SAndroid Build Coastguard Worker    struct pvr_descriptor_state compute_desc_state;
730*61046927SAndroid Build Coastguard Worker 
731*61046927SAndroid Build Coastguard Worker    VkFormat depth_format;
732*61046927SAndroid Build Coastguard Worker 
733*61046927SAndroid Build Coastguard Worker    struct {
734*61046927SAndroid Build Coastguard Worker       bool compute_pipeline_binding : 1;
735*61046927SAndroid Build Coastguard Worker       bool compute_desc_dirty : 1;
736*61046927SAndroid Build Coastguard Worker 
737*61046927SAndroid Build Coastguard Worker       bool gfx_pipeline_binding : 1;
738*61046927SAndroid Build Coastguard Worker       bool gfx_desc_dirty : 1;
739*61046927SAndroid Build Coastguard Worker 
740*61046927SAndroid Build Coastguard Worker       bool vertex_bindings : 1;
741*61046927SAndroid Build Coastguard Worker       bool index_buffer_binding : 1;
742*61046927SAndroid Build Coastguard Worker       bool vertex_descriptors : 1;
743*61046927SAndroid Build Coastguard Worker       bool fragment_descriptors : 1;
744*61046927SAndroid Build Coastguard Worker 
745*61046927SAndroid Build Coastguard Worker       bool isp_userpass : 1;
746*61046927SAndroid Build Coastguard Worker 
747*61046927SAndroid Build Coastguard Worker       /* Some draw state needs to be tracked for changes between draw calls
748*61046927SAndroid Build Coastguard Worker        * i.e. if we get a draw with baseInstance=0, followed by a call with
749*61046927SAndroid Build Coastguard Worker        * baseInstance=1 that needs to cause us to select a different PDS
750*61046927SAndroid Build Coastguard Worker        * attrib program and update the BASE_INSTANCE PDS const. If only
751*61046927SAndroid Build Coastguard Worker        * baseInstance changes then we just have to update the data section.
752*61046927SAndroid Build Coastguard Worker        */
753*61046927SAndroid Build Coastguard Worker       bool draw_base_instance : 1;
754*61046927SAndroid Build Coastguard Worker       bool draw_variant : 1;
755*61046927SAndroid Build Coastguard Worker 
756*61046927SAndroid Build Coastguard Worker       bool vis_test;
757*61046927SAndroid Build Coastguard Worker    } dirty;
758*61046927SAndroid Build Coastguard Worker 
759*61046927SAndroid Build Coastguard Worker    struct pvr_cmd_buffer_draw_state draw_state;
760*61046927SAndroid Build Coastguard Worker 
761*61046927SAndroid Build Coastguard Worker    struct {
762*61046927SAndroid Build Coastguard Worker       uint32_t code_offset;
763*61046927SAndroid Build Coastguard Worker       const struct pvr_pds_info *info;
764*61046927SAndroid Build Coastguard Worker    } pds_shader;
765*61046927SAndroid Build Coastguard Worker 
766*61046927SAndroid Build Coastguard Worker    const struct pvr_query_pool *query_pool;
767*61046927SAndroid Build Coastguard Worker    bool vis_test_enabled;
768*61046927SAndroid Build Coastguard Worker    uint32_t vis_reg;
769*61046927SAndroid Build Coastguard Worker 
770*61046927SAndroid Build Coastguard Worker    struct util_dynarray query_indices;
771*61046927SAndroid Build Coastguard Worker 
772*61046927SAndroid Build Coastguard Worker    uint32_t max_shared_regs;
773*61046927SAndroid Build Coastguard Worker 
774*61046927SAndroid Build Coastguard Worker    /* Address of data segment for vertex attrib upload program. */
775*61046927SAndroid Build Coastguard Worker    uint32_t pds_vertex_attrib_offset;
776*61046927SAndroid Build Coastguard Worker 
777*61046927SAndroid Build Coastguard Worker    uint32_t pds_fragment_descriptor_data_offset;
778*61046927SAndroid Build Coastguard Worker    uint32_t pds_compute_descriptor_data_offset;
779*61046927SAndroid Build Coastguard Worker };
780*61046927SAndroid Build Coastguard Worker 
781*61046927SAndroid Build Coastguard Worker /* Do not change this. This is the format used for the depth_bias_array
782*61046927SAndroid Build Coastguard Worker  * elements uploaded to the device.
783*61046927SAndroid Build Coastguard Worker  */
784*61046927SAndroid Build Coastguard Worker struct pvr_depth_bias_state {
785*61046927SAndroid Build Coastguard Worker    /* Saved information from pCreateInfo. */
786*61046927SAndroid Build Coastguard Worker    float constant_factor;
787*61046927SAndroid Build Coastguard Worker    float slope_factor;
788*61046927SAndroid Build Coastguard Worker    float clamp;
789*61046927SAndroid Build Coastguard Worker };
790*61046927SAndroid Build Coastguard Worker 
791*61046927SAndroid Build Coastguard Worker /* Do not change this. This is the format used for the scissor_array
792*61046927SAndroid Build Coastguard Worker  * elements uploaded to the device.
793*61046927SAndroid Build Coastguard Worker  */
794*61046927SAndroid Build Coastguard Worker struct pvr_scissor_words {
795*61046927SAndroid Build Coastguard Worker    /* Contains a packed IPF_SCISSOR_WORD_0. */
796*61046927SAndroid Build Coastguard Worker    uint32_t w0;
797*61046927SAndroid Build Coastguard Worker    /* Contains a packed IPF_SCISSOR_WORD_1. */
798*61046927SAndroid Build Coastguard Worker    uint32_t w1;
799*61046927SAndroid Build Coastguard Worker };
800*61046927SAndroid Build Coastguard Worker 
801*61046927SAndroid Build Coastguard Worker struct pvr_cmd_buffer {
802*61046927SAndroid Build Coastguard Worker    struct vk_command_buffer vk;
803*61046927SAndroid Build Coastguard Worker 
804*61046927SAndroid Build Coastguard Worker    struct pvr_device *device;
805*61046927SAndroid Build Coastguard Worker 
806*61046927SAndroid Build Coastguard Worker    /* Buffer usage flags */
807*61046927SAndroid Build Coastguard Worker    VkCommandBufferUsageFlags usage_flags;
808*61046927SAndroid Build Coastguard Worker 
809*61046927SAndroid Build Coastguard Worker    /* Array of struct pvr_depth_bias_state. */
810*61046927SAndroid Build Coastguard Worker    struct util_dynarray depth_bias_array;
811*61046927SAndroid Build Coastguard Worker 
812*61046927SAndroid Build Coastguard Worker    /* Array of struct pvr_scissor_words. */
813*61046927SAndroid Build Coastguard Worker    struct util_dynarray scissor_array;
814*61046927SAndroid Build Coastguard Worker    struct pvr_scissor_words scissor_words;
815*61046927SAndroid Build Coastguard Worker 
816*61046927SAndroid Build Coastguard Worker    struct pvr_cmd_buffer_state state;
817*61046927SAndroid Build Coastguard Worker 
818*61046927SAndroid Build Coastguard Worker    /* List of struct pvr_deferred_cs_command control stream related commands to
819*61046927SAndroid Build Coastguard Worker     * execute in secondary command buffer.
820*61046927SAndroid Build Coastguard Worker     */
821*61046927SAndroid Build Coastguard Worker    struct util_dynarray deferred_csb_commands;
822*61046927SAndroid Build Coastguard Worker    /* List of struct pvr_transfer_cmd used to emulate RTA clears on non RTA
823*61046927SAndroid Build Coastguard Worker     * capable cores.
824*61046927SAndroid Build Coastguard Worker     */
825*61046927SAndroid Build Coastguard Worker    struct util_dynarray deferred_clears;
826*61046927SAndroid Build Coastguard Worker 
827*61046927SAndroid Build Coastguard Worker    /* List of pvr_bo structs associated with this cmd buffer. */
828*61046927SAndroid Build Coastguard Worker    struct list_head bo_list;
829*61046927SAndroid Build Coastguard Worker 
830*61046927SAndroid Build Coastguard Worker    struct list_head sub_cmds;
831*61046927SAndroid Build Coastguard Worker };
832*61046927SAndroid Build Coastguard Worker 
833*61046927SAndroid Build Coastguard Worker struct pvr_stage_allocation_descriptor_state {
834*61046927SAndroid Build Coastguard Worker    struct pvr_pds_upload pds_code;
835*61046927SAndroid Build Coastguard Worker    /* Since we upload the code segment separately from the data segment
836*61046927SAndroid Build Coastguard Worker     * pds_code->data_size might be 0 whilst
837*61046927SAndroid Build Coastguard Worker     * pds_info->data_size_in_dwords might be >0 in the case of this struct
838*61046927SAndroid Build Coastguard Worker     * referring to the code upload.
839*61046927SAndroid Build Coastguard Worker     */
840*61046927SAndroid Build Coastguard Worker    struct pvr_pds_info pds_info;
841*61046927SAndroid Build Coastguard Worker 
842*61046927SAndroid Build Coastguard Worker    /* Already setup compile time static consts. */
843*61046927SAndroid Build Coastguard Worker    struct pvr_suballoc_bo *static_consts;
844*61046927SAndroid Build Coastguard Worker };
845*61046927SAndroid Build Coastguard Worker 
846*61046927SAndroid Build Coastguard Worker struct pvr_pds_attrib_program {
847*61046927SAndroid Build Coastguard Worker    struct pvr_pds_info info;
848*61046927SAndroid Build Coastguard Worker    /* The uploaded PDS program stored here only contains the code segment,
849*61046927SAndroid Build Coastguard Worker     * meaning the data size will be 0, unlike the data size stored in the
850*61046927SAndroid Build Coastguard Worker     * 'info' member above.
851*61046927SAndroid Build Coastguard Worker     */
852*61046927SAndroid Build Coastguard Worker    struct pvr_pds_upload program;
853*61046927SAndroid Build Coastguard Worker };
854*61046927SAndroid Build Coastguard Worker 
855*61046927SAndroid Build Coastguard Worker struct pvr_pipeline_stage_state {
856*61046927SAndroid Build Coastguard Worker    uint32_t const_shared_reg_count;
857*61046927SAndroid Build Coastguard Worker    uint32_t const_shared_reg_offset;
858*61046927SAndroid Build Coastguard Worker    uint32_t pds_temps_count;
859*61046927SAndroid Build Coastguard Worker 
860*61046927SAndroid Build Coastguard Worker    uint32_t coefficient_size;
861*61046927SAndroid Build Coastguard Worker 
862*61046927SAndroid Build Coastguard Worker    /* True if this shader uses any atomic operations. */
863*61046927SAndroid Build Coastguard Worker    bool uses_atomic_ops;
864*61046927SAndroid Build Coastguard Worker 
865*61046927SAndroid Build Coastguard Worker    /* True if this shader uses both texture reads and texture writes. */
866*61046927SAndroid Build Coastguard Worker    bool uses_texture_rw;
867*61046927SAndroid Build Coastguard Worker 
868*61046927SAndroid Build Coastguard Worker    /* Only used for compute stage. */
869*61046927SAndroid Build Coastguard Worker    bool uses_barrier;
870*61046927SAndroid Build Coastguard Worker 
871*61046927SAndroid Build Coastguard Worker    /* True if this shader has side effects */
872*61046927SAndroid Build Coastguard Worker    bool has_side_effects;
873*61046927SAndroid Build Coastguard Worker 
874*61046927SAndroid Build Coastguard Worker    /* True if this shader is simply a nop.end. */
875*61046927SAndroid Build Coastguard Worker    bool empty_program;
876*61046927SAndroid Build Coastguard Worker };
877*61046927SAndroid Build Coastguard Worker 
878*61046927SAndroid Build Coastguard Worker struct pvr_compute_shader_state {
879*61046927SAndroid Build Coastguard Worker    /* Pointer to a buffer object that contains the shader binary. */
880*61046927SAndroid Build Coastguard Worker    struct pvr_suballoc_bo *bo;
881*61046927SAndroid Build Coastguard Worker 
882*61046927SAndroid Build Coastguard Worker    bool uses_atomic_ops;
883*61046927SAndroid Build Coastguard Worker    bool uses_barrier;
884*61046927SAndroid Build Coastguard Worker    /* E.g. GLSL shader uses gl_NumWorkGroups. */
885*61046927SAndroid Build Coastguard Worker    bool uses_num_workgroups;
886*61046927SAndroid Build Coastguard Worker 
887*61046927SAndroid Build Coastguard Worker    uint32_t const_shared_reg_count;
888*61046927SAndroid Build Coastguard Worker    uint32_t input_register_count;
889*61046927SAndroid Build Coastguard Worker    uint32_t work_size;
890*61046927SAndroid Build Coastguard Worker    uint32_t coefficient_register_count;
891*61046927SAndroid Build Coastguard Worker };
892*61046927SAndroid Build Coastguard Worker 
893*61046927SAndroid Build Coastguard Worker struct pvr_vertex_shader_state {
894*61046927SAndroid Build Coastguard Worker    /* Pointer to a buffer object that contains the shader binary. */
895*61046927SAndroid Build Coastguard Worker    struct pvr_suballoc_bo *bo;
896*61046927SAndroid Build Coastguard Worker    uint32_t entry_offset;
897*61046927SAndroid Build Coastguard Worker 
898*61046927SAndroid Build Coastguard Worker    /* 2 since we only need STATE_VARYING{0,1} state words. */
899*61046927SAndroid Build Coastguard Worker    uint32_t varying[2];
900*61046927SAndroid Build Coastguard Worker 
901*61046927SAndroid Build Coastguard Worker    struct pvr_pds_attrib_program
902*61046927SAndroid Build Coastguard Worker       pds_attrib_programs[PVR_PDS_VERTEX_ATTRIB_PROGRAM_COUNT];
903*61046927SAndroid Build Coastguard Worker 
904*61046927SAndroid Build Coastguard Worker    struct pvr_pipeline_stage_state stage_state;
905*61046927SAndroid Build Coastguard Worker    /* FIXME: Move this into stage_state? */
906*61046927SAndroid Build Coastguard Worker    struct pvr_stage_allocation_descriptor_state descriptor_state;
907*61046927SAndroid Build Coastguard Worker    uint32_t vertex_input_size;
908*61046927SAndroid Build Coastguard Worker    uint32_t vertex_output_size;
909*61046927SAndroid Build Coastguard Worker    uint32_t user_clip_planes_mask;
910*61046927SAndroid Build Coastguard Worker };
911*61046927SAndroid Build Coastguard Worker 
912*61046927SAndroid Build Coastguard Worker struct pvr_fragment_shader_state {
913*61046927SAndroid Build Coastguard Worker    /* Pointer to a buffer object that contains the shader binary. */
914*61046927SAndroid Build Coastguard Worker    struct pvr_suballoc_bo *bo;
915*61046927SAndroid Build Coastguard Worker    uint32_t entry_offset;
916*61046927SAndroid Build Coastguard Worker 
917*61046927SAndroid Build Coastguard Worker    struct pvr_pipeline_stage_state stage_state;
918*61046927SAndroid Build Coastguard Worker    /* FIXME: Move this into stage_state? */
919*61046927SAndroid Build Coastguard Worker    struct pvr_stage_allocation_descriptor_state descriptor_state;
920*61046927SAndroid Build Coastguard Worker    enum PVRX(TA_PASSTYPE) pass_type;
921*61046927SAndroid Build Coastguard Worker 
922*61046927SAndroid Build Coastguard Worker    struct pvr_pds_upload pds_coeff_program;
923*61046927SAndroid Build Coastguard Worker    struct pvr_pds_upload pds_fragment_program;
924*61046927SAndroid Build Coastguard Worker };
925*61046927SAndroid Build Coastguard Worker 
926*61046927SAndroid Build Coastguard Worker struct pvr_pipeline {
927*61046927SAndroid Build Coastguard Worker    struct vk_object_base base;
928*61046927SAndroid Build Coastguard Worker 
929*61046927SAndroid Build Coastguard Worker    enum pvr_pipeline_type type;
930*61046927SAndroid Build Coastguard Worker 
931*61046927SAndroid Build Coastguard Worker    /* Saved information from pCreateInfo. */
932*61046927SAndroid Build Coastguard Worker    struct pvr_pipeline_layout *layout;
933*61046927SAndroid Build Coastguard Worker };
934*61046927SAndroid Build Coastguard Worker 
935*61046927SAndroid Build Coastguard Worker struct pvr_compute_pipeline {
936*61046927SAndroid Build Coastguard Worker    struct pvr_pipeline base;
937*61046927SAndroid Build Coastguard Worker 
938*61046927SAndroid Build Coastguard Worker    struct pvr_compute_shader_state shader_state;
939*61046927SAndroid Build Coastguard Worker 
940*61046927SAndroid Build Coastguard Worker    struct {
941*61046927SAndroid Build Coastguard Worker       uint32_t base_workgroup : 1;
942*61046927SAndroid Build Coastguard Worker    } flags;
943*61046927SAndroid Build Coastguard Worker 
944*61046927SAndroid Build Coastguard Worker    struct pvr_stage_allocation_descriptor_state descriptor_state;
945*61046927SAndroid Build Coastguard Worker 
946*61046927SAndroid Build Coastguard Worker    struct pvr_pds_upload primary_program;
947*61046927SAndroid Build Coastguard Worker    struct pvr_pds_info primary_program_info;
948*61046927SAndroid Build Coastguard Worker 
949*61046927SAndroid Build Coastguard Worker    struct pvr_pds_base_workgroup_program {
950*61046927SAndroid Build Coastguard Worker       struct pvr_pds_upload code_upload;
951*61046927SAndroid Build Coastguard Worker 
952*61046927SAndroid Build Coastguard Worker       uint32_t *data_section;
953*61046927SAndroid Build Coastguard Worker       /* Offset within the PDS data section at which the base workgroup id
954*61046927SAndroid Build Coastguard Worker        * resides.
955*61046927SAndroid Build Coastguard Worker        */
956*61046927SAndroid Build Coastguard Worker       uint32_t base_workgroup_data_patching_offset;
957*61046927SAndroid Build Coastguard Worker 
958*61046927SAndroid Build Coastguard Worker       struct pvr_pds_info info;
959*61046927SAndroid Build Coastguard Worker    } primary_base_workgroup_variant_program;
960*61046927SAndroid Build Coastguard Worker };
961*61046927SAndroid Build Coastguard Worker 
962*61046927SAndroid Build Coastguard Worker struct pvr_graphics_pipeline {
963*61046927SAndroid Build Coastguard Worker    struct pvr_pipeline base;
964*61046927SAndroid Build Coastguard Worker 
965*61046927SAndroid Build Coastguard Worker    struct vk_dynamic_graphics_state dynamic_state;
966*61046927SAndroid Build Coastguard Worker 
967*61046927SAndroid Build Coastguard Worker    /* Derived and other state */
968*61046927SAndroid Build Coastguard Worker    size_t stage_indices[MESA_SHADER_FRAGMENT + 1];
969*61046927SAndroid Build Coastguard Worker 
970*61046927SAndroid Build Coastguard Worker    struct {
971*61046927SAndroid Build Coastguard Worker       struct pvr_vertex_shader_state vertex;
972*61046927SAndroid Build Coastguard Worker       struct pvr_fragment_shader_state fragment;
973*61046927SAndroid Build Coastguard Worker    } shader_state;
974*61046927SAndroid Build Coastguard Worker };
975*61046927SAndroid Build Coastguard Worker 
976*61046927SAndroid Build Coastguard Worker struct pvr_query_pool {
977*61046927SAndroid Build Coastguard Worker    struct vk_object_base base;
978*61046927SAndroid Build Coastguard Worker 
979*61046927SAndroid Build Coastguard Worker    /* Stride of result_buffer to get to the start of the results for the next
980*61046927SAndroid Build Coastguard Worker     * Phantom.
981*61046927SAndroid Build Coastguard Worker     */
982*61046927SAndroid Build Coastguard Worker    uint32_t result_stride;
983*61046927SAndroid Build Coastguard Worker 
984*61046927SAndroid Build Coastguard Worker    uint32_t query_count;
985*61046927SAndroid Build Coastguard Worker 
986*61046927SAndroid Build Coastguard Worker    struct pvr_suballoc_bo *result_buffer;
987*61046927SAndroid Build Coastguard Worker    struct pvr_suballoc_bo *availability_buffer;
988*61046927SAndroid Build Coastguard Worker };
989*61046927SAndroid Build Coastguard Worker 
990*61046927SAndroid Build Coastguard Worker struct pvr_private_compute_pipeline {
991*61046927SAndroid Build Coastguard Worker    /* Used by pvr_compute_update_kernel_private(). */
992*61046927SAndroid Build Coastguard Worker    uint32_t pds_code_offset;
993*61046927SAndroid Build Coastguard Worker    uint32_t pds_data_offset;
994*61046927SAndroid Build Coastguard Worker    uint32_t pds_data_size_dw;
995*61046927SAndroid Build Coastguard Worker    uint32_t pds_temps_used;
996*61046927SAndroid Build Coastguard Worker    uint32_t coeff_regs_count;
997*61046927SAndroid Build Coastguard Worker    uint32_t unified_store_regs_count;
998*61046927SAndroid Build Coastguard Worker    VkExtent3D workgroup_size;
999*61046927SAndroid Build Coastguard Worker 
1000*61046927SAndroid Build Coastguard Worker    /* Used by pvr_compute_update_shared_private(). */
1001*61046927SAndroid Build Coastguard Worker    uint32_t pds_shared_update_code_offset;
1002*61046927SAndroid Build Coastguard Worker    uint32_t pds_shared_update_data_offset;
1003*61046927SAndroid Build Coastguard Worker    uint32_t pds_shared_update_data_size_dw;
1004*61046927SAndroid Build Coastguard Worker 
1005*61046927SAndroid Build Coastguard Worker    /* Used by both pvr_compute_update_{kernel,shared}_private(). */
1006*61046927SAndroid Build Coastguard Worker    uint32_t const_shared_regs_count;
1007*61046927SAndroid Build Coastguard Worker 
1008*61046927SAndroid Build Coastguard Worker    pvr_dev_addr_t const_buffer_addr;
1009*61046927SAndroid Build Coastguard Worker };
1010*61046927SAndroid Build Coastguard Worker 
1011*61046927SAndroid Build Coastguard Worker struct pvr_query_info {
1012*61046927SAndroid Build Coastguard Worker    enum pvr_query_type type;
1013*61046927SAndroid Build Coastguard Worker 
1014*61046927SAndroid Build Coastguard Worker    union {
1015*61046927SAndroid Build Coastguard Worker       struct {
1016*61046927SAndroid Build Coastguard Worker          uint32_t num_query_indices;
1017*61046927SAndroid Build Coastguard Worker          struct pvr_suballoc_bo *index_bo;
1018*61046927SAndroid Build Coastguard Worker          uint32_t num_queries;
1019*61046927SAndroid Build Coastguard Worker          struct pvr_suballoc_bo *availability_bo;
1020*61046927SAndroid Build Coastguard Worker       } availability_write;
1021*61046927SAndroid Build Coastguard Worker 
1022*61046927SAndroid Build Coastguard Worker       struct {
1023*61046927SAndroid Build Coastguard Worker          VkQueryPool query_pool;
1024*61046927SAndroid Build Coastguard Worker          uint32_t first_query;
1025*61046927SAndroid Build Coastguard Worker          uint32_t query_count;
1026*61046927SAndroid Build Coastguard Worker       } reset_query_pool;
1027*61046927SAndroid Build Coastguard Worker 
1028*61046927SAndroid Build Coastguard Worker       struct {
1029*61046927SAndroid Build Coastguard Worker          VkQueryPool query_pool;
1030*61046927SAndroid Build Coastguard Worker          uint32_t first_query;
1031*61046927SAndroid Build Coastguard Worker          uint32_t query_count;
1032*61046927SAndroid Build Coastguard Worker          VkBuffer dst_buffer;
1033*61046927SAndroid Build Coastguard Worker          VkDeviceSize dst_offset;
1034*61046927SAndroid Build Coastguard Worker          VkDeviceSize stride;
1035*61046927SAndroid Build Coastguard Worker          VkQueryResultFlags flags;
1036*61046927SAndroid Build Coastguard Worker       } copy_query_results;
1037*61046927SAndroid Build Coastguard Worker    };
1038*61046927SAndroid Build Coastguard Worker };
1039*61046927SAndroid Build Coastguard Worker 
1040*61046927SAndroid Build Coastguard Worker struct pvr_render_target {
1041*61046927SAndroid Build Coastguard Worker    struct pvr_rt_dataset *rt_dataset;
1042*61046927SAndroid Build Coastguard Worker 
1043*61046927SAndroid Build Coastguard Worker    pthread_mutex_t mutex;
1044*61046927SAndroid Build Coastguard Worker 
1045*61046927SAndroid Build Coastguard Worker    bool valid;
1046*61046927SAndroid Build Coastguard Worker };
1047*61046927SAndroid Build Coastguard Worker 
1048*61046927SAndroid Build Coastguard Worker struct pvr_framebuffer {
1049*61046927SAndroid Build Coastguard Worker    struct vk_object_base base;
1050*61046927SAndroid Build Coastguard Worker 
1051*61046927SAndroid Build Coastguard Worker    /* Saved information from pCreateInfo. */
1052*61046927SAndroid Build Coastguard Worker    uint32_t width;
1053*61046927SAndroid Build Coastguard Worker    uint32_t height;
1054*61046927SAndroid Build Coastguard Worker    uint32_t layers;
1055*61046927SAndroid Build Coastguard Worker 
1056*61046927SAndroid Build Coastguard Worker    uint32_t attachment_count;
1057*61046927SAndroid Build Coastguard Worker    struct pvr_image_view **attachments;
1058*61046927SAndroid Build Coastguard Worker 
1059*61046927SAndroid Build Coastguard Worker    /* Derived and other state. */
1060*61046927SAndroid Build Coastguard Worker    struct pvr_suballoc_bo *ppp_state_bo;
1061*61046927SAndroid Build Coastguard Worker    /* PPP state size in dwords. */
1062*61046927SAndroid Build Coastguard Worker    size_t ppp_state_size;
1063*61046927SAndroid Build Coastguard Worker 
1064*61046927SAndroid Build Coastguard Worker    uint32_t render_targets_count;
1065*61046927SAndroid Build Coastguard Worker    struct pvr_render_target *render_targets;
1066*61046927SAndroid Build Coastguard Worker 
1067*61046927SAndroid Build Coastguard Worker    struct pvr_spm_scratch_buffer *scratch_buffer;
1068*61046927SAndroid Build Coastguard Worker 
1069*61046927SAndroid Build Coastguard Worker    uint32_t render_count;
1070*61046927SAndroid Build Coastguard Worker    struct pvr_spm_eot_state *spm_eot_state_per_render;
1071*61046927SAndroid Build Coastguard Worker    struct pvr_spm_bgobj_state *spm_bgobj_state_per_render;
1072*61046927SAndroid Build Coastguard Worker };
1073*61046927SAndroid Build Coastguard Worker 
1074*61046927SAndroid Build Coastguard Worker struct pvr_render_pass_attachment {
1075*61046927SAndroid Build Coastguard Worker    /* Saved information from pCreateInfo. */
1076*61046927SAndroid Build Coastguard Worker    VkAttachmentLoadOp load_op;
1077*61046927SAndroid Build Coastguard Worker 
1078*61046927SAndroid Build Coastguard Worker    VkAttachmentStoreOp store_op;
1079*61046927SAndroid Build Coastguard Worker 
1080*61046927SAndroid Build Coastguard Worker    VkAttachmentLoadOp stencil_load_op;
1081*61046927SAndroid Build Coastguard Worker 
1082*61046927SAndroid Build Coastguard Worker    VkAttachmentStoreOp stencil_store_op;
1083*61046927SAndroid Build Coastguard Worker 
1084*61046927SAndroid Build Coastguard Worker    VkFormat vk_format;
1085*61046927SAndroid Build Coastguard Worker    uint32_t sample_count;
1086*61046927SAndroid Build Coastguard Worker    VkImageLayout initial_layout;
1087*61046927SAndroid Build Coastguard Worker 
1088*61046927SAndroid Build Coastguard Worker    /* Derived and other state. */
1089*61046927SAndroid Build Coastguard Worker    VkImageAspectFlags aspects;
1090*61046927SAndroid Build Coastguard Worker 
1091*61046927SAndroid Build Coastguard Worker    /* Can this surface be resolved by the PBE. */
1092*61046927SAndroid Build Coastguard Worker    bool is_pbe_downscalable;
1093*61046927SAndroid Build Coastguard Worker 
1094*61046927SAndroid Build Coastguard Worker    uint32_t index;
1095*61046927SAndroid Build Coastguard Worker };
1096*61046927SAndroid Build Coastguard Worker 
1097*61046927SAndroid Build Coastguard Worker struct pvr_render_subpass {
1098*61046927SAndroid Build Coastguard Worker    /* Saved information from pCreateInfo. */
1099*61046927SAndroid Build Coastguard Worker    /* The number of samples per color attachment (or depth attachment if
1100*61046927SAndroid Build Coastguard Worker     * z-only).
1101*61046927SAndroid Build Coastguard Worker     */
1102*61046927SAndroid Build Coastguard Worker    /* FIXME: rename to 'samples' to match struct pvr_image */
1103*61046927SAndroid Build Coastguard Worker    uint32_t sample_count;
1104*61046927SAndroid Build Coastguard Worker 
1105*61046927SAndroid Build Coastguard Worker    uint32_t color_count;
1106*61046927SAndroid Build Coastguard Worker    uint32_t *color_attachments;
1107*61046927SAndroid Build Coastguard Worker    uint32_t *resolve_attachments;
1108*61046927SAndroid Build Coastguard Worker 
1109*61046927SAndroid Build Coastguard Worker    uint32_t input_count;
1110*61046927SAndroid Build Coastguard Worker    uint32_t *input_attachments;
1111*61046927SAndroid Build Coastguard Worker 
1112*61046927SAndroid Build Coastguard Worker    uint32_t depth_stencil_attachment;
1113*61046927SAndroid Build Coastguard Worker 
1114*61046927SAndroid Build Coastguard Worker    /*  Derived and other state. */
1115*61046927SAndroid Build Coastguard Worker    uint32_t dep_count;
1116*61046927SAndroid Build Coastguard Worker    uint32_t *dep_list;
1117*61046927SAndroid Build Coastguard Worker 
1118*61046927SAndroid Build Coastguard Worker    /* Array with dep_count elements. flush_on_dep[x] is true if this subpass
1119*61046927SAndroid Build Coastguard Worker     * and the subpass dep_list[x] can't be in the same hardware render.
1120*61046927SAndroid Build Coastguard Worker     */
1121*61046927SAndroid Build Coastguard Worker    bool *flush_on_dep;
1122*61046927SAndroid Build Coastguard Worker 
1123*61046927SAndroid Build Coastguard Worker    uint32_t index;
1124*61046927SAndroid Build Coastguard Worker 
1125*61046927SAndroid Build Coastguard Worker    uint32_t isp_userpass;
1126*61046927SAndroid Build Coastguard Worker 
1127*61046927SAndroid Build Coastguard Worker    VkPipelineBindPoint pipeline_bind_point;
1128*61046927SAndroid Build Coastguard Worker };
1129*61046927SAndroid Build Coastguard Worker 
1130*61046927SAndroid Build Coastguard Worker struct pvr_render_pass {
1131*61046927SAndroid Build Coastguard Worker    struct vk_object_base base;
1132*61046927SAndroid Build Coastguard Worker 
1133*61046927SAndroid Build Coastguard Worker    /* Saved information from pCreateInfo. */
1134*61046927SAndroid Build Coastguard Worker    uint32_t attachment_count;
1135*61046927SAndroid Build Coastguard Worker 
1136*61046927SAndroid Build Coastguard Worker    struct pvr_render_pass_attachment *attachments;
1137*61046927SAndroid Build Coastguard Worker 
1138*61046927SAndroid Build Coastguard Worker    uint32_t subpass_count;
1139*61046927SAndroid Build Coastguard Worker 
1140*61046927SAndroid Build Coastguard Worker    struct pvr_render_subpass *subpasses;
1141*61046927SAndroid Build Coastguard Worker 
1142*61046927SAndroid Build Coastguard Worker    struct pvr_renderpass_hwsetup *hw_setup;
1143*61046927SAndroid Build Coastguard Worker 
1144*61046927SAndroid Build Coastguard Worker    /*  Derived and other state. */
1145*61046927SAndroid Build Coastguard Worker    /* FIXME: rename to 'max_samples' as we use 'samples' elsewhere */
1146*61046927SAndroid Build Coastguard Worker    uint32_t max_sample_count;
1147*61046927SAndroid Build Coastguard Worker 
1148*61046927SAndroid Build Coastguard Worker    /* The maximum number of tile buffers to use in any subpass. */
1149*61046927SAndroid Build Coastguard Worker    uint32_t max_tilebuffer_count;
1150*61046927SAndroid Build Coastguard Worker };
1151*61046927SAndroid Build Coastguard Worker 
1152*61046927SAndroid Build Coastguard Worker /* Max render targets for the clears loads state in load op.
1153*61046927SAndroid Build Coastguard Worker  * To account for resolve attachments, double the color attachments.
1154*61046927SAndroid Build Coastguard Worker  */
1155*61046927SAndroid Build Coastguard Worker #define PVR_LOAD_OP_CLEARS_LOADS_MAX_RTS (PVR_MAX_COLOR_ATTACHMENTS * 2)
1156*61046927SAndroid Build Coastguard Worker 
1157*61046927SAndroid Build Coastguard Worker struct pvr_load_op {
1158*61046927SAndroid Build Coastguard Worker    bool is_hw_object;
1159*61046927SAndroid Build Coastguard Worker 
1160*61046927SAndroid Build Coastguard Worker    struct pvr_suballoc_bo *usc_frag_prog_bo;
1161*61046927SAndroid Build Coastguard Worker    uint32_t const_shareds_count;
1162*61046927SAndroid Build Coastguard Worker    uint32_t shareds_dest_offset;
1163*61046927SAndroid Build Coastguard Worker    uint32_t shareds_count;
1164*61046927SAndroid Build Coastguard Worker 
1165*61046927SAndroid Build Coastguard Worker    struct pvr_pds_upload pds_frag_prog;
1166*61046927SAndroid Build Coastguard Worker 
1167*61046927SAndroid Build Coastguard Worker    struct pvr_pds_upload pds_tex_state_prog;
1168*61046927SAndroid Build Coastguard Worker    uint32_t temps_count;
1169*61046927SAndroid Build Coastguard Worker 
1170*61046927SAndroid Build Coastguard Worker    union {
1171*61046927SAndroid Build Coastguard Worker       const struct pvr_renderpass_hwsetup_render *hw_render;
1172*61046927SAndroid Build Coastguard Worker       const struct pvr_render_subpass *subpass;
1173*61046927SAndroid Build Coastguard Worker    };
1174*61046927SAndroid Build Coastguard Worker 
1175*61046927SAndroid Build Coastguard Worker    /* TODO: We might not need to keep all of this around. Some stuff might just
1176*61046927SAndroid Build Coastguard Worker     * be for the compiler to ingest which we can then discard.
1177*61046927SAndroid Build Coastguard Worker     */
1178*61046927SAndroid Build Coastguard Worker    struct {
1179*61046927SAndroid Build Coastguard Worker       uint16_t rt_clear_mask;
1180*61046927SAndroid Build Coastguard Worker       uint16_t rt_load_mask;
1181*61046927SAndroid Build Coastguard Worker 
1182*61046927SAndroid Build Coastguard Worker       uint16_t unresolved_msaa_mask;
1183*61046927SAndroid Build Coastguard Worker 
1184*61046927SAndroid Build Coastguard Worker       /* The format to write to the output regs. */
1185*61046927SAndroid Build Coastguard Worker       VkFormat dest_vk_format[PVR_LOAD_OP_CLEARS_LOADS_MAX_RTS];
1186*61046927SAndroid Build Coastguard Worker 
1187*61046927SAndroid Build Coastguard Worker #define PVR_NO_DEPTH_CLEAR_TO_REG (-1)
1188*61046927SAndroid Build Coastguard Worker       /* If >= 0, write a depth clear value to the specified pixel output. */
1189*61046927SAndroid Build Coastguard Worker       int32_t depth_clear_to_reg;
1190*61046927SAndroid Build Coastguard Worker    } clears_loads_state;
1191*61046927SAndroid Build Coastguard Worker };
1192*61046927SAndroid Build Coastguard Worker 
1193*61046927SAndroid Build Coastguard Worker #define CHECK_MASK_SIZE(_struct_type, _field_name, _nr_bits)               \
1194*61046927SAndroid Build Coastguard Worker    static_assert(sizeof(((struct _struct_type *)NULL)->_field_name) * 8 >= \
1195*61046927SAndroid Build Coastguard Worker                     _nr_bits,                                              \
1196*61046927SAndroid Build Coastguard Worker                  #_field_name " mask of struct " #_struct_type " too small")
1197*61046927SAndroid Build Coastguard Worker 
1198*61046927SAndroid Build Coastguard Worker CHECK_MASK_SIZE(pvr_load_op,
1199*61046927SAndroid Build Coastguard Worker                 clears_loads_state.rt_clear_mask,
1200*61046927SAndroid Build Coastguard Worker                 PVR_LOAD_OP_CLEARS_LOADS_MAX_RTS);
1201*61046927SAndroid Build Coastguard Worker CHECK_MASK_SIZE(pvr_load_op,
1202*61046927SAndroid Build Coastguard Worker                 clears_loads_state.rt_load_mask,
1203*61046927SAndroid Build Coastguard Worker                 PVR_LOAD_OP_CLEARS_LOADS_MAX_RTS);
1204*61046927SAndroid Build Coastguard Worker CHECK_MASK_SIZE(pvr_load_op,
1205*61046927SAndroid Build Coastguard Worker                 clears_loads_state.unresolved_msaa_mask,
1206*61046927SAndroid Build Coastguard Worker                 PVR_LOAD_OP_CLEARS_LOADS_MAX_RTS);
1207*61046927SAndroid Build Coastguard Worker 
1208*61046927SAndroid Build Coastguard Worker #undef CHECK_MASK_SIZE
1209*61046927SAndroid Build Coastguard Worker 
1210*61046927SAndroid Build Coastguard Worker uint32_t pvr_calc_fscommon_size_and_tiles_in_flight(
1211*61046927SAndroid Build Coastguard Worker    const struct pvr_device_info *dev_info,
1212*61046927SAndroid Build Coastguard Worker    const struct pvr_device_runtime_info *dev_runtime_info,
1213*61046927SAndroid Build Coastguard Worker    uint32_t fs_common_size,
1214*61046927SAndroid Build Coastguard Worker    uint32_t min_tiles_in_flight);
1215*61046927SAndroid Build Coastguard Worker 
1216*61046927SAndroid Build Coastguard Worker VkResult pvr_wsi_init(struct pvr_physical_device *pdevice);
1217*61046927SAndroid Build Coastguard Worker void pvr_wsi_finish(struct pvr_physical_device *pdevice);
1218*61046927SAndroid Build Coastguard Worker 
1219*61046927SAndroid Build Coastguard Worker VkResult pvr_queues_create(struct pvr_device *device,
1220*61046927SAndroid Build Coastguard Worker                            const VkDeviceCreateInfo *pCreateInfo);
1221*61046927SAndroid Build Coastguard Worker void pvr_queues_destroy(struct pvr_device *device);
1222*61046927SAndroid Build Coastguard Worker 
1223*61046927SAndroid Build Coastguard Worker VkResult pvr_bind_memory(struct pvr_device *device,
1224*61046927SAndroid Build Coastguard Worker                          struct pvr_device_memory *mem,
1225*61046927SAndroid Build Coastguard Worker                          VkDeviceSize offset,
1226*61046927SAndroid Build Coastguard Worker                          VkDeviceSize size,
1227*61046927SAndroid Build Coastguard Worker                          VkDeviceSize alignment,
1228*61046927SAndroid Build Coastguard Worker                          struct pvr_winsys_vma **const vma_out,
1229*61046927SAndroid Build Coastguard Worker                          pvr_dev_addr_t *const dev_addr_out);
1230*61046927SAndroid Build Coastguard Worker void pvr_unbind_memory(struct pvr_device *device, struct pvr_winsys_vma *vma);
1231*61046927SAndroid Build Coastguard Worker VkResult pvr_gpu_upload(struct pvr_device *device,
1232*61046927SAndroid Build Coastguard Worker                         struct pvr_winsys_heap *heap,
1233*61046927SAndroid Build Coastguard Worker                         const void *data,
1234*61046927SAndroid Build Coastguard Worker                         size_t size,
1235*61046927SAndroid Build Coastguard Worker                         uint64_t alignment,
1236*61046927SAndroid Build Coastguard Worker                         struct pvr_suballoc_bo **const pvr_bo_out);
1237*61046927SAndroid Build Coastguard Worker VkResult pvr_gpu_upload_pds(struct pvr_device *device,
1238*61046927SAndroid Build Coastguard Worker                             const uint32_t *data,
1239*61046927SAndroid Build Coastguard Worker                             uint32_t data_size_dwords,
1240*61046927SAndroid Build Coastguard Worker                             uint32_t data_alignment,
1241*61046927SAndroid Build Coastguard Worker                             const uint32_t *code,
1242*61046927SAndroid Build Coastguard Worker                             uint32_t code_size_dwords,
1243*61046927SAndroid Build Coastguard Worker                             uint32_t code_alignment,
1244*61046927SAndroid Build Coastguard Worker                             uint64_t min_alignment,
1245*61046927SAndroid Build Coastguard Worker                             struct pvr_pds_upload *const pds_upload_out);
1246*61046927SAndroid Build Coastguard Worker VkResult pvr_gpu_upload_usc(struct pvr_device *device,
1247*61046927SAndroid Build Coastguard Worker                             const void *code,
1248*61046927SAndroid Build Coastguard Worker                             size_t code_size,
1249*61046927SAndroid Build Coastguard Worker                             uint64_t code_alignment,
1250*61046927SAndroid Build Coastguard Worker                             struct pvr_suballoc_bo **const pvr_bo_out);
1251*61046927SAndroid Build Coastguard Worker 
1252*61046927SAndroid Build Coastguard Worker VkResult pvr_cmd_buffer_add_transfer_cmd(struct pvr_cmd_buffer *cmd_buffer,
1253*61046927SAndroid Build Coastguard Worker                                          struct pvr_transfer_cmd *transfer_cmd);
1254*61046927SAndroid Build Coastguard Worker 
1255*61046927SAndroid Build Coastguard Worker VkResult pvr_cmd_buffer_alloc_mem(struct pvr_cmd_buffer *cmd_buffer,
1256*61046927SAndroid Build Coastguard Worker                                   struct pvr_winsys_heap *heap,
1257*61046927SAndroid Build Coastguard Worker                                   uint64_t size,
1258*61046927SAndroid Build Coastguard Worker                                   struct pvr_suballoc_bo **const pvr_bo_out);
1259*61046927SAndroid Build Coastguard Worker 
1260*61046927SAndroid Build Coastguard Worker void pvr_calculate_vertex_cam_size(const struct pvr_device_info *dev_info,
1261*61046927SAndroid Build Coastguard Worker                                    const uint32_t vs_output_size,
1262*61046927SAndroid Build Coastguard Worker                                    const bool raster_enable,
1263*61046927SAndroid Build Coastguard Worker                                    uint32_t *const cam_size_out,
1264*61046927SAndroid Build Coastguard Worker                                    uint32_t *const vs_max_instances_out);
1265*61046927SAndroid Build Coastguard Worker 
1266*61046927SAndroid Build Coastguard Worker void pvr_get_image_subresource_layout(const struct pvr_image *image,
1267*61046927SAndroid Build Coastguard Worker                                       const VkImageSubresource *subresource,
1268*61046927SAndroid Build Coastguard Worker                                       VkSubresourceLayout *layout);
1269*61046927SAndroid Build Coastguard Worker 
1270*61046927SAndroid Build Coastguard Worker static inline struct pvr_compute_pipeline *
to_pvr_compute_pipeline(struct pvr_pipeline * pipeline)1271*61046927SAndroid Build Coastguard Worker to_pvr_compute_pipeline(struct pvr_pipeline *pipeline)
1272*61046927SAndroid Build Coastguard Worker {
1273*61046927SAndroid Build Coastguard Worker    assert(pipeline->type == PVR_PIPELINE_TYPE_COMPUTE);
1274*61046927SAndroid Build Coastguard Worker    return container_of(pipeline, struct pvr_compute_pipeline, base);
1275*61046927SAndroid Build Coastguard Worker }
1276*61046927SAndroid Build Coastguard Worker 
1277*61046927SAndroid Build Coastguard Worker static inline struct pvr_graphics_pipeline *
to_pvr_graphics_pipeline(struct pvr_pipeline * pipeline)1278*61046927SAndroid Build Coastguard Worker to_pvr_graphics_pipeline(struct pvr_pipeline *pipeline)
1279*61046927SAndroid Build Coastguard Worker {
1280*61046927SAndroid Build Coastguard Worker    assert(pipeline->type == PVR_PIPELINE_TYPE_GRAPHICS);
1281*61046927SAndroid Build Coastguard Worker    return container_of(pipeline, struct pvr_graphics_pipeline, base);
1282*61046927SAndroid Build Coastguard Worker }
1283*61046927SAndroid Build Coastguard Worker 
1284*61046927SAndroid Build Coastguard Worker static inline const struct pvr_image *
vk_to_pvr_image(const struct vk_image * image)1285*61046927SAndroid Build Coastguard Worker vk_to_pvr_image(const struct vk_image *image)
1286*61046927SAndroid Build Coastguard Worker {
1287*61046927SAndroid Build Coastguard Worker    return container_of(image, const struct pvr_image, vk);
1288*61046927SAndroid Build Coastguard Worker }
1289*61046927SAndroid Build Coastguard Worker 
1290*61046927SAndroid Build Coastguard Worker static inline const struct pvr_image *
pvr_image_view_get_image(const struct pvr_image_view * const iview)1291*61046927SAndroid Build Coastguard Worker pvr_image_view_get_image(const struct pvr_image_view *const iview)
1292*61046927SAndroid Build Coastguard Worker {
1293*61046927SAndroid Build Coastguard Worker    return vk_to_pvr_image(iview->vk.image);
1294*61046927SAndroid Build Coastguard Worker }
1295*61046927SAndroid Build Coastguard Worker 
1296*61046927SAndroid Build Coastguard Worker static enum pvr_pipeline_stage_bits
pvr_stage_mask(VkPipelineStageFlags2 stage_mask)1297*61046927SAndroid Build Coastguard Worker pvr_stage_mask(VkPipelineStageFlags2 stage_mask)
1298*61046927SAndroid Build Coastguard Worker {
1299*61046927SAndroid Build Coastguard Worker    enum pvr_pipeline_stage_bits stages = 0;
1300*61046927SAndroid Build Coastguard Worker 
1301*61046927SAndroid Build Coastguard Worker    if (stage_mask & VK_PIPELINE_STAGE_ALL_COMMANDS_BIT)
1302*61046927SAndroid Build Coastguard Worker       return PVR_PIPELINE_STAGE_ALL_BITS;
1303*61046927SAndroid Build Coastguard Worker 
1304*61046927SAndroid Build Coastguard Worker    if (stage_mask & (VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT))
1305*61046927SAndroid Build Coastguard Worker       stages |= PVR_PIPELINE_STAGE_ALL_GRAPHICS_BITS;
1306*61046927SAndroid Build Coastguard Worker 
1307*61046927SAndroid Build Coastguard Worker    if (stage_mask & (VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT |
1308*61046927SAndroid Build Coastguard Worker                      VK_PIPELINE_STAGE_VERTEX_INPUT_BIT |
1309*61046927SAndroid Build Coastguard Worker                      VK_PIPELINE_STAGE_VERTEX_SHADER_BIT |
1310*61046927SAndroid Build Coastguard Worker                      VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
1311*61046927SAndroid Build Coastguard Worker                      VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT |
1312*61046927SAndroid Build Coastguard Worker                      VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT)) {
1313*61046927SAndroid Build Coastguard Worker       stages |= PVR_PIPELINE_STAGE_GEOM_BIT;
1314*61046927SAndroid Build Coastguard Worker    }
1315*61046927SAndroid Build Coastguard Worker 
1316*61046927SAndroid Build Coastguard Worker    if (stage_mask & (VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
1317*61046927SAndroid Build Coastguard Worker                      VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
1318*61046927SAndroid Build Coastguard Worker                      VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
1319*61046927SAndroid Build Coastguard Worker                      VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT)) {
1320*61046927SAndroid Build Coastguard Worker       stages |= PVR_PIPELINE_STAGE_FRAG_BIT;
1321*61046927SAndroid Build Coastguard Worker    }
1322*61046927SAndroid Build Coastguard Worker 
1323*61046927SAndroid Build Coastguard Worker    if (stage_mask & (VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT |
1324*61046927SAndroid Build Coastguard Worker                      VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT)) {
1325*61046927SAndroid Build Coastguard Worker       stages |= PVR_PIPELINE_STAGE_COMPUTE_BIT;
1326*61046927SAndroid Build Coastguard Worker    }
1327*61046927SAndroid Build Coastguard Worker 
1328*61046927SAndroid Build Coastguard Worker    if (stage_mask & (VK_PIPELINE_STAGE_TRANSFER_BIT))
1329*61046927SAndroid Build Coastguard Worker       stages |= PVR_PIPELINE_STAGE_TRANSFER_BIT;
1330*61046927SAndroid Build Coastguard Worker 
1331*61046927SAndroid Build Coastguard Worker    return stages;
1332*61046927SAndroid Build Coastguard Worker }
1333*61046927SAndroid Build Coastguard Worker 
1334*61046927SAndroid Build Coastguard Worker static inline enum pvr_pipeline_stage_bits
pvr_stage_mask_src(VkPipelineStageFlags2 stage_mask)1335*61046927SAndroid Build Coastguard Worker pvr_stage_mask_src(VkPipelineStageFlags2 stage_mask)
1336*61046927SAndroid Build Coastguard Worker {
1337*61046927SAndroid Build Coastguard Worker    /* If the source is bottom of pipe, all stages will need to be waited for. */
1338*61046927SAndroid Build Coastguard Worker    if (stage_mask & VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT)
1339*61046927SAndroid Build Coastguard Worker       return PVR_PIPELINE_STAGE_ALL_BITS;
1340*61046927SAndroid Build Coastguard Worker 
1341*61046927SAndroid Build Coastguard Worker    return pvr_stage_mask(stage_mask);
1342*61046927SAndroid Build Coastguard Worker }
1343*61046927SAndroid Build Coastguard Worker 
1344*61046927SAndroid Build Coastguard Worker static inline enum pvr_pipeline_stage_bits
pvr_stage_mask_dst(VkPipelineStageFlags2 stage_mask)1345*61046927SAndroid Build Coastguard Worker pvr_stage_mask_dst(VkPipelineStageFlags2 stage_mask)
1346*61046927SAndroid Build Coastguard Worker {
1347*61046927SAndroid Build Coastguard Worker    /* If the destination is top of pipe, all stages should be blocked by prior
1348*61046927SAndroid Build Coastguard Worker     * commands.
1349*61046927SAndroid Build Coastguard Worker     */
1350*61046927SAndroid Build Coastguard Worker    if (stage_mask & VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT)
1351*61046927SAndroid Build Coastguard Worker       return PVR_PIPELINE_STAGE_ALL_BITS;
1352*61046927SAndroid Build Coastguard Worker 
1353*61046927SAndroid Build Coastguard Worker    return pvr_stage_mask(stage_mask);
1354*61046927SAndroid Build Coastguard Worker }
1355*61046927SAndroid Build Coastguard Worker 
pvr_sub_cmd_gfx_requires_split_submit(const struct pvr_sub_cmd_gfx * const sub_cmd)1356*61046927SAndroid Build Coastguard Worker static inline bool pvr_sub_cmd_gfx_requires_split_submit(
1357*61046927SAndroid Build Coastguard Worker    const struct pvr_sub_cmd_gfx *const sub_cmd)
1358*61046927SAndroid Build Coastguard Worker {
1359*61046927SAndroid Build Coastguard Worker    return sub_cmd->job.run_frag && sub_cmd->framebuffer->layers > 1;
1360*61046927SAndroid Build Coastguard Worker }
1361*61046927SAndroid Build Coastguard Worker 
1362*61046927SAndroid Build Coastguard Worker /* This function is intended to be used when the error being set has been
1363*61046927SAndroid Build Coastguard Worker  * returned from a function call, i.e. the error happened further down the
1364*61046927SAndroid Build Coastguard Worker  * stack. `vk_command_buffer_set_error()` should be used at the point an error
1365*61046927SAndroid Build Coastguard Worker  * occurs, i.e. VK_ERROR_* is being passed in.
1366*61046927SAndroid Build Coastguard Worker  * This ensures we only ever get the error printed once.
1367*61046927SAndroid Build Coastguard Worker  */
1368*61046927SAndroid Build Coastguard Worker static inline VkResult
pvr_cmd_buffer_set_error_unwarned(struct pvr_cmd_buffer * cmd_buffer,VkResult error)1369*61046927SAndroid Build Coastguard Worker pvr_cmd_buffer_set_error_unwarned(struct pvr_cmd_buffer *cmd_buffer,
1370*61046927SAndroid Build Coastguard Worker                                   VkResult error)
1371*61046927SAndroid Build Coastguard Worker {
1372*61046927SAndroid Build Coastguard Worker    assert(error != VK_SUCCESS);
1373*61046927SAndroid Build Coastguard Worker 
1374*61046927SAndroid Build Coastguard Worker    if (cmd_buffer->vk.record_result == VK_SUCCESS)
1375*61046927SAndroid Build Coastguard Worker       cmd_buffer->vk.record_result = error;
1376*61046927SAndroid Build Coastguard Worker 
1377*61046927SAndroid Build Coastguard Worker    return error;
1378*61046927SAndroid Build Coastguard Worker }
1379*61046927SAndroid Build Coastguard Worker 
1380*61046927SAndroid Build Coastguard Worker VkResult pvr_pds_fragment_program_create_and_upload(
1381*61046927SAndroid Build Coastguard Worker    struct pvr_device *device,
1382*61046927SAndroid Build Coastguard Worker    const VkAllocationCallbacks *allocator,
1383*61046927SAndroid Build Coastguard Worker    const struct pvr_suballoc_bo *fragment_shader_bo,
1384*61046927SAndroid Build Coastguard Worker    uint32_t fragment_temp_count,
1385*61046927SAndroid Build Coastguard Worker    enum rogue_msaa_mode msaa_mode,
1386*61046927SAndroid Build Coastguard Worker    bool has_phase_rate_change,
1387*61046927SAndroid Build Coastguard Worker    struct pvr_pds_upload *const pds_upload_out);
1388*61046927SAndroid Build Coastguard Worker 
1389*61046927SAndroid Build Coastguard Worker VkResult pvr_pds_unitex_state_program_create_and_upload(
1390*61046927SAndroid Build Coastguard Worker    struct pvr_device *device,
1391*61046927SAndroid Build Coastguard Worker    const VkAllocationCallbacks *allocator,
1392*61046927SAndroid Build Coastguard Worker    uint32_t texture_kicks,
1393*61046927SAndroid Build Coastguard Worker    uint32_t uniform_kicks,
1394*61046927SAndroid Build Coastguard Worker    struct pvr_pds_upload *const pds_upload_out);
1395*61046927SAndroid Build Coastguard Worker 
1396*61046927SAndroid Build Coastguard Worker VkResult pvr_device_tile_buffer_ensure_cap(struct pvr_device *device,
1397*61046927SAndroid Build Coastguard Worker                                            uint32_t capacity,
1398*61046927SAndroid Build Coastguard Worker                                            uint32_t size_in_bytes);
1399*61046927SAndroid Build Coastguard Worker 
1400*61046927SAndroid Build Coastguard Worker VkResult
1401*61046927SAndroid Build Coastguard Worker pvr_cmd_buffer_upload_general(struct pvr_cmd_buffer *const cmd_buffer,
1402*61046927SAndroid Build Coastguard Worker                               const void *const data,
1403*61046927SAndroid Build Coastguard Worker                               const size_t size,
1404*61046927SAndroid Build Coastguard Worker                               struct pvr_suballoc_bo **const pvr_bo_out);
1405*61046927SAndroid Build Coastguard Worker VkResult pvr_cmd_buffer_upload_pds(struct pvr_cmd_buffer *const cmd_buffer,
1406*61046927SAndroid Build Coastguard Worker                                    const uint32_t *data,
1407*61046927SAndroid Build Coastguard Worker                                    uint32_t data_size_dwords,
1408*61046927SAndroid Build Coastguard Worker                                    uint32_t data_alignment,
1409*61046927SAndroid Build Coastguard Worker                                    const uint32_t *code,
1410*61046927SAndroid Build Coastguard Worker                                    uint32_t code_size_dwords,
1411*61046927SAndroid Build Coastguard Worker                                    uint32_t code_alignment,
1412*61046927SAndroid Build Coastguard Worker                                    uint64_t min_alignment,
1413*61046927SAndroid Build Coastguard Worker                                    struct pvr_pds_upload *const pds_upload_out);
1414*61046927SAndroid Build Coastguard Worker 
1415*61046927SAndroid Build Coastguard Worker VkResult pvr_cmd_buffer_start_sub_cmd(struct pvr_cmd_buffer *cmd_buffer,
1416*61046927SAndroid Build Coastguard Worker                                       enum pvr_sub_cmd_type type);
1417*61046927SAndroid Build Coastguard Worker VkResult pvr_cmd_buffer_end_sub_cmd(struct pvr_cmd_buffer *cmd_buffer);
1418*61046927SAndroid Build Coastguard Worker 
1419*61046927SAndroid Build Coastguard Worker void pvr_compute_generate_fence(struct pvr_cmd_buffer *cmd_buffer,
1420*61046927SAndroid Build Coastguard Worker                                 struct pvr_sub_cmd_compute *const sub_cmd,
1421*61046927SAndroid Build Coastguard Worker                                 bool deallocate_shareds);
1422*61046927SAndroid Build Coastguard Worker void pvr_compute_update_shared_private(
1423*61046927SAndroid Build Coastguard Worker    struct pvr_cmd_buffer *cmd_buffer,
1424*61046927SAndroid Build Coastguard Worker    struct pvr_sub_cmd_compute *const sub_cmd,
1425*61046927SAndroid Build Coastguard Worker    struct pvr_private_compute_pipeline *pipeline);
1426*61046927SAndroid Build Coastguard Worker void pvr_compute_update_kernel_private(
1427*61046927SAndroid Build Coastguard Worker    struct pvr_cmd_buffer *cmd_buffer,
1428*61046927SAndroid Build Coastguard Worker    struct pvr_sub_cmd_compute *const sub_cmd,
1429*61046927SAndroid Build Coastguard Worker    struct pvr_private_compute_pipeline *pipeline,
1430*61046927SAndroid Build Coastguard Worker    const uint32_t global_workgroup_size[static const PVR_WORKGROUP_DIMENSIONS]);
1431*61046927SAndroid Build Coastguard Worker 
1432*61046927SAndroid Build Coastguard Worker size_t pvr_pds_get_max_descriptor_upload_const_map_size_in_bytes(void);
1433*61046927SAndroid Build Coastguard Worker 
1434*61046927SAndroid Build Coastguard Worker VkResult pvr_pds_compute_shader_create_and_upload(
1435*61046927SAndroid Build Coastguard Worker    struct pvr_device *device,
1436*61046927SAndroid Build Coastguard Worker    struct pvr_pds_compute_shader_program *program,
1437*61046927SAndroid Build Coastguard Worker    struct pvr_pds_upload *const pds_upload_out);
1438*61046927SAndroid Build Coastguard Worker 
1439*61046927SAndroid Build Coastguard Worker VkResult pvr_device_create_compute_query_programs(struct pvr_device *device);
1440*61046927SAndroid Build Coastguard Worker void pvr_device_destroy_compute_query_programs(struct pvr_device *device);
1441*61046927SAndroid Build Coastguard Worker 
1442*61046927SAndroid Build Coastguard Worker VkResult pvr_add_query_program(struct pvr_cmd_buffer *cmd_buffer,
1443*61046927SAndroid Build Coastguard Worker                                const struct pvr_query_info *query_info);
1444*61046927SAndroid Build Coastguard Worker 
1445*61046927SAndroid Build Coastguard Worker void pvr_reset_graphics_dirty_state(struct pvr_cmd_buffer *const cmd_buffer,
1446*61046927SAndroid Build Coastguard Worker                                     bool start_geom);
1447*61046927SAndroid Build Coastguard Worker 
1448*61046927SAndroid Build Coastguard Worker const struct pvr_renderpass_hwsetup_subpass *
1449*61046927SAndroid Build Coastguard Worker pvr_get_hw_subpass(const struct pvr_render_pass *pass, const uint32_t subpass);
1450*61046927SAndroid Build Coastguard Worker 
1451*61046927SAndroid Build Coastguard Worker void pvr_descriptor_size_info_init(
1452*61046927SAndroid Build Coastguard Worker    const struct pvr_device *device,
1453*61046927SAndroid Build Coastguard Worker    VkDescriptorType type,
1454*61046927SAndroid Build Coastguard Worker    struct pvr_descriptor_size_info *const size_info_out);
1455*61046927SAndroid Build Coastguard Worker 
1456*61046927SAndroid Build Coastguard Worker #define PVR_FROM_HANDLE(__pvr_type, __name, __handle) \
1457*61046927SAndroid Build Coastguard Worker    VK_FROM_HANDLE(__pvr_type, __name, __handle)
1458*61046927SAndroid Build Coastguard Worker 
1459*61046927SAndroid Build Coastguard Worker VK_DEFINE_HANDLE_CASTS(pvr_cmd_buffer,
1460*61046927SAndroid Build Coastguard Worker                        vk.base,
1461*61046927SAndroid Build Coastguard Worker                        VkCommandBuffer,
1462*61046927SAndroid Build Coastguard Worker                        VK_OBJECT_TYPE_COMMAND_BUFFER)
1463*61046927SAndroid Build Coastguard Worker VK_DEFINE_HANDLE_CASTS(pvr_device, vk.base, VkDevice, VK_OBJECT_TYPE_DEVICE)
1464*61046927SAndroid Build Coastguard Worker VK_DEFINE_HANDLE_CASTS(pvr_instance,
1465*61046927SAndroid Build Coastguard Worker                        vk.base,
1466*61046927SAndroid Build Coastguard Worker                        VkInstance,
1467*61046927SAndroid Build Coastguard Worker                        VK_OBJECT_TYPE_INSTANCE)
1468*61046927SAndroid Build Coastguard Worker VK_DEFINE_HANDLE_CASTS(pvr_physical_device,
1469*61046927SAndroid Build Coastguard Worker                        vk.base,
1470*61046927SAndroid Build Coastguard Worker                        VkPhysicalDevice,
1471*61046927SAndroid Build Coastguard Worker                        VK_OBJECT_TYPE_PHYSICAL_DEVICE)
1472*61046927SAndroid Build Coastguard Worker VK_DEFINE_HANDLE_CASTS(pvr_queue, vk.base, VkQueue, VK_OBJECT_TYPE_QUEUE)
1473*61046927SAndroid Build Coastguard Worker 
1474*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(pvr_device_memory,
1475*61046927SAndroid Build Coastguard Worker                                base,
1476*61046927SAndroid Build Coastguard Worker                                VkDeviceMemory,
1477*61046927SAndroid Build Coastguard Worker                                VK_OBJECT_TYPE_DEVICE_MEMORY)
1478*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(pvr_image, vk.base, VkImage, VK_OBJECT_TYPE_IMAGE)
1479*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(pvr_buffer,
1480*61046927SAndroid Build Coastguard Worker                                vk.base,
1481*61046927SAndroid Build Coastguard Worker                                VkBuffer,
1482*61046927SAndroid Build Coastguard Worker                                VK_OBJECT_TYPE_BUFFER)
1483*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(pvr_image_view,
1484*61046927SAndroid Build Coastguard Worker                                vk.base,
1485*61046927SAndroid Build Coastguard Worker                                VkImageView,
1486*61046927SAndroid Build Coastguard Worker                                VK_OBJECT_TYPE_IMAGE_VIEW)
1487*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(pvr_buffer_view,
1488*61046927SAndroid Build Coastguard Worker                                base,
1489*61046927SAndroid Build Coastguard Worker                                VkBufferView,
1490*61046927SAndroid Build Coastguard Worker                                VK_OBJECT_TYPE_BUFFER_VIEW)
1491*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(pvr_descriptor_set_layout,
1492*61046927SAndroid Build Coastguard Worker                                base,
1493*61046927SAndroid Build Coastguard Worker                                VkDescriptorSetLayout,
1494*61046927SAndroid Build Coastguard Worker                                VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT)
1495*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(pvr_descriptor_set,
1496*61046927SAndroid Build Coastguard Worker                                base,
1497*61046927SAndroid Build Coastguard Worker                                VkDescriptorSet,
1498*61046927SAndroid Build Coastguard Worker                                VK_OBJECT_TYPE_DESCRIPTOR_SET)
1499*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(pvr_event, base, VkEvent, VK_OBJECT_TYPE_EVENT)
1500*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(pvr_descriptor_pool,
1501*61046927SAndroid Build Coastguard Worker                                base,
1502*61046927SAndroid Build Coastguard Worker                                VkDescriptorPool,
1503*61046927SAndroid Build Coastguard Worker                                VK_OBJECT_TYPE_DESCRIPTOR_POOL)
1504*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(pvr_sampler,
1505*61046927SAndroid Build Coastguard Worker                                vk.base,
1506*61046927SAndroid Build Coastguard Worker                                VkSampler,
1507*61046927SAndroid Build Coastguard Worker                                VK_OBJECT_TYPE_SAMPLER)
1508*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(pvr_pipeline_layout,
1509*61046927SAndroid Build Coastguard Worker                                base,
1510*61046927SAndroid Build Coastguard Worker                                VkPipelineLayout,
1511*61046927SAndroid Build Coastguard Worker                                VK_OBJECT_TYPE_PIPELINE_LAYOUT)
1512*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(pvr_pipeline,
1513*61046927SAndroid Build Coastguard Worker                                base,
1514*61046927SAndroid Build Coastguard Worker                                VkPipeline,
1515*61046927SAndroid Build Coastguard Worker                                VK_OBJECT_TYPE_PIPELINE)
1516*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(pvr_query_pool,
1517*61046927SAndroid Build Coastguard Worker                                base,
1518*61046927SAndroid Build Coastguard Worker                                VkQueryPool,
1519*61046927SAndroid Build Coastguard Worker                                VK_OBJECT_TYPE_QUERY_POOL)
1520*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(pvr_framebuffer,
1521*61046927SAndroid Build Coastguard Worker                                base,
1522*61046927SAndroid Build Coastguard Worker                                VkFramebuffer,
1523*61046927SAndroid Build Coastguard Worker                                VK_OBJECT_TYPE_FRAMEBUFFER)
1524*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(pvr_render_pass,
1525*61046927SAndroid Build Coastguard Worker                                base,
1526*61046927SAndroid Build Coastguard Worker                                VkRenderPass,
1527*61046927SAndroid Build Coastguard Worker                                VK_OBJECT_TYPE_RENDER_PASS)
1528*61046927SAndroid Build Coastguard Worker 
1529*61046927SAndroid Build Coastguard Worker #define PVR_CHECK_COMMAND_BUFFER_BUILDING_STATE(cmd_buffer)                  \
1530*61046927SAndroid Build Coastguard Worker    do {                                                                      \
1531*61046927SAndroid Build Coastguard Worker       struct pvr_cmd_buffer *const _cmd_buffer = (cmd_buffer);               \
1532*61046927SAndroid Build Coastguard Worker       const VkResult _record_result =                                        \
1533*61046927SAndroid Build Coastguard Worker          vk_command_buffer_get_record_result(&_cmd_buffer->vk);              \
1534*61046927SAndroid Build Coastguard Worker                                                                              \
1535*61046927SAndroid Build Coastguard Worker       if (_cmd_buffer->vk.state != MESA_VK_COMMAND_BUFFER_STATE_RECORDING) { \
1536*61046927SAndroid Build Coastguard Worker          vk_errorf(_cmd_buffer,                                              \
1537*61046927SAndroid Build Coastguard Worker                    VK_ERROR_OUT_OF_DEVICE_MEMORY,                            \
1538*61046927SAndroid Build Coastguard Worker                    "Command buffer is not in recording state");              \
1539*61046927SAndroid Build Coastguard Worker          return;                                                             \
1540*61046927SAndroid Build Coastguard Worker       } else if (_record_result < VK_SUCCESS) {                              \
1541*61046927SAndroid Build Coastguard Worker          vk_errorf(_cmd_buffer,                                              \
1542*61046927SAndroid Build Coastguard Worker                    _record_result,                                           \
1543*61046927SAndroid Build Coastguard Worker                    "Skipping function as command buffer has "                \
1544*61046927SAndroid Build Coastguard Worker                    "previous build error");                                  \
1545*61046927SAndroid Build Coastguard Worker          return;                                                             \
1546*61046927SAndroid Build Coastguard Worker       }                                                                      \
1547*61046927SAndroid Build Coastguard Worker    } while (0)
1548*61046927SAndroid Build Coastguard Worker 
1549*61046927SAndroid Build Coastguard Worker /**
1550*61046927SAndroid Build Coastguard Worker  * Print a FINISHME message, including its source location.
1551*61046927SAndroid Build Coastguard Worker  */
1552*61046927SAndroid Build Coastguard Worker #define pvr_finishme(format, ...)              \
1553*61046927SAndroid Build Coastguard Worker    do {                                        \
1554*61046927SAndroid Build Coastguard Worker       static bool reported = false;            \
1555*61046927SAndroid Build Coastguard Worker       if (!reported) {                         \
1556*61046927SAndroid Build Coastguard Worker          mesa_logw("%s:%d: FINISHME: " format, \
1557*61046927SAndroid Build Coastguard Worker                    __FILE__,                   \
1558*61046927SAndroid Build Coastguard Worker                    __LINE__,                   \
1559*61046927SAndroid Build Coastguard Worker                    ##__VA_ARGS__);             \
1560*61046927SAndroid Build Coastguard Worker          reported = true;                      \
1561*61046927SAndroid Build Coastguard Worker       }                                        \
1562*61046927SAndroid Build Coastguard Worker    } while (false)
1563*61046927SAndroid Build Coastguard Worker 
1564*61046927SAndroid Build Coastguard Worker #define PVR_WRITE(_buffer, _value, _offset, _max)                \
1565*61046927SAndroid Build Coastguard Worker    do {                                                          \
1566*61046927SAndroid Build Coastguard Worker       __typeof__(_value) __value = _value;                       \
1567*61046927SAndroid Build Coastguard Worker       uint64_t __offset = _offset;                               \
1568*61046927SAndroid Build Coastguard Worker       uint32_t __nr_dwords = sizeof(__value) / sizeof(uint32_t); \
1569*61046927SAndroid Build Coastguard Worker       static_assert(__same_type(*_buffer, __value),              \
1570*61046927SAndroid Build Coastguard Worker                     "Buffer and value type mismatch");           \
1571*61046927SAndroid Build Coastguard Worker       assert((__offset + __nr_dwords) <= (_max));                \
1572*61046927SAndroid Build Coastguard Worker       assert((__offset % __nr_dwords) == 0U);                    \
1573*61046927SAndroid Build Coastguard Worker       _buffer[__offset / __nr_dwords] = __value;                 \
1574*61046927SAndroid Build Coastguard Worker    } while (0)
1575*61046927SAndroid Build Coastguard Worker 
1576*61046927SAndroid Build Coastguard Worker /* A non-fatal assert. Useful for debugging. */
1577*61046927SAndroid Build Coastguard Worker #if MESA_DEBUG
1578*61046927SAndroid Build Coastguard Worker #   define pvr_assert(x)                                           \
1579*61046927SAndroid Build Coastguard Worker       ({                                                           \
1580*61046927SAndroid Build Coastguard Worker          if (unlikely(!(x)))                                       \
1581*61046927SAndroid Build Coastguard Worker             mesa_loge("%s:%d ASSERT: %s", __FILE__, __LINE__, #x); \
1582*61046927SAndroid Build Coastguard Worker       })
1583*61046927SAndroid Build Coastguard Worker #else
1584*61046927SAndroid Build Coastguard Worker #   define pvr_assert(x)
1585*61046927SAndroid Build Coastguard Worker #endif
1586*61046927SAndroid Build Coastguard Worker 
1587*61046927SAndroid Build Coastguard Worker #endif /* PVR_PRIVATE_H */
1588