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