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 #include "dzn_private.h"
25*61046927SAndroid Build Coastguard Worker
26*61046927SAndroid Build Coastguard Worker #include "spirv_to_dxil.h"
27*61046927SAndroid Build Coastguard Worker #include "nir_to_dxil.h"
28*61046927SAndroid Build Coastguard Worker
29*61046927SAndroid Build Coastguard Worker #include "dxil_nir.h"
30*61046927SAndroid Build Coastguard Worker #include "dxil_nir_lower_int_samplers.h"
31*61046927SAndroid Build Coastguard Worker #include "dxil_validator.h"
32*61046927SAndroid Build Coastguard Worker
33*61046927SAndroid Build Coastguard Worker static void
dzn_meta_compile_shader(struct dzn_device * device,nir_shader * nir,D3D12_SHADER_BYTECODE * slot)34*61046927SAndroid Build Coastguard Worker dzn_meta_compile_shader(struct dzn_device *device, nir_shader *nir,
35*61046927SAndroid Build Coastguard Worker D3D12_SHADER_BYTECODE *slot)
36*61046927SAndroid Build Coastguard Worker {
37*61046927SAndroid Build Coastguard Worker struct dzn_instance *instance =
38*61046927SAndroid Build Coastguard Worker container_of(device->vk.physical->instance, struct dzn_instance, vk);
39*61046927SAndroid Build Coastguard Worker struct dzn_physical_device *pdev =
40*61046927SAndroid Build Coastguard Worker container_of(device->vk.physical, struct dzn_physical_device, vk);
41*61046927SAndroid Build Coastguard Worker
42*61046927SAndroid Build Coastguard Worker nir_shader_gather_info(nir, nir_shader_get_entrypoint(nir));
43*61046927SAndroid Build Coastguard Worker
44*61046927SAndroid Build Coastguard Worker if ((instance->debug_flags & DZN_DEBUG_NIR) &&
45*61046927SAndroid Build Coastguard Worker (instance->debug_flags & DZN_DEBUG_INTERNAL))
46*61046927SAndroid Build Coastguard Worker nir_print_shader(nir, stderr);
47*61046927SAndroid Build Coastguard Worker
48*61046927SAndroid Build Coastguard Worker struct nir_to_dxil_options opts = {
49*61046927SAndroid Build Coastguard Worker .environment = DXIL_ENVIRONMENT_VULKAN,
50*61046927SAndroid Build Coastguard Worker .shader_model_max = dzn_get_shader_model(pdev),
51*61046927SAndroid Build Coastguard Worker #ifdef _WIN32
52*61046927SAndroid Build Coastguard Worker .validator_version_max = dxil_get_validator_version(instance->dxil_validator),
53*61046927SAndroid Build Coastguard Worker #endif
54*61046927SAndroid Build Coastguard Worker };
55*61046927SAndroid Build Coastguard Worker struct blob dxil_blob;
56*61046927SAndroid Build Coastguard Worker ASSERTED bool ret = nir_to_dxil(nir, &opts, NULL, &dxil_blob);
57*61046927SAndroid Build Coastguard Worker assert(ret);
58*61046927SAndroid Build Coastguard Worker
59*61046927SAndroid Build Coastguard Worker #ifdef _WIN32
60*61046927SAndroid Build Coastguard Worker char *err = NULL;
61*61046927SAndroid Build Coastguard Worker bool res = dxil_validate_module(instance->dxil_validator,
62*61046927SAndroid Build Coastguard Worker dxil_blob.data,
63*61046927SAndroid Build Coastguard Worker dxil_blob.size, &err);
64*61046927SAndroid Build Coastguard Worker
65*61046927SAndroid Build Coastguard Worker if ((instance->debug_flags & DZN_DEBUG_DXIL) &&
66*61046927SAndroid Build Coastguard Worker (instance->debug_flags & DZN_DEBUG_INTERNAL)) {
67*61046927SAndroid Build Coastguard Worker char *disasm = dxil_disasm_module(instance->dxil_validator,
68*61046927SAndroid Build Coastguard Worker dxil_blob.data,
69*61046927SAndroid Build Coastguard Worker dxil_blob.size);
70*61046927SAndroid Build Coastguard Worker if (disasm) {
71*61046927SAndroid Build Coastguard Worker fprintf(stderr,
72*61046927SAndroid Build Coastguard Worker "== BEGIN SHADER ============================================\n"
73*61046927SAndroid Build Coastguard Worker "%s\n"
74*61046927SAndroid Build Coastguard Worker "== END SHADER ==============================================\n",
75*61046927SAndroid Build Coastguard Worker disasm);
76*61046927SAndroid Build Coastguard Worker ralloc_free(disasm);
77*61046927SAndroid Build Coastguard Worker }
78*61046927SAndroid Build Coastguard Worker }
79*61046927SAndroid Build Coastguard Worker
80*61046927SAndroid Build Coastguard Worker if ((instance->debug_flags & DZN_DEBUG_DXIL) &&
81*61046927SAndroid Build Coastguard Worker (instance->debug_flags & DZN_DEBUG_INTERNAL) &&
82*61046927SAndroid Build Coastguard Worker !res && !(instance->debug_flags & DZN_DEBUG_EXPERIMENTAL)) {
83*61046927SAndroid Build Coastguard Worker fprintf(stderr,
84*61046927SAndroid Build Coastguard Worker "== VALIDATION ERROR =============================================\n"
85*61046927SAndroid Build Coastguard Worker "%s\n"
86*61046927SAndroid Build Coastguard Worker "== END ==========================================================\n",
87*61046927SAndroid Build Coastguard Worker err ? err : "unknown");
88*61046927SAndroid Build Coastguard Worker ralloc_free(err);
89*61046927SAndroid Build Coastguard Worker }
90*61046927SAndroid Build Coastguard Worker assert(res || (instance->debug_flags & DZN_DEBUG_EXPERIMENTAL));
91*61046927SAndroid Build Coastguard Worker #endif
92*61046927SAndroid Build Coastguard Worker
93*61046927SAndroid Build Coastguard Worker void *data;
94*61046927SAndroid Build Coastguard Worker size_t size;
95*61046927SAndroid Build Coastguard Worker blob_finish_get_buffer(&dxil_blob, &data, &size);
96*61046927SAndroid Build Coastguard Worker slot->pShaderBytecode = data;
97*61046927SAndroid Build Coastguard Worker slot->BytecodeLength = size;
98*61046927SAndroid Build Coastguard Worker }
99*61046927SAndroid Build Coastguard Worker
100*61046927SAndroid Build Coastguard Worker #define DZN_META_INDIRECT_DRAW_MAX_PARAM_COUNT 5
101*61046927SAndroid Build Coastguard Worker
102*61046927SAndroid Build Coastguard Worker static void
dzn_meta_indirect_draw_finish(struct dzn_device * device,struct dzn_indirect_draw_type type)103*61046927SAndroid Build Coastguard Worker dzn_meta_indirect_draw_finish(struct dzn_device *device, struct dzn_indirect_draw_type type)
104*61046927SAndroid Build Coastguard Worker {
105*61046927SAndroid Build Coastguard Worker struct dzn_meta_indirect_draw *meta = &device->indirect_draws[type.value];
106*61046927SAndroid Build Coastguard Worker
107*61046927SAndroid Build Coastguard Worker if (meta->root_sig)
108*61046927SAndroid Build Coastguard Worker ID3D12RootSignature_Release(meta->root_sig);
109*61046927SAndroid Build Coastguard Worker
110*61046927SAndroid Build Coastguard Worker if (meta->pipeline_state)
111*61046927SAndroid Build Coastguard Worker ID3D12PipelineState_Release(meta->pipeline_state);
112*61046927SAndroid Build Coastguard Worker }
113*61046927SAndroid Build Coastguard Worker
114*61046927SAndroid Build Coastguard Worker static VkResult
dzn_meta_indirect_draw_init(struct dzn_device * device,struct dzn_indirect_draw_type type)115*61046927SAndroid Build Coastguard Worker dzn_meta_indirect_draw_init(struct dzn_device *device,
116*61046927SAndroid Build Coastguard Worker struct dzn_indirect_draw_type type)
117*61046927SAndroid Build Coastguard Worker {
118*61046927SAndroid Build Coastguard Worker struct dzn_meta_indirect_draw *meta = &device->indirect_draws[type.value];
119*61046927SAndroid Build Coastguard Worker struct dzn_instance *instance =
120*61046927SAndroid Build Coastguard Worker container_of(device->vk.physical->instance, struct dzn_instance, vk);
121*61046927SAndroid Build Coastguard Worker VkResult ret = VK_SUCCESS;
122*61046927SAndroid Build Coastguard Worker
123*61046927SAndroid Build Coastguard Worker glsl_type_singleton_init_or_ref();
124*61046927SAndroid Build Coastguard Worker
125*61046927SAndroid Build Coastguard Worker nir_shader *nir = dzn_nir_indirect_draw_shader(type);
126*61046927SAndroid Build Coastguard Worker uint32_t shader_params_size =
127*61046927SAndroid Build Coastguard Worker type.triangle_fan_primitive_restart ?
128*61046927SAndroid Build Coastguard Worker sizeof(struct dzn_indirect_draw_triangle_fan_prim_restart_rewrite_params) :
129*61046927SAndroid Build Coastguard Worker type.triangle_fan ?
130*61046927SAndroid Build Coastguard Worker sizeof(struct dzn_indirect_draw_triangle_fan_rewrite_params) :
131*61046927SAndroid Build Coastguard Worker sizeof(struct dzn_indirect_draw_rewrite_params);
132*61046927SAndroid Build Coastguard Worker
133*61046927SAndroid Build Coastguard Worker uint32_t root_param_count = 0;
134*61046927SAndroid Build Coastguard Worker D3D12_ROOT_PARAMETER1 root_params[DZN_META_INDIRECT_DRAW_MAX_PARAM_COUNT];
135*61046927SAndroid Build Coastguard Worker
136*61046927SAndroid Build Coastguard Worker root_params[root_param_count++] = (D3D12_ROOT_PARAMETER1) {
137*61046927SAndroid Build Coastguard Worker .ParameterType = D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS,
138*61046927SAndroid Build Coastguard Worker .Constants = {
139*61046927SAndroid Build Coastguard Worker .ShaderRegister = 0,
140*61046927SAndroid Build Coastguard Worker .RegisterSpace = 0,
141*61046927SAndroid Build Coastguard Worker .Num32BitValues = shader_params_size / 4,
142*61046927SAndroid Build Coastguard Worker },
143*61046927SAndroid Build Coastguard Worker .ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL,
144*61046927SAndroid Build Coastguard Worker };
145*61046927SAndroid Build Coastguard Worker
146*61046927SAndroid Build Coastguard Worker root_params[root_param_count++] = (D3D12_ROOT_PARAMETER1) {
147*61046927SAndroid Build Coastguard Worker .ParameterType = D3D12_ROOT_PARAMETER_TYPE_SRV,
148*61046927SAndroid Build Coastguard Worker .Descriptor = {
149*61046927SAndroid Build Coastguard Worker .ShaderRegister = 1,
150*61046927SAndroid Build Coastguard Worker .RegisterSpace = 0,
151*61046927SAndroid Build Coastguard Worker .Flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE,
152*61046927SAndroid Build Coastguard Worker },
153*61046927SAndroid Build Coastguard Worker .ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL,
154*61046927SAndroid Build Coastguard Worker };
155*61046927SAndroid Build Coastguard Worker
156*61046927SAndroid Build Coastguard Worker root_params[root_param_count++] = (D3D12_ROOT_PARAMETER1) {
157*61046927SAndroid Build Coastguard Worker .ParameterType = D3D12_ROOT_PARAMETER_TYPE_UAV,
158*61046927SAndroid Build Coastguard Worker .Descriptor = {
159*61046927SAndroid Build Coastguard Worker .ShaderRegister = 2,
160*61046927SAndroid Build Coastguard Worker .RegisterSpace = 0,
161*61046927SAndroid Build Coastguard Worker .Flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE,
162*61046927SAndroid Build Coastguard Worker },
163*61046927SAndroid Build Coastguard Worker .ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL,
164*61046927SAndroid Build Coastguard Worker };
165*61046927SAndroid Build Coastguard Worker
166*61046927SAndroid Build Coastguard Worker if (type.indirect_count) {
167*61046927SAndroid Build Coastguard Worker root_params[root_param_count++] = (D3D12_ROOT_PARAMETER1) {
168*61046927SAndroid Build Coastguard Worker .ParameterType = D3D12_ROOT_PARAMETER_TYPE_SRV,
169*61046927SAndroid Build Coastguard Worker .Descriptor = {
170*61046927SAndroid Build Coastguard Worker .ShaderRegister = 3,
171*61046927SAndroid Build Coastguard Worker .RegisterSpace = 0,
172*61046927SAndroid Build Coastguard Worker .Flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE,
173*61046927SAndroid Build Coastguard Worker },
174*61046927SAndroid Build Coastguard Worker .ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL,
175*61046927SAndroid Build Coastguard Worker };
176*61046927SAndroid Build Coastguard Worker }
177*61046927SAndroid Build Coastguard Worker
178*61046927SAndroid Build Coastguard Worker
179*61046927SAndroid Build Coastguard Worker if (type.triangle_fan) {
180*61046927SAndroid Build Coastguard Worker root_params[root_param_count++] = (D3D12_ROOT_PARAMETER1) {
181*61046927SAndroid Build Coastguard Worker .ParameterType = D3D12_ROOT_PARAMETER_TYPE_UAV,
182*61046927SAndroid Build Coastguard Worker .Descriptor = {
183*61046927SAndroid Build Coastguard Worker .ShaderRegister = 4,
184*61046927SAndroid Build Coastguard Worker .RegisterSpace = 0,
185*61046927SAndroid Build Coastguard Worker .Flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE,
186*61046927SAndroid Build Coastguard Worker },
187*61046927SAndroid Build Coastguard Worker .ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL,
188*61046927SAndroid Build Coastguard Worker };
189*61046927SAndroid Build Coastguard Worker }
190*61046927SAndroid Build Coastguard Worker
191*61046927SAndroid Build Coastguard Worker assert(root_param_count <= ARRAY_SIZE(root_params));
192*61046927SAndroid Build Coastguard Worker
193*61046927SAndroid Build Coastguard Worker D3D12_VERSIONED_ROOT_SIGNATURE_DESC root_sig_desc = {
194*61046927SAndroid Build Coastguard Worker .Version = D3D_ROOT_SIGNATURE_VERSION_1_1,
195*61046927SAndroid Build Coastguard Worker .Desc_1_1 = {
196*61046927SAndroid Build Coastguard Worker .NumParameters = root_param_count,
197*61046927SAndroid Build Coastguard Worker .pParameters = root_params,
198*61046927SAndroid Build Coastguard Worker .Flags = D3D12_ROOT_SIGNATURE_FLAG_NONE,
199*61046927SAndroid Build Coastguard Worker },
200*61046927SAndroid Build Coastguard Worker };
201*61046927SAndroid Build Coastguard Worker
202*61046927SAndroid Build Coastguard Worker D3D12_COMPUTE_PIPELINE_STATE_DESC desc = {
203*61046927SAndroid Build Coastguard Worker .Flags = D3D12_PIPELINE_STATE_FLAG_NONE,
204*61046927SAndroid Build Coastguard Worker };
205*61046927SAndroid Build Coastguard Worker
206*61046927SAndroid Build Coastguard Worker meta->root_sig =
207*61046927SAndroid Build Coastguard Worker dzn_device_create_root_sig(device, &root_sig_desc);
208*61046927SAndroid Build Coastguard Worker if (!meta->root_sig) {
209*61046927SAndroid Build Coastguard Worker ret = vk_error(instance, VK_ERROR_INITIALIZATION_FAILED);
210*61046927SAndroid Build Coastguard Worker goto out;
211*61046927SAndroid Build Coastguard Worker }
212*61046927SAndroid Build Coastguard Worker
213*61046927SAndroid Build Coastguard Worker desc.pRootSignature = meta->root_sig;
214*61046927SAndroid Build Coastguard Worker dzn_meta_compile_shader(device, nir, &desc.CS);
215*61046927SAndroid Build Coastguard Worker assert(desc.CS.pShaderBytecode);
216*61046927SAndroid Build Coastguard Worker
217*61046927SAndroid Build Coastguard Worker if (FAILED(ID3D12Device1_CreateComputePipelineState(device->dev, &desc,
218*61046927SAndroid Build Coastguard Worker &IID_ID3D12PipelineState,
219*61046927SAndroid Build Coastguard Worker (void **)&meta->pipeline_state)))
220*61046927SAndroid Build Coastguard Worker ret = vk_error(instance, VK_ERROR_INITIALIZATION_FAILED);
221*61046927SAndroid Build Coastguard Worker
222*61046927SAndroid Build Coastguard Worker out:
223*61046927SAndroid Build Coastguard Worker if (ret != VK_SUCCESS)
224*61046927SAndroid Build Coastguard Worker dzn_meta_indirect_draw_finish(device, type);
225*61046927SAndroid Build Coastguard Worker
226*61046927SAndroid Build Coastguard Worker free((void *)desc.CS.pShaderBytecode);
227*61046927SAndroid Build Coastguard Worker ralloc_free(nir);
228*61046927SAndroid Build Coastguard Worker glsl_type_singleton_decref();
229*61046927SAndroid Build Coastguard Worker
230*61046927SAndroid Build Coastguard Worker return ret;
231*61046927SAndroid Build Coastguard Worker }
232*61046927SAndroid Build Coastguard Worker
233*61046927SAndroid Build Coastguard Worker #define DZN_META_TRIANGLE_FAN_REWRITE_IDX_MAX_PARAM_COUNT 4
234*61046927SAndroid Build Coastguard Worker
235*61046927SAndroid Build Coastguard Worker static void
dzn_meta_triangle_fan_rewrite_index_finish(struct dzn_device * device,enum dzn_index_type old_index_type)236*61046927SAndroid Build Coastguard Worker dzn_meta_triangle_fan_rewrite_index_finish(struct dzn_device *device,
237*61046927SAndroid Build Coastguard Worker enum dzn_index_type old_index_type)
238*61046927SAndroid Build Coastguard Worker {
239*61046927SAndroid Build Coastguard Worker struct dzn_meta_triangle_fan_rewrite_index *meta =
240*61046927SAndroid Build Coastguard Worker &device->triangle_fan[old_index_type];
241*61046927SAndroid Build Coastguard Worker
242*61046927SAndroid Build Coastguard Worker if (meta->root_sig)
243*61046927SAndroid Build Coastguard Worker ID3D12RootSignature_Release(meta->root_sig);
244*61046927SAndroid Build Coastguard Worker if (meta->pipeline_state)
245*61046927SAndroid Build Coastguard Worker ID3D12PipelineState_Release(meta->pipeline_state);
246*61046927SAndroid Build Coastguard Worker if (meta->cmd_sig)
247*61046927SAndroid Build Coastguard Worker ID3D12CommandSignature_Release(meta->cmd_sig);
248*61046927SAndroid Build Coastguard Worker }
249*61046927SAndroid Build Coastguard Worker
250*61046927SAndroid Build Coastguard Worker static VkResult
dzn_meta_triangle_fan_rewrite_index_init(struct dzn_device * device,enum dzn_index_type old_index_type)251*61046927SAndroid Build Coastguard Worker dzn_meta_triangle_fan_rewrite_index_init(struct dzn_device *device,
252*61046927SAndroid Build Coastguard Worker enum dzn_index_type old_index_type)
253*61046927SAndroid Build Coastguard Worker {
254*61046927SAndroid Build Coastguard Worker struct dzn_meta_triangle_fan_rewrite_index *meta =
255*61046927SAndroid Build Coastguard Worker &device->triangle_fan[old_index_type];
256*61046927SAndroid Build Coastguard Worker struct dzn_instance *instance =
257*61046927SAndroid Build Coastguard Worker container_of(device->vk.physical->instance, struct dzn_instance, vk);
258*61046927SAndroid Build Coastguard Worker VkResult ret = VK_SUCCESS;
259*61046927SAndroid Build Coastguard Worker
260*61046927SAndroid Build Coastguard Worker glsl_type_singleton_init_or_ref();
261*61046927SAndroid Build Coastguard Worker
262*61046927SAndroid Build Coastguard Worker uint8_t old_index_size = dzn_index_size(old_index_type);
263*61046927SAndroid Build Coastguard Worker bool prim_restart =
264*61046927SAndroid Build Coastguard Worker old_index_type == DZN_INDEX_2B_WITH_PRIM_RESTART ||
265*61046927SAndroid Build Coastguard Worker old_index_type == DZN_INDEX_4B_WITH_PRIM_RESTART;
266*61046927SAndroid Build Coastguard Worker
267*61046927SAndroid Build Coastguard Worker nir_shader *nir =
268*61046927SAndroid Build Coastguard Worker prim_restart ?
269*61046927SAndroid Build Coastguard Worker dzn_nir_triangle_fan_prim_restart_rewrite_index_shader(old_index_size) :
270*61046927SAndroid Build Coastguard Worker dzn_nir_triangle_fan_rewrite_index_shader(old_index_size);
271*61046927SAndroid Build Coastguard Worker
272*61046927SAndroid Build Coastguard Worker uint32_t root_param_count = 0;
273*61046927SAndroid Build Coastguard Worker D3D12_ROOT_PARAMETER1 root_params[DZN_META_TRIANGLE_FAN_REWRITE_IDX_MAX_PARAM_COUNT];
274*61046927SAndroid Build Coastguard Worker
275*61046927SAndroid Build Coastguard Worker root_params[root_param_count++] = (D3D12_ROOT_PARAMETER1) {
276*61046927SAndroid Build Coastguard Worker .ParameterType = D3D12_ROOT_PARAMETER_TYPE_UAV,
277*61046927SAndroid Build Coastguard Worker .Descriptor = {
278*61046927SAndroid Build Coastguard Worker .ShaderRegister = 1,
279*61046927SAndroid Build Coastguard Worker .RegisterSpace = 0,
280*61046927SAndroid Build Coastguard Worker .Flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE,
281*61046927SAndroid Build Coastguard Worker },
282*61046927SAndroid Build Coastguard Worker .ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL,
283*61046927SAndroid Build Coastguard Worker };
284*61046927SAndroid Build Coastguard Worker
285*61046927SAndroid Build Coastguard Worker uint32_t params_size =
286*61046927SAndroid Build Coastguard Worker prim_restart ?
287*61046927SAndroid Build Coastguard Worker sizeof(struct dzn_triangle_fan_prim_restart_rewrite_index_params) :
288*61046927SAndroid Build Coastguard Worker sizeof(struct dzn_triangle_fan_rewrite_index_params);
289*61046927SAndroid Build Coastguard Worker
290*61046927SAndroid Build Coastguard Worker root_params[root_param_count++] = (D3D12_ROOT_PARAMETER1) {
291*61046927SAndroid Build Coastguard Worker .ParameterType = D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS,
292*61046927SAndroid Build Coastguard Worker .Constants = {
293*61046927SAndroid Build Coastguard Worker .ShaderRegister = 0,
294*61046927SAndroid Build Coastguard Worker .RegisterSpace = 0,
295*61046927SAndroid Build Coastguard Worker .Num32BitValues = params_size / 4,
296*61046927SAndroid Build Coastguard Worker },
297*61046927SAndroid Build Coastguard Worker .ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL,
298*61046927SAndroid Build Coastguard Worker };
299*61046927SAndroid Build Coastguard Worker
300*61046927SAndroid Build Coastguard Worker if (old_index_type != DZN_NO_INDEX) {
301*61046927SAndroid Build Coastguard Worker root_params[root_param_count++] = (D3D12_ROOT_PARAMETER1) {
302*61046927SAndroid Build Coastguard Worker .ParameterType = D3D12_ROOT_PARAMETER_TYPE_SRV,
303*61046927SAndroid Build Coastguard Worker .Descriptor = {
304*61046927SAndroid Build Coastguard Worker .ShaderRegister = 2,
305*61046927SAndroid Build Coastguard Worker .RegisterSpace = 0,
306*61046927SAndroid Build Coastguard Worker .Flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE,
307*61046927SAndroid Build Coastguard Worker },
308*61046927SAndroid Build Coastguard Worker .ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL,
309*61046927SAndroid Build Coastguard Worker };
310*61046927SAndroid Build Coastguard Worker }
311*61046927SAndroid Build Coastguard Worker
312*61046927SAndroid Build Coastguard Worker if (prim_restart) {
313*61046927SAndroid Build Coastguard Worker root_params[root_param_count++] = (D3D12_ROOT_PARAMETER1) {
314*61046927SAndroid Build Coastguard Worker .ParameterType = D3D12_ROOT_PARAMETER_TYPE_UAV,
315*61046927SAndroid Build Coastguard Worker .Descriptor = {
316*61046927SAndroid Build Coastguard Worker .ShaderRegister = 3,
317*61046927SAndroid Build Coastguard Worker .RegisterSpace = 0,
318*61046927SAndroid Build Coastguard Worker .Flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE,
319*61046927SAndroid Build Coastguard Worker },
320*61046927SAndroid Build Coastguard Worker .ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL,
321*61046927SAndroid Build Coastguard Worker };
322*61046927SAndroid Build Coastguard Worker }
323*61046927SAndroid Build Coastguard Worker
324*61046927SAndroid Build Coastguard Worker assert(root_param_count <= ARRAY_SIZE(root_params));
325*61046927SAndroid Build Coastguard Worker
326*61046927SAndroid Build Coastguard Worker D3D12_VERSIONED_ROOT_SIGNATURE_DESC root_sig_desc = {
327*61046927SAndroid Build Coastguard Worker .Version = D3D_ROOT_SIGNATURE_VERSION_1_1,
328*61046927SAndroid Build Coastguard Worker .Desc_1_1 = {
329*61046927SAndroid Build Coastguard Worker .NumParameters = root_param_count,
330*61046927SAndroid Build Coastguard Worker .pParameters = root_params,
331*61046927SAndroid Build Coastguard Worker .Flags = D3D12_ROOT_SIGNATURE_FLAG_NONE,
332*61046927SAndroid Build Coastguard Worker },
333*61046927SAndroid Build Coastguard Worker };
334*61046927SAndroid Build Coastguard Worker
335*61046927SAndroid Build Coastguard Worker D3D12_COMPUTE_PIPELINE_STATE_DESC desc = {
336*61046927SAndroid Build Coastguard Worker .Flags = D3D12_PIPELINE_STATE_FLAG_NONE,
337*61046927SAndroid Build Coastguard Worker };
338*61046927SAndroid Build Coastguard Worker
339*61046927SAndroid Build Coastguard Worker uint32_t cmd_arg_count = 0;
340*61046927SAndroid Build Coastguard Worker D3D12_INDIRECT_ARGUMENT_DESC cmd_args[4];
341*61046927SAndroid Build Coastguard Worker
342*61046927SAndroid Build Coastguard Worker cmd_args[cmd_arg_count++] = (D3D12_INDIRECT_ARGUMENT_DESC) {
343*61046927SAndroid Build Coastguard Worker .Type = D3D12_INDIRECT_ARGUMENT_TYPE_UNORDERED_ACCESS_VIEW,
344*61046927SAndroid Build Coastguard Worker .UnorderedAccessView = {
345*61046927SAndroid Build Coastguard Worker .RootParameterIndex = 0,
346*61046927SAndroid Build Coastguard Worker },
347*61046927SAndroid Build Coastguard Worker };
348*61046927SAndroid Build Coastguard Worker
349*61046927SAndroid Build Coastguard Worker cmd_args[cmd_arg_count++] = (D3D12_INDIRECT_ARGUMENT_DESC) {
350*61046927SAndroid Build Coastguard Worker .Type = D3D12_INDIRECT_ARGUMENT_TYPE_CONSTANT,
351*61046927SAndroid Build Coastguard Worker .Constant = {
352*61046927SAndroid Build Coastguard Worker .RootParameterIndex = 1,
353*61046927SAndroid Build Coastguard Worker .DestOffsetIn32BitValues = 0,
354*61046927SAndroid Build Coastguard Worker .Num32BitValuesToSet = params_size / 4,
355*61046927SAndroid Build Coastguard Worker },
356*61046927SAndroid Build Coastguard Worker };
357*61046927SAndroid Build Coastguard Worker
358*61046927SAndroid Build Coastguard Worker if (prim_restart) {
359*61046927SAndroid Build Coastguard Worker cmd_args[cmd_arg_count++] = (D3D12_INDIRECT_ARGUMENT_DESC) {
360*61046927SAndroid Build Coastguard Worker .Type = D3D12_INDIRECT_ARGUMENT_TYPE_UNORDERED_ACCESS_VIEW,
361*61046927SAndroid Build Coastguard Worker .UnorderedAccessView = {
362*61046927SAndroid Build Coastguard Worker .RootParameterIndex = 3,
363*61046927SAndroid Build Coastguard Worker },
364*61046927SAndroid Build Coastguard Worker };
365*61046927SAndroid Build Coastguard Worker }
366*61046927SAndroid Build Coastguard Worker
367*61046927SAndroid Build Coastguard Worker cmd_args[cmd_arg_count++] = (D3D12_INDIRECT_ARGUMENT_DESC) {
368*61046927SAndroid Build Coastguard Worker .Type = D3D12_INDIRECT_ARGUMENT_TYPE_DISPATCH,
369*61046927SAndroid Build Coastguard Worker };
370*61046927SAndroid Build Coastguard Worker
371*61046927SAndroid Build Coastguard Worker assert(cmd_arg_count <= ARRAY_SIZE(cmd_args));
372*61046927SAndroid Build Coastguard Worker
373*61046927SAndroid Build Coastguard Worker uint32_t exec_params_size =
374*61046927SAndroid Build Coastguard Worker prim_restart ?
375*61046927SAndroid Build Coastguard Worker sizeof(struct dzn_indirect_triangle_fan_prim_restart_rewrite_index_exec_params) :
376*61046927SAndroid Build Coastguard Worker sizeof(struct dzn_indirect_triangle_fan_rewrite_index_exec_params);
377*61046927SAndroid Build Coastguard Worker
378*61046927SAndroid Build Coastguard Worker D3D12_COMMAND_SIGNATURE_DESC cmd_sig_desc = {
379*61046927SAndroid Build Coastguard Worker .ByteStride = exec_params_size,
380*61046927SAndroid Build Coastguard Worker .NumArgumentDescs = cmd_arg_count,
381*61046927SAndroid Build Coastguard Worker .pArgumentDescs = cmd_args,
382*61046927SAndroid Build Coastguard Worker };
383*61046927SAndroid Build Coastguard Worker
384*61046927SAndroid Build Coastguard Worker assert((cmd_sig_desc.ByteStride & 7) == 0);
385*61046927SAndroid Build Coastguard Worker
386*61046927SAndroid Build Coastguard Worker meta->root_sig = dzn_device_create_root_sig(device, &root_sig_desc);
387*61046927SAndroid Build Coastguard Worker if (!meta->root_sig) {
388*61046927SAndroid Build Coastguard Worker ret = vk_error(instance, VK_ERROR_INITIALIZATION_FAILED);
389*61046927SAndroid Build Coastguard Worker goto out;
390*61046927SAndroid Build Coastguard Worker }
391*61046927SAndroid Build Coastguard Worker
392*61046927SAndroid Build Coastguard Worker
393*61046927SAndroid Build Coastguard Worker desc.pRootSignature = meta->root_sig;
394*61046927SAndroid Build Coastguard Worker dzn_meta_compile_shader(device, nir, &desc.CS);
395*61046927SAndroid Build Coastguard Worker
396*61046927SAndroid Build Coastguard Worker if (FAILED(ID3D12Device1_CreateComputePipelineState(device->dev, &desc,
397*61046927SAndroid Build Coastguard Worker &IID_ID3D12PipelineState,
398*61046927SAndroid Build Coastguard Worker (void **)&meta->pipeline_state))) {
399*61046927SAndroid Build Coastguard Worker ret = vk_error(instance, VK_ERROR_INITIALIZATION_FAILED);
400*61046927SAndroid Build Coastguard Worker goto out;
401*61046927SAndroid Build Coastguard Worker }
402*61046927SAndroid Build Coastguard Worker
403*61046927SAndroid Build Coastguard Worker if (FAILED(ID3D12Device1_CreateCommandSignature(device->dev, &cmd_sig_desc,
404*61046927SAndroid Build Coastguard Worker meta->root_sig,
405*61046927SAndroid Build Coastguard Worker &IID_ID3D12CommandSignature,
406*61046927SAndroid Build Coastguard Worker (void **)&meta->cmd_sig)))
407*61046927SAndroid Build Coastguard Worker ret = vk_error(instance, VK_ERROR_INITIALIZATION_FAILED);
408*61046927SAndroid Build Coastguard Worker
409*61046927SAndroid Build Coastguard Worker out:
410*61046927SAndroid Build Coastguard Worker if (ret != VK_SUCCESS)
411*61046927SAndroid Build Coastguard Worker dzn_meta_triangle_fan_rewrite_index_finish(device, old_index_type);
412*61046927SAndroid Build Coastguard Worker
413*61046927SAndroid Build Coastguard Worker free((void *)desc.CS.pShaderBytecode);
414*61046927SAndroid Build Coastguard Worker ralloc_free(nir);
415*61046927SAndroid Build Coastguard Worker glsl_type_singleton_decref();
416*61046927SAndroid Build Coastguard Worker
417*61046927SAndroid Build Coastguard Worker return ret;
418*61046927SAndroid Build Coastguard Worker }
419*61046927SAndroid Build Coastguard Worker
420*61046927SAndroid Build Coastguard Worker static const D3D12_SHADER_BYTECODE *
dzn_meta_blits_get_vs(struct dzn_device * device)421*61046927SAndroid Build Coastguard Worker dzn_meta_blits_get_vs(struct dzn_device *device)
422*61046927SAndroid Build Coastguard Worker {
423*61046927SAndroid Build Coastguard Worker struct dzn_meta_blits *meta = &device->blits;
424*61046927SAndroid Build Coastguard Worker
425*61046927SAndroid Build Coastguard Worker mtx_lock(&meta->shaders_lock);
426*61046927SAndroid Build Coastguard Worker
427*61046927SAndroid Build Coastguard Worker if (meta->vs.pShaderBytecode == NULL) {
428*61046927SAndroid Build Coastguard Worker nir_shader *nir = dzn_nir_blit_vs();
429*61046927SAndroid Build Coastguard Worker
430*61046927SAndroid Build Coastguard Worker NIR_PASS_V(nir, nir_lower_system_values);
431*61046927SAndroid Build Coastguard Worker
432*61046927SAndroid Build Coastguard Worker gl_system_value system_values[] = {
433*61046927SAndroid Build Coastguard Worker SYSTEM_VALUE_FIRST_VERTEX,
434*61046927SAndroid Build Coastguard Worker SYSTEM_VALUE_BASE_VERTEX,
435*61046927SAndroid Build Coastguard Worker };
436*61046927SAndroid Build Coastguard Worker
437*61046927SAndroid Build Coastguard Worker NIR_PASS_V(nir, dxil_nir_lower_system_values_to_zero, system_values,
438*61046927SAndroid Build Coastguard Worker ARRAY_SIZE(system_values));
439*61046927SAndroid Build Coastguard Worker
440*61046927SAndroid Build Coastguard Worker D3D12_SHADER_BYTECODE bc;
441*61046927SAndroid Build Coastguard Worker
442*61046927SAndroid Build Coastguard Worker dzn_meta_compile_shader(device, nir, &bc);
443*61046927SAndroid Build Coastguard Worker meta->vs.pShaderBytecode =
444*61046927SAndroid Build Coastguard Worker vk_alloc(&device->vk.alloc, bc.BytecodeLength, 8,
445*61046927SAndroid Build Coastguard Worker VK_SYSTEM_ALLOCATION_SCOPE_DEVICE);
446*61046927SAndroid Build Coastguard Worker if (meta->vs.pShaderBytecode) {
447*61046927SAndroid Build Coastguard Worker meta->vs.BytecodeLength = bc.BytecodeLength;
448*61046927SAndroid Build Coastguard Worker memcpy((void *)meta->vs.pShaderBytecode, bc.pShaderBytecode, bc.BytecodeLength);
449*61046927SAndroid Build Coastguard Worker }
450*61046927SAndroid Build Coastguard Worker free((void *)bc.pShaderBytecode);
451*61046927SAndroid Build Coastguard Worker ralloc_free(nir);
452*61046927SAndroid Build Coastguard Worker }
453*61046927SAndroid Build Coastguard Worker
454*61046927SAndroid Build Coastguard Worker mtx_unlock(&meta->shaders_lock);
455*61046927SAndroid Build Coastguard Worker
456*61046927SAndroid Build Coastguard Worker return &meta->vs;
457*61046927SAndroid Build Coastguard Worker }
458*61046927SAndroid Build Coastguard Worker
459*61046927SAndroid Build Coastguard Worker static const D3D12_SHADER_BYTECODE *
dzn_meta_blits_get_fs(struct dzn_device * device,const struct dzn_nir_blit_info * info)460*61046927SAndroid Build Coastguard Worker dzn_meta_blits_get_fs(struct dzn_device *device,
461*61046927SAndroid Build Coastguard Worker const struct dzn_nir_blit_info *info)
462*61046927SAndroid Build Coastguard Worker {
463*61046927SAndroid Build Coastguard Worker struct dzn_meta_blits *meta = &device->blits;
464*61046927SAndroid Build Coastguard Worker D3D12_SHADER_BYTECODE *out = NULL;
465*61046927SAndroid Build Coastguard Worker
466*61046927SAndroid Build Coastguard Worker mtx_lock(&meta->shaders_lock);
467*61046927SAndroid Build Coastguard Worker
468*61046927SAndroid Build Coastguard Worker STATIC_ASSERT(sizeof(struct dzn_nir_blit_info) == sizeof(uint32_t));
469*61046927SAndroid Build Coastguard Worker
470*61046927SAndroid Build Coastguard Worker struct hash_entry *he =
471*61046927SAndroid Build Coastguard Worker _mesa_hash_table_search(meta->fs, (void *)(uintptr_t)info->hash_key);
472*61046927SAndroid Build Coastguard Worker
473*61046927SAndroid Build Coastguard Worker if (!he) {
474*61046927SAndroid Build Coastguard Worker nir_shader *nir = dzn_nir_blit_fs(info);
475*61046927SAndroid Build Coastguard Worker
476*61046927SAndroid Build Coastguard Worker if (info->out_type != GLSL_TYPE_FLOAT) {
477*61046927SAndroid Build Coastguard Worker dxil_wrap_sampler_state wrap_state = {
478*61046927SAndroid Build Coastguard Worker .is_int_sampler = 1,
479*61046927SAndroid Build Coastguard Worker .is_linear_filtering = 0,
480*61046927SAndroid Build Coastguard Worker .skip_boundary_conditions = 1,
481*61046927SAndroid Build Coastguard Worker };
482*61046927SAndroid Build Coastguard Worker dxil_lower_sample_to_txf_for_integer_tex(nir, 1, &wrap_state, NULL, 0);
483*61046927SAndroid Build Coastguard Worker }
484*61046927SAndroid Build Coastguard Worker
485*61046927SAndroid Build Coastguard Worker D3D12_SHADER_BYTECODE bc;
486*61046927SAndroid Build Coastguard Worker
487*61046927SAndroid Build Coastguard Worker dzn_meta_compile_shader(device, nir, &bc);
488*61046927SAndroid Build Coastguard Worker
489*61046927SAndroid Build Coastguard Worker out = vk_alloc(&device->vk.alloc,
490*61046927SAndroid Build Coastguard Worker sizeof(D3D12_SHADER_BYTECODE) + bc.BytecodeLength, 8,
491*61046927SAndroid Build Coastguard Worker VK_SYSTEM_ALLOCATION_SCOPE_DEVICE);
492*61046927SAndroid Build Coastguard Worker if (out) {
493*61046927SAndroid Build Coastguard Worker out->pShaderBytecode = out + 1;
494*61046927SAndroid Build Coastguard Worker memcpy((void *)out->pShaderBytecode, bc.pShaderBytecode, bc.BytecodeLength);
495*61046927SAndroid Build Coastguard Worker out->BytecodeLength = bc.BytecodeLength;
496*61046927SAndroid Build Coastguard Worker _mesa_hash_table_insert(meta->fs, &info->hash_key, out);
497*61046927SAndroid Build Coastguard Worker }
498*61046927SAndroid Build Coastguard Worker free((void *)bc.pShaderBytecode);
499*61046927SAndroid Build Coastguard Worker ralloc_free(nir);
500*61046927SAndroid Build Coastguard Worker } else {
501*61046927SAndroid Build Coastguard Worker out = he->data;
502*61046927SAndroid Build Coastguard Worker }
503*61046927SAndroid Build Coastguard Worker
504*61046927SAndroid Build Coastguard Worker mtx_unlock(&meta->shaders_lock);
505*61046927SAndroid Build Coastguard Worker
506*61046927SAndroid Build Coastguard Worker return out;
507*61046927SAndroid Build Coastguard Worker }
508*61046927SAndroid Build Coastguard Worker
509*61046927SAndroid Build Coastguard Worker static void
dzn_meta_blit_destroy(struct dzn_device * device,struct dzn_meta_blit * blit)510*61046927SAndroid Build Coastguard Worker dzn_meta_blit_destroy(struct dzn_device *device, struct dzn_meta_blit *blit)
511*61046927SAndroid Build Coastguard Worker {
512*61046927SAndroid Build Coastguard Worker if (!blit)
513*61046927SAndroid Build Coastguard Worker return;
514*61046927SAndroid Build Coastguard Worker
515*61046927SAndroid Build Coastguard Worker if (blit->root_sig)
516*61046927SAndroid Build Coastguard Worker ID3D12RootSignature_Release(blit->root_sig);
517*61046927SAndroid Build Coastguard Worker if (blit->pipeline_state)
518*61046927SAndroid Build Coastguard Worker ID3D12PipelineState_Release(blit->pipeline_state);
519*61046927SAndroid Build Coastguard Worker
520*61046927SAndroid Build Coastguard Worker vk_free(&device->vk.alloc, blit);
521*61046927SAndroid Build Coastguard Worker }
522*61046927SAndroid Build Coastguard Worker
523*61046927SAndroid Build Coastguard Worker static struct dzn_meta_blit *
dzn_meta_blit_create(struct dzn_device * device,const struct dzn_meta_blit_key * key)524*61046927SAndroid Build Coastguard Worker dzn_meta_blit_create(struct dzn_device *device, const struct dzn_meta_blit_key *key)
525*61046927SAndroid Build Coastguard Worker {
526*61046927SAndroid Build Coastguard Worker struct dzn_meta_blit *blit =
527*61046927SAndroid Build Coastguard Worker vk_zalloc(&device->vk.alloc, sizeof(*blit), 8,
528*61046927SAndroid Build Coastguard Worker VK_SYSTEM_ALLOCATION_SCOPE_DEVICE);
529*61046927SAndroid Build Coastguard Worker
530*61046927SAndroid Build Coastguard Worker if (!blit)
531*61046927SAndroid Build Coastguard Worker return NULL;
532*61046927SAndroid Build Coastguard Worker
533*61046927SAndroid Build Coastguard Worker D3D12_DESCRIPTOR_RANGE1 ranges[] = {
534*61046927SAndroid Build Coastguard Worker {
535*61046927SAndroid Build Coastguard Worker .RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV,
536*61046927SAndroid Build Coastguard Worker .NumDescriptors = 1,
537*61046927SAndroid Build Coastguard Worker .BaseShaderRegister = 0,
538*61046927SAndroid Build Coastguard Worker .RegisterSpace = 0,
539*61046927SAndroid Build Coastguard Worker .Flags = D3D12_DESCRIPTOR_RANGE_FLAG_DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS,
540*61046927SAndroid Build Coastguard Worker .OffsetInDescriptorsFromTableStart = 0,
541*61046927SAndroid Build Coastguard Worker },
542*61046927SAndroid Build Coastguard Worker };
543*61046927SAndroid Build Coastguard Worker D3D12_DESCRIPTOR_RANGE1 sampler_ranges[] = {
544*61046927SAndroid Build Coastguard Worker {
545*61046927SAndroid Build Coastguard Worker .RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER,
546*61046927SAndroid Build Coastguard Worker .NumDescriptors = 1,
547*61046927SAndroid Build Coastguard Worker .BaseShaderRegister = 0,
548*61046927SAndroid Build Coastguard Worker .RegisterSpace = 0,
549*61046927SAndroid Build Coastguard Worker .Flags = 0,
550*61046927SAndroid Build Coastguard Worker .OffsetInDescriptorsFromTableStart = 0,
551*61046927SAndroid Build Coastguard Worker },
552*61046927SAndroid Build Coastguard Worker };
553*61046927SAndroid Build Coastguard Worker
554*61046927SAndroid Build Coastguard Worker D3D12_STATIC_SAMPLER_DESC samplers[] = {
555*61046927SAndroid Build Coastguard Worker {
556*61046927SAndroid Build Coastguard Worker .Filter = key->linear_filter ?
557*61046927SAndroid Build Coastguard Worker D3D12_FILTER_MIN_MAG_MIP_LINEAR :
558*61046927SAndroid Build Coastguard Worker D3D12_FILTER_MIN_MAG_MIP_POINT,
559*61046927SAndroid Build Coastguard Worker .AddressU = D3D12_TEXTURE_ADDRESS_MODE_CLAMP,
560*61046927SAndroid Build Coastguard Worker .AddressV = D3D12_TEXTURE_ADDRESS_MODE_CLAMP,
561*61046927SAndroid Build Coastguard Worker .AddressW = D3D12_TEXTURE_ADDRESS_MODE_CLAMP,
562*61046927SAndroid Build Coastguard Worker .MipLODBias = 0,
563*61046927SAndroid Build Coastguard Worker .MaxAnisotropy = 0,
564*61046927SAndroid Build Coastguard Worker .MinLOD = 0,
565*61046927SAndroid Build Coastguard Worker .MaxLOD = D3D12_FLOAT32_MAX,
566*61046927SAndroid Build Coastguard Worker .ShaderRegister = 0,
567*61046927SAndroid Build Coastguard Worker .RegisterSpace = 0,
568*61046927SAndroid Build Coastguard Worker .ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL,
569*61046927SAndroid Build Coastguard Worker },
570*61046927SAndroid Build Coastguard Worker };
571*61046927SAndroid Build Coastguard Worker
572*61046927SAndroid Build Coastguard Worker D3D12_ROOT_PARAMETER1 root_params[4] = {
573*61046927SAndroid Build Coastguard Worker {
574*61046927SAndroid Build Coastguard Worker .ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE,
575*61046927SAndroid Build Coastguard Worker .DescriptorTable = {
576*61046927SAndroid Build Coastguard Worker .NumDescriptorRanges = ARRAY_SIZE(ranges),
577*61046927SAndroid Build Coastguard Worker .pDescriptorRanges = ranges,
578*61046927SAndroid Build Coastguard Worker },
579*61046927SAndroid Build Coastguard Worker .ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL,
580*61046927SAndroid Build Coastguard Worker },
581*61046927SAndroid Build Coastguard Worker {
582*61046927SAndroid Build Coastguard Worker .ParameterType = D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS,
583*61046927SAndroid Build Coastguard Worker .Constants = {
584*61046927SAndroid Build Coastguard Worker .ShaderRegister = 0,
585*61046927SAndroid Build Coastguard Worker .RegisterSpace = 0,
586*61046927SAndroid Build Coastguard Worker .Num32BitValues = 17,
587*61046927SAndroid Build Coastguard Worker },
588*61046927SAndroid Build Coastguard Worker .ShaderVisibility = D3D12_SHADER_VISIBILITY_VERTEX,
589*61046927SAndroid Build Coastguard Worker },
590*61046927SAndroid Build Coastguard Worker {
591*61046927SAndroid Build Coastguard Worker .ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE,
592*61046927SAndroid Build Coastguard Worker .DescriptorTable = {
593*61046927SAndroid Build Coastguard Worker .NumDescriptorRanges = ARRAY_SIZE(sampler_ranges),
594*61046927SAndroid Build Coastguard Worker .pDescriptorRanges = sampler_ranges,
595*61046927SAndroid Build Coastguard Worker },
596*61046927SAndroid Build Coastguard Worker .ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL,
597*61046927SAndroid Build Coastguard Worker },
598*61046927SAndroid Build Coastguard Worker {
599*61046927SAndroid Build Coastguard Worker .ParameterType = D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS,
600*61046927SAndroid Build Coastguard Worker .Constants = {
601*61046927SAndroid Build Coastguard Worker .ShaderRegister = 0,
602*61046927SAndroid Build Coastguard Worker .RegisterSpace = 0,
603*61046927SAndroid Build Coastguard Worker .Num32BitValues = 1,
604*61046927SAndroid Build Coastguard Worker },
605*61046927SAndroid Build Coastguard Worker .ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL,
606*61046927SAndroid Build Coastguard Worker },
607*61046927SAndroid Build Coastguard Worker };
608*61046927SAndroid Build Coastguard Worker uint32_t num_root_params = 2;
609*61046927SAndroid Build Coastguard Worker
610*61046927SAndroid Build Coastguard Worker uint32_t samples = key->resolve_mode == dzn_blit_resolve_none ?
611*61046927SAndroid Build Coastguard Worker key->samples : 1;
612*61046927SAndroid Build Coastguard Worker D3D12_GRAPHICS_PIPELINE_STATE_DESC desc = {
613*61046927SAndroid Build Coastguard Worker .SampleMask = (1ULL << samples) - 1,
614*61046927SAndroid Build Coastguard Worker .RasterizerState = {
615*61046927SAndroid Build Coastguard Worker .FillMode = D3D12_FILL_MODE_SOLID,
616*61046927SAndroid Build Coastguard Worker .CullMode = D3D12_CULL_MODE_NONE,
617*61046927SAndroid Build Coastguard Worker .DepthClipEnable = true,
618*61046927SAndroid Build Coastguard Worker },
619*61046927SAndroid Build Coastguard Worker .PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE,
620*61046927SAndroid Build Coastguard Worker .SampleDesc = {
621*61046927SAndroid Build Coastguard Worker .Count = samples,
622*61046927SAndroid Build Coastguard Worker .Quality = 0,
623*61046927SAndroid Build Coastguard Worker },
624*61046927SAndroid Build Coastguard Worker .Flags = D3D12_PIPELINE_STATE_FLAG_NONE,
625*61046927SAndroid Build Coastguard Worker };
626*61046927SAndroid Build Coastguard Worker
627*61046927SAndroid Build Coastguard Worker struct dzn_nir_blit_info blit_fs_info = {
628*61046927SAndroid Build Coastguard Worker .src_samples = key->samples,
629*61046927SAndroid Build Coastguard Worker .loc = key->loc,
630*61046927SAndroid Build Coastguard Worker .out_type = key->out_type,
631*61046927SAndroid Build Coastguard Worker .sampler_dim = key->sampler_dim,
632*61046927SAndroid Build Coastguard Worker .src_is_array = key->src_is_array,
633*61046927SAndroid Build Coastguard Worker .resolve_mode = key->resolve_mode,
634*61046927SAndroid Build Coastguard Worker .stencil_fallback = key->loc == FRAG_RESULT_STENCIL && key->stencil_bit != 0xf,
635*61046927SAndroid Build Coastguard Worker .padding = 0,
636*61046927SAndroid Build Coastguard Worker };
637*61046927SAndroid Build Coastguard Worker
638*61046927SAndroid Build Coastguard Worker D3D12_VERSIONED_ROOT_SIGNATURE_DESC root_sig_desc = {
639*61046927SAndroid Build Coastguard Worker .Version = D3D_ROOT_SIGNATURE_VERSION_1_1,
640*61046927SAndroid Build Coastguard Worker .Desc_1_1 = {
641*61046927SAndroid Build Coastguard Worker .NumParameters = num_root_params,
642*61046927SAndroid Build Coastguard Worker .pParameters = root_params,
643*61046927SAndroid Build Coastguard Worker .NumStaticSamplers = ARRAY_SIZE(samplers),
644*61046927SAndroid Build Coastguard Worker .pStaticSamplers = samplers,
645*61046927SAndroid Build Coastguard Worker .Flags = D3D12_ROOT_SIGNATURE_FLAG_NONE,
646*61046927SAndroid Build Coastguard Worker },
647*61046927SAndroid Build Coastguard Worker };
648*61046927SAndroid Build Coastguard Worker
649*61046927SAndroid Build Coastguard Worker if (!device->support_static_samplers) {
650*61046927SAndroid Build Coastguard Worker root_sig_desc.Desc_1_1.NumStaticSamplers = 0;
651*61046927SAndroid Build Coastguard Worker root_sig_desc.Desc_1_1.NumParameters = 3;
652*61046927SAndroid Build Coastguard Worker }
653*61046927SAndroid Build Coastguard Worker
654*61046927SAndroid Build Coastguard Worker /* Don't need fs constants unless we're doing the stencil fallback */
655*61046927SAndroid Build Coastguard Worker if (blit_fs_info.stencil_fallback) {
656*61046927SAndroid Build Coastguard Worker if (device->support_static_samplers) {
657*61046927SAndroid Build Coastguard Worker root_params[2] = root_params[3];
658*61046927SAndroid Build Coastguard Worker root_sig_desc.Desc_1_1.NumParameters = 3;
659*61046927SAndroid Build Coastguard Worker } else {
660*61046927SAndroid Build Coastguard Worker root_sig_desc.Desc_1_1.NumParameters = 4;
661*61046927SAndroid Build Coastguard Worker }
662*61046927SAndroid Build Coastguard Worker }
663*61046927SAndroid Build Coastguard Worker
664*61046927SAndroid Build Coastguard Worker blit->root_sig = dzn_device_create_root_sig(device, &root_sig_desc);
665*61046927SAndroid Build Coastguard Worker if (!blit->root_sig) {
666*61046927SAndroid Build Coastguard Worker dzn_meta_blit_destroy(device, blit);
667*61046927SAndroid Build Coastguard Worker return NULL;
668*61046927SAndroid Build Coastguard Worker }
669*61046927SAndroid Build Coastguard Worker
670*61046927SAndroid Build Coastguard Worker desc.pRootSignature = blit->root_sig;
671*61046927SAndroid Build Coastguard Worker
672*61046927SAndroid Build Coastguard Worker const D3D12_SHADER_BYTECODE *vs, *fs;
673*61046927SAndroid Build Coastguard Worker
674*61046927SAndroid Build Coastguard Worker vs = dzn_meta_blits_get_vs(device);
675*61046927SAndroid Build Coastguard Worker if (!vs) {
676*61046927SAndroid Build Coastguard Worker dzn_meta_blit_destroy(device, blit);
677*61046927SAndroid Build Coastguard Worker return NULL;
678*61046927SAndroid Build Coastguard Worker }
679*61046927SAndroid Build Coastguard Worker
680*61046927SAndroid Build Coastguard Worker desc.VS = *vs;
681*61046927SAndroid Build Coastguard Worker assert(desc.VS.pShaderBytecode);
682*61046927SAndroid Build Coastguard Worker
683*61046927SAndroid Build Coastguard Worker fs = dzn_meta_blits_get_fs(device, &blit_fs_info);
684*61046927SAndroid Build Coastguard Worker if (!fs) {
685*61046927SAndroid Build Coastguard Worker dzn_meta_blit_destroy(device, blit);
686*61046927SAndroid Build Coastguard Worker return NULL;
687*61046927SAndroid Build Coastguard Worker }
688*61046927SAndroid Build Coastguard Worker
689*61046927SAndroid Build Coastguard Worker desc.PS = *fs;
690*61046927SAndroid Build Coastguard Worker assert(desc.PS.pShaderBytecode);
691*61046927SAndroid Build Coastguard Worker
692*61046927SAndroid Build Coastguard Worker assert(key->loc == FRAG_RESULT_DATA0 ||
693*61046927SAndroid Build Coastguard Worker key->loc == FRAG_RESULT_DEPTH ||
694*61046927SAndroid Build Coastguard Worker key->loc == FRAG_RESULT_STENCIL);
695*61046927SAndroid Build Coastguard Worker
696*61046927SAndroid Build Coastguard Worker if (key->loc == FRAG_RESULT_DATA0) {
697*61046927SAndroid Build Coastguard Worker desc.NumRenderTargets = 1;
698*61046927SAndroid Build Coastguard Worker desc.RTVFormats[0] = key->out_format;
699*61046927SAndroid Build Coastguard Worker desc.BlendState.RenderTarget[0].RenderTargetWriteMask = 0xf;
700*61046927SAndroid Build Coastguard Worker } else {
701*61046927SAndroid Build Coastguard Worker desc.DSVFormat = key->out_format;
702*61046927SAndroid Build Coastguard Worker if (key->loc == FRAG_RESULT_DEPTH) {
703*61046927SAndroid Build Coastguard Worker desc.DepthStencilState.DepthEnable = true;
704*61046927SAndroid Build Coastguard Worker desc.DepthStencilState.DepthWriteMask = D3D12_DEPTH_WRITE_MASK_ALL;
705*61046927SAndroid Build Coastguard Worker desc.DepthStencilState.DepthFunc = D3D12_COMPARISON_FUNC_ALWAYS;
706*61046927SAndroid Build Coastguard Worker } else {
707*61046927SAndroid Build Coastguard Worker assert(key->loc == FRAG_RESULT_STENCIL);
708*61046927SAndroid Build Coastguard Worker desc.DepthStencilState.StencilEnable = true;
709*61046927SAndroid Build Coastguard Worker desc.DepthStencilState.StencilWriteMask = key->stencil_bit == 0xf ? 0xff : (1 << key->stencil_bit);
710*61046927SAndroid Build Coastguard Worker desc.DepthStencilState.FrontFace.StencilFailOp = D3D12_STENCIL_OP_REPLACE;
711*61046927SAndroid Build Coastguard Worker desc.DepthStencilState.FrontFace.StencilDepthFailOp = D3D12_STENCIL_OP_REPLACE;
712*61046927SAndroid Build Coastguard Worker desc.DepthStencilState.FrontFace.StencilPassOp = D3D12_STENCIL_OP_REPLACE;
713*61046927SAndroid Build Coastguard Worker desc.DepthStencilState.FrontFace.StencilFunc = D3D12_COMPARISON_FUNC_ALWAYS;
714*61046927SAndroid Build Coastguard Worker desc.DepthStencilState.BackFace = desc.DepthStencilState.FrontFace;
715*61046927SAndroid Build Coastguard Worker }
716*61046927SAndroid Build Coastguard Worker }
717*61046927SAndroid Build Coastguard Worker
718*61046927SAndroid Build Coastguard Worker if (FAILED(ID3D12Device1_CreateGraphicsPipelineState(device->dev, &desc,
719*61046927SAndroid Build Coastguard Worker &IID_ID3D12PipelineState,
720*61046927SAndroid Build Coastguard Worker (void **)&blit->pipeline_state))) {
721*61046927SAndroid Build Coastguard Worker dzn_meta_blit_destroy(device, blit);
722*61046927SAndroid Build Coastguard Worker return NULL;
723*61046927SAndroid Build Coastguard Worker }
724*61046927SAndroid Build Coastguard Worker
725*61046927SAndroid Build Coastguard Worker return blit;
726*61046927SAndroid Build Coastguard Worker }
727*61046927SAndroid Build Coastguard Worker
728*61046927SAndroid Build Coastguard Worker const struct dzn_meta_blit *
dzn_meta_blits_get_context(struct dzn_device * device,const struct dzn_meta_blit_key * key)729*61046927SAndroid Build Coastguard Worker dzn_meta_blits_get_context(struct dzn_device *device,
730*61046927SAndroid Build Coastguard Worker const struct dzn_meta_blit_key *key)
731*61046927SAndroid Build Coastguard Worker {
732*61046927SAndroid Build Coastguard Worker struct dzn_meta_blit *out = NULL;
733*61046927SAndroid Build Coastguard Worker
734*61046927SAndroid Build Coastguard Worker STATIC_ASSERT(sizeof(*key) == sizeof(uint64_t));
735*61046927SAndroid Build Coastguard Worker
736*61046927SAndroid Build Coastguard Worker mtx_lock(&device->blits.contexts_lock);
737*61046927SAndroid Build Coastguard Worker
738*61046927SAndroid Build Coastguard Worker out =
739*61046927SAndroid Build Coastguard Worker _mesa_hash_table_u64_search(device->blits.contexts, key->u64);
740*61046927SAndroid Build Coastguard Worker if (!out) {
741*61046927SAndroid Build Coastguard Worker out = dzn_meta_blit_create(device, key);
742*61046927SAndroid Build Coastguard Worker
743*61046927SAndroid Build Coastguard Worker if (out)
744*61046927SAndroid Build Coastguard Worker _mesa_hash_table_u64_insert(device->blits.contexts, key->u64, out);
745*61046927SAndroid Build Coastguard Worker }
746*61046927SAndroid Build Coastguard Worker
747*61046927SAndroid Build Coastguard Worker mtx_unlock(&device->blits.contexts_lock);
748*61046927SAndroid Build Coastguard Worker
749*61046927SAndroid Build Coastguard Worker return out;
750*61046927SAndroid Build Coastguard Worker }
751*61046927SAndroid Build Coastguard Worker
752*61046927SAndroid Build Coastguard Worker static void
dzn_meta_blits_finish(struct dzn_device * device)753*61046927SAndroid Build Coastguard Worker dzn_meta_blits_finish(struct dzn_device *device)
754*61046927SAndroid Build Coastguard Worker {
755*61046927SAndroid Build Coastguard Worker struct dzn_meta_blits *meta = &device->blits;
756*61046927SAndroid Build Coastguard Worker
757*61046927SAndroid Build Coastguard Worker vk_free(&device->vk.alloc, (void *)meta->vs.pShaderBytecode);
758*61046927SAndroid Build Coastguard Worker
759*61046927SAndroid Build Coastguard Worker if (meta->fs) {
760*61046927SAndroid Build Coastguard Worker hash_table_foreach(meta->fs, he)
761*61046927SAndroid Build Coastguard Worker vk_free(&device->vk.alloc, he->data);
762*61046927SAndroid Build Coastguard Worker _mesa_hash_table_destroy(meta->fs, NULL);
763*61046927SAndroid Build Coastguard Worker }
764*61046927SAndroid Build Coastguard Worker
765*61046927SAndroid Build Coastguard Worker if (meta->contexts) {
766*61046927SAndroid Build Coastguard Worker hash_table_foreach(meta->contexts->table, he)
767*61046927SAndroid Build Coastguard Worker dzn_meta_blit_destroy(device, he->data);
768*61046927SAndroid Build Coastguard Worker _mesa_hash_table_u64_destroy(meta->contexts);
769*61046927SAndroid Build Coastguard Worker }
770*61046927SAndroid Build Coastguard Worker
771*61046927SAndroid Build Coastguard Worker mtx_destroy(&meta->shaders_lock);
772*61046927SAndroid Build Coastguard Worker mtx_destroy(&meta->contexts_lock);
773*61046927SAndroid Build Coastguard Worker }
774*61046927SAndroid Build Coastguard Worker
775*61046927SAndroid Build Coastguard Worker static VkResult
dzn_meta_blits_init(struct dzn_device * device)776*61046927SAndroid Build Coastguard Worker dzn_meta_blits_init(struct dzn_device *device)
777*61046927SAndroid Build Coastguard Worker {
778*61046927SAndroid Build Coastguard Worker struct dzn_instance *instance =
779*61046927SAndroid Build Coastguard Worker container_of(device->vk.physical->instance, struct dzn_instance, vk);
780*61046927SAndroid Build Coastguard Worker struct dzn_meta_blits *meta = &device->blits;
781*61046927SAndroid Build Coastguard Worker
782*61046927SAndroid Build Coastguard Worker mtx_init(&meta->shaders_lock, mtx_plain);
783*61046927SAndroid Build Coastguard Worker mtx_init(&meta->contexts_lock, mtx_plain);
784*61046927SAndroid Build Coastguard Worker
785*61046927SAndroid Build Coastguard Worker meta->fs = _mesa_hash_table_create_u32_keys(NULL);
786*61046927SAndroid Build Coastguard Worker if (!meta->fs) {
787*61046927SAndroid Build Coastguard Worker dzn_meta_blits_finish(device);
788*61046927SAndroid Build Coastguard Worker return vk_error(instance, VK_ERROR_OUT_OF_HOST_MEMORY);
789*61046927SAndroid Build Coastguard Worker }
790*61046927SAndroid Build Coastguard Worker
791*61046927SAndroid Build Coastguard Worker meta->contexts = _mesa_hash_table_u64_create(NULL);
792*61046927SAndroid Build Coastguard Worker if (!meta->contexts) {
793*61046927SAndroid Build Coastguard Worker dzn_meta_blits_finish(device);
794*61046927SAndroid Build Coastguard Worker return vk_error(instance, VK_ERROR_OUT_OF_HOST_MEMORY);
795*61046927SAndroid Build Coastguard Worker }
796*61046927SAndroid Build Coastguard Worker
797*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
798*61046927SAndroid Build Coastguard Worker }
799*61046927SAndroid Build Coastguard Worker
800*61046927SAndroid Build Coastguard Worker void
dzn_meta_finish(struct dzn_device * device)801*61046927SAndroid Build Coastguard Worker dzn_meta_finish(struct dzn_device *device)
802*61046927SAndroid Build Coastguard Worker {
803*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < ARRAY_SIZE(device->triangle_fan); i++)
804*61046927SAndroid Build Coastguard Worker dzn_meta_triangle_fan_rewrite_index_finish(device, i);
805*61046927SAndroid Build Coastguard Worker
806*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < ARRAY_SIZE(device->indirect_draws); i++)
807*61046927SAndroid Build Coastguard Worker dzn_meta_indirect_draw_finish(device, (struct dzn_indirect_draw_type) { .value = i });
808*61046927SAndroid Build Coastguard Worker
809*61046927SAndroid Build Coastguard Worker dzn_meta_blits_finish(device);
810*61046927SAndroid Build Coastguard Worker }
811*61046927SAndroid Build Coastguard Worker
812*61046927SAndroid Build Coastguard Worker VkResult
dzn_meta_init(struct dzn_device * device)813*61046927SAndroid Build Coastguard Worker dzn_meta_init(struct dzn_device *device)
814*61046927SAndroid Build Coastguard Worker {
815*61046927SAndroid Build Coastguard Worker struct dzn_physical_device *pdev = container_of(device->vk.physical, struct dzn_physical_device, vk);
816*61046927SAndroid Build Coastguard Worker VkResult result = dzn_meta_blits_init(device);
817*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS)
818*61046927SAndroid Build Coastguard Worker goto out;
819*61046927SAndroid Build Coastguard Worker
820*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < ARRAY_SIZE(device->indirect_draws); i++) {
821*61046927SAndroid Build Coastguard Worker struct dzn_indirect_draw_type type = { .value = i };
822*61046927SAndroid Build Coastguard Worker if (type.triangle_fan_primitive_restart && !type.triangle_fan)
823*61046927SAndroid Build Coastguard Worker continue;
824*61046927SAndroid Build Coastguard Worker if (type.triangle_fan && pdev->options15.TriangleFanSupported)
825*61046927SAndroid Build Coastguard Worker continue;
826*61046927SAndroid Build Coastguard Worker if (type.draw_params && pdev->options21.ExtendedCommandInfoSupported)
827*61046927SAndroid Build Coastguard Worker continue;
828*61046927SAndroid Build Coastguard Worker if (type.draw_id && pdev->options21.ExecuteIndirectTier >= D3D12_EXECUTE_INDIRECT_TIER_1_1)
829*61046927SAndroid Build Coastguard Worker continue;
830*61046927SAndroid Build Coastguard Worker VkResult result =
831*61046927SAndroid Build Coastguard Worker dzn_meta_indirect_draw_init(device, type);
832*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS)
833*61046927SAndroid Build Coastguard Worker goto out;
834*61046927SAndroid Build Coastguard Worker }
835*61046927SAndroid Build Coastguard Worker
836*61046927SAndroid Build Coastguard Worker if (!pdev->options15.TriangleFanSupported) {
837*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < ARRAY_SIZE(device->triangle_fan); i++) {
838*61046927SAndroid Build Coastguard Worker VkResult result =
839*61046927SAndroid Build Coastguard Worker dzn_meta_triangle_fan_rewrite_index_init(device, i);
840*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS)
841*61046927SAndroid Build Coastguard Worker goto out;
842*61046927SAndroid Build Coastguard Worker }
843*61046927SAndroid Build Coastguard Worker }
844*61046927SAndroid Build Coastguard Worker
845*61046927SAndroid Build Coastguard Worker out:
846*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS) {
847*61046927SAndroid Build Coastguard Worker dzn_meta_finish(device);
848*61046927SAndroid Build Coastguard Worker return result;
849*61046927SAndroid Build Coastguard Worker }
850*61046927SAndroid Build Coastguard Worker
851*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
852*61046927SAndroid Build Coastguard Worker }
853