xref: /aosp_15_r20/external/mesa3d/src/microsoft/vulkan/dzn_private.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © Microsoft Corporation
3*61046927SAndroid Build Coastguard Worker  *
4*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*61046927SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*61046927SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*61046927SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*61046927SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*61046927SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*61046927SAndroid Build Coastguard Worker  *
11*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
12*61046927SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
13*61046927SAndroid Build Coastguard Worker  * Software.
14*61046927SAndroid Build Coastguard Worker  *
15*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*61046927SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*61046927SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*61046927SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*61046927SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*61046927SAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*61046927SAndroid Build Coastguard Worker  * IN THE SOFTWARE.
22*61046927SAndroid Build Coastguard Worker  */
23*61046927SAndroid Build Coastguard Worker 
24*61046927SAndroid Build Coastguard Worker #ifndef DZN_PRIVATE_H
25*61046927SAndroid Build Coastguard Worker #define DZN_PRIVATE_H
26*61046927SAndroid Build Coastguard Worker 
27*61046927SAndroid Build Coastguard Worker #define COBJMACROS
28*61046927SAndroid Build Coastguard Worker 
29*61046927SAndroid Build Coastguard Worker #include "vk_command_pool.h"
30*61046927SAndroid Build Coastguard Worker #include "vk_command_buffer.h"
31*61046927SAndroid Build Coastguard Worker #include "vk_cmd_queue.h"
32*61046927SAndroid Build Coastguard Worker #include "vk_debug_report.h"
33*61046927SAndroid Build Coastguard Worker #include "vk_descriptor_set_layout.h"
34*61046927SAndroid Build Coastguard Worker #include "vk_device.h"
35*61046927SAndroid Build Coastguard Worker #include "vk_image.h"
36*61046927SAndroid Build Coastguard Worker #include "vk_log.h"
37*61046927SAndroid Build Coastguard Worker #include "vk_physical_device.h"
38*61046927SAndroid Build Coastguard Worker #include "vk_pipeline_layout.h"
39*61046927SAndroid Build Coastguard Worker #include "vk_render_pass.h"
40*61046927SAndroid Build Coastguard Worker #include "vk_sync.h"
41*61046927SAndroid Build Coastguard Worker #include "vk_sync_binary.h"
42*61046927SAndroid Build Coastguard Worker #include "vk_queue.h"
43*61046927SAndroid Build Coastguard Worker #include "vk_shader_module.h"
44*61046927SAndroid Build Coastguard Worker #include "wsi_common.h"
45*61046927SAndroid Build Coastguard Worker 
46*61046927SAndroid Build Coastguard Worker #include "util/bitset.h"
47*61046927SAndroid Build Coastguard Worker #include "util/blob.h"
48*61046927SAndroid Build Coastguard Worker #include "util/hash_table.h"
49*61046927SAndroid Build Coastguard Worker #include "util/u_dynarray.h"
50*61046927SAndroid Build Coastguard Worker #include "util/log.h"
51*61046927SAndroid Build Coastguard Worker #include "util/xmlconfig.h"
52*61046927SAndroid Build Coastguard Worker 
53*61046927SAndroid Build Coastguard Worker #include "shader_enums.h"
54*61046927SAndroid Build Coastguard Worker 
55*61046927SAndroid Build Coastguard Worker #include "dzn_entrypoints.h"
56*61046927SAndroid Build Coastguard Worker #include "dzn_nir.h"
57*61046927SAndroid Build Coastguard Worker #include "dzn_physical_device_enum.h"
58*61046927SAndroid Build Coastguard Worker 
59*61046927SAndroid Build Coastguard Worker #include <vulkan/vulkan.h>
60*61046927SAndroid Build Coastguard Worker #include <vulkan/vk_icd.h>
61*61046927SAndroid Build Coastguard Worker 
62*61046927SAndroid Build Coastguard Worker #define D3D12_IGNORE_SDK_LAYERS
63*61046927SAndroid Build Coastguard Worker #include <unknwn.h>
64*61046927SAndroid Build Coastguard Worker #include <directx/d3d12.h>
65*61046927SAndroid Build Coastguard Worker 
66*61046927SAndroid Build Coastguard Worker #include "spirv_to_dxil.h"
67*61046927SAndroid Build Coastguard Worker #include "dzn_abi_helper.h"
68*61046927SAndroid Build Coastguard Worker 
69*61046927SAndroid Build Coastguard Worker #define DZN_SWAP(t, a, b) \
70*61046927SAndroid Build Coastguard Worker    do { \
71*61046927SAndroid Build Coastguard Worker       t __tmp = a; \
72*61046927SAndroid Build Coastguard Worker       a = b; \
73*61046927SAndroid Build Coastguard Worker       b = __tmp; \
74*61046927SAndroid Build Coastguard Worker    } while (0)
75*61046927SAndroid Build Coastguard Worker 
76*61046927SAndroid Build Coastguard Worker #define dzn_stub() unreachable("Unsupported feature")
77*61046927SAndroid Build Coastguard Worker 
78*61046927SAndroid Build Coastguard Worker #if defined(VK_USE_PLATFORM_WIN32_KHR) || \
79*61046927SAndroid Build Coastguard Worker     defined(VK_USE_PLATFORM_WAYLAND_KHR) || \
80*61046927SAndroid Build Coastguard Worker     defined(VK_USE_PLATFORM_XCB_KHR) || \
81*61046927SAndroid Build Coastguard Worker     defined(VK_USE_PLATFORM_XLIB_KHR)
82*61046927SAndroid Build Coastguard Worker #define DZN_USE_WSI_PLATFORM
83*61046927SAndroid Build Coastguard Worker #endif
84*61046927SAndroid Build Coastguard Worker 
85*61046927SAndroid Build Coastguard Worker struct dxil_validator;
86*61046927SAndroid Build Coastguard Worker struct util_dl_library;
87*61046927SAndroid Build Coastguard Worker 
88*61046927SAndroid Build Coastguard Worker struct dzn_instance;
89*61046927SAndroid Build Coastguard Worker struct dzn_device;
90*61046927SAndroid Build Coastguard Worker 
91*61046927SAndroid Build Coastguard Worker struct dzn_meta_indirect_draw {
92*61046927SAndroid Build Coastguard Worker    ID3D12RootSignature *root_sig;
93*61046927SAndroid Build Coastguard Worker    ID3D12PipelineState *pipeline_state;
94*61046927SAndroid Build Coastguard Worker };
95*61046927SAndroid Build Coastguard Worker 
96*61046927SAndroid Build Coastguard Worker enum dzn_index_type {
97*61046927SAndroid Build Coastguard Worker    DZN_NO_INDEX,
98*61046927SAndroid Build Coastguard Worker    DZN_INDEX_2B,
99*61046927SAndroid Build Coastguard Worker    DZN_INDEX_4B,
100*61046927SAndroid Build Coastguard Worker    DZN_INDEX_2B_WITH_PRIM_RESTART,
101*61046927SAndroid Build Coastguard Worker    DZN_INDEX_4B_WITH_PRIM_RESTART,
102*61046927SAndroid Build Coastguard Worker    DZN_NUM_INDEX_TYPE,
103*61046927SAndroid Build Coastguard Worker };
104*61046927SAndroid Build Coastguard Worker 
105*61046927SAndroid Build Coastguard Worker static inline enum dzn_index_type
dzn_index_type_from_size(uint8_t index_size)106*61046927SAndroid Build Coastguard Worker dzn_index_type_from_size(uint8_t index_size)
107*61046927SAndroid Build Coastguard Worker {
108*61046927SAndroid Build Coastguard Worker    switch (index_size) {
109*61046927SAndroid Build Coastguard Worker    case 0: return DZN_NO_INDEX;
110*61046927SAndroid Build Coastguard Worker    case 2: return DZN_INDEX_2B;
111*61046927SAndroid Build Coastguard Worker    case 4: return DZN_INDEX_4B;
112*61046927SAndroid Build Coastguard Worker    default: unreachable("Invalid index size");
113*61046927SAndroid Build Coastguard Worker    }
114*61046927SAndroid Build Coastguard Worker }
115*61046927SAndroid Build Coastguard Worker 
116*61046927SAndroid Build Coastguard Worker static inline enum dzn_index_type
dzn_index_type_from_dxgi_format(DXGI_FORMAT format,bool prim_restart)117*61046927SAndroid Build Coastguard Worker dzn_index_type_from_dxgi_format(DXGI_FORMAT format, bool prim_restart)
118*61046927SAndroid Build Coastguard Worker {
119*61046927SAndroid Build Coastguard Worker    switch (format) {
120*61046927SAndroid Build Coastguard Worker    case DXGI_FORMAT_UNKNOWN: return DZN_NO_INDEX;
121*61046927SAndroid Build Coastguard Worker    case DXGI_FORMAT_R16_UINT:
122*61046927SAndroid Build Coastguard Worker       return prim_restart ? DZN_INDEX_2B_WITH_PRIM_RESTART : DZN_INDEX_2B;
123*61046927SAndroid Build Coastguard Worker    case DXGI_FORMAT_R32_UINT:
124*61046927SAndroid Build Coastguard Worker       return prim_restart ? DZN_INDEX_4B_WITH_PRIM_RESTART : DZN_INDEX_4B;
125*61046927SAndroid Build Coastguard Worker    default: unreachable("Invalid index format");
126*61046927SAndroid Build Coastguard Worker    }
127*61046927SAndroid Build Coastguard Worker }
128*61046927SAndroid Build Coastguard Worker 
129*61046927SAndroid Build Coastguard Worker static inline uint8_t
dzn_index_size(enum dzn_index_type type)130*61046927SAndroid Build Coastguard Worker dzn_index_size(enum dzn_index_type type)
131*61046927SAndroid Build Coastguard Worker {
132*61046927SAndroid Build Coastguard Worker    switch (type) {
133*61046927SAndroid Build Coastguard Worker    case DZN_NO_INDEX:
134*61046927SAndroid Build Coastguard Worker       return 0;
135*61046927SAndroid Build Coastguard Worker    case DZN_INDEX_2B_WITH_PRIM_RESTART:
136*61046927SAndroid Build Coastguard Worker    case DZN_INDEX_2B:
137*61046927SAndroid Build Coastguard Worker       return 2;
138*61046927SAndroid Build Coastguard Worker    case DZN_INDEX_4B_WITH_PRIM_RESTART:
139*61046927SAndroid Build Coastguard Worker    case DZN_INDEX_4B:
140*61046927SAndroid Build Coastguard Worker       return 4;
141*61046927SAndroid Build Coastguard Worker    default: unreachable("Invalid index type");
142*61046927SAndroid Build Coastguard Worker    }
143*61046927SAndroid Build Coastguard Worker }
144*61046927SAndroid Build Coastguard Worker 
145*61046927SAndroid Build Coastguard Worker struct dzn_meta_triangle_fan_rewrite_index {
146*61046927SAndroid Build Coastguard Worker    ID3D12RootSignature *root_sig;
147*61046927SAndroid Build Coastguard Worker    ID3D12PipelineState *pipeline_state;
148*61046927SAndroid Build Coastguard Worker    ID3D12CommandSignature *cmd_sig;
149*61046927SAndroid Build Coastguard Worker };
150*61046927SAndroid Build Coastguard Worker 
151*61046927SAndroid Build Coastguard Worker struct dzn_meta_blit_key {
152*61046927SAndroid Build Coastguard Worker    union {
153*61046927SAndroid Build Coastguard Worker       struct {
154*61046927SAndroid Build Coastguard Worker          DXGI_FORMAT out_format;
155*61046927SAndroid Build Coastguard Worker          uint32_t samples : 6;
156*61046927SAndroid Build Coastguard Worker          uint32_t loc : 4;
157*61046927SAndroid Build Coastguard Worker          uint32_t out_type : 4;
158*61046927SAndroid Build Coastguard Worker          uint32_t sampler_dim : 4;
159*61046927SAndroid Build Coastguard Worker          uint32_t src_is_array : 1;
160*61046927SAndroid Build Coastguard Worker          uint32_t resolve_mode : 3;
161*61046927SAndroid Build Coastguard Worker          uint32_t linear_filter : 1;
162*61046927SAndroid Build Coastguard Worker          uint32_t stencil_bit : 4;
163*61046927SAndroid Build Coastguard Worker          uint32_t padding : 5;
164*61046927SAndroid Build Coastguard Worker       };
165*61046927SAndroid Build Coastguard Worker       const uint64_t u64;
166*61046927SAndroid Build Coastguard Worker    };
167*61046927SAndroid Build Coastguard Worker };
168*61046927SAndroid Build Coastguard Worker 
169*61046927SAndroid Build Coastguard Worker struct dzn_meta_blit {
170*61046927SAndroid Build Coastguard Worker    ID3D12RootSignature *root_sig;
171*61046927SAndroid Build Coastguard Worker    ID3D12PipelineState *pipeline_state;
172*61046927SAndroid Build Coastguard Worker };
173*61046927SAndroid Build Coastguard Worker 
174*61046927SAndroid Build Coastguard Worker struct dzn_meta_blits {
175*61046927SAndroid Build Coastguard Worker    mtx_t shaders_lock;
176*61046927SAndroid Build Coastguard Worker    D3D12_SHADER_BYTECODE vs;
177*61046927SAndroid Build Coastguard Worker    struct hash_table *fs;
178*61046927SAndroid Build Coastguard Worker    mtx_t contexts_lock;
179*61046927SAndroid Build Coastguard Worker    struct hash_table_u64 *contexts;
180*61046927SAndroid Build Coastguard Worker };
181*61046927SAndroid Build Coastguard Worker 
182*61046927SAndroid Build Coastguard Worker const struct dzn_meta_blit *
183*61046927SAndroid Build Coastguard Worker dzn_meta_blits_get_context(struct dzn_device *device,
184*61046927SAndroid Build Coastguard Worker                            const struct dzn_meta_blit_key *key);
185*61046927SAndroid Build Coastguard Worker 
186*61046927SAndroid Build Coastguard Worker #define MAX_SYNC_TYPES 3
187*61046927SAndroid Build Coastguard Worker #define MAX_QUEUE_FAMILIES 2
188*61046927SAndroid Build Coastguard Worker 
189*61046927SAndroid Build Coastguard Worker struct dzn_physical_device {
190*61046927SAndroid Build Coastguard Worker    struct vk_physical_device vk;
191*61046927SAndroid Build Coastguard Worker 
192*61046927SAndroid Build Coastguard Worker    struct vk_physical_device_dispatch_table dispatch;
193*61046927SAndroid Build Coastguard Worker 
194*61046927SAndroid Build Coastguard Worker    IUnknown *adapter;
195*61046927SAndroid Build Coastguard Worker    struct dzn_physical_device_desc desc;
196*61046927SAndroid Build Coastguard Worker 
197*61046927SAndroid Build Coastguard Worker    uint32_t queue_family_count;
198*61046927SAndroid Build Coastguard Worker    struct dzn_queue_family {
199*61046927SAndroid Build Coastguard Worker       VkQueueFamilyProperties props;
200*61046927SAndroid Build Coastguard Worker       D3D12_COMMAND_QUEUE_DESC desc;
201*61046927SAndroid Build Coastguard Worker    } queue_families[MAX_QUEUE_FAMILIES];
202*61046927SAndroid Build Coastguard Worker 
203*61046927SAndroid Build Coastguard Worker    uint8_t pipeline_cache_uuid[VK_UUID_SIZE];
204*61046927SAndroid Build Coastguard Worker    uint8_t device_uuid[VK_UUID_SIZE];
205*61046927SAndroid Build Coastguard Worker    uint8_t driver_uuid[VK_UUID_SIZE];
206*61046927SAndroid Build Coastguard Worker 
207*61046927SAndroid Build Coastguard Worker    struct wsi_device wsi_device;
208*61046927SAndroid Build Coastguard Worker 
209*61046927SAndroid Build Coastguard Worker    ID3D12Device4 *dev;
210*61046927SAndroid Build Coastguard Worker    ID3D12Device10 *dev10;
211*61046927SAndroid Build Coastguard Worker    ID3D12Device11 *dev11;
212*61046927SAndroid Build Coastguard Worker    ID3D12Device12 *dev12;
213*61046927SAndroid Build Coastguard Worker    ID3D12Device13 *dev13;
214*61046927SAndroid Build Coastguard Worker    D3D_FEATURE_LEVEL feature_level;
215*61046927SAndroid Build Coastguard Worker    D3D_SHADER_MODEL shader_model;
216*61046927SAndroid Build Coastguard Worker    D3D_ROOT_SIGNATURE_VERSION root_sig_version;
217*61046927SAndroid Build Coastguard Worker    D3D12_FEATURE_DATA_ARCHITECTURE1 architecture;
218*61046927SAndroid Build Coastguard Worker    D3D12_FEATURE_DATA_D3D12_OPTIONS options;
219*61046927SAndroid Build Coastguard Worker    D3D12_FEATURE_DATA_D3D12_OPTIONS1 options1;
220*61046927SAndroid Build Coastguard Worker    D3D12_FEATURE_DATA_D3D12_OPTIONS2 options2;
221*61046927SAndroid Build Coastguard Worker    D3D12_FEATURE_DATA_D3D12_OPTIONS3 options3;
222*61046927SAndroid Build Coastguard Worker    D3D12_FEATURE_DATA_D3D12_OPTIONS4 options4;
223*61046927SAndroid Build Coastguard Worker    D3D12_FEATURE_DATA_D3D12_OPTIONS12 options12;
224*61046927SAndroid Build Coastguard Worker    D3D12_FEATURE_DATA_D3D12_OPTIONS13 options13;
225*61046927SAndroid Build Coastguard Worker    D3D12_FEATURE_DATA_D3D12_OPTIONS14 options14;
226*61046927SAndroid Build Coastguard Worker    D3D12_FEATURE_DATA_D3D12_OPTIONS15 options15;
227*61046927SAndroid Build Coastguard Worker    D3D12_FEATURE_DATA_D3D12_OPTIONS16 options16;
228*61046927SAndroid Build Coastguard Worker    D3D12_FEATURE_DATA_D3D12_OPTIONS17 options17;
229*61046927SAndroid Build Coastguard Worker    D3D12_FEATURE_DATA_D3D12_OPTIONS19 options19;
230*61046927SAndroid Build Coastguard Worker    D3D12_FEATURE_DATA_D3D12_OPTIONS21 options21;
231*61046927SAndroid Build Coastguard Worker    VkPhysicalDeviceMemoryProperties memory;
232*61046927SAndroid Build Coastguard Worker    D3D12_HEAP_FLAGS heap_flags_for_mem_type[VK_MAX_MEMORY_TYPES];
233*61046927SAndroid Build Coastguard Worker    const struct vk_sync_type *sync_types[MAX_SYNC_TYPES + 1];
234*61046927SAndroid Build Coastguard Worker    float timestamp_period;
235*61046927SAndroid Build Coastguard Worker    bool support_a4b4g4r4;
236*61046927SAndroid Build Coastguard Worker };
237*61046927SAndroid Build Coastguard Worker 
238*61046927SAndroid Build Coastguard Worker D3D12_FEATURE_DATA_FORMAT_SUPPORT
239*61046927SAndroid Build Coastguard Worker dzn_physical_device_get_format_support(struct dzn_physical_device *pdev,
240*61046927SAndroid Build Coastguard Worker                                        VkFormat format,
241*61046927SAndroid Build Coastguard Worker                                        VkImageCreateFlags create_flags);
242*61046927SAndroid Build Coastguard Worker 
243*61046927SAndroid Build Coastguard Worker uint32_t
244*61046927SAndroid Build Coastguard Worker dzn_physical_device_get_mem_type_mask_for_resource(const struct dzn_physical_device *pdev,
245*61046927SAndroid Build Coastguard Worker                                                    const D3D12_RESOURCE_DESC *desc,
246*61046927SAndroid Build Coastguard Worker                                                    bool shared);
247*61046927SAndroid Build Coastguard Worker 
248*61046927SAndroid Build Coastguard Worker enum dxil_shader_model
249*61046927SAndroid Build Coastguard Worker dzn_get_shader_model(const struct dzn_physical_device *pdev);
250*61046927SAndroid Build Coastguard Worker 
251*61046927SAndroid Build Coastguard Worker PFN_D3D12_SERIALIZE_VERSIONED_ROOT_SIGNATURE
252*61046927SAndroid Build Coastguard Worker d3d12_get_serialize_root_sig(struct util_dl_library *d3d12_mod);
253*61046927SAndroid Build Coastguard Worker 
254*61046927SAndroid Build Coastguard Worker void
255*61046927SAndroid Build Coastguard Worker d3d12_enable_debug_layer(struct util_dl_library *d3d12_mod, ID3D12DeviceFactory *factory);
256*61046927SAndroid Build Coastguard Worker 
257*61046927SAndroid Build Coastguard Worker void
258*61046927SAndroid Build Coastguard Worker d3d12_enable_gpu_validation(struct util_dl_library *d3d12_mod, ID3D12DeviceFactory *factory);
259*61046927SAndroid Build Coastguard Worker 
260*61046927SAndroid Build Coastguard Worker ID3D12Device4 *
261*61046927SAndroid Build Coastguard Worker d3d12_create_device(struct util_dl_library *d3d12_mod, IUnknown *adapter, ID3D12DeviceFactory *factory, bool experimental_features);
262*61046927SAndroid Build Coastguard Worker 
263*61046927SAndroid Build Coastguard Worker struct dzn_queue {
264*61046927SAndroid Build Coastguard Worker    struct vk_queue vk;
265*61046927SAndroid Build Coastguard Worker 
266*61046927SAndroid Build Coastguard Worker    ID3D12CommandQueue *cmdqueue;
267*61046927SAndroid Build Coastguard Worker    ID3D12Fence *fence;
268*61046927SAndroid Build Coastguard Worker    uint64_t fence_point;
269*61046927SAndroid Build Coastguard Worker };
270*61046927SAndroid Build Coastguard Worker 
271*61046927SAndroid Build Coastguard Worker struct dzn_descriptor_heap {
272*61046927SAndroid Build Coastguard Worker    ID3D12DescriptorHeap *heap;
273*61046927SAndroid Build Coastguard Worker    SIZE_T cpu_base;
274*61046927SAndroid Build Coastguard Worker    uint64_t gpu_base;
275*61046927SAndroid Build Coastguard Worker    uint32_t desc_count;
276*61046927SAndroid Build Coastguard Worker    uint32_t desc_sz;
277*61046927SAndroid Build Coastguard Worker };
278*61046927SAndroid Build Coastguard Worker 
279*61046927SAndroid Build Coastguard Worker struct dzn_device_descriptor_heap {
280*61046927SAndroid Build Coastguard Worker    struct dzn_descriptor_heap heap;
281*61046927SAndroid Build Coastguard Worker    mtx_t lock;
282*61046927SAndroid Build Coastguard Worker    struct util_dynarray slot_freelist;
283*61046927SAndroid Build Coastguard Worker    uint32_t next_alloc_slot;
284*61046927SAndroid Build Coastguard Worker };
285*61046927SAndroid Build Coastguard Worker 
286*61046927SAndroid Build Coastguard Worker #define NUM_POOL_TYPES D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER + 1
287*61046927SAndroid Build Coastguard Worker 
288*61046927SAndroid Build Coastguard Worker struct dzn_device {
289*61046927SAndroid Build Coastguard Worker    struct vk_device vk;
290*61046927SAndroid Build Coastguard Worker    struct vk_device_extension_table enabled_extensions;
291*61046927SAndroid Build Coastguard Worker    struct vk_device_dispatch_table cmd_dispatch;
292*61046927SAndroid Build Coastguard Worker 
293*61046927SAndroid Build Coastguard Worker    ID3D12Device4 *dev;
294*61046927SAndroid Build Coastguard Worker    ID3D12Device10 *dev10;
295*61046927SAndroid Build Coastguard Worker    ID3D12Device11 *dev11;
296*61046927SAndroid Build Coastguard Worker    ID3D12Device12 *dev12;
297*61046927SAndroid Build Coastguard Worker    ID3D12Device13 *dev13;
298*61046927SAndroid Build Coastguard Worker    ID3D12DeviceConfiguration *dev_config;
299*61046927SAndroid Build Coastguard Worker 
300*61046927SAndroid Build Coastguard Worker    struct dzn_meta_indirect_draw indirect_draws[DZN_NUM_INDIRECT_DRAW_TYPES];
301*61046927SAndroid Build Coastguard Worker    struct dzn_meta_triangle_fan_rewrite_index triangle_fan[DZN_NUM_INDEX_TYPE];
302*61046927SAndroid Build Coastguard Worker    struct dzn_meta_blits blits;
303*61046927SAndroid Build Coastguard Worker 
304*61046927SAndroid Build Coastguard Worker    struct {
305*61046927SAndroid Build Coastguard Worker #define DZN_QUERY_REFS_SECTION_SIZE 4096
306*61046927SAndroid Build Coastguard Worker #define DZN_QUERY_REFS_ALL_ONES_OFFSET 0
307*61046927SAndroid Build Coastguard Worker #define DZN_QUERY_REFS_ALL_ZEROS_OFFSET (DZN_QUERY_REFS_ALL_ONES_OFFSET + DZN_QUERY_REFS_SECTION_SIZE)
308*61046927SAndroid Build Coastguard Worker #define DZN_QUERY_REFS_RES_SIZE (DZN_QUERY_REFS_ALL_ZEROS_OFFSET + DZN_QUERY_REFS_SECTION_SIZE)
309*61046927SAndroid Build Coastguard Worker       ID3D12Resource *refs;
310*61046927SAndroid Build Coastguard Worker    } queries;
311*61046927SAndroid Build Coastguard Worker 
312*61046927SAndroid Build Coastguard Worker    /* Will be the app's graphics queue if there's exactly one, otherwise this will be
313*61046927SAndroid Build Coastguard Worker     * a dedicated graphics queue to host swapchain blits.
314*61046927SAndroid Build Coastguard Worker     */
315*61046927SAndroid Build Coastguard Worker    bool need_swapchain_blits;
316*61046927SAndroid Build Coastguard Worker    struct dzn_queue *swapchain_queue;
317*61046927SAndroid Build Coastguard Worker 
318*61046927SAndroid Build Coastguard Worker    bool bindless;
319*61046927SAndroid Build Coastguard Worker    bool support_static_samplers;
320*61046927SAndroid Build Coastguard Worker    struct dzn_device_descriptor_heap device_heaps[NUM_POOL_TYPES];
321*61046927SAndroid Build Coastguard Worker };
322*61046927SAndroid Build Coastguard Worker 
323*61046927SAndroid Build Coastguard Worker void dzn_meta_finish(struct dzn_device *device);
324*61046927SAndroid Build Coastguard Worker 
325*61046927SAndroid Build Coastguard Worker VkResult dzn_meta_init(struct dzn_device *device);
326*61046927SAndroid Build Coastguard Worker 
327*61046927SAndroid Build Coastguard Worker const struct dzn_meta_blit *
328*61046927SAndroid Build Coastguard Worker dzn_meta_blits_get_context(struct dzn_device *device,
329*61046927SAndroid Build Coastguard Worker                            const struct dzn_meta_blit_key *key);
330*61046927SAndroid Build Coastguard Worker 
331*61046927SAndroid Build Coastguard Worker ID3D12RootSignature *
332*61046927SAndroid Build Coastguard Worker dzn_device_create_root_sig(struct dzn_device *device,
333*61046927SAndroid Build Coastguard Worker                            const D3D12_VERSIONED_ROOT_SIGNATURE_DESC *desc);
334*61046927SAndroid Build Coastguard Worker 
335*61046927SAndroid Build Coastguard Worker struct dzn_device_memory {
336*61046927SAndroid Build Coastguard Worker    struct vk_object_base base;
337*61046927SAndroid Build Coastguard Worker 
338*61046927SAndroid Build Coastguard Worker    struct list_head link;
339*61046927SAndroid Build Coastguard Worker 
340*61046927SAndroid Build Coastguard Worker    /* Dedicated image/buffer resource. Can be used for import (e.g. from a swapchain)
341*61046927SAndroid Build Coastguard Worker     * or just from a dedicated allocation request.
342*61046927SAndroid Build Coastguard Worker     */
343*61046927SAndroid Build Coastguard Worker    ID3D12Resource *dedicated_res;
344*61046927SAndroid Build Coastguard Worker 
345*61046927SAndroid Build Coastguard Worker    ID3D12Heap *heap;
346*61046927SAndroid Build Coastguard Worker    VkDeviceSize size;
347*61046927SAndroid Build Coastguard Worker 
348*61046927SAndroid Build Coastguard Worker    /* A buffer-resource spanning the entire heap, used for mapping memory */
349*61046927SAndroid Build Coastguard Worker    ID3D12Resource *map_res;
350*61046927SAndroid Build Coastguard Worker 
351*61046927SAndroid Build Coastguard Worker    VkDeviceSize map_size;
352*61046927SAndroid Build Coastguard Worker    void *map;
353*61046927SAndroid Build Coastguard Worker 
354*61046927SAndroid Build Coastguard Worker    /* If the resource is exportable, this is the pre-created handle for that */
355*61046927SAndroid Build Coastguard Worker    HANDLE export_handle;
356*61046927SAndroid Build Coastguard Worker 
357*61046927SAndroid Build Coastguard Worker    /* These flags need to be added into all resources created on this heap */
358*61046927SAndroid Build Coastguard Worker    D3D12_RESOURCE_FLAGS res_flags;
359*61046927SAndroid Build Coastguard Worker };
360*61046927SAndroid Build Coastguard Worker 
361*61046927SAndroid Build Coastguard Worker enum dzn_cmd_bindpoint_dirty {
362*61046927SAndroid Build Coastguard Worker    DZN_CMD_BINDPOINT_DIRTY_PIPELINE = 1 << 0,
363*61046927SAndroid Build Coastguard Worker    DZN_CMD_BINDPOINT_DIRTY_DYNAMIC_BUFFERS = 1 << 1,
364*61046927SAndroid Build Coastguard Worker    DZN_CMD_BINDPOINT_DIRTY_SYSVALS = 1 << 2,
365*61046927SAndroid Build Coastguard Worker    DZN_CMD_BINDPOINT_DIRTY_DESC_SET0 = 1 << 3,
366*61046927SAndroid Build Coastguard Worker    DZN_CMD_BINDPOINT_DIRTY_DESC_SET1 = 1 << 4,
367*61046927SAndroid Build Coastguard Worker    DZN_CMD_BINDPOINT_DIRTY_DESC_SET2 = 1 << 5,
368*61046927SAndroid Build Coastguard Worker    DZN_CMD_BINDPOINT_DIRTY_DESC_SET3 = 1 << 6,
369*61046927SAndroid Build Coastguard Worker    DZN_CMD_BINDPOINT_DIRTY_DESC_SET4 = 1 << 7,
370*61046927SAndroid Build Coastguard Worker    DZN_CMD_BINDPOINT_DIRTY_DESC_SET5 = 1 << 8,
371*61046927SAndroid Build Coastguard Worker    DZN_CMD_BINDPOINT_DIRTY_DESC_SET6 = 1 << 9,
372*61046927SAndroid Build Coastguard Worker    DZN_CMD_BINDPOINT_DIRTY_DESC_SET7 = 1 << 10,
373*61046927SAndroid Build Coastguard Worker    DZN_CMD_BINDPOINT_DIRTY_DESC_SETS =
374*61046927SAndroid Build Coastguard Worker       DZN_CMD_BINDPOINT_DIRTY_DESC_SET0 |
375*61046927SAndroid Build Coastguard Worker       DZN_CMD_BINDPOINT_DIRTY_DESC_SET1 |
376*61046927SAndroid Build Coastguard Worker       DZN_CMD_BINDPOINT_DIRTY_DESC_SET2 |
377*61046927SAndroid Build Coastguard Worker       DZN_CMD_BINDPOINT_DIRTY_DESC_SET3 |
378*61046927SAndroid Build Coastguard Worker       DZN_CMD_BINDPOINT_DIRTY_DESC_SET4 |
379*61046927SAndroid Build Coastguard Worker       DZN_CMD_BINDPOINT_DIRTY_DESC_SET5 |
380*61046927SAndroid Build Coastguard Worker       DZN_CMD_BINDPOINT_DIRTY_DESC_SET6 |
381*61046927SAndroid Build Coastguard Worker       DZN_CMD_BINDPOINT_DIRTY_DESC_SET7,
382*61046927SAndroid Build Coastguard Worker    DZN_CMD_BINDPOINT_DIRTY_HEAPS =
383*61046927SAndroid Build Coastguard Worker       DZN_CMD_BINDPOINT_DIRTY_DYNAMIC_BUFFERS |
384*61046927SAndroid Build Coastguard Worker       DZN_CMD_BINDPOINT_DIRTY_SYSVALS |
385*61046927SAndroid Build Coastguard Worker       DZN_CMD_BINDPOINT_DIRTY_DESC_SETS,
386*61046927SAndroid Build Coastguard Worker };
387*61046927SAndroid Build Coastguard Worker 
388*61046927SAndroid Build Coastguard Worker enum dzn_cmd_dirty {
389*61046927SAndroid Build Coastguard Worker    DZN_CMD_DIRTY_VIEWPORTS = 1 << 0,
390*61046927SAndroid Build Coastguard Worker    DZN_CMD_DIRTY_SCISSORS = 1 << 1,
391*61046927SAndroid Build Coastguard Worker    DZN_CMD_DIRTY_IB = 1 << 2,
392*61046927SAndroid Build Coastguard Worker    DZN_CMD_DIRTY_STENCIL_REF = 1 << 3,
393*61046927SAndroid Build Coastguard Worker    DZN_CMD_DIRTY_STENCIL_COMPARE_MASK = 1 << 4,
394*61046927SAndroid Build Coastguard Worker    DZN_CMD_DIRTY_STENCIL_WRITE_MASK = 1 << 5,
395*61046927SAndroid Build Coastguard Worker    DZN_CMD_DIRTY_BLEND_CONSTANTS = 1 << 6,
396*61046927SAndroid Build Coastguard Worker    DZN_CMD_DIRTY_DEPTH_BOUNDS = 1 << 7,
397*61046927SAndroid Build Coastguard Worker    DZN_CMD_DIRTY_DEPTH_BIAS = 1 << 8,
398*61046927SAndroid Build Coastguard Worker };
399*61046927SAndroid Build Coastguard Worker 
400*61046927SAndroid Build Coastguard Worker #define MAX_VBS D3D12_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT
401*61046927SAndroid Build Coastguard Worker #define MAX_VP D3D12_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE
402*61046927SAndroid Build Coastguard Worker #define MAX_SCISSOR D3D12_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE
403*61046927SAndroid Build Coastguard Worker #define MAX_SETS 8
404*61046927SAndroid Build Coastguard Worker #define MAX_DYNAMIC_UNIFORM_BUFFERS 8
405*61046927SAndroid Build Coastguard Worker #define MAX_DYNAMIC_STORAGE_BUFFERS 4
406*61046927SAndroid Build Coastguard Worker #define MAX_DYNAMIC_BUFFERS                                                  \
407*61046927SAndroid Build Coastguard Worker    (MAX_DYNAMIC_UNIFORM_BUFFERS + MAX_DYNAMIC_STORAGE_BUFFERS)
408*61046927SAndroid Build Coastguard Worker #define MAX_PUSH_CONSTANT_DWORDS 32
409*61046927SAndroid Build Coastguard Worker 
410*61046927SAndroid Build Coastguard Worker #define NUM_BIND_POINT VK_PIPELINE_BIND_POINT_COMPUTE + 1
411*61046927SAndroid Build Coastguard Worker 
412*61046927SAndroid Build Coastguard Worker #define dzn_foreach_pool_type(type) \
413*61046927SAndroid Build Coastguard Worker    for (D3D12_DESCRIPTOR_HEAP_TYPE type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV; \
414*61046927SAndroid Build Coastguard Worker         type <= D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER; \
415*61046927SAndroid Build Coastguard Worker         type = (D3D12_DESCRIPTOR_HEAP_TYPE)(type + 1))
416*61046927SAndroid Build Coastguard Worker 
417*61046927SAndroid Build Coastguard Worker struct dzn_cmd_event_signal {
418*61046927SAndroid Build Coastguard Worker    struct dzn_event *event;
419*61046927SAndroid Build Coastguard Worker    bool value;
420*61046927SAndroid Build Coastguard Worker };
421*61046927SAndroid Build Coastguard Worker 
422*61046927SAndroid Build Coastguard Worker struct dzn_cmd_buffer;
423*61046927SAndroid Build Coastguard Worker 
424*61046927SAndroid Build Coastguard Worker struct dzn_descriptor_state {
425*61046927SAndroid Build Coastguard Worker    struct {
426*61046927SAndroid Build Coastguard Worker       const struct dzn_descriptor_set *set;
427*61046927SAndroid Build Coastguard Worker       uint32_t dynamic_offsets[MAX_DYNAMIC_BUFFERS];
428*61046927SAndroid Build Coastguard Worker    } sets[MAX_SETS];
429*61046927SAndroid Build Coastguard Worker    struct dzn_descriptor_heap *heaps[NUM_POOL_TYPES];
430*61046927SAndroid Build Coastguard Worker };
431*61046927SAndroid Build Coastguard Worker 
432*61046927SAndroid Build Coastguard Worker struct dzn_sampler;
433*61046927SAndroid Build Coastguard Worker struct dzn_image_view;
434*61046927SAndroid Build Coastguard Worker struct dzn_buffer_view;
435*61046927SAndroid Build Coastguard Worker 
436*61046927SAndroid Build Coastguard Worker struct dzn_buffer_desc {
437*61046927SAndroid Build Coastguard Worker    VkDescriptorType type;
438*61046927SAndroid Build Coastguard Worker    struct dzn_buffer *buffer;
439*61046927SAndroid Build Coastguard Worker    VkDeviceSize range;
440*61046927SAndroid Build Coastguard Worker    VkDeviceSize offset;
441*61046927SAndroid Build Coastguard Worker };
442*61046927SAndroid Build Coastguard Worker 
443*61046927SAndroid Build Coastguard Worker #define MAX_DESCS_PER_SAMPLER_HEAP     D3D12_MAX_SHADER_VISIBLE_SAMPLER_HEAP_SIZE
444*61046927SAndroid Build Coastguard Worker #define MAX_DESCS_PER_CBV_SRV_UAV_HEAP D3D12_MAX_SHADER_VISIBLE_DESCRIPTOR_HEAP_SIZE_TIER_1
445*61046927SAndroid Build Coastguard Worker 
446*61046927SAndroid Build Coastguard Worker VkResult
447*61046927SAndroid Build Coastguard Worker dzn_descriptor_heap_init(struct dzn_descriptor_heap *heap,
448*61046927SAndroid Build Coastguard Worker                          struct dzn_device *device,
449*61046927SAndroid Build Coastguard Worker                          D3D12_DESCRIPTOR_HEAP_TYPE type,
450*61046927SAndroid Build Coastguard Worker                          uint32_t desc_count,
451*61046927SAndroid Build Coastguard Worker                          bool shader_visible);
452*61046927SAndroid Build Coastguard Worker 
453*61046927SAndroid Build Coastguard Worker void
454*61046927SAndroid Build Coastguard Worker dzn_descriptor_heap_finish(struct dzn_descriptor_heap *heap);
455*61046927SAndroid Build Coastguard Worker 
456*61046927SAndroid Build Coastguard Worker D3D12_CPU_DESCRIPTOR_HANDLE
457*61046927SAndroid Build Coastguard Worker dzn_descriptor_heap_get_cpu_handle(const struct dzn_descriptor_heap *heap, uint32_t slot);
458*61046927SAndroid Build Coastguard Worker 
459*61046927SAndroid Build Coastguard Worker D3D12_GPU_DESCRIPTOR_HANDLE
460*61046927SAndroid Build Coastguard Worker dzn_descriptor_heap_get_gpu_handle(const struct dzn_descriptor_heap *heap, uint32_t slot);
461*61046927SAndroid Build Coastguard Worker 
462*61046927SAndroid Build Coastguard Worker void
463*61046927SAndroid Build Coastguard Worker dzn_descriptor_heap_write_image_view_desc(struct dzn_device *device,
464*61046927SAndroid Build Coastguard Worker                                           struct dzn_descriptor_heap *heap,
465*61046927SAndroid Build Coastguard Worker                                           uint32_t heap_offset,
466*61046927SAndroid Build Coastguard Worker                                           bool writeable,
467*61046927SAndroid Build Coastguard Worker                                           bool cube_as_2darray,
468*61046927SAndroid Build Coastguard Worker                                           const struct dzn_image_view *iview);
469*61046927SAndroid Build Coastguard Worker 
470*61046927SAndroid Build Coastguard Worker void
471*61046927SAndroid Build Coastguard Worker dzn_descriptor_heap_write_buffer_view_desc(struct dzn_device *device,
472*61046927SAndroid Build Coastguard Worker                                            struct dzn_descriptor_heap *heap,
473*61046927SAndroid Build Coastguard Worker                                            uint32_t heap_offset,
474*61046927SAndroid Build Coastguard Worker                                            bool writeable,
475*61046927SAndroid Build Coastguard Worker                                            const struct dzn_buffer_view *bview);
476*61046927SAndroid Build Coastguard Worker 
477*61046927SAndroid Build Coastguard Worker void
478*61046927SAndroid Build Coastguard Worker dzn_descriptor_heap_write_buffer_desc(struct dzn_device *device,
479*61046927SAndroid Build Coastguard Worker                                       struct dzn_descriptor_heap *heap,
480*61046927SAndroid Build Coastguard Worker                                       uint32_t heap_offset,
481*61046927SAndroid Build Coastguard Worker                                       bool writeable,
482*61046927SAndroid Build Coastguard Worker                                       const struct dzn_buffer_desc *bdesc);
483*61046927SAndroid Build Coastguard Worker 
484*61046927SAndroid Build Coastguard Worker void
485*61046927SAndroid Build Coastguard Worker dzn_descriptor_heap_write_sampler_desc(struct dzn_device *device,
486*61046927SAndroid Build Coastguard Worker                                        struct dzn_descriptor_heap *heap,
487*61046927SAndroid Build Coastguard Worker                                        uint32_t desc_offset,
488*61046927SAndroid Build Coastguard Worker                                        const struct dzn_sampler *sampler);
489*61046927SAndroid Build Coastguard Worker 
490*61046927SAndroid Build Coastguard Worker void
491*61046927SAndroid Build Coastguard Worker dzn_descriptor_heap_copy(struct dzn_device *device,
492*61046927SAndroid Build Coastguard Worker                          struct dzn_descriptor_heap *dst_heap, uint32_t dst_heap_offset,
493*61046927SAndroid Build Coastguard Worker                          const struct dzn_descriptor_heap *src_heap, uint32_t src_heap_offset,
494*61046927SAndroid Build Coastguard Worker                          uint32_t desc_count, D3D12_DESCRIPTOR_HEAP_TYPE type);
495*61046927SAndroid Build Coastguard Worker 
496*61046927SAndroid Build Coastguard Worker struct dzn_descriptor_heap_pool_entry {
497*61046927SAndroid Build Coastguard Worker    struct list_head link;
498*61046927SAndroid Build Coastguard Worker    struct dzn_descriptor_heap heap;
499*61046927SAndroid Build Coastguard Worker };
500*61046927SAndroid Build Coastguard Worker 
501*61046927SAndroid Build Coastguard Worker struct dzn_descriptor_heap_pool {
502*61046927SAndroid Build Coastguard Worker    const VkAllocationCallbacks *alloc;
503*61046927SAndroid Build Coastguard Worker    D3D12_DESCRIPTOR_HEAP_TYPE type;
504*61046927SAndroid Build Coastguard Worker    bool shader_visible;
505*61046927SAndroid Build Coastguard Worker    struct list_head active_heaps, free_heaps;
506*61046927SAndroid Build Coastguard Worker    uint32_t offset;
507*61046927SAndroid Build Coastguard Worker    uint32_t desc_sz;
508*61046927SAndroid Build Coastguard Worker };
509*61046927SAndroid Build Coastguard Worker 
510*61046927SAndroid Build Coastguard Worker void
511*61046927SAndroid Build Coastguard Worker dzn_descriptor_heap_pool_init(struct dzn_descriptor_heap_pool *pool,
512*61046927SAndroid Build Coastguard Worker                               struct dzn_device *device,
513*61046927SAndroid Build Coastguard Worker                               D3D12_DESCRIPTOR_HEAP_TYPE type,
514*61046927SAndroid Build Coastguard Worker                               bool shader_visible,
515*61046927SAndroid Build Coastguard Worker                               const VkAllocationCallbacks *alloc);
516*61046927SAndroid Build Coastguard Worker 
517*61046927SAndroid Build Coastguard Worker void
518*61046927SAndroid Build Coastguard Worker dzn_descriptor_heap_pool_finish(struct dzn_descriptor_heap_pool *pool);
519*61046927SAndroid Build Coastguard Worker 
520*61046927SAndroid Build Coastguard Worker void
521*61046927SAndroid Build Coastguard Worker dzn_descriptor_heap_pool_reset(struct dzn_descriptor_heap_pool *pool);
522*61046927SAndroid Build Coastguard Worker 
523*61046927SAndroid Build Coastguard Worker VkResult
524*61046927SAndroid Build Coastguard Worker dzn_descriptor_heap_pool_alloc_slots(struct dzn_descriptor_heap_pool *pool,
525*61046927SAndroid Build Coastguard Worker                                      struct dzn_device *device,
526*61046927SAndroid Build Coastguard Worker                                      uint32_t num_slots,
527*61046927SAndroid Build Coastguard Worker                                      struct dzn_descriptor_heap **heap,
528*61046927SAndroid Build Coastguard Worker                                      uint32_t *first_slot);
529*61046927SAndroid Build Coastguard Worker 
530*61046927SAndroid Build Coastguard Worker int
531*61046927SAndroid Build Coastguard Worker dzn_device_descriptor_heap_alloc_slot(struct dzn_device *device,
532*61046927SAndroid Build Coastguard Worker                                       D3D12_DESCRIPTOR_HEAP_TYPE type);
533*61046927SAndroid Build Coastguard Worker 
534*61046927SAndroid Build Coastguard Worker void
535*61046927SAndroid Build Coastguard Worker dzn_device_descriptor_heap_free_slot(struct dzn_device *device,
536*61046927SAndroid Build Coastguard Worker                                      D3D12_DESCRIPTOR_HEAP_TYPE type,
537*61046927SAndroid Build Coastguard Worker                                      int slot);
538*61046927SAndroid Build Coastguard Worker 
539*61046927SAndroid Build Coastguard Worker struct dzn_cmd_buffer_query_range {
540*61046927SAndroid Build Coastguard Worker    struct dzn_query_pool *qpool;
541*61046927SAndroid Build Coastguard Worker    uint32_t start, count;
542*61046927SAndroid Build Coastguard Worker };
543*61046927SAndroid Build Coastguard Worker 
544*61046927SAndroid Build Coastguard Worker struct dzn_cmd_buffer_query_pool_state {
545*61046927SAndroid Build Coastguard Worker    struct util_dynarray reset, collect, signal, zero;
546*61046927SAndroid Build Coastguard Worker };
547*61046927SAndroid Build Coastguard Worker 
548*61046927SAndroid Build Coastguard Worker struct dzn_internal_resource {
549*61046927SAndroid Build Coastguard Worker    struct list_head link;
550*61046927SAndroid Build Coastguard Worker    ID3D12Resource *res;
551*61046927SAndroid Build Coastguard Worker    uint64_t size;
552*61046927SAndroid Build Coastguard Worker };
553*61046927SAndroid Build Coastguard Worker 
554*61046927SAndroid Build Coastguard Worker enum dzn_event_state {
555*61046927SAndroid Build Coastguard Worker    DZN_EVENT_STATE_RESET = 0,
556*61046927SAndroid Build Coastguard Worker    DZN_EVENT_STATE_SET = 1,
557*61046927SAndroid Build Coastguard Worker };
558*61046927SAndroid Build Coastguard Worker 
559*61046927SAndroid Build Coastguard Worker struct dzn_cmd_buffer_push_constant_state {
560*61046927SAndroid Build Coastguard Worker    uint32_t offset;
561*61046927SAndroid Build Coastguard Worker    uint32_t end;
562*61046927SAndroid Build Coastguard Worker    uint32_t values[MAX_PUSH_CONSTANT_DWORDS];
563*61046927SAndroid Build Coastguard Worker };
564*61046927SAndroid Build Coastguard Worker 
565*61046927SAndroid Build Coastguard Worker struct dzn_rendering_attachment {
566*61046927SAndroid Build Coastguard Worker    struct dzn_image_view *iview;
567*61046927SAndroid Build Coastguard Worker    VkImageLayout layout;
568*61046927SAndroid Build Coastguard Worker    struct {
569*61046927SAndroid Build Coastguard Worker       VkResolveModeFlagBits mode;
570*61046927SAndroid Build Coastguard Worker       struct dzn_image_view *iview;
571*61046927SAndroid Build Coastguard Worker       VkImageLayout layout;
572*61046927SAndroid Build Coastguard Worker    } resolve;
573*61046927SAndroid Build Coastguard Worker    VkAttachmentStoreOp store_op;
574*61046927SAndroid Build Coastguard Worker };
575*61046927SAndroid Build Coastguard Worker 
576*61046927SAndroid Build Coastguard Worker struct dzn_graphics_pipeline_variant_key {
577*61046927SAndroid Build Coastguard Worker    D3D12_INDEX_BUFFER_STRIP_CUT_VALUE ib_strip_cut;
578*61046927SAndroid Build Coastguard Worker    struct {
579*61046927SAndroid Build Coastguard Worker       int constant_factor;
580*61046927SAndroid Build Coastguard Worker       float slope_factor;
581*61046927SAndroid Build Coastguard Worker       float clamp;
582*61046927SAndroid Build Coastguard Worker    } depth_bias;
583*61046927SAndroid Build Coastguard Worker    struct {
584*61046927SAndroid Build Coastguard Worker       struct {
585*61046927SAndroid Build Coastguard Worker          uint32_t ref, compare_mask, write_mask;
586*61046927SAndroid Build Coastguard Worker       } front, back;
587*61046927SAndroid Build Coastguard Worker    } stencil_test;
588*61046927SAndroid Build Coastguard Worker };
589*61046927SAndroid Build Coastguard Worker 
590*61046927SAndroid Build Coastguard Worker struct dzn_graphics_pipeline_variant {
591*61046927SAndroid Build Coastguard Worker    struct dzn_graphics_pipeline_variant_key key;
592*61046927SAndroid Build Coastguard Worker    ID3D12PipelineState *state;
593*61046927SAndroid Build Coastguard Worker };
594*61046927SAndroid Build Coastguard Worker 
595*61046927SAndroid Build Coastguard Worker #define MAX_RTS D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT
596*61046927SAndroid Build Coastguard Worker 
597*61046927SAndroid Build Coastguard Worker struct dzn_cmd_buffer_state {
598*61046927SAndroid Build Coastguard Worker    const struct dzn_pipeline *pipeline;
599*61046927SAndroid Build Coastguard Worker    struct dzn_descriptor_heap *heaps[NUM_POOL_TYPES];
600*61046927SAndroid Build Coastguard Worker    struct dzn_graphics_pipeline_variant_key pipeline_variant;
601*61046927SAndroid Build Coastguard Worker    struct {
602*61046927SAndroid Build Coastguard Worker       VkRenderingFlags flags;
603*61046927SAndroid Build Coastguard Worker       D3D12_RECT area;
604*61046927SAndroid Build Coastguard Worker       uint32_t layer_count;
605*61046927SAndroid Build Coastguard Worker       uint32_t view_mask;
606*61046927SAndroid Build Coastguard Worker       struct {
607*61046927SAndroid Build Coastguard Worker          uint32_t color_count;
608*61046927SAndroid Build Coastguard Worker          struct dzn_rendering_attachment colors[MAX_RTS];
609*61046927SAndroid Build Coastguard Worker          struct dzn_rendering_attachment depth, stencil;
610*61046927SAndroid Build Coastguard Worker       } attachments;
611*61046927SAndroid Build Coastguard Worker    } render;
612*61046927SAndroid Build Coastguard Worker    struct {
613*61046927SAndroid Build Coastguard Worker       BITSET_DECLARE(dirty, MAX_VBS);
614*61046927SAndroid Build Coastguard Worker       D3D12_VERTEX_BUFFER_VIEW views[MAX_VBS];
615*61046927SAndroid Build Coastguard Worker    } vb;
616*61046927SAndroid Build Coastguard Worker    struct {
617*61046927SAndroid Build Coastguard Worker       D3D12_INDEX_BUFFER_VIEW view;
618*61046927SAndroid Build Coastguard Worker    } ib;
619*61046927SAndroid Build Coastguard Worker    struct {
620*61046927SAndroid Build Coastguard Worker       struct {
621*61046927SAndroid Build Coastguard Worker          struct {
622*61046927SAndroid Build Coastguard Worker             uint32_t ref, compare_mask, write_mask;
623*61046927SAndroid Build Coastguard Worker          } front, back;
624*61046927SAndroid Build Coastguard Worker       } stencil_test;
625*61046927SAndroid Build Coastguard Worker       struct {
626*61046927SAndroid Build Coastguard Worker          float min, max;
627*61046927SAndroid Build Coastguard Worker       } depth_bounds;
628*61046927SAndroid Build Coastguard Worker    } zsa;
629*61046927SAndroid Build Coastguard Worker    struct {
630*61046927SAndroid Build Coastguard Worker       float constants[4];
631*61046927SAndroid Build Coastguard Worker    } blend;
632*61046927SAndroid Build Coastguard Worker    D3D12_VIEWPORT viewports[MAX_VP];
633*61046927SAndroid Build Coastguard Worker    D3D12_RECT scissors[MAX_SCISSOR];
634*61046927SAndroid Build Coastguard Worker    struct {
635*61046927SAndroid Build Coastguard Worker       struct dzn_cmd_buffer_push_constant_state gfx, compute;
636*61046927SAndroid Build Coastguard Worker    } push_constant;
637*61046927SAndroid Build Coastguard Worker    uint32_t dirty;
638*61046927SAndroid Build Coastguard Worker    struct {
639*61046927SAndroid Build Coastguard Worker       struct dzn_pipeline *pipeline;
640*61046927SAndroid Build Coastguard Worker       ID3D12RootSignature *root_sig;
641*61046927SAndroid Build Coastguard Worker       struct dzn_descriptor_state desc_state;
642*61046927SAndroid Build Coastguard Worker       uint32_t dirty;
643*61046927SAndroid Build Coastguard Worker    } bindpoint[NUM_BIND_POINT];
644*61046927SAndroid Build Coastguard Worker    union {
645*61046927SAndroid Build Coastguard Worker       struct dxil_spirv_vertex_runtime_data gfx;
646*61046927SAndroid Build Coastguard Worker       struct dxil_spirv_compute_runtime_data compute;
647*61046927SAndroid Build Coastguard Worker    } sysvals;
648*61046927SAndroid Build Coastguard Worker    struct {
649*61046927SAndroid Build Coastguard Worker       uint32_t num_views;
650*61046927SAndroid Build Coastguard Worker       uint32_t view_mask;
651*61046927SAndroid Build Coastguard Worker    } multiview;
652*61046927SAndroid Build Coastguard Worker };
653*61046927SAndroid Build Coastguard Worker 
654*61046927SAndroid Build Coastguard Worker struct dzn_cmd_buffer_rtv_key {
655*61046927SAndroid Build Coastguard Worker    const struct dzn_image *image;
656*61046927SAndroid Build Coastguard Worker    D3D12_RENDER_TARGET_VIEW_DESC desc;
657*61046927SAndroid Build Coastguard Worker };
658*61046927SAndroid Build Coastguard Worker 
659*61046927SAndroid Build Coastguard Worker struct dzn_cmd_buffer_rtv_entry {
660*61046927SAndroid Build Coastguard Worker    struct dzn_cmd_buffer_rtv_key key;
661*61046927SAndroid Build Coastguard Worker    D3D12_CPU_DESCRIPTOR_HANDLE handle;
662*61046927SAndroid Build Coastguard Worker };
663*61046927SAndroid Build Coastguard Worker 
664*61046927SAndroid Build Coastguard Worker struct dzn_cmd_buffer_dsv_key {
665*61046927SAndroid Build Coastguard Worker    const struct dzn_image *image;
666*61046927SAndroid Build Coastguard Worker    D3D12_DEPTH_STENCIL_VIEW_DESC desc;
667*61046927SAndroid Build Coastguard Worker };
668*61046927SAndroid Build Coastguard Worker 
669*61046927SAndroid Build Coastguard Worker struct dzn_cmd_buffer_dsv_entry {
670*61046927SAndroid Build Coastguard Worker    struct dzn_cmd_buffer_dsv_key key;
671*61046927SAndroid Build Coastguard Worker    D3D12_CPU_DESCRIPTOR_HANDLE handle;
672*61046927SAndroid Build Coastguard Worker };
673*61046927SAndroid Build Coastguard Worker 
674*61046927SAndroid Build Coastguard Worker enum dzn_internal_buf_bucket {
675*61046927SAndroid Build Coastguard Worker    DZN_INTERNAL_BUF_UPLOAD,
676*61046927SAndroid Build Coastguard Worker    DZN_INTERNAL_BUF_DEFAULT,
677*61046927SAndroid Build Coastguard Worker    DZN_INTERNAL_BUF_BUCKET_COUNT,
678*61046927SAndroid Build Coastguard Worker };
679*61046927SAndroid Build Coastguard Worker 
680*61046927SAndroid Build Coastguard Worker struct dzn_cmd_buffer {
681*61046927SAndroid Build Coastguard Worker    struct vk_command_buffer vk;
682*61046927SAndroid Build Coastguard Worker    struct dzn_cmd_buffer_state state;
683*61046927SAndroid Build Coastguard Worker 
684*61046927SAndroid Build Coastguard Worker    struct {
685*61046927SAndroid Build Coastguard Worker       struct hash_table *ht;
686*61046927SAndroid Build Coastguard Worker       struct util_dynarray reset;
687*61046927SAndroid Build Coastguard Worker       struct util_dynarray signal;
688*61046927SAndroid Build Coastguard Worker    } queries;
689*61046927SAndroid Build Coastguard Worker 
690*61046927SAndroid Build Coastguard Worker    struct {
691*61046927SAndroid Build Coastguard Worker       struct hash_table *ht;
692*61046927SAndroid Build Coastguard Worker       struct util_dynarray signal;
693*61046927SAndroid Build Coastguard Worker    } events;
694*61046927SAndroid Build Coastguard Worker 
695*61046927SAndroid Build Coastguard Worker    struct {
696*61046927SAndroid Build Coastguard Worker       struct hash_table *ht;
697*61046927SAndroid Build Coastguard Worker       struct dzn_descriptor_heap_pool pool;
698*61046927SAndroid Build Coastguard Worker    } rtvs, dsvs;
699*61046927SAndroid Build Coastguard Worker 
700*61046927SAndroid Build Coastguard Worker    bool enhanced_barriers;
701*61046927SAndroid Build Coastguard Worker    struct hash_table *transition_barriers;
702*61046927SAndroid Build Coastguard Worker 
703*61046927SAndroid Build Coastguard Worker    struct dzn_descriptor_heap_pool cbv_srv_uav_pool, sampler_pool;
704*61046927SAndroid Build Coastguard Worker    D3D12_CPU_DESCRIPTOR_HANDLE null_rtv;
705*61046927SAndroid Build Coastguard Worker 
706*61046927SAndroid Build Coastguard Worker    struct list_head internal_bufs[DZN_INTERNAL_BUF_BUCKET_COUNT];
707*61046927SAndroid Build Coastguard Worker    struct dzn_internal_resource *cur_upload_buf;
708*61046927SAndroid Build Coastguard Worker    uint64_t cur_upload_buf_offset;
709*61046927SAndroid Build Coastguard Worker 
710*61046927SAndroid Build Coastguard Worker    ID3D12CommandAllocator *cmdalloc;
711*61046927SAndroid Build Coastguard Worker    ID3D12GraphicsCommandList1 *cmdlist;
712*61046927SAndroid Build Coastguard Worker    ID3D12GraphicsCommandList8 *cmdlist8;
713*61046927SAndroid Build Coastguard Worker    ID3D12GraphicsCommandList9 *cmdlist9;
714*61046927SAndroid Build Coastguard Worker 
715*61046927SAndroid Build Coastguard Worker    D3D12_COMMAND_LIST_TYPE type;
716*61046927SAndroid Build Coastguard Worker    D3D12_BARRIER_SYNC valid_sync;
717*61046927SAndroid Build Coastguard Worker    D3D12_BARRIER_ACCESS valid_access;
718*61046927SAndroid Build Coastguard Worker };
719*61046927SAndroid Build Coastguard Worker 
720*61046927SAndroid Build Coastguard Worker struct dxil_spirv_bindless_entry;
721*61046927SAndroid Build Coastguard Worker struct dzn_descriptor_pool {
722*61046927SAndroid Build Coastguard Worker    struct vk_object_base base;
723*61046927SAndroid Build Coastguard Worker    VkAllocationCallbacks alloc;
724*61046927SAndroid Build Coastguard Worker 
725*61046927SAndroid Build Coastguard Worker    uint32_t set_count;
726*61046927SAndroid Build Coastguard Worker    uint32_t used_set_count;
727*61046927SAndroid Build Coastguard Worker    struct dzn_descriptor_set *sets;
728*61046927SAndroid Build Coastguard Worker    union {
729*61046927SAndroid Build Coastguard Worker       struct dzn_descriptor_heap heaps[NUM_POOL_TYPES];
730*61046927SAndroid Build Coastguard Worker       struct {
731*61046927SAndroid Build Coastguard Worker          ID3D12Resource *buf;
732*61046927SAndroid Build Coastguard Worker          volatile struct dxil_spirv_bindless_entry *map;
733*61046927SAndroid Build Coastguard Worker          uint64_t gpuva;
734*61046927SAndroid Build Coastguard Worker       } bindless;
735*61046927SAndroid Build Coastguard Worker    };
736*61046927SAndroid Build Coastguard Worker    uint32_t desc_count[NUM_POOL_TYPES];
737*61046927SAndroid Build Coastguard Worker    uint32_t used_desc_count[NUM_POOL_TYPES];
738*61046927SAndroid Build Coastguard Worker    uint32_t free_offset[NUM_POOL_TYPES];
739*61046927SAndroid Build Coastguard Worker };
740*61046927SAndroid Build Coastguard Worker 
741*61046927SAndroid Build Coastguard Worker #define MAX_SHADER_VISIBILITIES (D3D12_SHADER_VISIBILITY_PIXEL + 1)
742*61046927SAndroid Build Coastguard Worker #define STATIC_SAMPLER_TAG (~0u - 1)
743*61046927SAndroid Build Coastguard Worker 
744*61046927SAndroid Build Coastguard Worker struct dzn_descriptor_set_layout_binding {
745*61046927SAndroid Build Coastguard Worker    VkDescriptorType type;
746*61046927SAndroid Build Coastguard Worker    uint32_t stages;
747*61046927SAndroid Build Coastguard Worker    D3D12_SHADER_VISIBILITY visibility;
748*61046927SAndroid Build Coastguard Worker    uint32_t base_shader_register;
749*61046927SAndroid Build Coastguard Worker    uint32_t range_idx[NUM_POOL_TYPES];
750*61046927SAndroid Build Coastguard Worker    union {
751*61046927SAndroid Build Coastguard Worker       /* For sampler types, index into the set layout's immutable sampler list,
752*61046927SAndroid Build Coastguard Worker        * or STATIC_SAMPLER_TAG for static samplers, or ~0 for dynamic samplers. */
753*61046927SAndroid Build Coastguard Worker       uint32_t immutable_sampler_idx;
754*61046927SAndroid Build Coastguard Worker       /* For dynamic buffer types, index into the set's dynamic buffer list.
755*61046927SAndroid Build Coastguard Worker        * For non-dynamic buffer types, index into the set's buffer descriptor slot list when bindless. */
756*61046927SAndroid Build Coastguard Worker       uint32_t buffer_idx;
757*61046927SAndroid Build Coastguard Worker    };
758*61046927SAndroid Build Coastguard Worker    bool variable_size;
759*61046927SAndroid Build Coastguard Worker };
760*61046927SAndroid Build Coastguard Worker 
761*61046927SAndroid Build Coastguard Worker struct dzn_descriptor_set_layout {
762*61046927SAndroid Build Coastguard Worker    struct vk_descriptor_set_layout vk;
763*61046927SAndroid Build Coastguard Worker 
764*61046927SAndroid Build Coastguard Worker    /* Ranges are bucketed by shader visibility so that each visibility can have
765*61046927SAndroid Build Coastguard Worker     * a single descriptor table in the root signature, with all ranges concatenated. */
766*61046927SAndroid Build Coastguard Worker    uint32_t range_count[MAX_SHADER_VISIBILITIES][NUM_POOL_TYPES];
767*61046927SAndroid Build Coastguard Worker    const D3D12_DESCRIPTOR_RANGE1 *ranges[MAX_SHADER_VISIBILITIES][NUM_POOL_TYPES];
768*61046927SAndroid Build Coastguard Worker 
769*61046927SAndroid Build Coastguard Worker    /* The number of descriptors across all ranges/visibilities for this type */
770*61046927SAndroid Build Coastguard Worker    uint32_t range_desc_count[NUM_POOL_TYPES];
771*61046927SAndroid Build Coastguard Worker 
772*61046927SAndroid Build Coastguard Worker    /* Static samplers actually go into the D3D12 root signature.
773*61046927SAndroid Build Coastguard Worker     * Immutable samplers are only stored here to be copied into descriptor tables later. */
774*61046927SAndroid Build Coastguard Worker    uint32_t static_sampler_count;
775*61046927SAndroid Build Coastguard Worker    const D3D12_STATIC_SAMPLER_DESC1 *static_samplers;
776*61046927SAndroid Build Coastguard Worker    uint32_t immutable_sampler_count;
777*61046927SAndroid Build Coastguard Worker    const struct dzn_sampler **immutable_samplers;
778*61046927SAndroid Build Coastguard Worker 
779*61046927SAndroid Build Coastguard Worker    struct {
780*61046927SAndroid Build Coastguard Worker       uint32_t bindings[MAX_DYNAMIC_BUFFERS];
781*61046927SAndroid Build Coastguard Worker       uint32_t count;
782*61046927SAndroid Build Coastguard Worker       uint32_t desc_count;
783*61046927SAndroid Build Coastguard Worker       uint32_t range_offset;
784*61046927SAndroid Build Coastguard Worker    } dynamic_buffers;
785*61046927SAndroid Build Coastguard Worker    uint32_t buffer_count;
786*61046927SAndroid Build Coastguard Worker    uint32_t stages;
787*61046927SAndroid Build Coastguard Worker 
788*61046927SAndroid Build Coastguard Worker    uint32_t binding_count;
789*61046927SAndroid Build Coastguard Worker    const struct dzn_descriptor_set_layout_binding *bindings;
790*61046927SAndroid Build Coastguard Worker };
791*61046927SAndroid Build Coastguard Worker 
792*61046927SAndroid Build Coastguard Worker struct dzn_descriptor_set {
793*61046927SAndroid Build Coastguard Worker    struct vk_object_base base;
794*61046927SAndroid Build Coastguard Worker    struct dzn_buffer_desc dynamic_buffers[MAX_DYNAMIC_BUFFERS];
795*61046927SAndroid Build Coastguard Worker    struct dzn_descriptor_pool *pool;
796*61046927SAndroid Build Coastguard Worker    /* The offset in the current active staging descriptor heap for the set's pool. */
797*61046927SAndroid Build Coastguard Worker    uint32_t heap_offsets[NUM_POOL_TYPES];
798*61046927SAndroid Build Coastguard Worker    /* The number of descriptors needed for this set */
799*61046927SAndroid Build Coastguard Worker    uint32_t heap_sizes[NUM_POOL_TYPES];
800*61046927SAndroid Build Coastguard Worker    /* Layout (and pool) is null for a freed descriptor set */
801*61046927SAndroid Build Coastguard Worker    const struct dzn_descriptor_set_layout *layout;
802*61046927SAndroid Build Coastguard Worker };
803*61046927SAndroid Build Coastguard Worker 
804*61046927SAndroid Build Coastguard Worker struct dzn_pipeline_layout_set {
805*61046927SAndroid Build Coastguard Worker    /* The offset from the start of a descriptor table where the set should be copied */
806*61046927SAndroid Build Coastguard Worker    uint32_t heap_offsets[NUM_POOL_TYPES];
807*61046927SAndroid Build Coastguard Worker    struct {
808*61046927SAndroid Build Coastguard Worker       uint32_t primary, alt;
809*61046927SAndroid Build Coastguard Worker    } dynamic_buffer_heap_offsets[MAX_DYNAMIC_BUFFERS];
810*61046927SAndroid Build Coastguard Worker    uint32_t dynamic_buffer_count;
811*61046927SAndroid Build Coastguard Worker    uint32_t range_desc_count[NUM_POOL_TYPES];
812*61046927SAndroid Build Coastguard Worker };
813*61046927SAndroid Build Coastguard Worker 
814*61046927SAndroid Build Coastguard Worker enum dzn_pipeline_binding_class {
815*61046927SAndroid Build Coastguard Worker    DZN_PIPELINE_BINDING_NORMAL,
816*61046927SAndroid Build Coastguard Worker    DZN_PIPELINE_BINDING_DYNAMIC_BUFFER,
817*61046927SAndroid Build Coastguard Worker    DZN_PIPELINE_BINDING_STATIC_SAMPLER,
818*61046927SAndroid Build Coastguard Worker };
819*61046927SAndroid Build Coastguard Worker 
820*61046927SAndroid Build Coastguard Worker struct dzn_pipeline_layout {
821*61046927SAndroid Build Coastguard Worker    struct vk_pipeline_layout vk;
822*61046927SAndroid Build Coastguard Worker    struct dzn_pipeline_layout_set sets[MAX_SETS];
823*61046927SAndroid Build Coastguard Worker    struct {
824*61046927SAndroid Build Coastguard Worker       uint32_t binding_count;
825*61046927SAndroid Build Coastguard Worker       /* A mapping from a binding value, which can be shared among multiple descriptors
826*61046927SAndroid Build Coastguard Worker        * in an array, to unique 0-based registers. This mapping is applied to the shaders
827*61046927SAndroid Build Coastguard Worker        * during pipeline creation. */
828*61046927SAndroid Build Coastguard Worker       uint32_t *base_reg;
829*61046927SAndroid Build Coastguard Worker       uint8_t *binding_class;
830*61046927SAndroid Build Coastguard Worker    } binding_translation[MAX_SETS];
831*61046927SAndroid Build Coastguard Worker    uint32_t set_count;
832*61046927SAndroid Build Coastguard Worker    /* How much space needs to be allocated to copy descriptors during cmdbuf recording? */
833*61046927SAndroid Build Coastguard Worker    uint32_t desc_count[NUM_POOL_TYPES];
834*61046927SAndroid Build Coastguard Worker    uint32_t dynamic_buffer_count;
835*61046927SAndroid Build Coastguard Worker    struct {
836*61046927SAndroid Build Coastguard Worker       uint32_t param_count;
837*61046927SAndroid Build Coastguard Worker       uint32_t sets_param_count;
838*61046927SAndroid Build Coastguard Worker       uint32_t sysval_cbv_param_idx;
839*61046927SAndroid Build Coastguard Worker       uint32_t push_constant_cbv_param_idx;
840*61046927SAndroid Build Coastguard Worker       uint32_t dynamic_buffer_bindless_param_idx;
841*61046927SAndroid Build Coastguard Worker       D3D12_DESCRIPTOR_HEAP_TYPE type[MAX_SHADER_VISIBILITIES];
842*61046927SAndroid Build Coastguard Worker       ID3D12RootSignature *sig;
843*61046927SAndroid Build Coastguard Worker    } root;
844*61046927SAndroid Build Coastguard Worker    struct {
845*61046927SAndroid Build Coastguard Worker       uint8_t hash[SHA1_DIGEST_LENGTH];
846*61046927SAndroid Build Coastguard Worker    } stages[MESA_VULKAN_SHADER_STAGES];
847*61046927SAndroid Build Coastguard Worker };
848*61046927SAndroid Build Coastguard Worker 
849*61046927SAndroid Build Coastguard Worker struct dzn_descriptor_update_template_entry {
850*61046927SAndroid Build Coastguard Worker    VkDescriptorType type;
851*61046927SAndroid Build Coastguard Worker    uint32_t desc_count;
852*61046927SAndroid Build Coastguard Worker    uint32_t buffer_idx;
853*61046927SAndroid Build Coastguard Worker    struct {
854*61046927SAndroid Build Coastguard Worker       uint32_t cbv_srv_uav;
855*61046927SAndroid Build Coastguard Worker       union {
856*61046927SAndroid Build Coastguard Worker          uint32_t sampler, extra_srv;
857*61046927SAndroid Build Coastguard Worker       };
858*61046927SAndroid Build Coastguard Worker    } heap_offsets;
859*61046927SAndroid Build Coastguard Worker    struct {
860*61046927SAndroid Build Coastguard Worker       size_t offset;
861*61046927SAndroid Build Coastguard Worker       size_t stride;
862*61046927SAndroid Build Coastguard Worker    } user_data;
863*61046927SAndroid Build Coastguard Worker };
864*61046927SAndroid Build Coastguard Worker 
865*61046927SAndroid Build Coastguard Worker struct dzn_descriptor_update_template {
866*61046927SAndroid Build Coastguard Worker    struct vk_object_base base;
867*61046927SAndroid Build Coastguard Worker    uint32_t entry_count;
868*61046927SAndroid Build Coastguard Worker    const struct dzn_descriptor_update_template_entry *entries;
869*61046927SAndroid Build Coastguard Worker };
870*61046927SAndroid Build Coastguard Worker 
871*61046927SAndroid Build Coastguard Worker enum dzn_register_space {
872*61046927SAndroid Build Coastguard Worker    DZN_REGISTER_SPACE_SYSVALS = MAX_SETS,
873*61046927SAndroid Build Coastguard Worker    DZN_REGISTER_SPACE_PUSH_CONSTANT,
874*61046927SAndroid Build Coastguard Worker };
875*61046927SAndroid Build Coastguard Worker 
876*61046927SAndroid Build Coastguard Worker #define D3D12_PIPELINE_STATE_STREAM_DESC_SIZE(__type) \
877*61046927SAndroid Build Coastguard Worker    ALIGN_POT(ALIGN_POT(sizeof(D3D12_PIPELINE_STATE_SUBOBJECT_TYPE), alignof(__type)) + sizeof(__type), alignof(void *))
878*61046927SAndroid Build Coastguard Worker 
879*61046927SAndroid Build Coastguard Worker static_assert(sizeof(D3D12_DEPTH_STENCIL_DESC2) > sizeof(D3D12_DEPTH_STENCIL_DESC1),
880*61046927SAndroid Build Coastguard Worker               "Using just one of these descs in the max size calculation");
881*61046927SAndroid Build Coastguard Worker static_assert(sizeof(D3D12_RASTERIZER_DESC) >= sizeof(D3D12_RASTERIZER_DESC1) &&
882*61046927SAndroid Build Coastguard Worker               sizeof(D3D12_RASTERIZER_DESC) >= sizeof(D3D12_RASTERIZER_DESC2),
883*61046927SAndroid Build Coastguard Worker               "Using just one of these descs in the max size calculation");
884*61046927SAndroid Build Coastguard Worker 
885*61046927SAndroid Build Coastguard Worker #define MAX_GFX_PIPELINE_STATE_STREAM_SIZE \
886*61046927SAndroid Build Coastguard Worker    D3D12_PIPELINE_STATE_STREAM_DESC_SIZE(ID3D12RootSignature *) + \
887*61046927SAndroid Build Coastguard Worker    (D3D12_PIPELINE_STATE_STREAM_DESC_SIZE(D3D12_SHADER_BYTECODE) * 5) + /* VS, PS, DS, HS, GS */ \
888*61046927SAndroid Build Coastguard Worker    D3D12_PIPELINE_STATE_STREAM_DESC_SIZE(D3D12_STREAM_OUTPUT_DESC) + \
889*61046927SAndroid Build Coastguard Worker    D3D12_PIPELINE_STATE_STREAM_DESC_SIZE(D3D12_BLEND_DESC) + \
890*61046927SAndroid Build Coastguard Worker    D3D12_PIPELINE_STATE_STREAM_DESC_SIZE(UINT) + /* SampleMask */ \
891*61046927SAndroid Build Coastguard Worker    D3D12_PIPELINE_STATE_STREAM_DESC_SIZE(D3D12_RASTERIZER_DESC) + \
892*61046927SAndroid Build Coastguard Worker    D3D12_PIPELINE_STATE_STREAM_DESC_SIZE(D3D12_INPUT_LAYOUT_DESC) + \
893*61046927SAndroid Build Coastguard Worker    D3D12_PIPELINE_STATE_STREAM_DESC_SIZE(D3D12_INDEX_BUFFER_STRIP_CUT_VALUE) + \
894*61046927SAndroid Build Coastguard Worker    D3D12_PIPELINE_STATE_STREAM_DESC_SIZE(D3D12_PRIMITIVE_TOPOLOGY_TYPE) + \
895*61046927SAndroid Build Coastguard Worker    D3D12_PIPELINE_STATE_STREAM_DESC_SIZE(struct D3D12_RT_FORMAT_ARRAY) + \
896*61046927SAndroid Build Coastguard Worker    D3D12_PIPELINE_STATE_STREAM_DESC_SIZE(DXGI_FORMAT) + /* DS format */ \
897*61046927SAndroid Build Coastguard Worker    D3D12_PIPELINE_STATE_STREAM_DESC_SIZE(DXGI_SAMPLE_DESC) + \
898*61046927SAndroid Build Coastguard Worker    D3D12_PIPELINE_STATE_STREAM_DESC_SIZE(D3D12_NODE_MASK) + \
899*61046927SAndroid Build Coastguard Worker    D3D12_PIPELINE_STATE_STREAM_DESC_SIZE(D3D12_CACHED_PIPELINE_STATE) + \
900*61046927SAndroid Build Coastguard Worker    D3D12_PIPELINE_STATE_STREAM_DESC_SIZE(D3D12_PIPELINE_STATE_FLAGS) + \
901*61046927SAndroid Build Coastguard Worker    D3D12_PIPELINE_STATE_STREAM_DESC_SIZE(D3D12_DEPTH_STENCIL_DESC2) + \
902*61046927SAndroid Build Coastguard Worker    D3D12_PIPELINE_STATE_STREAM_DESC_SIZE(D3D12_VIEW_INSTANCING_DESC) + \
903*61046927SAndroid Build Coastguard Worker    D3D12_PIPELINE_STATE_STREAM_DESC_SIZE(D3D12_PIPELINE_STATE_FLAGS)
904*61046927SAndroid Build Coastguard Worker 
905*61046927SAndroid Build Coastguard Worker #define MAX_COMPUTE_PIPELINE_STATE_STREAM_SIZE \
906*61046927SAndroid Build Coastguard Worker    D3D12_PIPELINE_STATE_STREAM_DESC_SIZE(ID3D12RootSignature *) + \
907*61046927SAndroid Build Coastguard Worker    D3D12_PIPELINE_STATE_STREAM_DESC_SIZE(D3D12_SHADER_BYTECODE) + \
908*61046927SAndroid Build Coastguard Worker    D3D12_PIPELINE_STATE_STREAM_DESC_SIZE(D3D12_CACHED_PIPELINE_STATE)
909*61046927SAndroid Build Coastguard Worker 
910*61046927SAndroid Build Coastguard Worker struct dzn_pipeline {
911*61046927SAndroid Build Coastguard Worker    struct vk_object_base base;
912*61046927SAndroid Build Coastguard Worker    VkPipelineBindPoint type;
913*61046927SAndroid Build Coastguard Worker    VkPipelineCreateFlags2KHR flags;
914*61046927SAndroid Build Coastguard Worker    struct dzn_device *device;
915*61046927SAndroid Build Coastguard Worker    struct {
916*61046927SAndroid Build Coastguard Worker       uint32_t sets_param_count;
917*61046927SAndroid Build Coastguard Worker       uint32_t sysval_cbv_param_idx;
918*61046927SAndroid Build Coastguard Worker       uint32_t push_constant_cbv_param_idx;
919*61046927SAndroid Build Coastguard Worker       uint32_t dynamic_buffer_bindless_param_idx;
920*61046927SAndroid Build Coastguard Worker       D3D12_DESCRIPTOR_HEAP_TYPE type[MAX_SHADER_VISIBILITIES];
921*61046927SAndroid Build Coastguard Worker       ID3D12RootSignature *sig;
922*61046927SAndroid Build Coastguard Worker    } root;
923*61046927SAndroid Build Coastguard Worker    struct dzn_pipeline_layout_set sets[MAX_SETS];
924*61046927SAndroid Build Coastguard Worker    uint32_t set_count;
925*61046927SAndroid Build Coastguard Worker    uint32_t desc_count[NUM_POOL_TYPES];
926*61046927SAndroid Build Coastguard Worker    uint32_t dynamic_buffer_count;
927*61046927SAndroid Build Coastguard Worker    ID3D12PipelineState *state;
928*61046927SAndroid Build Coastguard Worker };
929*61046927SAndroid Build Coastguard Worker 
930*61046927SAndroid Build Coastguard Worker extern const struct vk_pipeline_cache_object_ops dzn_cached_blob_ops;
931*61046927SAndroid Build Coastguard Worker 
932*61046927SAndroid Build Coastguard Worker struct dzn_indirect_draw_cmd_sig_key {
933*61046927SAndroid Build Coastguard Worker    union {
934*61046927SAndroid Build Coastguard Worker       struct {
935*61046927SAndroid Build Coastguard Worker          uint8_t indexed : 1;
936*61046927SAndroid Build Coastguard Worker          uint8_t draw_params : 1;
937*61046927SAndroid Build Coastguard Worker          uint8_t draw_id : 1;
938*61046927SAndroid Build Coastguard Worker          uint8_t triangle_fan : 1;
939*61046927SAndroid Build Coastguard Worker       };
940*61046927SAndroid Build Coastguard Worker       uint8_t value;
941*61046927SAndroid Build Coastguard Worker    };
942*61046927SAndroid Build Coastguard Worker 
943*61046927SAndroid Build Coastguard Worker    uint8_t padding[3];
944*61046927SAndroid Build Coastguard Worker    uint32_t custom_stride;
945*61046927SAndroid Build Coastguard Worker };
946*61046927SAndroid Build Coastguard Worker #define DZN_NUM_INDIRECT_DRAW_CMD_SIGS (1 << 4)
947*61046927SAndroid Build Coastguard Worker 
948*61046927SAndroid Build Coastguard Worker struct dzn_graphics_pipeline {
949*61046927SAndroid Build Coastguard Worker    struct dzn_pipeline base;
950*61046927SAndroid Build Coastguard Worker    struct {
951*61046927SAndroid Build Coastguard Worker       unsigned count;
952*61046927SAndroid Build Coastguard Worker       uint32_t strides[MAX_VBS];
953*61046927SAndroid Build Coastguard Worker    } vb;
954*61046927SAndroid Build Coastguard Worker 
955*61046927SAndroid Build Coastguard Worker    struct {
956*61046927SAndroid Build Coastguard Worker       bool triangle_fan;
957*61046927SAndroid Build Coastguard Worker       D3D_PRIMITIVE_TOPOLOGY topology;
958*61046927SAndroid Build Coastguard Worker    } ia;
959*61046927SAndroid Build Coastguard Worker 
960*61046927SAndroid Build Coastguard Worker    struct {
961*61046927SAndroid Build Coastguard Worker       unsigned count;
962*61046927SAndroid Build Coastguard Worker       bool dynamic;
963*61046927SAndroid Build Coastguard Worker       D3D12_VIEWPORT desc[MAX_VP];
964*61046927SAndroid Build Coastguard Worker    } vp;
965*61046927SAndroid Build Coastguard Worker 
966*61046927SAndroid Build Coastguard Worker    struct {
967*61046927SAndroid Build Coastguard Worker       unsigned count;
968*61046927SAndroid Build Coastguard Worker       bool dynamic;
969*61046927SAndroid Build Coastguard Worker       D3D12_RECT desc[MAX_SCISSOR];
970*61046927SAndroid Build Coastguard Worker    } scissor;
971*61046927SAndroid Build Coastguard Worker 
972*61046927SAndroid Build Coastguard Worker    struct {
973*61046927SAndroid Build Coastguard Worker       struct {
974*61046927SAndroid Build Coastguard Worker          bool enable;
975*61046927SAndroid Build Coastguard Worker          bool dynamic_ref;
976*61046927SAndroid Build Coastguard Worker          bool dynamic_write_mask;
977*61046927SAndroid Build Coastguard Worker          bool dynamic_compare_mask;
978*61046927SAndroid Build Coastguard Worker          struct {
979*61046927SAndroid Build Coastguard Worker             uint32_t ref;
980*61046927SAndroid Build Coastguard Worker             uint32_t write_mask;
981*61046927SAndroid Build Coastguard Worker             uint32_t compare_mask;
982*61046927SAndroid Build Coastguard Worker             bool uses_ref;
983*61046927SAndroid Build Coastguard Worker         } front, back;
984*61046927SAndroid Build Coastguard Worker       } stencil_test;
985*61046927SAndroid Build Coastguard Worker       struct {
986*61046927SAndroid Build Coastguard Worker          bool enable;
987*61046927SAndroid Build Coastguard Worker          bool dynamic;
988*61046927SAndroid Build Coastguard Worker          float min, max;
989*61046927SAndroid Build Coastguard Worker       } depth_bounds;
990*61046927SAndroid Build Coastguard Worker       bool dynamic_depth_bias;
991*61046927SAndroid Build Coastguard Worker       DXGI_FORMAT ds_fmt;
992*61046927SAndroid Build Coastguard Worker    } zsa;
993*61046927SAndroid Build Coastguard Worker 
994*61046927SAndroid Build Coastguard Worker    struct {
995*61046927SAndroid Build Coastguard Worker       bool dynamic_constants;
996*61046927SAndroid Build Coastguard Worker       float constants[4];
997*61046927SAndroid Build Coastguard Worker    } blend;
998*61046927SAndroid Build Coastguard Worker 
999*61046927SAndroid Build Coastguard Worker    bool rast_disabled_from_missing_position;
1000*61046927SAndroid Build Coastguard Worker    bool use_gs_for_polygon_mode_point;
1001*61046927SAndroid Build Coastguard Worker    bool needs_draw_sysvals;
1002*61046927SAndroid Build Coastguard Worker 
1003*61046927SAndroid Build Coastguard Worker    struct {
1004*61046927SAndroid Build Coastguard Worker       uint32_t view_mask;
1005*61046927SAndroid Build Coastguard Worker       bool native_view_instancing;
1006*61046927SAndroid Build Coastguard Worker    } multiview;
1007*61046927SAndroid Build Coastguard Worker 
1008*61046927SAndroid Build Coastguard Worker    struct {
1009*61046927SAndroid Build Coastguard Worker       uintptr_t stream_buf[MAX_GFX_PIPELINE_STATE_STREAM_SIZE / sizeof(uintptr_t)];
1010*61046927SAndroid Build Coastguard Worker       D3D12_PIPELINE_STATE_STREAM_DESC stream_desc;
1011*61046927SAndroid Build Coastguard Worker       struct {
1012*61046927SAndroid Build Coastguard Worker          uint32_t ib_strip_cut;
1013*61046927SAndroid Build Coastguard Worker          uint32_t rast;
1014*61046927SAndroid Build Coastguard Worker          uint32_t ds;
1015*61046927SAndroid Build Coastguard Worker       } desc_offsets;
1016*61046927SAndroid Build Coastguard Worker       D3D12_INPUT_ELEMENT_DESC inputs[D3D12_VS_INPUT_REGISTER_COUNT];
1017*61046927SAndroid Build Coastguard Worker       struct {
1018*61046927SAndroid Build Coastguard Worker          D3D12_SHADER_BYTECODE *bc;
1019*61046927SAndroid Build Coastguard Worker          nir_shader *nir;
1020*61046927SAndroid Build Coastguard Worker       } shaders[MESA_VULKAN_SHADER_STAGES];
1021*61046927SAndroid Build Coastguard Worker    } templates;
1022*61046927SAndroid Build Coastguard Worker 
1023*61046927SAndroid Build Coastguard Worker    struct hash_table *variants;
1024*61046927SAndroid Build Coastguard Worker 
1025*61046927SAndroid Build Coastguard Worker    ID3D12CommandSignature *indirect_cmd_sigs[DZN_NUM_INDIRECT_DRAW_CMD_SIGS];
1026*61046927SAndroid Build Coastguard Worker    struct hash_table *custom_stride_cmd_sigs;
1027*61046927SAndroid Build Coastguard Worker };
1028*61046927SAndroid Build Coastguard Worker 
1029*61046927SAndroid Build Coastguard Worker #define dzn_graphics_pipeline_get_desc(pipeline, streambuf, name) \
1030*61046927SAndroid Build Coastguard Worker    (void *)(pipeline->templates.desc_offsets.name == 0 ? NULL : \
1031*61046927SAndroid Build Coastguard Worker             (uint8_t *)streambuf + pipeline->templates.desc_offsets.name)
1032*61046927SAndroid Build Coastguard Worker 
1033*61046927SAndroid Build Coastguard Worker #define dzn_graphics_pipeline_get_desc_template(pipeline, name) \
1034*61046927SAndroid Build Coastguard Worker    (const void *)dzn_graphics_pipeline_get_desc(pipeline, pipeline->templates.stream_buf, name)
1035*61046927SAndroid Build Coastguard Worker 
1036*61046927SAndroid Build Coastguard Worker ID3D12PipelineState *
1037*61046927SAndroid Build Coastguard Worker dzn_graphics_pipeline_get_state(struct dzn_graphics_pipeline *pipeline,
1038*61046927SAndroid Build Coastguard Worker                                 const struct dzn_graphics_pipeline_variant_key *key);
1039*61046927SAndroid Build Coastguard Worker 
1040*61046927SAndroid Build Coastguard Worker ID3D12CommandSignature *
1041*61046927SAndroid Build Coastguard Worker dzn_graphics_pipeline_get_indirect_cmd_sig(struct dzn_graphics_pipeline *pipeline,
1042*61046927SAndroid Build Coastguard Worker                                            struct dzn_indirect_draw_cmd_sig_key key);
1043*61046927SAndroid Build Coastguard Worker 
1044*61046927SAndroid Build Coastguard Worker VkFormat dzn_graphics_pipeline_patch_vi_format(VkFormat format);
1045*61046927SAndroid Build Coastguard Worker 
1046*61046927SAndroid Build Coastguard Worker struct dzn_compute_pipeline {
1047*61046927SAndroid Build Coastguard Worker    struct dzn_pipeline base;
1048*61046927SAndroid Build Coastguard Worker    struct {
1049*61046927SAndroid Build Coastguard Worker       uint32_t x, y, z;
1050*61046927SAndroid Build Coastguard Worker    } local_size;
1051*61046927SAndroid Build Coastguard Worker 
1052*61046927SAndroid Build Coastguard Worker    ID3D12CommandSignature *indirect_cmd_sig;
1053*61046927SAndroid Build Coastguard Worker };
1054*61046927SAndroid Build Coastguard Worker 
1055*61046927SAndroid Build Coastguard Worker ID3D12CommandSignature *
1056*61046927SAndroid Build Coastguard Worker dzn_compute_pipeline_get_indirect_cmd_sig(struct dzn_compute_pipeline *pipeline);
1057*61046927SAndroid Build Coastguard Worker 
1058*61046927SAndroid Build Coastguard Worker #define MAX_MIP_LEVELS 14
1059*61046927SAndroid Build Coastguard Worker 
1060*61046927SAndroid Build Coastguard Worker struct dzn_image {
1061*61046927SAndroid Build Coastguard Worker    struct vk_image vk;
1062*61046927SAndroid Build Coastguard Worker 
1063*61046927SAndroid Build Coastguard Worker    struct {
1064*61046927SAndroid Build Coastguard Worker       uint32_t row_stride;
1065*61046927SAndroid Build Coastguard Worker       uint32_t size;
1066*61046927SAndroid Build Coastguard Worker    } linear;
1067*61046927SAndroid Build Coastguard Worker    D3D12_RESOURCE_DESC desc;
1068*61046927SAndroid Build Coastguard Worker    ID3D12Resource *res;
1069*61046927SAndroid Build Coastguard Worker    struct dzn_device_memory *mem;
1070*61046927SAndroid Build Coastguard Worker    uint32_t castable_format_count;
1071*61046927SAndroid Build Coastguard Worker    const DXGI_FORMAT *castable_formats;
1072*61046927SAndroid Build Coastguard Worker 
1073*61046927SAndroid Build Coastguard Worker    D3D12_BARRIER_ACCESS valid_access;
1074*61046927SAndroid Build Coastguard Worker };
1075*61046927SAndroid Build Coastguard Worker 
1076*61046927SAndroid Build Coastguard Worker bool
1077*61046927SAndroid Build Coastguard Worker dzn_image_formats_are_compatible(const struct dzn_device *device,
1078*61046927SAndroid Build Coastguard Worker                                  VkFormat orig_fmt, VkFormat new_fmt,
1079*61046927SAndroid Build Coastguard Worker                                  VkImageUsageFlags usage,
1080*61046927SAndroid Build Coastguard Worker                                  VkImageAspectFlagBits aspect);
1081*61046927SAndroid Build Coastguard Worker 
1082*61046927SAndroid Build Coastguard Worker void
1083*61046927SAndroid Build Coastguard Worker dzn_image_align_extent(const struct dzn_image *image,
1084*61046927SAndroid Build Coastguard Worker                        VkExtent3D *extent);
1085*61046927SAndroid Build Coastguard Worker 
1086*61046927SAndroid Build Coastguard Worker DXGI_FORMAT
1087*61046927SAndroid Build Coastguard Worker dzn_image_get_dxgi_format(const struct dzn_physical_device *pdev,
1088*61046927SAndroid Build Coastguard Worker                           VkFormat format,
1089*61046927SAndroid Build Coastguard Worker                           VkImageUsageFlags usage,
1090*61046927SAndroid Build Coastguard Worker                           VkImageAspectFlags aspects);
1091*61046927SAndroid Build Coastguard Worker 
1092*61046927SAndroid Build Coastguard Worker VkFormat
1093*61046927SAndroid Build Coastguard Worker dzn_image_get_plane_format(VkFormat fmt, VkImageAspectFlags aspect);
1094*61046927SAndroid Build Coastguard Worker 
1095*61046927SAndroid Build Coastguard Worker DXGI_FORMAT
1096*61046927SAndroid Build Coastguard Worker dzn_image_get_placed_footprint_format(const struct dzn_physical_device *pdev,
1097*61046927SAndroid Build Coastguard Worker                                       VkFormat fmt, VkImageAspectFlags aspect);
1098*61046927SAndroid Build Coastguard Worker 
1099*61046927SAndroid Build Coastguard Worker D3D12_DEPTH_STENCIL_VIEW_DESC
1100*61046927SAndroid Build Coastguard Worker dzn_image_get_dsv_desc(const struct dzn_image *image,
1101*61046927SAndroid Build Coastguard Worker                        const VkImageSubresourceRange *range,
1102*61046927SAndroid Build Coastguard Worker                        uint32_t level);
1103*61046927SAndroid Build Coastguard Worker 
1104*61046927SAndroid Build Coastguard Worker D3D12_RENDER_TARGET_VIEW_DESC
1105*61046927SAndroid Build Coastguard Worker dzn_image_get_rtv_desc(const struct dzn_image *image,
1106*61046927SAndroid Build Coastguard Worker                        const VkImageSubresourceRange *range,
1107*61046927SAndroid Build Coastguard Worker                        uint32_t level);
1108*61046927SAndroid Build Coastguard Worker 
1109*61046927SAndroid Build Coastguard Worker D3D12_RESOURCE_STATES
1110*61046927SAndroid Build Coastguard Worker dzn_image_layout_to_state(const struct dzn_image *image,
1111*61046927SAndroid Build Coastguard Worker                           VkImageLayout layout,
1112*61046927SAndroid Build Coastguard Worker                           VkImageAspectFlagBits aspect,
1113*61046927SAndroid Build Coastguard Worker                           D3D12_COMMAND_LIST_TYPE type);
1114*61046927SAndroid Build Coastguard Worker 
1115*61046927SAndroid Build Coastguard Worker D3D12_BARRIER_LAYOUT
1116*61046927SAndroid Build Coastguard Worker dzn_vk_layout_to_d3d_layout(VkImageLayout layout,
1117*61046927SAndroid Build Coastguard Worker                             D3D12_COMMAND_LIST_TYPE type,
1118*61046927SAndroid Build Coastguard Worker                             VkImageAspectFlags aspect);
1119*61046927SAndroid Build Coastguard Worker 
1120*61046927SAndroid Build Coastguard Worker uint32_t
1121*61046927SAndroid Build Coastguard Worker dzn_image_layers_get_subresource_index(const struct dzn_image *image,
1122*61046927SAndroid Build Coastguard Worker                                        const VkImageSubresourceLayers *subres,
1123*61046927SAndroid Build Coastguard Worker                                        VkImageAspectFlagBits aspect,
1124*61046927SAndroid Build Coastguard Worker                                        uint32_t layer);
1125*61046927SAndroid Build Coastguard Worker uint32_t
1126*61046927SAndroid Build Coastguard Worker dzn_image_range_get_subresource_index(const struct dzn_image *image,
1127*61046927SAndroid Build Coastguard Worker                                       const VkImageSubresourceRange *range,
1128*61046927SAndroid Build Coastguard Worker                                       VkImageAspectFlagBits aspect,
1129*61046927SAndroid Build Coastguard Worker                                       uint32_t level, uint32_t layer);
1130*61046927SAndroid Build Coastguard Worker 
1131*61046927SAndroid Build Coastguard Worker D3D12_TEXTURE_COPY_LOCATION
1132*61046927SAndroid Build Coastguard Worker dzn_image_get_copy_loc(const struct dzn_image *image,
1133*61046927SAndroid Build Coastguard Worker                        const VkImageSubresourceLayers *layers,
1134*61046927SAndroid Build Coastguard Worker                        VkImageAspectFlagBits aspect,
1135*61046927SAndroid Build Coastguard Worker                        uint32_t layer);
1136*61046927SAndroid Build Coastguard Worker 
1137*61046927SAndroid Build Coastguard Worker struct dzn_image_view {
1138*61046927SAndroid Build Coastguard Worker    struct vk_image_view vk;
1139*61046927SAndroid Build Coastguard Worker    D3D12_SHADER_RESOURCE_VIEW_DESC srv_desc;
1140*61046927SAndroid Build Coastguard Worker    D3D12_UNORDERED_ACCESS_VIEW_DESC uav_desc;
1141*61046927SAndroid Build Coastguard Worker    D3D12_RENDER_TARGET_VIEW_DESC rtv_desc;
1142*61046927SAndroid Build Coastguard Worker    D3D12_DEPTH_STENCIL_VIEW_DESC dsv_desc;
1143*61046927SAndroid Build Coastguard Worker    int srv_bindless_slot;
1144*61046927SAndroid Build Coastguard Worker    int uav_bindless_slot;
1145*61046927SAndroid Build Coastguard Worker };
1146*61046927SAndroid Build Coastguard Worker 
1147*61046927SAndroid Build Coastguard Worker void
1148*61046927SAndroid Build Coastguard Worker dzn_image_view_init(struct dzn_device *device,
1149*61046927SAndroid Build Coastguard Worker                     struct dzn_image_view *iview,
1150*61046927SAndroid Build Coastguard Worker                     const VkImageViewCreateInfo *info);
1151*61046927SAndroid Build Coastguard Worker 
1152*61046927SAndroid Build Coastguard Worker void
1153*61046927SAndroid Build Coastguard Worker dzn_image_view_finish(struct dzn_image_view *iview);
1154*61046927SAndroid Build Coastguard Worker 
1155*61046927SAndroid Build Coastguard Worker struct dzn_buffer {
1156*61046927SAndroid Build Coastguard Worker    struct vk_object_base base;
1157*61046927SAndroid Build Coastguard Worker 
1158*61046927SAndroid Build Coastguard Worker    VkDeviceSize size;
1159*61046927SAndroid Build Coastguard Worker 
1160*61046927SAndroid Build Coastguard Worker    D3D12_RESOURCE_DESC desc;
1161*61046927SAndroid Build Coastguard Worker    ID3D12Resource *res;
1162*61046927SAndroid Build Coastguard Worker 
1163*61046927SAndroid Build Coastguard Worker    VkBufferCreateFlags create_flags;
1164*61046927SAndroid Build Coastguard Worker    VkBufferUsageFlags usage;
1165*61046927SAndroid Build Coastguard Worker    bool shared;
1166*61046927SAndroid Build Coastguard Worker 
1167*61046927SAndroid Build Coastguard Worker    D3D12_BARRIER_ACCESS valid_access;
1168*61046927SAndroid Build Coastguard Worker    D3D12_GPU_VIRTUAL_ADDRESS gpuva;
1169*61046927SAndroid Build Coastguard Worker 
1170*61046927SAndroid Build Coastguard Worker    mtx_t bindless_view_lock;
1171*61046927SAndroid Build Coastguard Worker    int cbv_bindless_slot;
1172*61046927SAndroid Build Coastguard Worker    int uav_bindless_slot;
1173*61046927SAndroid Build Coastguard Worker    struct hash_table *custom_views;
1174*61046927SAndroid Build Coastguard Worker };
1175*61046927SAndroid Build Coastguard Worker 
1176*61046927SAndroid Build Coastguard Worker void
1177*61046927SAndroid Build Coastguard Worker dzn_buffer_get_bindless_buffer_descriptor(struct dzn_device *device,
1178*61046927SAndroid Build Coastguard Worker                                           const struct dzn_buffer_desc *bdesc,
1179*61046927SAndroid Build Coastguard Worker                                           volatile struct dxil_spirv_bindless_entry *out);
1180*61046927SAndroid Build Coastguard Worker 
1181*61046927SAndroid Build Coastguard Worker DXGI_FORMAT
1182*61046927SAndroid Build Coastguard Worker dzn_buffer_get_dxgi_format(VkFormat format);
1183*61046927SAndroid Build Coastguard Worker 
1184*61046927SAndroid Build Coastguard Worker D3D12_TEXTURE_COPY_LOCATION
1185*61046927SAndroid Build Coastguard Worker dzn_buffer_get_copy_loc(const struct dzn_buffer *buf, VkFormat format,
1186*61046927SAndroid Build Coastguard Worker                         const VkBufferImageCopy2 *info,
1187*61046927SAndroid Build Coastguard Worker                         VkImageAspectFlagBits aspect,
1188*61046927SAndroid Build Coastguard Worker                         uint32_t layer);
1189*61046927SAndroid Build Coastguard Worker 
1190*61046927SAndroid Build Coastguard Worker D3D12_TEXTURE_COPY_LOCATION
1191*61046927SAndroid Build Coastguard Worker dzn_buffer_get_line_copy_loc(const struct dzn_buffer *buf, VkFormat format,
1192*61046927SAndroid Build Coastguard Worker                              const VkBufferImageCopy2 *region,
1193*61046927SAndroid Build Coastguard Worker                              const D3D12_TEXTURE_COPY_LOCATION *loc,
1194*61046927SAndroid Build Coastguard Worker                              uint32_t y, uint32_t z, uint32_t *start_x);
1195*61046927SAndroid Build Coastguard Worker 
1196*61046927SAndroid Build Coastguard Worker bool
1197*61046927SAndroid Build Coastguard Worker dzn_buffer_supports_region_copy(struct dzn_physical_device *pdev,
1198*61046927SAndroid Build Coastguard Worker                                 const D3D12_TEXTURE_COPY_LOCATION *loc);
1199*61046927SAndroid Build Coastguard Worker 
1200*61046927SAndroid Build Coastguard Worker struct dzn_buffer_view {
1201*61046927SAndroid Build Coastguard Worker    struct vk_object_base base;
1202*61046927SAndroid Build Coastguard Worker 
1203*61046927SAndroid Build Coastguard Worker    const struct dzn_buffer *buffer;
1204*61046927SAndroid Build Coastguard Worker 
1205*61046927SAndroid Build Coastguard Worker    D3D12_SHADER_RESOURCE_VIEW_DESC srv_desc;
1206*61046927SAndroid Build Coastguard Worker    D3D12_UNORDERED_ACCESS_VIEW_DESC uav_desc;
1207*61046927SAndroid Build Coastguard Worker    int srv_bindless_slot;
1208*61046927SAndroid Build Coastguard Worker    int uav_bindless_slot;
1209*61046927SAndroid Build Coastguard Worker };
1210*61046927SAndroid Build Coastguard Worker 
1211*61046927SAndroid Build Coastguard Worker struct dzn_sampler {
1212*61046927SAndroid Build Coastguard Worker    struct vk_object_base base;
1213*61046927SAndroid Build Coastguard Worker    D3D12_SAMPLER_DESC2 desc;
1214*61046927SAndroid Build Coastguard Worker    D3D12_STATIC_BORDER_COLOR static_border_color;
1215*61046927SAndroid Build Coastguard Worker    int bindless_slot;
1216*61046927SAndroid Build Coastguard Worker };
1217*61046927SAndroid Build Coastguard Worker 
1218*61046927SAndroid Build Coastguard Worker /* This is defined as a macro so that it works for both
1219*61046927SAndroid Build Coastguard Worker  * VkImageSubresourceRange and VkImageSubresourceLayers
1220*61046927SAndroid Build Coastguard Worker  */
1221*61046927SAndroid Build Coastguard Worker #define dzn_get_layer_count(_image, _range) \
1222*61046927SAndroid Build Coastguard Worker    ((_range)->layerCount == VK_REMAINING_ARRAY_LAYERS ? \
1223*61046927SAndroid Build Coastguard Worker     (_image)->vk.array_layers - (_range)->baseArrayLayer : (_range)->layerCount)
1224*61046927SAndroid Build Coastguard Worker 
1225*61046927SAndroid Build Coastguard Worker #define dzn_get_level_count(_image, _range) \
1226*61046927SAndroid Build Coastguard Worker    ((_range)->levelCount == VK_REMAINING_MIP_LEVELS ? \
1227*61046927SAndroid Build Coastguard Worker     (_image)->vk.mip_levels - (_range)->baseMipLevel : (_range)->levelCount)
1228*61046927SAndroid Build Coastguard Worker 
1229*61046927SAndroid Build Coastguard Worker DXGI_FORMAT dzn_pipe_to_dxgi_format(enum pipe_format in);
1230*61046927SAndroid Build Coastguard Worker DXGI_FORMAT dzn_get_typeless_dxgi_format(DXGI_FORMAT in);
1231*61046927SAndroid Build Coastguard Worker D3D12_FILTER dzn_translate_sampler_filter(const struct dzn_physical_device *pdev,
1232*61046927SAndroid Build Coastguard Worker                                           const VkSamplerCreateInfo *create_info);
1233*61046927SAndroid Build Coastguard Worker D3D12_COMPARISON_FUNC dzn_translate_compare_op(VkCompareOp in);
1234*61046927SAndroid Build Coastguard Worker void dzn_translate_viewport(D3D12_VIEWPORT *out, const VkViewport *in);
1235*61046927SAndroid Build Coastguard Worker void dzn_translate_rect(D3D12_RECT *out, const VkRect2D *in);
1236*61046927SAndroid Build Coastguard Worker 
1237*61046927SAndroid Build Coastguard Worker #define dzn_foreach_aspect(aspect, mask) \
1238*61046927SAndroid Build Coastguard Worker         for (VkImageAspectFlagBits aspect = VK_IMAGE_ASPECT_COLOR_BIT; \
1239*61046927SAndroid Build Coastguard Worker              aspect <= VK_IMAGE_ASPECT_STENCIL_BIT; \
1240*61046927SAndroid Build Coastguard Worker              aspect = (VkImageAspectFlagBits)(aspect << 1)) \
1241*61046927SAndroid Build Coastguard Worker            if (mask & aspect)
1242*61046927SAndroid Build Coastguard Worker 
1243*61046927SAndroid Build Coastguard Worker VkResult dzn_wsi_init(struct dzn_physical_device *physical_device);
1244*61046927SAndroid Build Coastguard Worker void dzn_wsi_finish(struct dzn_physical_device *physical_device);
1245*61046927SAndroid Build Coastguard Worker 
1246*61046927SAndroid Build Coastguard Worker struct dzn_app_info {
1247*61046927SAndroid Build Coastguard Worker    const char *app_name;
1248*61046927SAndroid Build Coastguard Worker    uint32_t app_version;
1249*61046927SAndroid Build Coastguard Worker    const char *engine_name;
1250*61046927SAndroid Build Coastguard Worker    uint32_t engine_version;
1251*61046927SAndroid Build Coastguard Worker    uint32_t api_version;
1252*61046927SAndroid Build Coastguard Worker };
1253*61046927SAndroid Build Coastguard Worker 
1254*61046927SAndroid Build Coastguard Worker enum dzn_debug_flags {
1255*61046927SAndroid Build Coastguard Worker    DZN_DEBUG_SYNC = 1 << 0,
1256*61046927SAndroid Build Coastguard Worker    DZN_DEBUG_NIR = 1 << 1,
1257*61046927SAndroid Build Coastguard Worker    DZN_DEBUG_DXIL = 1 << 2,
1258*61046927SAndroid Build Coastguard Worker    DZN_DEBUG_WARP = 1 << 3,
1259*61046927SAndroid Build Coastguard Worker    DZN_DEBUG_INTERNAL = 1 << 4,
1260*61046927SAndroid Build Coastguard Worker    DZN_DEBUG_SIG = 1 << 5,
1261*61046927SAndroid Build Coastguard Worker    DZN_DEBUG_GBV = 1 << 6,
1262*61046927SAndroid Build Coastguard Worker    DZN_DEBUG_D3D12 = 1 << 7,
1263*61046927SAndroid Build Coastguard Worker    DZN_DEBUG_DEBUGGER = 1 << 8,
1264*61046927SAndroid Build Coastguard Worker    DZN_DEBUG_REDIRECTS = 1 << 9,
1265*61046927SAndroid Build Coastguard Worker    DZN_DEBUG_BINDLESS = 1 << 10,
1266*61046927SAndroid Build Coastguard Worker    DZN_DEBUG_NO_BINDLESS = 1 << 11,
1267*61046927SAndroid Build Coastguard Worker    DZN_DEBUG_EXPERIMENTAL = 1 << 12,
1268*61046927SAndroid Build Coastguard Worker    DZN_DEBUG_MULTIVIEW = 1 << 13,
1269*61046927SAndroid Build Coastguard Worker };
1270*61046927SAndroid Build Coastguard Worker 
1271*61046927SAndroid Build Coastguard Worker struct dzn_instance {
1272*61046927SAndroid Build Coastguard Worker    struct vk_instance vk;
1273*61046927SAndroid Build Coastguard Worker 
1274*61046927SAndroid Build Coastguard Worker    struct dxil_validator *dxil_validator;
1275*61046927SAndroid Build Coastguard Worker    struct util_dl_library *d3d12_mod;
1276*61046927SAndroid Build Coastguard Worker    ID3D12DeviceFactory *factory;
1277*61046927SAndroid Build Coastguard Worker    struct {
1278*61046927SAndroid Build Coastguard Worker       PFN_D3D12_SERIALIZE_VERSIONED_ROOT_SIGNATURE serialize_root_sig;
1279*61046927SAndroid Build Coastguard Worker    } d3d12;
1280*61046927SAndroid Build Coastguard Worker    uint32_t debug_flags;
1281*61046927SAndroid Build Coastguard Worker 
1282*61046927SAndroid Build Coastguard Worker    struct vk_sync_binary_type sync_binary_type;
1283*61046927SAndroid Build Coastguard Worker 
1284*61046927SAndroid Build Coastguard Worker    struct driOptionCache dri_options;
1285*61046927SAndroid Build Coastguard Worker    struct driOptionCache available_dri_options;
1286*61046927SAndroid Build Coastguard Worker };
1287*61046927SAndroid Build Coastguard Worker 
1288*61046927SAndroid Build Coastguard Worker struct dzn_event {
1289*61046927SAndroid Build Coastguard Worker    struct vk_object_base base;
1290*61046927SAndroid Build Coastguard Worker    ID3D12Fence *fence;
1291*61046927SAndroid Build Coastguard Worker };
1292*61046927SAndroid Build Coastguard Worker 
1293*61046927SAndroid Build Coastguard Worker struct dzn_sync {
1294*61046927SAndroid Build Coastguard Worker    struct vk_sync vk;
1295*61046927SAndroid Build Coastguard Worker    ID3D12Fence *fence;
1296*61046927SAndroid Build Coastguard Worker    HANDLE export_handle;
1297*61046927SAndroid Build Coastguard Worker };
1298*61046927SAndroid Build Coastguard Worker 
1299*61046927SAndroid Build Coastguard Worker extern const struct vk_sync_type dzn_sync_type;
1300*61046927SAndroid Build Coastguard Worker 
1301*61046927SAndroid Build Coastguard Worker struct dzn_query {
1302*61046927SAndroid Build Coastguard Worker    D3D12_QUERY_TYPE type;
1303*61046927SAndroid Build Coastguard Worker    ID3D12Fence *fence;
1304*61046927SAndroid Build Coastguard Worker    uint64_t fence_value;
1305*61046927SAndroid Build Coastguard Worker };
1306*61046927SAndroid Build Coastguard Worker 
1307*61046927SAndroid Build Coastguard Worker struct dzn_query_pool {
1308*61046927SAndroid Build Coastguard Worker    struct vk_object_base base;
1309*61046927SAndroid Build Coastguard Worker 
1310*61046927SAndroid Build Coastguard Worker    D3D12_QUERY_HEAP_TYPE heap_type;
1311*61046927SAndroid Build Coastguard Worker    ID3D12QueryHeap *heap;
1312*61046927SAndroid Build Coastguard Worker    uint32_t query_count;
1313*61046927SAndroid Build Coastguard Worker    struct dzn_query *queries;
1314*61046927SAndroid Build Coastguard Worker    mtx_t queries_lock;
1315*61046927SAndroid Build Coastguard Worker    ID3D12Resource *resolve_buffer;
1316*61046927SAndroid Build Coastguard Worker    ID3D12Resource *collect_buffer;
1317*61046927SAndroid Build Coastguard Worker    VkQueryPipelineStatisticFlags pipeline_statistics;
1318*61046927SAndroid Build Coastguard Worker    uint32_t query_size;
1319*61046927SAndroid Build Coastguard Worker    uint64_t *collect_map;
1320*61046927SAndroid Build Coastguard Worker };
1321*61046927SAndroid Build Coastguard Worker 
1322*61046927SAndroid Build Coastguard Worker D3D12_QUERY_TYPE
1323*61046927SAndroid Build Coastguard Worker dzn_query_pool_get_query_type(const struct dzn_query_pool *qpool, VkQueryControlFlags flag);
1324*61046927SAndroid Build Coastguard Worker 
1325*61046927SAndroid Build Coastguard Worker uint32_t
1326*61046927SAndroid Build Coastguard Worker dzn_query_pool_get_result_offset(const struct dzn_query_pool *qpool, uint32_t query);
1327*61046927SAndroid Build Coastguard Worker 
1328*61046927SAndroid Build Coastguard Worker uint32_t
1329*61046927SAndroid Build Coastguard Worker dzn_query_pool_get_availability_offset(const struct dzn_query_pool *qpool, uint32_t query);
1330*61046927SAndroid Build Coastguard Worker 
1331*61046927SAndroid Build Coastguard Worker uint32_t
1332*61046927SAndroid Build Coastguard Worker dzn_query_pool_get_result_size(const struct dzn_query_pool *qpool, uint32_t count);
1333*61046927SAndroid Build Coastguard Worker 
1334*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
1335*61046927SAndroid Build Coastguard Worker dzn_CmdPipelineBarrier2_enhanced(VkCommandBuffer commandBuffer,
1336*61046927SAndroid Build Coastguard Worker                                  const VkDependencyInfo *info);
1337*61046927SAndroid Build Coastguard Worker 
1338*61046927SAndroid Build Coastguard Worker VK_DEFINE_HANDLE_CASTS(dzn_cmd_buffer, vk.base, VkCommandBuffer, VK_OBJECT_TYPE_COMMAND_BUFFER)
1339*61046927SAndroid Build Coastguard Worker VK_DEFINE_HANDLE_CASTS(dzn_device, vk.base, VkDevice, VK_OBJECT_TYPE_DEVICE)
1340*61046927SAndroid Build Coastguard Worker VK_DEFINE_HANDLE_CASTS(dzn_instance, vk.base, VkInstance, VK_OBJECT_TYPE_INSTANCE)
1341*61046927SAndroid Build Coastguard Worker VK_DEFINE_HANDLE_CASTS(dzn_physical_device, vk.base, VkPhysicalDevice, VK_OBJECT_TYPE_PHYSICAL_DEVICE)
1342*61046927SAndroid Build Coastguard Worker VK_DEFINE_HANDLE_CASTS(dzn_queue, vk.base, VkQueue, VK_OBJECT_TYPE_QUEUE)
1343*61046927SAndroid Build Coastguard Worker 
1344*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(dzn_buffer, base, VkBuffer, VK_OBJECT_TYPE_BUFFER)
1345*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(dzn_buffer_view, base, VkBufferView, VK_OBJECT_TYPE_BUFFER_VIEW)
1346*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(dzn_device_memory, base, VkDeviceMemory, VK_OBJECT_TYPE_DEVICE_MEMORY)
1347*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(dzn_descriptor_pool, base, VkDescriptorPool, VK_OBJECT_TYPE_DESCRIPTOR_POOL)
1348*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(dzn_descriptor_set, base, VkDescriptorSet, VK_OBJECT_TYPE_DESCRIPTOR_SET)
1349*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(dzn_descriptor_set_layout, vk.base, VkDescriptorSetLayout, VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT)
1350*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(dzn_descriptor_update_template, base, VkDescriptorUpdateTemplate, VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE)
1351*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(dzn_event, base, VkEvent, VK_OBJECT_TYPE_EVENT)
1352*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(dzn_image, vk.base, VkImage, VK_OBJECT_TYPE_IMAGE)
1353*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(dzn_image_view, vk.base, VkImageView, VK_OBJECT_TYPE_IMAGE_VIEW)
1354*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(dzn_pipeline, base, VkPipeline, VK_OBJECT_TYPE_PIPELINE)
1355*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(dzn_graphics_pipeline, base.base, VkPipeline, VK_OBJECT_TYPE_PIPELINE)
1356*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(dzn_compute_pipeline, base.base, VkPipeline, VK_OBJECT_TYPE_PIPELINE)
1357*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(dzn_pipeline_layout, vk.base, VkPipelineLayout, VK_OBJECT_TYPE_PIPELINE_LAYOUT)
1358*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(dzn_query_pool, base, VkQueryPool, VK_OBJECT_TYPE_QUERY_POOL)
1359*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(dzn_sampler, base, VkSampler, VK_OBJECT_TYPE_SAMPLER)
1360*61046927SAndroid Build Coastguard Worker 
1361*61046927SAndroid Build Coastguard Worker #endif /* DZN_PRIVATE_H */
1362