1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright © 2023 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_COMMON_H
32*61046927SAndroid Build Coastguard Worker #define PVR_COMMON_H
33*61046927SAndroid Build Coastguard Worker
34*61046927SAndroid Build Coastguard Worker #include <stdbool.h>
35*61046927SAndroid Build Coastguard Worker #include <stdint.h>
36*61046927SAndroid Build Coastguard Worker #include <vulkan/vulkan.h>
37*61046927SAndroid Build Coastguard Worker
38*61046927SAndroid Build Coastguard Worker /* FIXME: Rename this, and ensure it only contains what's
39*61046927SAndroid Build Coastguard Worker * relevant for the driver/compiler interface (no Vulkan types).
40*61046927SAndroid Build Coastguard Worker */
41*61046927SAndroid Build Coastguard Worker
42*61046927SAndroid Build Coastguard Worker #include "hwdef/rogue_hw_defs.h"
43*61046927SAndroid Build Coastguard Worker #include "pvr_limits.h"
44*61046927SAndroid Build Coastguard Worker #include "pvr_types.h"
45*61046927SAndroid Build Coastguard Worker #include "util/list.h"
46*61046927SAndroid Build Coastguard Worker #include "util/macros.h"
47*61046927SAndroid Build Coastguard Worker #include "vk_object.h"
48*61046927SAndroid Build Coastguard Worker #include "vk_sampler.h"
49*61046927SAndroid Build Coastguard Worker #include "vk_sync.h"
50*61046927SAndroid Build Coastguard Worker
51*61046927SAndroid Build Coastguard Worker #define VK_VENDOR_ID_IMAGINATION 0x1010
52*61046927SAndroid Build Coastguard Worker
53*61046927SAndroid Build Coastguard Worker #define PVR_WORKGROUP_DIMENSIONS 3U
54*61046927SAndroid Build Coastguard Worker
55*61046927SAndroid Build Coastguard Worker #define PVR_SAMPLER_DESCRIPTOR_SIZE 4U
56*61046927SAndroid Build Coastguard Worker #define PVR_IMAGE_DESCRIPTOR_SIZE 4U
57*61046927SAndroid Build Coastguard Worker
58*61046927SAndroid Build Coastguard Worker #define PVR_STATE_PBE_DWORDS 2U
59*61046927SAndroid Build Coastguard Worker
60*61046927SAndroid Build Coastguard Worker #define PVR_PIPELINE_LAYOUT_SUPPORTED_DESCRIPTOR_TYPE_COUNT \
61*61046927SAndroid Build Coastguard Worker (uint32_t)(VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT + 1U)
62*61046927SAndroid Build Coastguard Worker
63*61046927SAndroid Build Coastguard Worker #define PVR_TRANSFER_MAX_LAYERS 1U
64*61046927SAndroid Build Coastguard Worker #define PVR_TRANSFER_MAX_LOADS 4U
65*61046927SAndroid Build Coastguard Worker #define PVR_TRANSFER_MAX_IMAGES \
66*61046927SAndroid Build Coastguard Worker (PVR_TRANSFER_MAX_LAYERS * PVR_TRANSFER_MAX_LOADS)
67*61046927SAndroid Build Coastguard Worker
68*61046927SAndroid Build Coastguard Worker /* TODO: move into a common surface library? */
69*61046927SAndroid Build Coastguard Worker enum pvr_memlayout {
70*61046927SAndroid Build Coastguard Worker PVR_MEMLAYOUT_UNDEFINED = 0, /* explicitly treat 0 as undefined */
71*61046927SAndroid Build Coastguard Worker PVR_MEMLAYOUT_LINEAR,
72*61046927SAndroid Build Coastguard Worker PVR_MEMLAYOUT_TWIDDLED,
73*61046927SAndroid Build Coastguard Worker PVR_MEMLAYOUT_3DTWIDDLED,
74*61046927SAndroid Build Coastguard Worker };
75*61046927SAndroid Build Coastguard Worker
76*61046927SAndroid Build Coastguard Worker enum pvr_texture_state {
77*61046927SAndroid Build Coastguard Worker PVR_TEXTURE_STATE_SAMPLE,
78*61046927SAndroid Build Coastguard Worker PVR_TEXTURE_STATE_STORAGE,
79*61046927SAndroid Build Coastguard Worker PVR_TEXTURE_STATE_ATTACHMENT,
80*61046927SAndroid Build Coastguard Worker PVR_TEXTURE_STATE_MAX_ENUM,
81*61046927SAndroid Build Coastguard Worker };
82*61046927SAndroid Build Coastguard Worker
83*61046927SAndroid Build Coastguard Worker enum pvr_sub_cmd_type {
84*61046927SAndroid Build Coastguard Worker PVR_SUB_CMD_TYPE_INVALID = 0, /* explicitly treat 0 as invalid */
85*61046927SAndroid Build Coastguard Worker PVR_SUB_CMD_TYPE_GRAPHICS,
86*61046927SAndroid Build Coastguard Worker PVR_SUB_CMD_TYPE_COMPUTE,
87*61046927SAndroid Build Coastguard Worker PVR_SUB_CMD_TYPE_TRANSFER,
88*61046927SAndroid Build Coastguard Worker PVR_SUB_CMD_TYPE_OCCLUSION_QUERY,
89*61046927SAndroid Build Coastguard Worker PVR_SUB_CMD_TYPE_EVENT,
90*61046927SAndroid Build Coastguard Worker };
91*61046927SAndroid Build Coastguard Worker
92*61046927SAndroid Build Coastguard Worker enum pvr_event_type {
93*61046927SAndroid Build Coastguard Worker PVR_EVENT_TYPE_SET,
94*61046927SAndroid Build Coastguard Worker PVR_EVENT_TYPE_RESET,
95*61046927SAndroid Build Coastguard Worker PVR_EVENT_TYPE_WAIT,
96*61046927SAndroid Build Coastguard Worker PVR_EVENT_TYPE_BARRIER,
97*61046927SAndroid Build Coastguard Worker };
98*61046927SAndroid Build Coastguard Worker
99*61046927SAndroid Build Coastguard Worker enum pvr_depth_stencil_usage {
100*61046927SAndroid Build Coastguard Worker PVR_DEPTH_STENCIL_USAGE_UNDEFINED = 0, /* explicitly treat 0 as undefined */
101*61046927SAndroid Build Coastguard Worker PVR_DEPTH_STENCIL_USAGE_NEEDED,
102*61046927SAndroid Build Coastguard Worker PVR_DEPTH_STENCIL_USAGE_NEVER,
103*61046927SAndroid Build Coastguard Worker };
104*61046927SAndroid Build Coastguard Worker
105*61046927SAndroid Build Coastguard Worker enum pvr_job_type {
106*61046927SAndroid Build Coastguard Worker PVR_JOB_TYPE_GEOM,
107*61046927SAndroid Build Coastguard Worker PVR_JOB_TYPE_FRAG,
108*61046927SAndroid Build Coastguard Worker PVR_JOB_TYPE_COMPUTE,
109*61046927SAndroid Build Coastguard Worker PVR_JOB_TYPE_TRANSFER,
110*61046927SAndroid Build Coastguard Worker PVR_JOB_TYPE_OCCLUSION_QUERY,
111*61046927SAndroid Build Coastguard Worker PVR_JOB_TYPE_MAX
112*61046927SAndroid Build Coastguard Worker };
113*61046927SAndroid Build Coastguard Worker
114*61046927SAndroid Build Coastguard Worker enum pvr_pipeline_type {
115*61046927SAndroid Build Coastguard Worker PVR_PIPELINE_TYPE_INVALID = 0, /* explicitly treat 0 as undefined */
116*61046927SAndroid Build Coastguard Worker PVR_PIPELINE_TYPE_GRAPHICS,
117*61046927SAndroid Build Coastguard Worker PVR_PIPELINE_TYPE_COMPUTE,
118*61046927SAndroid Build Coastguard Worker };
119*61046927SAndroid Build Coastguard Worker
120*61046927SAndroid Build Coastguard Worker enum pvr_pipeline_stage_bits {
121*61046927SAndroid Build Coastguard Worker PVR_PIPELINE_STAGE_GEOM_BIT = BITFIELD_BIT(PVR_JOB_TYPE_GEOM),
122*61046927SAndroid Build Coastguard Worker PVR_PIPELINE_STAGE_FRAG_BIT = BITFIELD_BIT(PVR_JOB_TYPE_FRAG),
123*61046927SAndroid Build Coastguard Worker PVR_PIPELINE_STAGE_COMPUTE_BIT = BITFIELD_BIT(PVR_JOB_TYPE_COMPUTE),
124*61046927SAndroid Build Coastguard Worker PVR_PIPELINE_STAGE_TRANSFER_BIT = BITFIELD_BIT(PVR_JOB_TYPE_TRANSFER),
125*61046927SAndroid Build Coastguard Worker /* Note that this doesn't map to VkPipelineStageFlagBits so be careful with
126*61046927SAndroid Build Coastguard Worker * this.
127*61046927SAndroid Build Coastguard Worker */
128*61046927SAndroid Build Coastguard Worker PVR_PIPELINE_STAGE_OCCLUSION_QUERY_BIT =
129*61046927SAndroid Build Coastguard Worker BITFIELD_BIT(PVR_JOB_TYPE_OCCLUSION_QUERY),
130*61046927SAndroid Build Coastguard Worker };
131*61046927SAndroid Build Coastguard Worker
132*61046927SAndroid Build Coastguard Worker #define PVR_PIPELINE_STAGE_ALL_GRAPHICS_BITS \
133*61046927SAndroid Build Coastguard Worker (PVR_PIPELINE_STAGE_GEOM_BIT | PVR_PIPELINE_STAGE_FRAG_BIT)
134*61046927SAndroid Build Coastguard Worker
135*61046927SAndroid Build Coastguard Worker #define PVR_PIPELINE_STAGE_ALL_BITS \
136*61046927SAndroid Build Coastguard Worker (PVR_PIPELINE_STAGE_ALL_GRAPHICS_BITS | PVR_PIPELINE_STAGE_COMPUTE_BIT | \
137*61046927SAndroid Build Coastguard Worker PVR_PIPELINE_STAGE_TRANSFER_BIT)
138*61046927SAndroid Build Coastguard Worker
139*61046927SAndroid Build Coastguard Worker #define PVR_NUM_SYNC_PIPELINE_STAGES 4U
140*61046927SAndroid Build Coastguard Worker
141*61046927SAndroid Build Coastguard Worker /* Warning: Do not define an invalid stage as 0 since other code relies on 0
142*61046927SAndroid Build Coastguard Worker * being the first shader stage. This allows for stages to be split or added
143*61046927SAndroid Build Coastguard Worker * in the future. Defining 0 as invalid will very likely cause problems.
144*61046927SAndroid Build Coastguard Worker */
145*61046927SAndroid Build Coastguard Worker enum pvr_stage_allocation {
146*61046927SAndroid Build Coastguard Worker PVR_STAGE_ALLOCATION_VERTEX_GEOMETRY,
147*61046927SAndroid Build Coastguard Worker PVR_STAGE_ALLOCATION_FRAGMENT,
148*61046927SAndroid Build Coastguard Worker PVR_STAGE_ALLOCATION_COMPUTE,
149*61046927SAndroid Build Coastguard Worker PVR_STAGE_ALLOCATION_COUNT
150*61046927SAndroid Build Coastguard Worker };
151*61046927SAndroid Build Coastguard Worker
152*61046927SAndroid Build Coastguard Worker enum pvr_filter {
153*61046927SAndroid Build Coastguard Worker PVR_FILTER_DONTCARE, /* Any filtering mode is acceptable. */
154*61046927SAndroid Build Coastguard Worker PVR_FILTER_POINT,
155*61046927SAndroid Build Coastguard Worker PVR_FILTER_LINEAR,
156*61046927SAndroid Build Coastguard Worker PVR_FILTER_BICUBIC,
157*61046927SAndroid Build Coastguard Worker };
158*61046927SAndroid Build Coastguard Worker
159*61046927SAndroid Build Coastguard Worker enum pvr_resolve_op {
160*61046927SAndroid Build Coastguard Worker PVR_RESOLVE_BLEND,
161*61046927SAndroid Build Coastguard Worker PVR_RESOLVE_MIN,
162*61046927SAndroid Build Coastguard Worker PVR_RESOLVE_MAX,
163*61046927SAndroid Build Coastguard Worker PVR_RESOLVE_SAMPLE0,
164*61046927SAndroid Build Coastguard Worker PVR_RESOLVE_SAMPLE1,
165*61046927SAndroid Build Coastguard Worker PVR_RESOLVE_SAMPLE2,
166*61046927SAndroid Build Coastguard Worker PVR_RESOLVE_SAMPLE3,
167*61046927SAndroid Build Coastguard Worker PVR_RESOLVE_SAMPLE4,
168*61046927SAndroid Build Coastguard Worker PVR_RESOLVE_SAMPLE5,
169*61046927SAndroid Build Coastguard Worker PVR_RESOLVE_SAMPLE6,
170*61046927SAndroid Build Coastguard Worker PVR_RESOLVE_SAMPLE7,
171*61046927SAndroid Build Coastguard Worker };
172*61046927SAndroid Build Coastguard Worker
173*61046927SAndroid Build Coastguard Worker enum pvr_event_state {
174*61046927SAndroid Build Coastguard Worker PVR_EVENT_STATE_SET_BY_HOST,
175*61046927SAndroid Build Coastguard Worker PVR_EVENT_STATE_RESET_BY_HOST,
176*61046927SAndroid Build Coastguard Worker PVR_EVENT_STATE_SET_BY_DEVICE,
177*61046927SAndroid Build Coastguard Worker PVR_EVENT_STATE_RESET_BY_DEVICE
178*61046927SAndroid Build Coastguard Worker };
179*61046927SAndroid Build Coastguard Worker
180*61046927SAndroid Build Coastguard Worker enum pvr_deferred_cs_command_type {
181*61046927SAndroid Build Coastguard Worker PVR_DEFERRED_CS_COMMAND_TYPE_DBSC,
182*61046927SAndroid Build Coastguard Worker PVR_DEFERRED_CS_COMMAND_TYPE_DBSC2,
183*61046927SAndroid Build Coastguard Worker };
184*61046927SAndroid Build Coastguard Worker
185*61046927SAndroid Build Coastguard Worker enum pvr_query_type {
186*61046927SAndroid Build Coastguard Worker PVR_QUERY_TYPE_AVAILABILITY_WRITE,
187*61046927SAndroid Build Coastguard Worker PVR_QUERY_TYPE_RESET_QUERY_POOL,
188*61046927SAndroid Build Coastguard Worker PVR_QUERY_TYPE_COPY_QUERY_RESULTS,
189*61046927SAndroid Build Coastguard Worker };
190*61046927SAndroid Build Coastguard Worker
191*61046927SAndroid Build Coastguard Worker union pvr_sampler_descriptor {
192*61046927SAndroid Build Coastguard Worker uint32_t words[PVR_SAMPLER_DESCRIPTOR_SIZE];
193*61046927SAndroid Build Coastguard Worker
194*61046927SAndroid Build Coastguard Worker struct {
195*61046927SAndroid Build Coastguard Worker /* Packed PVRX(TEXSTATE_SAMPLER). */
196*61046927SAndroid Build Coastguard Worker uint64_t sampler_word;
197*61046927SAndroid Build Coastguard Worker uint32_t compare_op;
198*61046927SAndroid Build Coastguard Worker /* TODO: Figure out what this word is for and rename.
199*61046927SAndroid Build Coastguard Worker * Sampler state word 1?
200*61046927SAndroid Build Coastguard Worker */
201*61046927SAndroid Build Coastguard Worker uint32_t word3;
202*61046927SAndroid Build Coastguard Worker } data;
203*61046927SAndroid Build Coastguard Worker };
204*61046927SAndroid Build Coastguard Worker
205*61046927SAndroid Build Coastguard Worker struct pvr_combined_image_sampler_descriptor {
206*61046927SAndroid Build Coastguard Worker /* | TEXSTATE_IMAGE_WORD0 | TEXSTATE_{STRIDE_,}IMAGE_WORD1 | */
207*61046927SAndroid Build Coastguard Worker uint64_t image[ROGUE_NUM_TEXSTATE_IMAGE_WORDS];
208*61046927SAndroid Build Coastguard Worker union pvr_sampler_descriptor sampler;
209*61046927SAndroid Build Coastguard Worker };
210*61046927SAndroid Build Coastguard Worker
211*61046927SAndroid Build Coastguard Worker #define CHECK_STRUCT_FIELD_SIZE(_struct_type, _field_name, _size) \
212*61046927SAndroid Build Coastguard Worker static_assert(sizeof(((struct _struct_type *)NULL)->_field_name) == \
213*61046927SAndroid Build Coastguard Worker (_size), \
214*61046927SAndroid Build Coastguard Worker "Size of '" #_field_name "' in '" #_struct_type \
215*61046927SAndroid Build Coastguard Worker "' differs from expected")
216*61046927SAndroid Build Coastguard Worker
217*61046927SAndroid Build Coastguard Worker CHECK_STRUCT_FIELD_SIZE(pvr_combined_image_sampler_descriptor,
218*61046927SAndroid Build Coastguard Worker image,
219*61046927SAndroid Build Coastguard Worker ROGUE_NUM_TEXSTATE_IMAGE_WORDS * sizeof(uint64_t));
220*61046927SAndroid Build Coastguard Worker CHECK_STRUCT_FIELD_SIZE(pvr_combined_image_sampler_descriptor,
221*61046927SAndroid Build Coastguard Worker image,
222*61046927SAndroid Build Coastguard Worker PVR_DW_TO_BYTES(PVR_IMAGE_DESCRIPTOR_SIZE));
223*61046927SAndroid Build Coastguard Worker #if 0
224*61046927SAndroid Build Coastguard Worker /* TODO: Don't really want to include pvr_csb.h in here since this header is
225*61046927SAndroid Build Coastguard Worker * shared with the compiler. Figure out a better place for these.
226*61046927SAndroid Build Coastguard Worker */
227*61046927SAndroid Build Coastguard Worker CHECK_STRUCT_FIELD_SIZE(pvr_combined_image_sampler_descriptor,
228*61046927SAndroid Build Coastguard Worker image,
229*61046927SAndroid Build Coastguard Worker (pvr_cmd_length(TEXSTATE_IMAGE_WORD0) +
230*61046927SAndroid Build Coastguard Worker pvr_cmd_length(TEXSTATE_IMAGE_WORD1)) *
231*61046927SAndroid Build Coastguard Worker sizeof(uint32_t));
232*61046927SAndroid Build Coastguard Worker CHECK_STRUCT_FIELD_SIZE(pvr_combined_image_sampler_descriptor,
233*61046927SAndroid Build Coastguard Worker image,
234*61046927SAndroid Build Coastguard Worker (pvr_cmd_length(TEXSTATE_IMAGE_WORD0) +
235*61046927SAndroid Build Coastguard Worker pvr_cmd_length(TEXSTATE_STRIDE_IMAGE_WORD1)) *
236*61046927SAndroid Build Coastguard Worker sizeof(uint32_t));
237*61046927SAndroid Build Coastguard Worker #endif
238*61046927SAndroid Build Coastguard Worker
239*61046927SAndroid Build Coastguard Worker #undef CHECK_STRUCT_FIELD_SIZE
240*61046927SAndroid Build Coastguard Worker
241*61046927SAndroid Build Coastguard Worker struct pvr_sampler {
242*61046927SAndroid Build Coastguard Worker struct vk_sampler vk;
243*61046927SAndroid Build Coastguard Worker
244*61046927SAndroid Build Coastguard Worker union pvr_sampler_descriptor descriptor;
245*61046927SAndroid Build Coastguard Worker };
246*61046927SAndroid Build Coastguard Worker
247*61046927SAndroid Build Coastguard Worker struct pvr_descriptor_size_info {
248*61046927SAndroid Build Coastguard Worker /* Non-spillable size for storage in the common store. */
249*61046927SAndroid Build Coastguard Worker uint32_t primary;
250*61046927SAndroid Build Coastguard Worker
251*61046927SAndroid Build Coastguard Worker /* Spillable size to accommodate limitation of the common store. */
252*61046927SAndroid Build Coastguard Worker uint32_t secondary;
253*61046927SAndroid Build Coastguard Worker
254*61046927SAndroid Build Coastguard Worker uint32_t alignment;
255*61046927SAndroid Build Coastguard Worker };
256*61046927SAndroid Build Coastguard Worker
257*61046927SAndroid Build Coastguard Worker struct pvr_descriptor_set_layout_binding {
258*61046927SAndroid Build Coastguard Worker VkDescriptorType type;
259*61046927SAndroid Build Coastguard Worker
260*61046927SAndroid Build Coastguard Worker /* "M" in layout(set = N, binding = M)
261*61046927SAndroid Build Coastguard Worker * Can be used to index bindings in the descriptor_set_layout.
262*61046927SAndroid Build Coastguard Worker */
263*61046927SAndroid Build Coastguard Worker uint32_t binding_number;
264*61046927SAndroid Build Coastguard Worker
265*61046927SAndroid Build Coastguard Worker uint32_t descriptor_count;
266*61046927SAndroid Build Coastguard Worker
267*61046927SAndroid Build Coastguard Worker /* Index into the flattened descriptor set */
268*61046927SAndroid Build Coastguard Worker uint16_t descriptor_index;
269*61046927SAndroid Build Coastguard Worker
270*61046927SAndroid Build Coastguard Worker /* Mask of enum pvr_stage_allocation. */
271*61046927SAndroid Build Coastguard Worker uint8_t shader_stage_mask;
272*61046927SAndroid Build Coastguard Worker
273*61046927SAndroid Build Coastguard Worker struct {
274*61046927SAndroid Build Coastguard Worker uint32_t primary;
275*61046927SAndroid Build Coastguard Worker uint32_t secondary;
276*61046927SAndroid Build Coastguard Worker } per_stage_offset_in_dwords[PVR_STAGE_ALLOCATION_COUNT];
277*61046927SAndroid Build Coastguard Worker
278*61046927SAndroid Build Coastguard Worker bool has_immutable_samplers;
279*61046927SAndroid Build Coastguard Worker /* Index at which the samplers can be found in the descriptor_set_layout.
280*61046927SAndroid Build Coastguard Worker * 0 when the samplers are at index 0 or no samplers are present.
281*61046927SAndroid Build Coastguard Worker */
282*61046927SAndroid Build Coastguard Worker uint32_t immutable_samplers_index;
283*61046927SAndroid Build Coastguard Worker };
284*61046927SAndroid Build Coastguard Worker
285*61046927SAndroid Build Coastguard Worker /* All sizes are in dwords. */
286*61046927SAndroid Build Coastguard Worker struct pvr_descriptor_set_layout_mem_layout {
287*61046927SAndroid Build Coastguard Worker uint32_t primary_offset;
288*61046927SAndroid Build Coastguard Worker uint32_t primary_size;
289*61046927SAndroid Build Coastguard Worker
290*61046927SAndroid Build Coastguard Worker uint32_t secondary_offset;
291*61046927SAndroid Build Coastguard Worker uint32_t secondary_size;
292*61046927SAndroid Build Coastguard Worker
293*61046927SAndroid Build Coastguard Worker uint32_t primary_dynamic_size;
294*61046927SAndroid Build Coastguard Worker uint32_t secondary_dynamic_size;
295*61046927SAndroid Build Coastguard Worker };
296*61046927SAndroid Build Coastguard Worker
297*61046927SAndroid Build Coastguard Worker struct pvr_descriptor_set_layout {
298*61046927SAndroid Build Coastguard Worker struct vk_object_base base;
299*61046927SAndroid Build Coastguard Worker
300*61046927SAndroid Build Coastguard Worker /* Total amount of descriptors contained in this set. */
301*61046927SAndroid Build Coastguard Worker uint32_t descriptor_count;
302*61046927SAndroid Build Coastguard Worker
303*61046927SAndroid Build Coastguard Worker /* Count of dynamic buffers. */
304*61046927SAndroid Build Coastguard Worker uint32_t dynamic_buffer_count;
305*61046927SAndroid Build Coastguard Worker uint32_t total_dynamic_size_in_dwords;
306*61046927SAndroid Build Coastguard Worker
307*61046927SAndroid Build Coastguard Worker uint32_t binding_count;
308*61046927SAndroid Build Coastguard Worker struct pvr_descriptor_set_layout_binding *bindings;
309*61046927SAndroid Build Coastguard Worker
310*61046927SAndroid Build Coastguard Worker uint32_t immutable_sampler_count;
311*61046927SAndroid Build Coastguard Worker const struct pvr_sampler **immutable_samplers;
312*61046927SAndroid Build Coastguard Worker
313*61046927SAndroid Build Coastguard Worker /* Shader stages requiring access to descriptors in this set. */
314*61046927SAndroid Build Coastguard Worker /* Mask of enum pvr_stage_allocation. */
315*61046927SAndroid Build Coastguard Worker uint8_t shader_stage_mask;
316*61046927SAndroid Build Coastguard Worker
317*61046927SAndroid Build Coastguard Worker /* Count of each VkDescriptorType per shader stage. Dynamically allocated
318*61046927SAndroid Build Coastguard Worker * arrays per stage as to not hard code the max descriptor type here.
319*61046927SAndroid Build Coastguard Worker *
320*61046927SAndroid Build Coastguard Worker * Note: when adding a new type, it might not numerically follow the
321*61046927SAndroid Build Coastguard Worker * previous type so a sparse array will be created. You might want to
322*61046927SAndroid Build Coastguard Worker * readjust how these arrays are created and accessed.
323*61046927SAndroid Build Coastguard Worker */
324*61046927SAndroid Build Coastguard Worker uint32_t *per_stage_descriptor_count[PVR_STAGE_ALLOCATION_COUNT];
325*61046927SAndroid Build Coastguard Worker
326*61046927SAndroid Build Coastguard Worker uint32_t total_size_in_dwords;
327*61046927SAndroid Build Coastguard Worker struct pvr_descriptor_set_layout_mem_layout
328*61046927SAndroid Build Coastguard Worker memory_layout_in_dwords_per_stage[PVR_STAGE_ALLOCATION_COUNT];
329*61046927SAndroid Build Coastguard Worker };
330*61046927SAndroid Build Coastguard Worker
331*61046927SAndroid Build Coastguard Worker struct pvr_descriptor_pool {
332*61046927SAndroid Build Coastguard Worker struct vk_object_base base;
333*61046927SAndroid Build Coastguard Worker
334*61046927SAndroid Build Coastguard Worker VkAllocationCallbacks alloc;
335*61046927SAndroid Build Coastguard Worker
336*61046927SAndroid Build Coastguard Worker /* Saved information from pCreateInfo. */
337*61046927SAndroid Build Coastguard Worker uint32_t max_sets;
338*61046927SAndroid Build Coastguard Worker
339*61046927SAndroid Build Coastguard Worker uint32_t total_size_in_dwords;
340*61046927SAndroid Build Coastguard Worker uint32_t current_size_in_dwords;
341*61046927SAndroid Build Coastguard Worker
342*61046927SAndroid Build Coastguard Worker /* Derived and other state. */
343*61046927SAndroid Build Coastguard Worker /* List of the descriptor sets created using this pool. */
344*61046927SAndroid Build Coastguard Worker struct list_head descriptor_sets;
345*61046927SAndroid Build Coastguard Worker };
346*61046927SAndroid Build Coastguard Worker
347*61046927SAndroid Build Coastguard Worker struct pvr_descriptor {
348*61046927SAndroid Build Coastguard Worker VkDescriptorType type;
349*61046927SAndroid Build Coastguard Worker
350*61046927SAndroid Build Coastguard Worker union {
351*61046927SAndroid Build Coastguard Worker struct {
352*61046927SAndroid Build Coastguard Worker struct pvr_buffer_view *bview;
353*61046927SAndroid Build Coastguard Worker pvr_dev_addr_t buffer_dev_addr;
354*61046927SAndroid Build Coastguard Worker VkDeviceSize buffer_desc_range;
355*61046927SAndroid Build Coastguard Worker VkDeviceSize buffer_whole_range;
356*61046927SAndroid Build Coastguard Worker };
357*61046927SAndroid Build Coastguard Worker
358*61046927SAndroid Build Coastguard Worker struct {
359*61046927SAndroid Build Coastguard Worker VkImageLayout layout;
360*61046927SAndroid Build Coastguard Worker const struct pvr_image_view *iview;
361*61046927SAndroid Build Coastguard Worker const struct pvr_sampler *sampler;
362*61046927SAndroid Build Coastguard Worker };
363*61046927SAndroid Build Coastguard Worker };
364*61046927SAndroid Build Coastguard Worker };
365*61046927SAndroid Build Coastguard Worker
366*61046927SAndroid Build Coastguard Worker struct pvr_descriptor_set {
367*61046927SAndroid Build Coastguard Worker struct vk_object_base base;
368*61046927SAndroid Build Coastguard Worker
369*61046927SAndroid Build Coastguard Worker const struct pvr_descriptor_set_layout *layout;
370*61046927SAndroid Build Coastguard Worker const struct pvr_descriptor_pool *pool;
371*61046927SAndroid Build Coastguard Worker
372*61046927SAndroid Build Coastguard Worker struct pvr_suballoc_bo *pvr_bo;
373*61046927SAndroid Build Coastguard Worker
374*61046927SAndroid Build Coastguard Worker /* Links this descriptor set into pvr_descriptor_pool::descriptor_sets list.
375*61046927SAndroid Build Coastguard Worker */
376*61046927SAndroid Build Coastguard Worker struct list_head link;
377*61046927SAndroid Build Coastguard Worker
378*61046927SAndroid Build Coastguard Worker /* Array of size layout::descriptor_count. */
379*61046927SAndroid Build Coastguard Worker struct pvr_descriptor descriptors[0];
380*61046927SAndroid Build Coastguard Worker };
381*61046927SAndroid Build Coastguard Worker
382*61046927SAndroid Build Coastguard Worker struct pvr_event {
383*61046927SAndroid Build Coastguard Worker struct vk_object_base base;
384*61046927SAndroid Build Coastguard Worker
385*61046927SAndroid Build Coastguard Worker enum pvr_event_state state;
386*61046927SAndroid Build Coastguard Worker struct vk_sync *sync;
387*61046927SAndroid Build Coastguard Worker };
388*61046927SAndroid Build Coastguard Worker
389*61046927SAndroid Build Coastguard Worker #define PVR_MAX_DYNAMIC_BUFFERS \
390*61046927SAndroid Build Coastguard Worker (PVR_MAX_DESCRIPTOR_SET_UNIFORM_DYNAMIC_BUFFERS + \
391*61046927SAndroid Build Coastguard Worker PVR_MAX_DESCRIPTOR_SET_STORAGE_DYNAMIC_BUFFERS)
392*61046927SAndroid Build Coastguard Worker
393*61046927SAndroid Build Coastguard Worker struct pvr_descriptor_state {
394*61046927SAndroid Build Coastguard Worker struct pvr_descriptor_set *descriptor_sets[PVR_MAX_DESCRIPTOR_SETS];
395*61046927SAndroid Build Coastguard Worker uint32_t valid_mask;
396*61046927SAndroid Build Coastguard Worker
397*61046927SAndroid Build Coastguard Worker uint32_t dynamic_offsets[PVR_MAX_DYNAMIC_BUFFERS];
398*61046927SAndroid Build Coastguard Worker };
399*61046927SAndroid Build Coastguard Worker
400*61046927SAndroid Build Coastguard Worker #undef PVR_MAX_DYNAMIC_BUFFERS
401*61046927SAndroid Build Coastguard Worker
402*61046927SAndroid Build Coastguard Worker /**
403*61046927SAndroid Build Coastguard Worker * \brief Indicates the layout of shared registers allocated by the driver.
404*61046927SAndroid Build Coastguard Worker *
405*61046927SAndroid Build Coastguard Worker * 'present' fields indicate if a certain resource was allocated for, and
406*61046927SAndroid Build Coastguard Worker * whether it will be present in the shareds.
407*61046927SAndroid Build Coastguard Worker * 'offset' fields indicate at which shared reg the resource starts at.
408*61046927SAndroid Build Coastguard Worker */
409*61046927SAndroid Build Coastguard Worker struct pvr_sh_reg_layout {
410*61046927SAndroid Build Coastguard Worker /* If this is present, it will always take up 2 sh regs in size and contain
411*61046927SAndroid Build Coastguard Worker * the device address of the descriptor set addrs table.
412*61046927SAndroid Build Coastguard Worker */
413*61046927SAndroid Build Coastguard Worker struct {
414*61046927SAndroid Build Coastguard Worker bool present;
415*61046927SAndroid Build Coastguard Worker uint32_t offset;
416*61046927SAndroid Build Coastguard Worker } descriptor_set_addrs_table;
417*61046927SAndroid Build Coastguard Worker
418*61046927SAndroid Build Coastguard Worker /* If this is present, it will always take up 2 sh regs in size and contain
419*61046927SAndroid Build Coastguard Worker * the device address of the push constants buffer.
420*61046927SAndroid Build Coastguard Worker */
421*61046927SAndroid Build Coastguard Worker struct {
422*61046927SAndroid Build Coastguard Worker bool present;
423*61046927SAndroid Build Coastguard Worker uint32_t offset;
424*61046927SAndroid Build Coastguard Worker } push_consts;
425*61046927SAndroid Build Coastguard Worker
426*61046927SAndroid Build Coastguard Worker /* If this is present, it will always take up 2 sh regs in size and contain
427*61046927SAndroid Build Coastguard Worker * the device address of the blend constants buffer.
428*61046927SAndroid Build Coastguard Worker */
429*61046927SAndroid Build Coastguard Worker struct {
430*61046927SAndroid Build Coastguard Worker bool present;
431*61046927SAndroid Build Coastguard Worker uint32_t offset;
432*61046927SAndroid Build Coastguard Worker } blend_consts;
433*61046927SAndroid Build Coastguard Worker };
434*61046927SAndroid Build Coastguard Worker
435*61046927SAndroid Build Coastguard Worker struct pvr_pipeline_layout {
436*61046927SAndroid Build Coastguard Worker struct vk_object_base base;
437*61046927SAndroid Build Coastguard Worker
438*61046927SAndroid Build Coastguard Worker uint32_t set_count;
439*61046927SAndroid Build Coastguard Worker /* Contains set_count amount of descriptor set layouts. */
440*61046927SAndroid Build Coastguard Worker struct pvr_descriptor_set_layout *set_layout[PVR_MAX_DESCRIPTOR_SETS];
441*61046927SAndroid Build Coastguard Worker
442*61046927SAndroid Build Coastguard Worker /* Mask of enum pvr_stage_allocation. */
443*61046927SAndroid Build Coastguard Worker uint8_t push_constants_shader_stages;
444*61046927SAndroid Build Coastguard Worker uint32_t vert_push_constants_offset;
445*61046927SAndroid Build Coastguard Worker uint32_t frag_push_constants_offset;
446*61046927SAndroid Build Coastguard Worker uint32_t compute_push_constants_offset;
447*61046927SAndroid Build Coastguard Worker
448*61046927SAndroid Build Coastguard Worker /* Mask of enum pvr_stage_allocation. */
449*61046927SAndroid Build Coastguard Worker uint8_t shader_stage_mask;
450*61046927SAndroid Build Coastguard Worker
451*61046927SAndroid Build Coastguard Worker /* Per stage masks indicating which set in the layout contains any
452*61046927SAndroid Build Coastguard Worker * descriptor of the appropriate types: VK..._{SAMPLER, SAMPLED_IMAGE,
453*61046927SAndroid Build Coastguard Worker * UNIFORM_TEXEL_BUFFER, UNIFORM_BUFFER, STORAGE_BUFFER}.
454*61046927SAndroid Build Coastguard Worker * Shift by the set's number to check the mask (1U << set_num).
455*61046927SAndroid Build Coastguard Worker */
456*61046927SAndroid Build Coastguard Worker uint32_t per_stage_descriptor_masks[PVR_STAGE_ALLOCATION_COUNT];
457*61046927SAndroid Build Coastguard Worker
458*61046927SAndroid Build Coastguard Worker /* Array of descriptor offsets at which the set's descriptors' start, per
459*61046927SAndroid Build Coastguard Worker * stage, within all the sets in the pipeline layout per descriptor type.
460*61046927SAndroid Build Coastguard Worker * Note that we only store into for specific descriptor types
461*61046927SAndroid Build Coastguard Worker * VK_DESCRIPTOR_TYPE_{SAMPLER, SAMPLED_IMAGE, UNIFORM_TEXEL_BUFFER,
462*61046927SAndroid Build Coastguard Worker * UNIFORM_BUFFER, STORAGE_BUFFER}, the rest will be 0.
463*61046927SAndroid Build Coastguard Worker */
464*61046927SAndroid Build Coastguard Worker uint32_t
465*61046927SAndroid Build Coastguard Worker descriptor_offsets[PVR_MAX_DESCRIPTOR_SETS][PVR_STAGE_ALLOCATION_COUNT]
466*61046927SAndroid Build Coastguard Worker [PVR_PIPELINE_LAYOUT_SUPPORTED_DESCRIPTOR_TYPE_COUNT];
467*61046927SAndroid Build Coastguard Worker
468*61046927SAndroid Build Coastguard Worker /* There is no accounting for dynamics in here. They will be garbage values.
469*61046927SAndroid Build Coastguard Worker */
470*61046927SAndroid Build Coastguard Worker struct pvr_descriptor_set_layout_mem_layout
471*61046927SAndroid Build Coastguard Worker register_layout_in_dwords_per_stage[PVR_STAGE_ALLOCATION_COUNT]
472*61046927SAndroid Build Coastguard Worker [PVR_MAX_DESCRIPTOR_SETS];
473*61046927SAndroid Build Coastguard Worker
474*61046927SAndroid Build Coastguard Worker /* TODO: Consider whether this needs to be here. */
475*61046927SAndroid Build Coastguard Worker struct pvr_sh_reg_layout sh_reg_layout_per_stage[PVR_STAGE_ALLOCATION_COUNT];
476*61046927SAndroid Build Coastguard Worker
477*61046927SAndroid Build Coastguard Worker /* All sizes in dwords. */
478*61046927SAndroid Build Coastguard Worker struct pvr_pipeline_layout_reg_info {
479*61046927SAndroid Build Coastguard Worker uint32_t primary_dynamic_size_in_dwords;
480*61046927SAndroid Build Coastguard Worker uint32_t secondary_dynamic_size_in_dwords;
481*61046927SAndroid Build Coastguard Worker } per_stage_reg_info[PVR_STAGE_ALLOCATION_COUNT];
482*61046927SAndroid Build Coastguard Worker };
483*61046927SAndroid Build Coastguard Worker
pvr_compare_layout_binding(const void * a,const void * b)484*61046927SAndroid Build Coastguard Worker static int pvr_compare_layout_binding(const void *a, const void *b)
485*61046927SAndroid Build Coastguard Worker {
486*61046927SAndroid Build Coastguard Worker uint32_t binding_a;
487*61046927SAndroid Build Coastguard Worker uint32_t binding_b;
488*61046927SAndroid Build Coastguard Worker
489*61046927SAndroid Build Coastguard Worker binding_a = ((struct pvr_descriptor_set_layout_binding *)a)->binding_number;
490*61046927SAndroid Build Coastguard Worker binding_b = ((struct pvr_descriptor_set_layout_binding *)b)->binding_number;
491*61046927SAndroid Build Coastguard Worker
492*61046927SAndroid Build Coastguard Worker if (binding_a < binding_b)
493*61046927SAndroid Build Coastguard Worker return -1;
494*61046927SAndroid Build Coastguard Worker
495*61046927SAndroid Build Coastguard Worker if (binding_a > binding_b)
496*61046927SAndroid Build Coastguard Worker return 1;
497*61046927SAndroid Build Coastguard Worker
498*61046927SAndroid Build Coastguard Worker return 0;
499*61046927SAndroid Build Coastguard Worker }
500*61046927SAndroid Build Coastguard Worker
501*61046927SAndroid Build Coastguard Worker /* This function does not assume that the binding will always exist for a
502*61046927SAndroid Build Coastguard Worker * particular binding_num. Caller should check before using the return pointer.
503*61046927SAndroid Build Coastguard Worker */
504*61046927SAndroid Build Coastguard Worker static struct pvr_descriptor_set_layout_binding *
pvr_get_descriptor_binding(const struct pvr_descriptor_set_layout * layout,const uint32_t binding_num)505*61046927SAndroid Build Coastguard Worker pvr_get_descriptor_binding(const struct pvr_descriptor_set_layout *layout,
506*61046927SAndroid Build Coastguard Worker const uint32_t binding_num)
507*61046927SAndroid Build Coastguard Worker {
508*61046927SAndroid Build Coastguard Worker struct pvr_descriptor_set_layout_binding binding;
509*61046927SAndroid Build Coastguard Worker binding.binding_number = binding_num;
510*61046927SAndroid Build Coastguard Worker
511*61046927SAndroid Build Coastguard Worker return bsearch(&binding,
512*61046927SAndroid Build Coastguard Worker layout->bindings,
513*61046927SAndroid Build Coastguard Worker layout->binding_count,
514*61046927SAndroid Build Coastguard Worker sizeof(binding),
515*61046927SAndroid Build Coastguard Worker pvr_compare_layout_binding);
516*61046927SAndroid Build Coastguard Worker }
517*61046927SAndroid Build Coastguard Worker
518*61046927SAndroid Build Coastguard Worker #endif /* PVR_COMMON_H */
519