ReactOS 0.4.17-dev-934-g091855f
shader_spirv.c
Go to the documentation of this file.
1/*
2 * Copyright 2018 Henri Verbeet for CodeWeavers
3 * Copyright 2019 Józef Kucia for CodeWeavers
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
18 */
19
20#include "wined3d_private.h"
21#include "wined3d_vk.h"
22
24
26
28{
31};
32
34{
37
40
43
46
48};
49
51{
54
56};
57
58#define MAX_SM1_INTER_STAGE_VARYINGS 12
59
61{
62 union
63 {
64 struct
65 {
67 unsigned int varying_count;
68 } vs;
69 struct
70 {
72 unsigned int sample_count;
73 } fs;
74 } u;
75};
76
78{
82
83 VkShaderModule vk_module;
84};
85
87{
90
93};
94
96{
97 VkShaderModule vk_module;
98 VkPipeline vk_pipeline;
99 VkPipelineLayout vk_pipeline_layout;
100 VkDescriptorSetLayout vk_set_layout;
101
103};
104
106{
113};
114
116{
119};
120
122{
123}
124
126 const struct wined3d_context *context, const struct wined3d_shader *shader,
127 const struct wined3d_state *state, unsigned int sample_count)
128{
129 memset(args, 0, sizeof(*args));
130
131 switch (shader->reg_maps.shader_version.type)
132 {
134 /* The context here doesn't have a valid stream info, but that's
135 * fine, because we have full_ffp_varyings. */
137 state->vertex_declaration && state->vertex_declaration->position_transformed,
138 &args->u.fs.args, context);
139 args->u.fs.sample_count = sample_count;
140 break;
141
143 {
145
146 if (shader->reg_maps.shader_version.major < 4 && ps)
147 {
148 struct shader_spirv_graphics_program_vk *vs_program = shader->backend_data;
149 struct shader_spirv_graphics_program_vk *ps_program = ps->backend_data;
150
151 if (ps_program->signature_info.input.element_count > ARRAY_SIZE(args->u.vs.varying_map))
152 ERR("Unexpected inter-stage varying count %u.\n", ps_program->signature_info.input.element_count);
154 &ps_program->signature_info.input, &args->u.vs.varying_count, args->u.vs.varying_map);
155 }
156 break;
157 }
158
159 default:
160 break;
161 }
162}
163
165 const struct shader_spirv_compile_arguments *compile_args, uint32_t ffp_extra_binding)
166{
167 struct vkd3d_shader_parameter1 *parameters = vkd3d_args->parameters;
168
172 parameters[0].u.immediate_constant.u.u32 = compile_args->u.fs.sample_count;
173
177 parameters[1].u.immediate_constant.u.u32 = compile_args->u.fs.args.flatshading;
178
182 parameters[2].u.immediate_constant.u.u32 = compile_args->u.fs.args.alpha_test_func + 1;
183
187 parameters[3].u.buffer.set = 0;
188 parameters[3].u.buffer.binding = ffp_extra_binding;
189 parameters[3].u.buffer.offset = offsetof(struct wined3d_ffp_ps_constants, alpha_test_ref);
190
191 vkd3d_args->parameter_info.parameter_count = 4;
192 vkd3d_args->parameter_info.parameters = vkd3d_args->parameters;
193}
194
195static void shader_spirv_init_compile_args(const struct wined3d_vk_info *vk_info,
200 const struct shader_spirv_resource_bindings *bindings)
201{
202 unsigned int i;
203
204 memset(args, 0, sizeof(*args));
206 args->spirv_target.next = &args->parameter_info;
207 args->spirv_target.entry_point = "main";
208 args->spirv_target.environment = environment;
209
211 args->parameter_info.next = vkd3d_interface;
212
213 args->spirv_target.extensions = args->extensions;
214
216 args->extensions[args->spirv_target.extension_count++] = VKD3D_SHADER_SPIRV_EXTENSION_EXT_STENCIL_EXPORT;
217 assert(args->spirv_target.extension_count <= ARRAY_SIZE(args->extensions));
218
220 {
221 unsigned int rt_alpha_swizzle = compile_args->u.fs.args.rt_alpha_swizzle;
222
224
225 args->spirv_target.dual_source_blending = compile_args->u.fs.args.dual_source_blend;
226
227 for (i = 0; i < ARRAY_SIZE(args->ps_alpha_swizzle); ++i)
228 {
229 if (rt_alpha_swizzle && (1u << i))
230 args->ps_alpha_swizzle[i] = VKD3D_SHADER_SWIZZLE(W, X, Y, Z);
231 else
232 args->ps_alpha_swizzle[i] = VKD3D_SHADER_NO_SWIZZLE;
233 }
234
235 args->spirv_target.output_swizzles = args->ps_alpha_swizzle;
236 args->spirv_target.output_swizzle_count = ARRAY_SIZE(args->ps_alpha_swizzle);
237 }
239 {
240 if (source_type == VKD3D_SHADER_SOURCE_D3D_BYTECODE)
241 {
242 args->spirv_target.next = &args->varying_map;
243
245 args->varying_map.next = vkd3d_interface;
246 args->varying_map.varying_map = compile_args->u.vs.varying_map;
247 args->varying_map.varying_count = compile_args->u.vs.varying_count;
248 }
249 }
250}
251
253 const struct shader_spirv_resource_bindings *b, const struct wined3d_stream_output_desc *so_desc)
254{
255 memset(iface, 0, sizeof(*iface));
257
258 if (so_desc)
259 {
261 iface->xfb_info.next = NULL;
262
263 iface->xfb_info.elements = (const struct vkd3d_shader_transform_feedback_element *)so_desc->elements;
264 iface->xfb_info.element_count = so_desc->element_count;
265 iface->xfb_info.buffer_strides = so_desc->buffer_strides;
266 iface->xfb_info.buffer_stride_count = so_desc->buffer_stride_count;
267
268 iface->vkd3d_interface.next = &iface->xfb_info;
269 }
270
271 iface->vkd3d_interface.bindings = b->bindings;
272 iface->vkd3d_interface.binding_count = b->binding_count;
273
274 iface->vkd3d_interface.uav_counters = b->uav_counters;
275 iface->vkd3d_interface.uav_counter_count = b->uav_counter_count;
276}
277
278static VkShaderModule shader_spirv_compile_shader(struct wined3d_context_vk *context_vk,
279 const struct wined3d_shader_desc *shader_desc, enum vkd3d_shader_source_type source_type,
281 const struct shader_spirv_resource_bindings *bindings, const struct wined3d_stream_output_desc *so_desc)
282{
283 struct wined3d_device_vk *device_vk = wined3d_device_vk(context_vk->c.device);
284 const struct wined3d_vk_info *vk_info = &device_vk->vk_info;
287 VkShaderModuleCreateInfo shader_create_info;
289 struct vkd3d_shader_code spirv;
290 VkShaderModule module;
291 char *messages;
292 VkResult vr;
293 int ret;
294
295 shader_spirv_init_shader_interface_vk(&iface, bindings, so_desc);
298
300 info.next = &compile_args.spirv_target;
301 info.source.code = shader_desc->byte_code;
302 info.source.size = shader_desc->byte_code_size;
303 info.source_type = source_type;
305 info.options = spirv_compile_options;
306 info.option_count = ARRAY_SIZE(spirv_compile_options);
307 info.log_level = VKD3D_SHADER_LOG_WARNING;
308 info.source_name = NULL;
309
311 if (messages && *messages && FIXME_ON(d3d_shader))
312 {
313 const char *ptr, *end, *line;
314
315 FIXME("Shader log:\n");
316 ptr = messages;
317 end = ptr + strlen(ptr);
318 while ((line = wined3d_get_line(&ptr, end)))
319 {
320 FIXME(" %.*s", (int)(ptr - line), line);
321 }
322 FIXME("\n");
323 }
325
326 if (ret < 0)
327 {
328 ERR("Failed to compile shader, ret %d.\n", ret);
329 return VK_NULL_HANDLE;
330 }
331
332 shader_create_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
333 shader_create_info.pNext = NULL;
334 shader_create_info.flags = 0;
335 shader_create_info.codeSize = spirv.size;
336 shader_create_info.pCode = spirv.code;
337 if ((vr = VK_CALL(vkCreateShaderModule(device_vk->vk_device, &shader_create_info, NULL, &module))) < 0)
338 {
340 WARN("Failed to create Vulkan shader module, vr %s.\n", wined3d_debug_vkresult(vr));
341 return VK_NULL_HANDLE;
342 }
343
345
346 return module;
347}
348
350 struct shader_spirv_priv *priv, struct wined3d_context_vk *context_vk, struct wined3d_shader *shader,
351 const struct wined3d_state *state, const struct shader_spirv_resource_bindings *bindings)
352{
353 enum wined3d_shader_type shader_type = shader->reg_maps.shader_version.type;
355 size_t binding_base = bindings->binding_base[shader_type];
356 const struct wined3d_stream_output_desc *so_desc = NULL;
357 struct shader_spirv_graphics_program_vk *program_vk;
359 struct wined3d_shader_desc shader_desc;
360 size_t variant_count, i;
361
362 shader_spirv_compile_arguments_init(&args, &context_vk->c, shader, state, context_vk->sample_count);
363 if (bindings->so_stage == shader_type)
364 so_desc = state->shader[WINED3D_SHADER_TYPE_GEOMETRY]->u.gs.so_desc;
365
366 if (!(program_vk = shader->backend_data))
367 return NULL;
368
369 variant_count = program_vk->variant_count;
370 for (i = 0; i < variant_count; ++i)
371 {
372 variant_vk = &program_vk->variants[i];
373 if (variant_vk->so_desc == so_desc && variant_vk->binding_base == binding_base
374 && !memcmp(&variant_vk->compile_args, &args, sizeof(args)))
375 return variant_vk;
376 }
377
378 if (!wined3d_array_reserve((void **)&program_vk->variants, &program_vk->variants_size,
379 variant_count + 1, sizeof(*program_vk->variants)))
380 return NULL;
381
382 variant_vk = &program_vk->variants[variant_count];
383 variant_vk->compile_args = args;
384 variant_vk->binding_base = binding_base;
385
386 if (shader->source_type == VKD3D_SHADER_SOURCE_D3D_BYTECODE)
387 {
388 shader_desc.byte_code = shader->function;
389 shader_desc.byte_code_size = shader->functionLength;
390 }
391 else
392 {
393 shader_desc.byte_code = shader->byte_code;
394 shader_desc.byte_code_size = shader->byte_code_size;
395 }
396
397 if (!(variant_vk->vk_module = shader_spirv_compile_shader(context_vk, &shader_desc,
398 shader->source_type, shader_type, &args, bindings, so_desc)))
399 return NULL;
400 ++program_vk->variant_count;
401
402 return variant_vk;
403}
404
406 struct wined3d_context_vk *context_vk, struct wined3d_shader *shader,
407 const struct shader_spirv_resource_bindings *bindings)
408{
409 struct wined3d_device_vk *device_vk = wined3d_device_vk(context_vk->c.device);
410 const struct wined3d_vk_info *vk_info = context_vk->vk_info;
412 struct wined3d_pipeline_layout_vk *layout;
413 VkComputePipelineCreateInfo pipeline_info;
414 struct wined3d_shader_desc shader_desc;
415 VkResult vr;
416
417 if (!(program = shader->backend_data))
418 return NULL;
419
420 if (program->vk_module)
421 return program;
422
423 shader_desc.byte_code = shader->byte_code;
424 shader_desc.byte_code_size = shader->byte_code_size;
425
426 if (!(program->vk_module = shader_spirv_compile_shader(context_vk, &shader_desc,
427 shader->source_type, WINED3D_SHADER_TYPE_COMPUTE, NULL, bindings, NULL)))
428 return NULL;
429
430 if (!(layout = wined3d_context_vk_get_pipeline_layout(context_vk,
431 bindings->vk_bindings, bindings->vk_binding_count)))
432 {
433 VK_CALL(vkDestroyShaderModule(device_vk->vk_device, program->vk_module, NULL));
434 program->vk_module = VK_NULL_HANDLE;
435 return NULL;
436 }
437 program->vk_set_layout = layout->vk_set_layout;
438 program->vk_pipeline_layout = layout->vk_pipeline_layout;
439
441 pipeline_info.pNext = NULL;
442 pipeline_info.flags = 0;
444 pipeline_info.stage.pNext = NULL;
445 pipeline_info.stage.flags = 0;
446 pipeline_info.stage.stage = VK_SHADER_STAGE_COMPUTE_BIT;
447 pipeline_info.stage.pName = "main";
448 pipeline_info.stage.pSpecializationInfo = NULL;
449 pipeline_info.stage.module = program->vk_module;
450 pipeline_info.layout = program->vk_pipeline_layout;
451 pipeline_info.basePipelineHandle = VK_NULL_HANDLE;
452 pipeline_info.basePipelineIndex = -1;
453 if ((vr = VK_CALL(vkCreateComputePipelines(device_vk->vk_device,
454 VK_NULL_HANDLE, 1, &pipeline_info, NULL, &program->vk_pipeline))) < 0)
455 {
456 ERR("Failed to create Vulkan compute pipeline, vr %s.\n", wined3d_debug_vkresult(vr));
457 VK_CALL(vkDestroyShaderModule(device_vk->vk_device, program->vk_module, NULL));
458 program->vk_module = VK_NULL_HANDLE;
459 return NULL;
460 }
461
462 return program;
463}
464
466{
467 free(bindings->vk_bindings);
468 free(bindings->bindings);
469}
470
472 VkDescriptorType vk_type, VkShaderStageFlagBits vk_stage, size_t *binding_idx)
473{
474 SIZE_T binding_count = bindings->vk_binding_count;
476
477 if (!wined3d_array_reserve((void **)&bindings->vk_bindings, &bindings->vk_bindings_size,
478 binding_count + 1, sizeof(*bindings->vk_bindings)))
479 return false;
480
481 *binding_idx = binding_count;
482 binding = &bindings->vk_bindings[binding_count];
483 binding->binding = binding_count;
484 binding->descriptorType = vk_type;
485 binding->descriptorCount = 1;
486 binding->stageFlags = vk_stage;
487 binding->pImmutableSamplers = NULL;
488 ++bindings->vk_binding_count;
489
490 return true;
491}
492
494 enum vkd3d_shader_descriptor_type vkd3d_type, VkDescriptorType vk_type, size_t register_idx,
495 enum vkd3d_shader_visibility vkd3d_visibility, VkShaderStageFlagBits vk_stage,
496 uint32_t flags, size_t *binding_idx)
497{
498 SIZE_T binding_count = bindings->binding_count;
500
501 if (!wined3d_array_reserve((void **)&bindings->bindings, &bindings->bindings_size,
502 binding_count + 1, sizeof(*bindings->bindings)))
503 return false;
504
505 if (!shader_spirv_resource_bindings_add_vk_binding(bindings, vk_type, vk_stage, binding_idx))
506 return false;
507
508 binding = &bindings->bindings[binding_count];
509 binding->type = vkd3d_type;
510 binding->register_space = 0;
511 binding->register_index = register_idx;
512 binding->shader_visibility = vkd3d_visibility;
513 binding->flags = flags;
514 binding->binding.set = 0;
515 binding->binding.binding = *binding_idx;
516 binding->binding.count = 1;
517 ++bindings->binding_count;
518
519 return true;
520}
521
523 size_t register_idx, enum vkd3d_shader_visibility vkd3d_visibility,
524 VkShaderStageFlagBits vk_stage, size_t *binding_idx)
525{
526 SIZE_T uav_counter_count = bindings->uav_counter_count;
528
529 if (uav_counter_count >= ARRAY_SIZE(bindings->uav_counters))
530 return false;
531
533 VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, vk_stage, binding_idx))
534 return false;
535
536 counter = &bindings->uav_counters[uav_counter_count];
537 counter->register_space = 0;
538 counter->register_index = register_idx;
539 counter->shader_visibility = vkd3d_visibility;
540 counter->binding.set = 0;
541 counter->binding.binding = *binding_idx;
542 counter->binding.count = 1;
543 counter->offset = 0;
544 ++bindings->uav_counter_count;
545
546 return true;
547}
548
550 enum wined3d_shader_type shader_type, enum wined3d_shader_descriptor_type shader_descriptor_type,
551 size_t resource_idx, enum wined3d_shader_resource_type resource_type,
552 enum wined3d_data_type resource_data_type, size_t binding_idx)
553{
555 SIZE_T binding_count = bindings->count;
556
557 if (!wined3d_array_reserve((void **)&bindings->bindings, &bindings->size,
558 binding_count + 1, sizeof(*bindings->bindings)))
559 return false;
560
561 binding = &bindings->bindings[binding_count];
562 binding->shader_type = shader_type;
563 binding->shader_descriptor_type = shader_descriptor_type;
564 binding->resource_idx = resource_idx;
565 binding->resource_type = resource_type;
566 binding->resource_data_type = resource_data_type;
567 binding->binding_idx = binding_idx;
568 ++bindings->count;
569
570 return true;
571}
572
575{
576 switch (type)
577 {
580
585
590
593
594 default:
595 FIXME("Unhandled descriptor type %#x.\n", type);
596 return ~0u;
597 }
598}
599
601{
602 switch (type)
603 {
606
609
612
615
616 default:
617 FIXME("Unhandled descriptor type %#x.\n", type);
618 return ~0u;
619 }
620}
621
623{
624 return (enum wined3d_shader_resource_type)t;
625}
626
628{
629 switch (t)
630 {
632 return WINED3D_DATA_UNORM;
634 return WINED3D_DATA_SNORM;
636 return WINED3D_DATA_INT;
638 return WINED3D_DATA_UINT;
640 return WINED3D_DATA_FLOAT;
642 return WINED3D_DATA_UINT;
643 default:
644 FIXME("Unhandled resource data type %#x.\n", t);
645 return WINED3D_DATA_FLOAT;
646 }
647}
648
650 struct wined3d_shader_resource_bindings *wined3d_bindings,
651 const struct wined3d_state *state, uint32_t shader_mask)
652{
653 const struct vkd3d_shader_scan_descriptor_info *descriptor_info;
654 enum wined3d_shader_descriptor_type wined3d_type;
655 enum vkd3d_shader_visibility shader_visibility;
657 VkDescriptorType vk_descriptor_type;
658 VkShaderStageFlagBits vk_stage;
659 struct wined3d_shader *shader;
660 size_t binding_idx;
661 unsigned int i;
662
663 bindings->binding_count = 0;
664 bindings->uav_counter_count = 0;
665 bindings->vk_binding_count = 0;
667 wined3d_bindings->count = 0;
668
670 {
671 bindings->binding_base[shader_type] = bindings->vk_binding_count;
672
673 if (!(shader_mask & (1u << shader_type)) || !(shader = state->shader[shader_type]))
674 continue;
675
677 {
678 descriptor_info = &((struct shader_spirv_compute_program_vk *)shader->backend_data)->descriptor_info;
679 }
680 else
681 {
682 descriptor_info = &((struct shader_spirv_graphics_program_vk *)shader->backend_data)->descriptor_info;
685 }
686
689
690 for (i = 0; i < descriptor_info->descriptor_count; ++i)
691 {
692 const struct vkd3d_shader_descriptor_info *d = &descriptor_info->descriptors[i];
694
695 if (d->register_space)
696 {
697 WARN("Unsupported register space %u.\n", d->register_space);
698 return false;
699 }
700
701 if (d->resource_type == VKD3D_SHADER_RESOURCE_BUFFER)
703 else
705
706 vk_descriptor_type = vk_descriptor_type_from_vkd3d(d->type, d->resource_type);
707 if (!shader_spirv_resource_bindings_add_binding(bindings, d->type, vk_descriptor_type,
708 d->register_index, shader_visibility, vk_stage, flags, &binding_idx))
709 return false;
710
711 wined3d_type = wined3d_descriptor_type_from_vkd3d(d->type);
713 wined3d_type, d->register_index, wined3d_shader_resource_type_from_vkd3d(d->resource_type),
714 wined3d_data_type_from_vkd3d(d->resource_data_type), binding_idx))
715 return false;
716
719 {
721 d->register_index, shader_visibility, vk_stage, &binding_idx))
722 return false;
726 return false;
727 }
728 }
729
730 /* vkd3d-shader doesn't scan the uniform buffers we use for parameters.
731 * It can't really be reasonably modified to do so either, because
732 * parameters are specified in terms of the destination environment
733 * (SPIRV binding set and index). Add them manually here.
734 *
735 * Note that vkd3d-shader will ignore the extra binding specified in
736 * struct shader_spirv_resource_bindings, but we use it elsewhere. */
737
738 if (shader->source_type == VKD3D_SHADER_SOURCE_D3D_BYTECODE)
739 {
742 shader_visibility, vk_stage, VKD3D_SHADER_BINDING_FLAG_BUFFER, &binding_idx))
743 return false;
747 return false;
748 bindings->ffp_extra_binding[shader_type] = binding_idx;
749 }
750 }
751
752 return true;
753}
754
756 struct vkd3d_shader_scan_descriptor_info *descriptor_info,
757 struct vkd3d_shader_scan_signature_info *signature_info)
758{
760 char *messages;
761 int ret;
762
763 memset(descriptor_info, 0, sizeof(*descriptor_info));
765
766 if (signature_info)
767 {
768 memset(signature_info, 0, sizeof(*signature_info));
770 descriptor_info->next = signature_info;
771 }
772
774 info.next = descriptor_info;
775 if (shader->source_type == VKD3D_SHADER_SOURCE_D3D_BYTECODE)
776 {
777 info.source.code = shader->function;
778 info.source.size = shader->functionLength;
779 }
780 else
781 {
782 info.source.code = shader->byte_code;
783 info.source.size = shader->byte_code_size;
784 }
785 info.source_type = shader->source_type;
787 info.options = spirv_compile_options;
788 info.option_count = ARRAY_SIZE(spirv_compile_options);
789 info.log_level = VKD3D_SHADER_LOG_WARNING;
790 info.source_name = NULL;
791
792 if ((ret = vkd3d_shader_scan(&info, &messages)) < 0)
793 ERR("Failed to scan shader, ret %d.\n", ret);
794 if (messages && *messages && FIXME_ON(d3d_shader))
795 {
796 const char *ptr, *end, *line;
797
798 FIXME("Shader log:\n");
799 ptr = messages;
800 end = ptr + strlen(ptr);
801 while ((line = wined3d_get_line(&ptr, end)))
802 {
803 FIXME(" %.*s", (int)(ptr - line), line);
804 }
805 FIXME("\n");
806 }
808}
809
811{
812 struct shader_spirv_compute_program_vk *program_vk;
813
814 if (!(program_vk = shader->backend_data))
815 {
816 if (!(program_vk = calloc(1, sizeof(*program_vk))))
817 ERR("Failed to allocate program.\n");
818 shader->backend_data = program_vk;
819 }
820
822}
823
824static void shader_spirv_precompile(void *shader_priv, struct wined3d_shader *shader)
825{
826 struct shader_spirv_graphics_program_vk *program_vk;
827
828 TRACE("shader_priv %p, shader %p.\n", shader_priv, shader);
829
830 if (shader->reg_maps.shader_version.type == WINED3D_SHADER_TYPE_COMPUTE)
831 {
833 return;
834 }
835
836 if (!(program_vk = shader->backend_data))
837 {
838 if (!(program_vk = calloc(1, sizeof(*program_vk))))
839 ERR("Failed to allocate program.\n");
840 shader->backend_data = program_vk;
841 }
842
844}
845
846static void shader_spirv_apply_draw_state(void *shader_priv, struct wined3d_context *context,
847 const struct wined3d_state *state)
848{
849 struct wined3d_context_vk *context_vk = wined3d_context_vk(context);
853 struct wined3d_pipeline_layout_vk *layout_vk;
854 struct shader_spirv_priv *priv = shader_priv;
856 struct wined3d_shader *shader;
857
858 priv->vertex_pipe->vp_apply_draw_state(context, state);
859 priv->fragment_pipe->fp_apply_draw_state(context, state);
860
861 bindings = &priv->bindings;
862 memcpy(binding_base, bindings->binding_base, sizeof(bindings->binding_base));
863 if (!shader_spirv_resource_bindings_init(bindings, &context_vk->graphics.bindings,
865 {
866 ERR("Failed to initialise shader resource bindings.\n");
867 goto fail;
868 }
869 if (context->shader_update_mask & (1u << WINED3D_SHADER_TYPE_GEOMETRY))
870 context->shader_update_mask |= 1u << bindings->so_stage;
871
872 layout_vk = wined3d_context_vk_get_pipeline_layout(context_vk, bindings->vk_bindings, bindings->vk_binding_count);
873 context_vk->graphics.vk_set_layout = layout_vk->vk_set_layout;
874 context_vk->graphics.vk_pipeline_layout = layout_vk->vk_pipeline_layout;
875
876 for (shader_type = 0; shader_type < ARRAY_SIZE(context_vk->graphics.vk_modules); ++shader_type)
877 {
878 if (!(context->shader_update_mask & (1u << shader_type)) && (!context_vk->graphics.vk_modules[shader_type]
879 || binding_base[shader_type] == bindings->binding_base[shader_type]))
880 continue;
881
882 if (!(shader = state->shader[shader_type]) || !shader->function)
883 {
884 context_vk->graphics.vk_modules[shader_type] = VK_NULL_HANDLE;
885 continue;
886 }
887
888 if (!(variant_vk = shader_spirv_find_graphics_program_variant_vk(priv, context_vk, shader, state, bindings)))
889 goto fail;
890 context_vk->graphics.vk_modules[shader_type] = variant_vk->vk_module;
891 }
892
893 return;
894
895fail:
896 context_vk->graphics.vk_set_layout = VK_NULL_HANDLE;
897 context_vk->graphics.vk_pipeline_layout = VK_NULL_HANDLE;
898}
899
900static void shader_spirv_apply_compute_state(void *shader_priv,
901 struct wined3d_context *context, const struct wined3d_state *state)
902{
903 struct wined3d_context_vk *context_vk = wined3d_context_vk(context);
905 struct shader_spirv_priv *priv = shader_priv;
906 struct wined3d_shader *shader;
907
909 &context_vk->compute.bindings, state, 1u << WINED3D_SHADER_TYPE_COMPUTE))
910 ERR("Failed to initialise shader resource bindings.\n");
911
913 program = shader_spirv_find_compute_program_vk(priv, context_vk, shader, &priv->bindings);
914 else
915 program = NULL;
916
917 if (program)
918 {
919 context_vk->compute.vk_pipeline = program->vk_pipeline;
920 context_vk->compute.vk_set_layout = program->vk_set_layout;
921 context_vk->compute.vk_pipeline_layout = program->vk_pipeline_layout;
922 }
923 else
924 {
925 context_vk->compute.vk_pipeline = VK_NULL_HANDLE;
926 context_vk->compute.vk_set_layout = VK_NULL_HANDLE;
927 context_vk->compute.vk_pipeline_layout = VK_NULL_HANDLE;
928 }
929}
930
931static void shader_spirv_disable(void *shader_priv, struct wined3d_context *context)
932{
933 struct wined3d_context_vk *context_vk = wined3d_context_vk(context);
934 struct shader_spirv_priv *priv = shader_priv;
935
936 priv->vertex_pipe->vp_disable(context);
937 priv->fragment_pipe->fp_disable(context);
938
939 context_vk->compute.vk_pipeline = VK_NULL_HANDLE;
940 context->shader_update_mask = (1u << WINED3D_SHADER_TYPE_PIXEL)
946}
947
949{
950 WARN("Not implemented.\n");
951}
952
954{
955 WARN("Not implemented.\n");
956}
957
960{
961 if (context_vk->compute.vk_pipeline == program->vk_pipeline)
962 {
963 context_vk->c.shader_update_mask |= (1u << WINED3D_SHADER_TYPE_COMPUTE);
964 context_vk->compute.vk_pipeline = VK_NULL_HANDLE;
965 }
966}
967
970{
971 unsigned int i;
972
973 for (i = 0; i < device->context_count; ++i)
974 {
976 }
977}
978
980 const struct shader_spirv_graphics_program_variant_vk *variant)
981{
983
985 {
986 if (context_vk->graphics.vk_modules[shader_type] != variant->vk_module)
987 continue;
988
989 context_vk->graphics.vk_modules[shader_type] = VK_NULL_HANDLE;
990 context_vk->c.shader_update_mask |= (1u << shader_type);
991 }
992}
993
995 const struct shader_spirv_graphics_program_variant_vk *variant)
996{
997 unsigned int i;
998
999 for (i = 0; i < device->context_count; ++i)
1000 {
1002 }
1003}
1004
1006{
1007 struct wined3d_device_vk *device_vk = wined3d_device_vk(shader->device);
1008 struct shader_spirv_compute_program_vk *program = shader->backend_data;
1009 struct wined3d_context_vk *context_vk = &device_vk->context_vk;
1010 struct wined3d_vk_info *vk_info = &device_vk->vk_info;
1011
1014 VK_CALL(vkDestroyShaderModule(device_vk->vk_device, program->vk_module, NULL));
1016 shader->backend_data = NULL;
1017 free(program);
1018}
1019
1021{
1022 struct wined3d_device_vk *device_vk = wined3d_device_vk(shader->device);
1024 struct wined3d_vk_info *vk_info = &device_vk->vk_info;
1025 struct shader_spirv_graphics_program_vk *program_vk;
1026 size_t i;
1027
1028 if (!shader->backend_data)
1029 return;
1030
1031 if (shader->reg_maps.shader_version.type == WINED3D_SHADER_TYPE_COMPUTE)
1032 {
1034 return;
1035 }
1036
1037 program_vk = shader->backend_data;
1038 for (i = 0; i < program_vk->variant_count; ++i)
1039 {
1040 variant_vk = &program_vk->variants[i];
1042 VK_CALL(vkDestroyShaderModule(device_vk->vk_device, variant_vk->vk_module, NULL));
1043 }
1044 free(program_vk->variants);
1047
1048 shader->backend_data = NULL;
1049 free(program_vk);
1050}
1051
1053 const struct wined3d_vertex_pipe_ops *vertex_pipe, const struct wined3d_fragment_pipe_ops *fragment_pipe)
1054{
1055 void *vertex_priv, *fragment_priv;
1056 struct shader_spirv_priv *priv;
1057
1058 if (!(priv = malloc(sizeof(*priv))))
1059 return E_OUTOFMEMORY;
1060
1061 if (!(vertex_priv = vertex_pipe->vp_alloc(&spirv_shader_backend_vk, priv)))
1062 {
1063 ERR("Failed to initialise vertex pipe.\n");
1064 free(priv);
1065 return E_FAIL;
1066 }
1067
1068 if (!(fragment_priv = fragment_pipe->alloc_private(&spirv_shader_backend_vk, priv)))
1069 {
1070 ERR("Failed to initialise fragment pipe.\n");
1071 vertex_pipe->vp_free(device, NULL);
1072 free(priv);
1073 return E_FAIL;
1074 }
1075
1076 priv->vertex_pipe = vertex_pipe;
1078 memset(&priv->bindings, 0, sizeof(priv->bindings));
1079
1080 device->vertex_priv = vertex_priv;
1081 device->fragment_priv = fragment_priv;
1082 device->shader_priv = priv;
1083
1084 return WINED3D_OK;
1085}
1086
1088{
1089 struct shader_spirv_priv *priv = device->shader_priv;
1090
1092 priv->fragment_pipe->free_private(device, context);
1093 priv->vertex_pipe->vp_free(device, context);
1094 free(priv);
1095}
1096
1098{
1099 return TRUE;
1100}
1101
1103{
1104}
1105
1107{
1108}
1109
1110static void shader_spirv_get_caps(const struct wined3d_adapter *adapter, struct shader_caps *caps)
1111{
1112 memset(caps, 0, sizeof(*caps));
1113
1120
1123 caps->ps_1x_max_value = FLT_MAX;
1124 caps->varying_count = 0;
1126}
1127
1129{
1130 return is_identity_fixup(fixup);
1131}
1132
1135{
1139}
1140
1142{
1143 .shader_handle_instruction = shader_spirv_handle_instruction,
1144 .shader_precompile = shader_spirv_precompile,
1145 .shader_apply_draw_state = shader_spirv_apply_draw_state,
1146 .shader_apply_compute_state = shader_spirv_apply_compute_state,
1147 .shader_disable = shader_spirv_disable,
1148 .shader_update_float_vertex_constants = shader_spirv_update_float_vertex_constants,
1149 .shader_update_float_pixel_constants = shader_spirv_update_float_pixel_constants,
1150 .shader_destroy = shader_spirv_destroy,
1151 .shader_alloc_private = shader_spirv_alloc,
1152 .shader_free_private = shader_spirv_free,
1153 .shader_allocate_context_data = shader_spirv_allocate_context_data,
1154 .shader_free_context_data = shader_spirv_free_context_data,
1155 .shader_init_context_state = shader_spirv_init_context_state,
1156 .shader_get_caps = shader_spirv_get_caps,
1157 .shader_color_fixup_supported = shader_spirv_color_fixup_supported,
1158 .shader_compile = shader_spirv_compile,
1159};
1160
1162{
1163 TRACE("Using %s.\n", vkd3d_shader_get_version(NULL, NULL));
1164
1166}
1167
1169{
1170 /* Nothing to do. */
1171}
1172
1174{
1175 /* Nothing to do. */
1176}
1177
1179{
1180 memset(caps, 0, sizeof(*caps));
1181 caps->emulated_flatshading = true;
1182}
1183
1185{
1186 return 0;
1187}
1188
1189static void *spirv_vertex_pipe_vk_vp_alloc(const struct wined3d_shader_backend_ops *shader_backend, void *shader_priv)
1190{
1191 if (shader_backend != &spirv_shader_backend_vk)
1192 {
1193 FIXME("SPIR-V vertex pipe without SPIR-V shader backend not implemented.\n");
1194 return NULL;
1195 }
1196
1197 return shader_priv;
1198}
1199
1201{
1202 /* Nothing to do. */
1203}
1204
1206{
1213 {0}, /* Terminate */
1214};
1215
1217{
1218 .vp_apply_draw_state = spirv_vertex_pipe_vk_vp_apply_draw_state,
1219 .vp_disable = spirv_vertex_pipe_vk_vp_disable,
1220 .vp_get_caps = spirv_vertex_pipe_vk_vp_get_caps,
1221 .vp_get_emul_mask = spirv_vertex_pipe_vk_vp_get_emul_mask,
1224 .vp_states = spirv_vertex_pipe_vk_vp_states,
1225};
1226
1228{
1229 return &spirv_vertex_pipe_vk;
1230}
1231
1233 struct wined3d_context *context, const struct wined3d_state *state)
1234{
1235 /* Nothing to do. */
1236}
1237
1239{
1240 /* Nothing to do. */
1241}
1242
1244{
1245 memset(caps, 0, sizeof(*caps));
1247}
1248
1250{
1251 return 0;
1252}
1253
1254static void *spirv_fragment_pipe_vk_fp_alloc(const struct wined3d_shader_backend_ops *shader_backend, void *shader_priv)
1255{
1256 if (shader_backend != &spirv_shader_backend_vk)
1257 {
1258 FIXME("SPIR-V fragment pipe without SPIR-V shader backend not implemented.\n");
1259 return NULL;
1260 }
1261
1262 return shader_priv;
1263}
1264
1266{
1267 /* Nothing to do. */
1268}
1269
1271{
1272 return TRUE;
1273}
1274
1276{
1277 /* Nothing to do. */
1278}
1279
1281{
1294 {0}, /* Terminate */
1295};
1296
1298{
1299 .fp_apply_draw_state = spirv_fragment_pipe_vk_fp_apply_draw_state,
1303 .alloc_private = spirv_fragment_pipe_vk_fp_alloc,
1304 .free_private = spirv_fragment_pipe_vk_fp_free,
1305 .allocate_context_data = spirv_fragment_pipe_vk_fp_alloc_context_data,
1307 .color_fixup_supported = shader_spirv_color_fixup_supported,
1309};
1310
1312{
1313 return &spirv_fragment_pipe_vk;
1314}
static int state
Definition: maze.c:121
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define ARRAY_SIZE(A)
Definition: main.h:20
#define FIXME(fmt,...)
Definition: precomp.h:53
#define WARN(fmt,...)
Definition: precomp.h:61
#define ERR(fmt,...)
Definition: precomp.h:57
struct wined3d_pipeline_layout_vk * wined3d_context_vk_get_pipeline_layout(struct wined3d_context_vk *context_vk, VkDescriptorSetLayoutBinding *bindings, SIZE_T binding_count)
Definition: context_vk.c:3442
VkShaderStageFlagBits vk_shader_stage_from_wined3d(enum wined3d_shader_type shader_type)
Definition: context_vk.c:59
void wined3d_context_vk_destroy_vk_pipeline(struct wined3d_context_vk *context_vk, VkPipeline vk_pipeline, uint64_t command_buffer_id)
Definition: context_vk.c:1016
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_FAIL
Definition: ddrawi.h:102
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
UINT32 uint32_t
Definition: types.h:75
UINT64 uint64_t
Definition: types.h:77
void find_ps_compile_args(const struct wined3d_state *state, const struct wined3d_shader *shader, BOOL position_transformed, struct ps_compile_args *args, const struct wined3d_context *context)
Definition: shader.c:2871
enum vkd3d_shader_visibility vkd3d_shader_visibility_from_wined3d(enum wined3d_shader_type shader_type)
Definition: shader.c:309
const char * wined3d_debug_vkresult(VkResult vr)
Definition: utils.c:5463
BOOL wined3d_array_reserve(void **elements, SIZE_T *capacity, SIZE_T count, SIZE_T size)
Definition: utils.c:6740
#define Z(I)
#define Y(I)
#define assert(_expr)
Definition: assert.h:32
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
Definition: string.c:2807
#define FLT_MAX
Definition: float.h:37
_ACRTIMP size_t __cdecl strlen(const char *)
Definition: string.c:1597
return ret
Definition: mutex.c:147
void state_nop(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id)
Definition: ffp_gl.c:42
unsigned int BOOL
Definition: ntddk_ex.h:94
return adapter
GLuint start
Definition: gl.h:1545
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLuint GLuint end
Definition: gl.h:1545
GLdouble GLdouble t
Definition: gl.h:2047
GLuint shader
Definition: glext.h:6030
GLuint program
Definition: glext.h:6723
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
GLbitfield flags
Definition: glext.h:7161
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble * u
Definition: glfuncs.h:240
unsigned int UINT
Definition: sysinfo.c:13
#define d
Definition: ke_i.h:81
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
static PVOID ptr
Definition: dispmode.c:27
static RPC_BINDING_HANDLE binding
Definition: server.c:166
static BYTE parameters[]
Definition: asn.c:558
#define min(a, b)
Definition: monoChain.cc:55
#define calloc
Definition: rosglue.h:14
#define offsetof(TYPE, MEMBER)
#define FIXME_ON(ch)
Definition: debug.h:418
#define memset(x, y, z)
Definition: compat.h:39
#define args
Definition: format.c:66
static void spirv_vertex_pipe_vk_vp_free(struct wined3d_device *device, struct wined3d_context *context)
static struct shader_spirv_graphics_program_variant_vk * shader_spirv_find_graphics_program_variant_vk(struct shader_spirv_priv *priv, struct wined3d_context_vk *context_vk, struct wined3d_shader *shader, const struct wined3d_state *state, const struct shader_spirv_resource_bindings *bindings)
Definition: shader_spirv.c:349
static void spirv_fragment_pipe_vk_fp_disable(const struct wined3d_context *context)
static HRESULT shader_spirv_alloc(struct wined3d_device *device, const struct wined3d_vertex_pipe_ops *vertex_pipe, const struct wined3d_fragment_pipe_ops *fragment_pipe)
static bool wined3d_shader_resource_bindings_add_binding(struct wined3d_shader_resource_bindings *bindings, enum wined3d_shader_type shader_type, enum wined3d_shader_descriptor_type shader_descriptor_type, size_t resource_idx, enum wined3d_shader_resource_type resource_type, enum wined3d_data_type resource_data_type, size_t binding_idx)
Definition: shader_spirv.c:549
static void spirv_fragment_pipe_vk_fp_free_context_data(struct wined3d_context *context)
#define MAX_SM1_INTER_STAGE_VARYINGS
Definition: shader_spirv.c:58
const struct wined3d_fragment_pipe_ops * wined3d_spirv_fragment_pipe_init_vk(void)
static void shader_spirv_scan_shader(struct wined3d_shader *shader, struct vkd3d_shader_scan_descriptor_info *descriptor_info, struct vkd3d_shader_scan_signature_info *signature_info)
Definition: shader_spirv.c:755
static void shader_spirv_free(struct wined3d_device *device, struct wined3d_context *context)
static void shader_spirv_init_shader_interface_vk(struct wined3d_shader_spirv_shader_interface *iface, const struct shader_spirv_resource_bindings *b, const struct wined3d_stream_output_desc *so_desc)
Definition: shader_spirv.c:252
static const struct wined3d_shader_backend_ops spirv_shader_backend_vk
Definition: shader_spirv.c:25
static BOOL shader_spirv_allocate_context_data(struct wined3d_context *context)
static void spirv_vertex_pipe_vk_vp_disable(const struct wined3d_context *context)
static void spirv_fragment_pipe_vk_fp_apply_draw_state(struct wined3d_context *context, const struct wined3d_state *state)
static bool shader_spirv_resource_bindings_add_binding(struct shader_spirv_resource_bindings *bindings, enum vkd3d_shader_descriptor_type vkd3d_type, VkDescriptorType vk_type, size_t register_idx, enum vkd3d_shader_visibility vkd3d_visibility, VkShaderStageFlagBits vk_stage, uint32_t flags, size_t *binding_idx)
Definition: shader_spirv.c:493
static void fill_ps_parameters(struct wined3d_shader_spirv_compile_args *vkd3d_args, const struct shader_spirv_compile_arguments *compile_args, uint32_t ffp_extra_binding)
Definition: shader_spirv.c:164
static void shader_spirv_handle_instruction(const struct wined3d_shader_instruction *ins)
Definition: shader_spirv.c:121
static void shader_spirv_invalidate_contexts_graphics_program_variant(struct wined3d_device *device, const struct shader_spirv_graphics_program_variant_vk *variant)
Definition: shader_spirv.c:994
static void shader_spirv_precompile_compute(struct wined3d_shader *shader)
Definition: shader_spirv.c:810
static void shader_spirv_init_compile_args(const struct wined3d_vk_info *vk_info, struct wined3d_shader_spirv_compile_args *args, struct vkd3d_shader_interface_info *vkd3d_interface, enum vkd3d_shader_spirv_environment environment, enum wined3d_shader_type shader_type, enum vkd3d_shader_source_type source_type, const struct shader_spirv_compile_arguments *compile_args, const struct shader_spirv_resource_bindings *bindings)
Definition: shader_spirv.c:195
static void shader_spirv_apply_draw_state(void *shader_priv, struct wined3d_context *context, const struct wined3d_state *state)
Definition: shader_spirv.c:846
static void * spirv_vertex_pipe_vk_vp_alloc(const struct wined3d_shader_backend_ops *shader_backend, void *shader_priv)
static void shader_spirv_invalidate_compute_program(struct wined3d_context_vk *context_vk, const struct shader_spirv_compute_program_vk *program)
Definition: shader_spirv.c:958
static const struct wined3d_vertex_pipe_ops spirv_vertex_pipe_vk
static unsigned int spirv_fragment_pipe_vk_fp_get_emul_mask(const struct wined3d_adapter *adapter)
const struct wined3d_shader_backend_ops * wined3d_spirv_shader_backend_init_vk(void)
static void shader_spirv_free_context_data(struct wined3d_context *context)
static BOOL shader_spirv_color_fixup_supported(struct color_fixup_desc fixup)
static bool shader_spirv_resource_bindings_add_vk_binding(struct shader_spirv_resource_bindings *bindings, VkDescriptorType vk_type, VkShaderStageFlagBits vk_stage, size_t *binding_idx)
Definition: shader_spirv.c:471
static VkDescriptorType vk_descriptor_type_from_vkd3d(enum vkd3d_shader_descriptor_type type, enum vkd3d_shader_resource_type resource_type)
Definition: shader_spirv.c:573
static struct shader_spirv_compute_program_vk * shader_spirv_find_compute_program_vk(struct shader_spirv_priv *priv, struct wined3d_context_vk *context_vk, struct wined3d_shader *shader, const struct shader_spirv_resource_bindings *bindings)
Definition: shader_spirv.c:405
static void spirv_vertex_pipe_vk_vp_get_caps(const struct wined3d_adapter *adapter, struct wined3d_vertex_caps *caps)
static VkShaderModule shader_spirv_compile_shader(struct wined3d_context_vk *context_vk, const struct wined3d_shader_desc *shader_desc, enum vkd3d_shader_source_type source_type, enum wined3d_shader_type shader_type, const struct shader_spirv_compile_arguments *args, const struct shader_spirv_resource_bindings *bindings, const struct wined3d_stream_output_desc *so_desc)
Definition: shader_spirv.c:278
static void shader_spirv_precompile(void *shader_priv, struct wined3d_shader *shader)
Definition: shader_spirv.c:824
static const struct wined3d_fragment_pipe_ops spirv_fragment_pipe_vk
static bool shader_spirv_resource_bindings_init(struct shader_spirv_resource_bindings *bindings, struct wined3d_shader_resource_bindings *wined3d_bindings, const struct wined3d_state *state, uint32_t shader_mask)
Definition: shader_spirv.c:649
static void shader_spirv_init_context_state(struct wined3d_context *context)
static void spirv_fragment_pipe_vk_fp_free(struct wined3d_device *device, struct wined3d_context *context)
static void shader_spirv_update_float_vertex_constants(struct wined3d_device *device, UINT start, UINT count)
Definition: shader_spirv.c:948
static bool shader_spirv_resource_bindings_add_uav_counter_binding(struct shader_spirv_resource_bindings *bindings, size_t register_idx, enum vkd3d_shader_visibility vkd3d_visibility, VkShaderStageFlagBits vk_stage, size_t *binding_idx)
Definition: shader_spirv.c:522
static enum wined3d_shader_resource_type wined3d_shader_resource_type_from_vkd3d(enum vkd3d_shader_resource_type t)
Definition: shader_spirv.c:622
static enum wined3d_data_type wined3d_data_type_from_vkd3d(enum vkd3d_shader_resource_data_type t)
Definition: shader_spirv.c:627
static void spirv_vertex_pipe_vk_vp_apply_draw_state(struct wined3d_context *context, const struct wined3d_state *state)
static void shader_spirv_destroy(struct wined3d_shader *shader)
static void shader_spirv_apply_compute_state(void *shader_priv, struct wined3d_context *context, const struct wined3d_state *state)
Definition: shader_spirv.c:900
static void shader_spirv_invalidate_graphics_program_variant(struct wined3d_context_vk *context_vk, const struct shader_spirv_graphics_program_variant_vk *variant)
Definition: shader_spirv.c:979
static void * spirv_fragment_pipe_vk_fp_alloc(const struct wined3d_shader_backend_ops *shader_backend, void *shader_priv)
static BOOL spirv_fragment_pipe_vk_fp_alloc_context_data(struct wined3d_context *context)
static void shader_spirv_invalidate_contexts_compute_program(struct wined3d_device *device, const struct shader_spirv_compute_program_vk *program)
Definition: shader_spirv.c:968
static void shader_spirv_resource_bindings_cleanup(struct shader_spirv_resource_bindings *bindings)
Definition: shader_spirv.c:465
static const struct wined3d_state_entry_template spirv_fragment_pipe_vk_fp_states[]
static void shader_spirv_get_caps(const struct wined3d_adapter *adapter, struct shader_caps *caps)
static const struct vkd3d_shader_compile_option spirv_compile_options[]
Definition: shader_spirv.c:27
const struct wined3d_vertex_pipe_ops * wined3d_spirv_vertex_pipe_init_vk(void)
static void shader_spirv_disable(void *shader_priv, struct wined3d_context *context)
Definition: shader_spirv.c:931
static const struct wined3d_state_entry_template spirv_vertex_pipe_vk_vp_states[]
static enum wined3d_shader_descriptor_type wined3d_descriptor_type_from_vkd3d(enum vkd3d_shader_descriptor_type type)
Definition: shader_spirv.c:600
static unsigned int spirv_vertex_pipe_vk_vp_get_emul_mask(const struct wined3d_adapter *adapter)
static void spirv_fragment_pipe_vk_fp_get_caps(const struct wined3d_adapter *adapter, struct fragment_caps *caps)
static uint64_t shader_spirv_compile(struct wined3d_context *context, const struct wined3d_shader_desc *shader_desc, enum wined3d_shader_type shader_type)
static void shader_spirv_compile_arguments_init(struct shader_spirv_compile_arguments *args, const struct wined3d_context *context, const struct wined3d_shader *shader, const struct wined3d_state *state, unsigned int sample_count)
Definition: shader_spirv.c:125
static void shader_spirv_destroy_compute_vk(struct wined3d_shader *shader)
static void shader_spirv_update_float_pixel_constants(struct wined3d_device *device, UINT start, UINT count)
Definition: shader_spirv.c:953
#define TRACE(s)
Definition: solgame.cpp:4
enum vkd3d_shader_spirv_environment environment
Definition: spirv.c:4841
VkStructureType sType
Definition: vulkan.h:17583
VkPipelineCreateFlags flags
Definition: vulkan.h:17585
Definition: polytest.cpp:36
Definition: match.c:390
Definition: http.c:7252
Definition: devices.h:37
unsigned int max_blend_stages
enum api function
Definition: notification.c:71
Definition: parser.c:49
unsigned int vs_version
unsigned int varying_count
unsigned int cs_version
unsigned int ps_uniform_count
unsigned int hs_version
unsigned int gs_version
unsigned int vs_uniform_count
unsigned int ps_version
unsigned int ds_version
struct shader_spirv_compile_arguments::@339::@340 vs
union shader_spirv_compile_arguments::@339 u
struct vkd3d_shader_varying_map varying_map[MAX_SM1_INTER_STAGE_VARYINGS]
Definition: shader_spirv.c:66
struct shader_spirv_compile_arguments::@339::@341 fs
struct vkd3d_shader_scan_descriptor_info descriptor_info
Definition: shader_spirv.c:102
VkDescriptorSetLayout vk_set_layout
Definition: shader_spirv.c:100
VkPipelineLayout vk_pipeline_layout
Definition: shader_spirv.c:99
const struct wined3d_stream_output_desc * so_desc
Definition: shader_spirv.c:80
struct shader_spirv_compile_arguments compile_args
Definition: shader_spirv.c:79
struct vkd3d_shader_scan_descriptor_info descriptor_info
Definition: shader_spirv.c:91
struct vkd3d_shader_scan_signature_info signature_info
Definition: shader_spirv.c:92
struct shader_spirv_graphics_program_variant_vk * variants
Definition: shader_spirv.c:88
const struct wined3d_fragment_pipe_ops * fragment_pipe
Definition: shader_spirv.c:53
struct shader_spirv_resource_bindings bindings
Definition: shader_spirv.c:55
const struct wined3d_vertex_pipe_ops * vertex_pipe
Definition: shader_spirv.c:52
enum wined3d_shader_type so_stage
Definition: shader_spirv.c:45
struct vkd3d_shader_resource_binding * bindings
Definition: shader_spirv.c:35
size_t binding_base[WINED3D_SHADER_TYPE_COUNT]
Definition: shader_spirv.c:44
VkDescriptorSetLayoutBinding * vk_bindings
Definition: shader_spirv.c:41
struct vkd3d_shader_uav_counter_binding uav_counters[MAX_UNORDERED_ACCESS_VIEWS]
Definition: shader_spirv.c:38
const void * code
Definition: vkd3d_shader.h:413
enum vkd3d_shader_structure_type type
struct vkd3d_shader_descriptor_info * descriptors
enum vkd3d_shader_structure_type type
VkSampleCountFlagBits sample_count
Definition: wined3d_vk.h:640
struct wined3d_command_buffer_vk current_command_buffer
Definition: wined3d_vk.h:617
struct wined3d_context_vk::@363 compute
struct wined3d_context_vk::@362 graphics
const struct wined3d_vk_info * vk_info
Definition: wined3d_vk.h:590
VkPipeline vk_pipeline
Definition: wined3d_vk.h:602
struct wined3d_context c
Definition: wined3d_vk.h:588
struct wined3d_device d
Definition: wined3d_vk.h:821
VkDevice vk_device
Definition: wined3d_vk.h:825
struct wined3d_vk_info vk_info
Definition: wined3d_vk.h:830
struct wined3d_context_vk context_vk
Definition: wined3d_vk.h:823
VkDescriptorSetLayout vk_set_layout
Definition: wined3d_vk.h:522
VkPipelineLayout vk_pipeline_layout
Definition: wined3d_vk.h:521
unsigned int max_sm_hs
unsigned int max_sm_vs
unsigned int max_sm_ps
unsigned int max_sm_cs
unsigned int max_sm_ds
unsigned int max_sm_gs
const DWORD * byte_code
Definition: wined3d.h:2105
size_t byte_code_size
Definition: wined3d.h:2106
enum wined3d_data_type resource_data_type
Definition: wined3d_vk.h:570
enum wined3d_shader_descriptor_type shader_descriptor_type
Definition: wined3d_vk.h:567
enum wined3d_shader_resource_type resource_type
Definition: wined3d_vk.h:569
struct wined3d_shader_resource_binding * bindings
Definition: wined3d_vk.h:576
struct vkd3d_shader_spirv_target_info spirv_target
Definition: shader_spirv.c:108
enum vkd3d_shader_spirv_extension extensions[1]
Definition: shader_spirv.c:110
struct vkd3d_shader_parameter_info parameter_info
Definition: shader_spirv.c:109
unsigned int ps_alpha_swizzle[WINED3D_MAX_RENDER_TARGETS]
Definition: shader_spirv.c:112
struct vkd3d_shader_parameter1 parameters[4]
Definition: shader_spirv.c:111
struct vkd3d_shader_varying_map_info varying_map
Definition: shader_spirv.c:107
struct vkd3d_shader_interface_info vkd3d_interface
Definition: shader_spirv.c:117
struct vkd3d_shader_transform_feedback_info xfb_info
Definition: shader_spirv.c:118
struct wined3d_pixel_shader ps
unsigned int buffer_strides[WINED3D_MAX_STREAM_OUTPUT_BUFFERS]
Definition: wined3d.h:2123
unsigned int element_count
Definition: wined3d.h:2122
const struct wined3d_stream_output_element * elements
Definition: wined3d.h:2121
unsigned int buffer_stride_count
Definition: wined3d.h:2124
BOOL supported[WINED3D_VK_EXT_COUNT]
Definition: wined3d_vk.h:261
enum vkd3d_primitive_type vkd3d_type
Definition: tpf.c:725
ULONG_PTR SIZE_T
Definition: typedefs.h:80
static HRESULT compile_args(compile_ctx_t *ctx, expression_t *args, unsigned *ret)
Definition: compile.c:452
@ VKD3D_SHADER_COMPILE_OPTION_API_VERSION
Definition: vkd3d_shader.h:279
@ VKD3D_SHADER_COMPILE_OPTION_WRITE_TESS_GEOM_POINT_SIZE
Definition: vkd3d_shader.h:293
vkd3d_shader_resource_data_type
@ VKD3D_SHADER_RESOURCE_DATA_MIXED
@ VKD3D_SHADER_RESOURCE_DATA_SNORM
@ VKD3D_SHADER_RESOURCE_DATA_UINT
@ VKD3D_SHADER_RESOURCE_DATA_FLOAT
@ VKD3D_SHADER_RESOURCE_DATA_UNORM
@ VKD3D_SHADER_RESOURCE_DATA_INT
VKD3D_SHADER_API const char * vkd3d_shader_get_version(unsigned int *major, unsigned int *minor)
@ VKD3D_SHADER_PARAMETER_TYPE_BUFFER
Definition: vkd3d_shader.h:494
@ VKD3D_SHADER_PARAMETER_TYPE_IMMEDIATE_CONSTANT
Definition: vkd3d_shader.h:482
VKD3D_SHADER_API void vkd3d_shader_free_shader_code(struct vkd3d_shader_code *code)
@ VKD3D_SHADER_PARAMETER_DATA_TYPE_UINT32
Definition: vkd3d_shader.h:507
@ VKD3D_SHADER_PARAMETER_DATA_TYPE_FLOAT32
Definition: vkd3d_shader.h:509
VKD3D_SHADER_API void vkd3d_shader_build_varying_map(const struct vkd3d_shader_signature *output_signature, const struct vkd3d_shader_signature *input_signature, unsigned int *count, struct vkd3d_shader_varying_map *varyings)
@ VKD3D_SHADER_DESCRIPTOR_INFO_FLAG_UAV_COUNTER
vkd3d_shader_source_type
@ VKD3D_SHADER_SOURCE_D3D_BYTECODE
@ VKD3D_SHADER_SOURCE_DXBC_TPF
@ VKD3D_SHADER_LOG_WARNING
VKD3D_SHADER_API int vkd3d_shader_scan(const struct vkd3d_shader_compile_info *compile_info, char **messages)
@ VKD3D_SHADER_STRUCTURE_TYPE_TRANSFORM_FEEDBACK_INFO
Definition: vkd3d_shader.h:78
@ VKD3D_SHADER_STRUCTURE_TYPE_COMPILE_INFO
Definition: vkd3d_shader.h:68
@ VKD3D_SHADER_STRUCTURE_TYPE_PARAMETER_INFO
Definition: vkd3d_shader.h:114
@ VKD3D_SHADER_STRUCTURE_TYPE_SCAN_DESCRIPTOR_INFO
Definition: vkd3d_shader.h:72
@ VKD3D_SHADER_STRUCTURE_TYPE_SCAN_SIGNATURE_INFO
Definition: vkd3d_shader.h:99
@ VKD3D_SHADER_STRUCTURE_TYPE_INTERFACE_INFO
Definition: vkd3d_shader.h:70
@ VKD3D_SHADER_STRUCTURE_TYPE_VARYING_MAP_INFO
Definition: vkd3d_shader.h:104
@ VKD3D_SHADER_STRUCTURE_TYPE_SPIRV_TARGET_INFO
Definition: vkd3d_shader.h:76
vkd3d_shader_visibility
Definition: vkd3d_shader.h:383
vkd3d_shader_spirv_extension
@ VKD3D_SHADER_SPIRV_EXTENSION_EXT_STENCIL_EXPORT
@ VKD3D_SHADER_API_VERSION_1_7
Definition: vkd3d_shader.h:52
vkd3d_shader_descriptor_type
Definition: vkd3d_shader.h:420
@ VKD3D_SHADER_DESCRIPTOR_TYPE_UAV
Definition: vkd3d_shader.h:430
@ VKD3D_SHADER_DESCRIPTOR_TYPE_CBV
Definition: vkd3d_shader.h:435
@ VKD3D_SHADER_DESCRIPTOR_TYPE_SAMPLER
Definition: vkd3d_shader.h:440
@ VKD3D_SHADER_DESCRIPTOR_TYPE_SRV
Definition: vkd3d_shader.h:425
vkd3d_shader_resource_type
@ VKD3D_SHADER_RESOURCE_BUFFER
@ VKD3D_SHADER_BINDING_FLAG_IMAGE
Definition: vkd3d_shader.h:469
@ VKD3D_SHADER_BINDING_FLAG_BUFFER
Definition: vkd3d_shader.h:468
VKD3D_SHADER_API void vkd3d_shader_free_scan_signature_info(struct vkd3d_shader_scan_signature_info *info)
VKD3D_SHADER_API int vkd3d_shader_compile(const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_code *out, char **messages)
VKD3D_SHADER_API void vkd3d_shader_free_scan_descriptor_info(struct vkd3d_shader_scan_descriptor_info *scan_descriptor_info)
#define VKD3D_SHADER_SWIZZLE(x, y, z, w)
#define VKD3D_SHADER_NO_SWIZZLE
@ VKD3D_SHADER_TARGET_SPIRV_BINARY
vkd3d_shader_spirv_environment
@ VKD3D_SHADER_SPIRV_ENVIRONMENT_VULKAN_1_0
@ VKD3D_SHADER_PARAMETER_NAME_RASTERIZER_SAMPLE_COUNT
Definition: vkd3d_shader.h:540
@ VKD3D_SHADER_PARAMETER_NAME_ALPHA_TEST_FUNC
Definition: vkd3d_shader.h:565
@ VKD3D_SHADER_PARAMETER_NAME_ALPHA_TEST_REF
Definition: vkd3d_shader.h:575
@ VKD3D_SHADER_PARAMETER_NAME_FLAT_INTERPOLATION
Definition: vkd3d_shader.h:599
VKD3D_SHADER_API void vkd3d_shader_free_messages(char *messages)
VkShaderStageFlagBits
Definition: vulkan.h:4873
@ VK_SHADER_STAGE_COMPUTE_BIT
Definition: vulkan.h:4880
VkResult VKAPI_CALL vkCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkComputePipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines)
void VKAPI_CALL vkDestroyShaderModule(VkDevice device, VkShaderModule shaderModule, const VkAllocationCallbacks *pAllocator)
VkResult
Definition: vulkan.h:4639
VkDescriptorType
Definition: vulkan.h:2463
@ VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER
Definition: vulkan.h:2469
@ VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE
Definition: vulkan.h:2466
@ VK_DESCRIPTOR_TYPE_SAMPLER
Definition: vulkan.h:2464
@ VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER
Definition: vulkan.h:2470
@ VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER
Definition: vulkan.h:2468
@ VK_DESCRIPTOR_TYPE_STORAGE_IMAGE
Definition: vulkan.h:2467
#define VK_NULL_HANDLE
Definition: vulkan.h:861
VkResult VKAPI_CALL vkCreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkShaderModule *pShaderModule)
@ VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO
Definition: vulkan.h:4993
@ VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO
Definition: vulkan.h:4980
@ VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO
Definition: vulkan.h:4982
@ WINED3D_RS_FOGCOLOR
Definition: wined3d.h:317
@ WINED3D_RS_SHADEMODE
Definition: wined3d.h:295
@ WINED3D_RS_FOGEND
Definition: wined3d.h:320
@ WINED3D_RS_SRGBWRITEENABLE
Definition: wined3d.h:400
@ WINED3D_RS_POINTSIZE_MIN
Definition: wined3d.h:363
@ WINED3D_RS_FOGSTART
Definition: wined3d.h:319
@ WINED3D_RS_FOGTABLEMODE
Definition: wined3d.h:318
@ WINED3D_RS_POINTSIZE
Definition: wined3d.h:362
@ WINED3D_RS_POINTSIZE_MAX
Definition: wined3d.h:374
@ WINED3D_RS_CLIPPLANEENABLE
Definition: wined3d.h:360
@ WINED3D_RS_FOGENABLE
Definition: wined3d.h:311
@ WINED3D_RS_POINTSPRITEENABLE
Definition: wined3d.h:364
@ WINED3D_RS_CLIPPING
Definition: wined3d.h:346
@ WINED3D_RS_FOGVERTEXMODE
Definition: wined3d.h:350
@ WINED3D_RS_FOGDENSITY
Definition: wined3d.h:321
@ WINED3D_RS_ALPHATESTENABLE
Definition: wined3d.h:301
@ WINED3D_RS_ALPHAFUNC
Definition: wined3d.h:308
#define WINED3D_OK
Definition: wined3d.h:33
#define WINED3D_MAX_PS_CONSTS_F
Definition: wined3d.h:1605
#define WINED3D_MAX_VS_CONSTS_F
Definition: wined3d.h:1604
#define WINED3D_MAX_RENDER_TARGETS
Definition: wined3d.h:1606
wined3d_shader_type
Definition: wined3d.h:840
@ WINED3D_SHADER_TYPE_HULL
Definition: wined3d.h:844
@ WINED3D_SHADER_TYPE_PIXEL
Definition: wined3d.h:841
@ WINED3D_SHADER_TYPE_GEOMETRY
Definition: wined3d.h:843
@ WINED3D_SHADER_TYPE_GRAPHICS_COUNT
Definition: wined3d.h:846
@ WINED3D_SHADER_TYPE_DOMAIN
Definition: wined3d.h:845
@ WINED3D_SHADER_TYPE_COMPUTE
Definition: wined3d.h:848
@ WINED3D_SHADER_TYPE_VERTEX
Definition: wined3d.h:842
@ WINED3D_SHADER_TYPE_COUNT
Definition: wined3d.h:849
#define WINED3D_MAX_FFP_TEXTURES
Definition: wined3d.h:1597
wined3d_data_type
@ WINED3D_DATA_UINT
@ WINED3D_DATA_INT
@ WINED3D_DATA_SNORM
@ WINED3D_DATA_UNORM
@ WINED3D_DATA_FLOAT
#define STATE_SHADER(a)
#define MAX_UNORDERED_ACCESS_VIEWS
wined3d_shader_resource_type
@ WINED3D_SHADER_RESOURCE_BUFFER
#define WINED3D_SHADER_CAP_FULL_FFP_VARYINGS
static const char * wined3d_get_line(const char **ptr, const char *end)
static BOOL is_identity_fixup(struct color_fixup_desc fixup)
#define WINED3D_FFP_CONSTANTS_EXTRA_REGISTER
#define STATE_RENDER(a)
wined3d_shader_descriptor_type
Definition: wined3d_vk.h:556
@ WINED3D_SHADER_DESCRIPTOR_TYPE_UAV
Definition: wined3d_vk.h:559
@ WINED3D_SHADER_DESCRIPTOR_TYPE_SRV
Definition: wined3d_vk.h:558
@ WINED3D_SHADER_DESCRIPTOR_TYPE_UAV_COUNTER
Definition: wined3d_vk.h:560
@ WINED3D_SHADER_DESCRIPTOR_TYPE_CBV
Definition: wined3d_vk.h:557
@ WINED3D_SHADER_DESCRIPTOR_TYPE_SAMPLER
Definition: wined3d_vk.h:561
#define VK_CALL(f)
Definition: wined3d_vk.h:272
@ WINED3D_VK_EXT_SHADER_STENCIL_EXPORT
Definition: wined3d_vk.h:244