This allows for the basic features necessary to compile sm1 shaders. This is the first step towards comprehensive Direct3D 1-9 support in the Vulkan backend.
Fixed-function d3d states that must be emulated with shaders in Vulkan (e.g. alpha test) are not yet implemented, nor is the fixed-function pipeline. Accordingly it is unlikely that any real applications run yet.
Tested with vkd3d's tests. Specifically, run `make crosstest` in a vkd3d tree, then:
wine tests/shader_runner.cross64.exe ../vkd3d/tests/hlsl/writemask-assignop-0.shader_test
From: Zebediah Figura zfigura@codeweavers.com
--- dlls/wined3d/adapter_vk.c | 1 + dlls/wined3d/cs.c | 35 +++++++++++++++++++++++++--------- dlls/wined3d/wined3d_private.h | 1 + 3 files changed, 28 insertions(+), 9 deletions(-)
diff --git a/dlls/wined3d/adapter_vk.c b/dlls/wined3d/adapter_vk.c index 3e6604c035e..0e6a7babfb1 100644 --- a/dlls/wined3d/adapter_vk.c +++ b/dlls/wined3d/adapter_vk.c @@ -2322,6 +2322,7 @@ static void wined3d_adapter_vk_init_d3d_info(struct wined3d_adapter_vk *adapter_ d3d_info->subpixel_viewport = true; d3d_info->fences = true; d3d_info->persistent_map = true; + d3d_info->gpu_push_constants = true;
/* Like GL, Vulkan doesn't explicitly specify a filling convention and only mandates that a * shared edge of two adjacent triangles generate a fragment for exactly one of the triangles. diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c index 37d160d8f25..fb114fb0b78 100644 --- a/dlls/wined3d/cs.c +++ b/dlls/wined3d/cs.c @@ -2144,29 +2144,39 @@ static const struct push_constant_info size_t size; unsigned int max_count; DWORD mask; + enum wined3d_shader_type shader_type; + enum vkd3d_shader_d3dbc_constant_register shader_binding; } wined3d_cs_push_constant_info[] = { - [WINED3D_PUSH_CONSTANTS_VS_F] = {sizeof(struct wined3d_vec4), WINED3D_MAX_VS_CONSTS_F, WINED3D_SHADER_CONST_VS_F}, - [WINED3D_PUSH_CONSTANTS_PS_F] = {sizeof(struct wined3d_vec4), WINED3D_MAX_PS_CONSTS_F, WINED3D_SHADER_CONST_PS_F}, - [WINED3D_PUSH_CONSTANTS_VS_I] = {sizeof(struct wined3d_ivec4), WINED3D_MAX_CONSTS_I, WINED3D_SHADER_CONST_VS_I}, - [WINED3D_PUSH_CONSTANTS_PS_I] = {sizeof(struct wined3d_ivec4), WINED3D_MAX_CONSTS_I, WINED3D_SHADER_CONST_PS_I}, - [WINED3D_PUSH_CONSTANTS_VS_B] = {sizeof(BOOL), WINED3D_MAX_CONSTS_B, WINED3D_SHADER_CONST_VS_B}, - [WINED3D_PUSH_CONSTANTS_PS_B] = {sizeof(BOOL), WINED3D_MAX_CONSTS_B, WINED3D_SHADER_CONST_PS_B}, + [WINED3D_PUSH_CONSTANTS_VS_F] = {sizeof(struct wined3d_vec4), WINED3D_MAX_VS_CONSTS_F, WINED3D_SHADER_CONST_VS_F, WINED3D_SHADER_TYPE_VERTEX, VKD3D_SHADER_D3DBC_FLOAT_CONSTANT_REGISTER}, + [WINED3D_PUSH_CONSTANTS_PS_F] = {sizeof(struct wined3d_vec4), WINED3D_MAX_PS_CONSTS_F, WINED3D_SHADER_CONST_PS_F, WINED3D_SHADER_TYPE_PIXEL, VKD3D_SHADER_D3DBC_FLOAT_CONSTANT_REGISTER}, + [WINED3D_PUSH_CONSTANTS_VS_I] = {sizeof(struct wined3d_ivec4), WINED3D_MAX_CONSTS_I, WINED3D_SHADER_CONST_VS_I, WINED3D_SHADER_TYPE_VERTEX, VKD3D_SHADER_D3DBC_INT_CONSTANT_REGISTER}, + [WINED3D_PUSH_CONSTANTS_PS_I] = {sizeof(struct wined3d_ivec4), WINED3D_MAX_CONSTS_I, WINED3D_SHADER_CONST_PS_I, WINED3D_SHADER_TYPE_PIXEL, VKD3D_SHADER_D3DBC_INT_CONSTANT_REGISTER}, + [WINED3D_PUSH_CONSTANTS_VS_B] = {sizeof(BOOL), WINED3D_MAX_CONSTS_B, WINED3D_SHADER_CONST_VS_B, WINED3D_SHADER_TYPE_VERTEX, VKD3D_SHADER_D3DBC_BOOL_CONSTANT_REGISTER}, + [WINED3D_PUSH_CONSTANTS_PS_B] = {sizeof(BOOL), WINED3D_MAX_CONSTS_B, WINED3D_SHADER_CONST_PS_B, WINED3D_SHADER_TYPE_PIXEL, VKD3D_SHADER_D3DBC_BOOL_CONSTANT_REGISTER}, };
-static bool prepare_push_constant_buffer(struct wined3d_device *device, enum wined3d_push_constants type) +static bool prepare_push_constant_buffer(struct wined3d_device_context *context, enum wined3d_push_constants type) { const struct push_constant_info *info = &wined3d_cs_push_constant_info[type]; + struct wined3d_device *device = context->device; + bool gpu = device->adapter->d3d_info.gpu_push_constants; HRESULT hr;
- const struct wined3d_buffer_desc desc = + struct wined3d_buffer_desc desc = { .byte_width = info->max_count * info->size, .bind_flags = 0, .access = WINED3D_RESOURCE_ACCESS_CPU | WINED3D_RESOURCE_ACCESS_MAP_R | WINED3D_RESOURCE_ACCESS_MAP_W, };
+ if (gpu) + { + desc.bind_flags = WINED3D_BIND_CONSTANT_BUFFER; + desc.access = WINED3D_RESOURCE_ACCESS_GPU; + } + if (!device->push_constants[type] && FAILED(hr = wined3d_buffer_create(device, &desc, NULL, NULL, &wined3d_null_parent_ops, &device->push_constants[type]))) { @@ -2174,6 +2184,13 @@ static bool prepare_push_constant_buffer(struct wined3d_device *device, enum win return false; }
+ if (gpu) + { + struct wined3d_constant_buffer_state state = {.buffer = device->push_constants[type], .size = desc.byte_width}; + + wined3d_device_context_emit_set_constant_buffers(context, info->shader_type, info->shader_binding, 1, &state); + } + return true; }
@@ -2219,7 +2236,7 @@ void wined3d_device_context_push_constants(struct wined3d_device_context *contex unsigned int byte_size = count * info->size; struct wined3d_box box;
- if (!prepare_push_constant_buffer(context->device, type)) + if (!prepare_push_constant_buffer(context, type)) return;
wined3d_box_set(&box, byte_offset, 0, byte_offset + byte_size, 1, 0, 1); diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 238456e78d8..5a35ca88a7b 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -236,6 +236,7 @@ struct wined3d_d3d_info uint32_t subpixel_viewport : 1; uint32_t fences : 1; uint32_t persistent_map : 1; + uint32_t gpu_push_constants : 1; enum wined3d_feature_level feature_level;
DWORD multisample_draw_location;
From: Fan Wenjie fanwj@mail.ustc.edu.cn
--- configure.ac | 2 +- dlls/wined3d/shader_spirv.c | 12 ++++++++++-- dlls/wined3d/wined3d_private.h | 2 ++ 3 files changed, 13 insertions(+), 3 deletions(-)
diff --git a/configure.ac b/configure.ac index cba55126869..d60576a8604 100644 --- a/configure.ac +++ b/configure.ac @@ -1161,7 +1161,7 @@ then if test "$ac_cv_mingw_header_vkd3d_h" = "yes" -a "$ac_cv_mingw_header_vkd3d_shader_h" = "yes" then WINE_CHECK_MINGW_LIB(vkd3d,vkd3d_set_log_callback,[:],[:],[$VKD3D_PE_LIBS]) - WINE_CHECK_MINGW_LIB(vkd3d-shader,vkd3d_shader_serialize_dxbc,[:],[:],[$VKD3D_PE_LIBS]) + WINE_CHECK_MINGW_LIB(vkd3d-shader,vkd3d_shader_free_scan_combined_resource_sampler_info,[:],[:],[$VKD3D_PE_LIBS]) if test "$ac_cv_mingw_lib_vkd3d" = "no" -o "$ac_cv_mingw_lib_vkd3d_shader" = "no" then VKD3D_PE_CFLAGS="" diff --git a/dlls/wined3d/shader_spirv.c b/dlls/wined3d/shader_spirv.c index b5b0e1f0462..dab0e3dc5f9 100644 --- a/dlls/wined3d/shader_spirv.c +++ b/dlls/wined3d/shader_spirv.c @@ -227,6 +227,14 @@ static void shader_spirv_init_shader_interface_vk(struct wined3d_shader_spirv_sh iface->vkd3d_interface.uav_counter_count = b->uav_counter_count; }
+static enum vkd3d_shader_source_type shader_spirv_get_source_type(uint32_t magic) +{ + if (magic == TAG_DXBC) + return VKD3D_SHADER_SOURCE_DXBC_TPF; + else + return VKD3D_SHADER_SOURCE_D3D_BYTECODE; +} + static VkShaderModule shader_spirv_compile_shader(struct wined3d_context_vk *context_vk, const struct wined3d_shader_desc *shader_desc, enum wined3d_shader_type shader_type, const struct shader_spirv_compile_arguments *args, const struct shader_spirv_resource_bindings *bindings, @@ -252,7 +260,7 @@ static VkShaderModule shader_spirv_compile_shader(struct wined3d_context_vk *con info.next = &compile_args.spirv_target; info.source.code = shader_desc->byte_code; info.source.size = shader_desc->byte_code_size; - info.source_type = VKD3D_SHADER_SOURCE_DXBC_TPF; + info.source_type = shader_spirv_get_source_type(*(const uint32_t *)info.source.code); info.target_type = VKD3D_SHADER_TARGET_SPIRV_BINARY; info.options = spirv_compile_options; info.option_count = ARRAY_SIZE(spirv_compile_options); @@ -692,7 +700,7 @@ static void shader_spirv_scan_shader(struct wined3d_shader *shader, info.next = descriptor_info; info.source.code = shader->byte_code; info.source.size = shader->byte_code_size; - info.source_type = VKD3D_SHADER_SOURCE_DXBC_TPF; + info.source_type = shader_spirv_get_source_type(*(const uint32_t *)info.source.code); info.target_type = VKD3D_SHADER_TARGET_SPIRV_BINARY; info.options = spirv_compile_options; info.option_count = ARRAY_SIZE(spirv_compile_options); diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 5a35ca88a7b..78146799bfd 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -92,6 +92,8 @@ static inline const char *wined3d_get_line(const char **ptr, const char *end)
#define WINED3D_BITMAP_SIZE(x) (((x) + 31) >> 5)
+#define TAG_DXBC WINEMAKEFOURCC('D', 'X', 'B', 'C') + struct wined3d_fragment_pipe_ops; struct wined3d_adapter; struct wined3d_context;
From: Zebediah Figura zfigura@codeweavers.com
--- dlls/wined3d/shader_spirv.c | 60 +++++++++++++++++++++++++++++++++---- 1 file changed, 54 insertions(+), 6 deletions(-)
diff --git a/dlls/wined3d/shader_spirv.c b/dlls/wined3d/shader_spirv.c index dab0e3dc5f9..a32767efc68 100644 --- a/dlls/wined3d/shader_spirv.c +++ b/dlls/wined3d/shader_spirv.c @@ -57,6 +57,12 @@ struct shader_spirv_compile_arguments { union { + struct + { + /* The maximum inter-stage register index for an sm1 shader is 11. */ + struct vkd3d_shader_varying_map varying_map[12]; + unsigned int varying_count; + } vs; struct { uint32_t alpha_swizzle; @@ -81,6 +87,7 @@ struct shader_spirv_graphics_program_vk SIZE_T variants_size, variant_count;
struct vkd3d_shader_scan_descriptor_info descriptor_info; + struct vkd3d_shader_scan_signature_info signature_info; };
struct shader_spirv_compute_program_vk @@ -95,6 +102,7 @@ struct shader_spirv_compute_program_vk
struct wined3d_shader_spirv_compile_args { + struct vkd3d_shader_varying_map_info varying_map; struct vkd3d_shader_spirv_target_info spirv_target; struct vkd3d_shader_parameter sample_count; unsigned int ps_alpha_swizzle[WINED3D_MAX_RENDER_TARGETS]; @@ -155,6 +163,22 @@ static void shader_spirv_compile_arguments_init(struct shader_spirv_compile_argu args->u.fs.dual_source_blending = state->blend_state && state->blend_state->dual_source; break;
+ case WINED3D_SHADER_TYPE_VERTEX: + { + struct wined3d_shader *ps = state->shader[WINED3D_SHADER_TYPE_PIXEL]; + struct shader_spirv_graphics_program_vk *ps_program = ps->backend_data; + struct shader_spirv_graphics_program_vk *vs_program = shader->backend_data; + unsigned int count = ARRAY_SIZE(args->u.vs.varying_map); + + if (shader->reg_maps.shader_version.major < 4) + { + vkd3d_shader_build_varying_map(&vs_program->signature_info.output, + &ps_program->signature_info.input, &count, args->u.vs.varying_map); + args->u.vs.varying_count = count; + } + break; + } + default: break; } @@ -162,7 +186,8 @@ static void shader_spirv_compile_arguments_init(struct shader_spirv_compile_argu
static void shader_spirv_init_compile_args(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, const struct shader_spirv_compile_arguments *compile_args) + enum wined3d_shader_type shader_type, enum vkd3d_shader_source_type source_type, + const struct shader_spirv_compile_arguments *compile_args) { unsigned int i;
@@ -199,6 +224,19 @@ static void shader_spirv_init_compile_args(struct wined3d_shader_spirv_compile_a args->spirv_target.output_swizzles = args->ps_alpha_swizzle; args->spirv_target.output_swizzle_count = ARRAY_SIZE(args->ps_alpha_swizzle); } + else if (shader_type == WINED3D_SHADER_TYPE_VERTEX) + { + args->spirv_target.next = &args->varying_map; + + args->varying_map.type = VKD3D_SHADER_STRUCTURE_TYPE_VARYING_MAP_INFO; + args->varying_map.next = vkd3d_interface; + + if (source_type == VKD3D_SHADER_SOURCE_D3D_BYTECODE) + { + args->varying_map.varying_map = compile_args->u.vs.varying_map; + args->varying_map.varying_count = compile_args->u.vs.varying_count; + } + } }
static void shader_spirv_init_shader_interface_vk(struct wined3d_shader_spirv_shader_interface *iface, @@ -240,6 +278,7 @@ static VkShaderModule shader_spirv_compile_shader(struct wined3d_context_vk *con const struct shader_spirv_compile_arguments *args, const struct shader_spirv_resource_bindings *bindings, const struct wined3d_stream_output_desc *so_desc) { + enum vkd3d_shader_source_type source_type = shader_spirv_get_source_type(*(const uint32_t *)shader_desc->byte_code); struct wined3d_shader_spirv_compile_args compile_args; struct wined3d_shader_spirv_shader_interface iface; VkShaderModuleCreateInfo shader_create_info; @@ -254,13 +293,13 @@ static VkShaderModule shader_spirv_compile_shader(struct wined3d_context_vk *con
shader_spirv_init_shader_interface_vk(&iface, bindings, so_desc); shader_spirv_init_compile_args(&compile_args, &iface.vkd3d_interface, - VKD3D_SHADER_SPIRV_ENVIRONMENT_VULKAN_1_0, shader_type, args); + VKD3D_SHADER_SPIRV_ENVIRONMENT_VULKAN_1_0, shader_type, source_type, args);
info.type = VKD3D_SHADER_STRUCTURE_TYPE_COMPILE_INFO; info.next = &compile_args.spirv_target; info.source.code = shader_desc->byte_code; info.source.size = shader_desc->byte_code_size; - info.source_type = shader_spirv_get_source_type(*(const uint32_t *)info.source.code); + info.source_type = source_type; info.target_type = VKD3D_SHADER_TARGET_SPIRV_BINARY; info.options = spirv_compile_options; info.option_count = ARRAY_SIZE(spirv_compile_options); @@ -687,7 +726,8 @@ static bool shader_spirv_resource_bindings_init(struct shader_spirv_resource_bin }
static void shader_spirv_scan_shader(struct wined3d_shader *shader, - struct vkd3d_shader_scan_descriptor_info *descriptor_info) + struct vkd3d_shader_scan_descriptor_info *descriptor_info, + struct vkd3d_shader_scan_signature_info *signature_info) { struct vkd3d_shader_compile_info info; char *messages; @@ -696,6 +736,13 @@ static void shader_spirv_scan_shader(struct wined3d_shader *shader, memset(descriptor_info, 0, sizeof(*descriptor_info)); descriptor_info->type = VKD3D_SHADER_STRUCTURE_TYPE_SCAN_DESCRIPTOR_INFO;
+ if (signature_info) + { + memset(signature_info, 0, sizeof(*signature_info)); + signature_info->type = VKD3D_SHADER_STRUCTURE_TYPE_SCAN_SIGNATURE_INFO; + descriptor_info->next = signature_info; + } + info.type = VKD3D_SHADER_STRUCTURE_TYPE_COMPILE_INFO; info.next = descriptor_info; info.source.code = shader->byte_code; @@ -736,7 +783,7 @@ static void shader_spirv_precompile_compute(struct wined3d_shader *shader) shader->backend_data = program_vk; }
- shader_spirv_scan_shader(shader, &program_vk->descriptor_info); + shader_spirv_scan_shader(shader, &program_vk->descriptor_info, NULL); }
static void shader_spirv_precompile(void *shader_priv, struct wined3d_shader *shader) @@ -758,7 +805,7 @@ static void shader_spirv_precompile(void *shader_priv, struct wined3d_shader *sh shader->backend_data = program_vk; }
- shader_spirv_scan_shader(shader, &program_vk->descriptor_info); + shader_spirv_scan_shader(shader, &program_vk->descriptor_info, &program_vk->signature_info); }
static void shader_spirv_select(void *shader_priv, struct wined3d_context *context, @@ -967,6 +1014,7 @@ static void shader_spirv_destroy(struct wined3d_shader *shader) } heap_free(program_vk->variants); vkd3d_shader_free_scan_descriptor_info(&program_vk->descriptor_info); + vkd3d_shader_free_scan_signature_info(&program_vk->signature_info);
shader->backend_data = NULL; heap_free(program_vk);
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=142060
Your paranoid android.
=== debian11b (64 bit WoW report) ===
shell32: shlfolder.c:5512: Test failed: Got unexpected hr 0x1. shlfolder.c:5513: Test failed: Failed to create window. shlfolder.c:5520: Test failed: Got unexpected hr 0x1. shlfolder.c:5521: Test failed: Failed to create window. shlfolder.c:5530: Test failed: Got unexpected hr 0x1. shlfolder.c:5531: Test failed: Failed to create window. shlfolder.c:5540: Test failed: Got unexpected hr 0x1. shlfolder.c:5541: Test failed: Failed to create window. shlfolder.c:5550: Test failed: Got unexpected hr 0x1. shlfolder.c:5551: Test failed: Failed to create window.
This merge request was approved by Zebediah Figura.
+static enum vkd3d_shader_source_type shader_spirv_get_source_type(uint32_t magic) +{ + if (magic == TAG_DXBC) + return VKD3D_SHADER_SOURCE_DXBC_TPF; + else + return VKD3D_SHADER_SOURCE_D3D_BYTECODE; +}
That's not quite right, and somewhat unnecessary. I think we should store "source_type" from shader_init() in struct wined3d_shader, and use that instead.
Do we need to bump the required vkd3d version here? Perhaps it's somewhat moot because we're going to need vkd3d_shader_build_varying_map() and others in patch 3/3, but technically 1.10 isn't a compile-time dependency, and for bisects it tends to help to not bump requirements unnecessarily.
+ /* The maximum inter-stage register index for an sm1 shader is 11. */ + struct vkd3d_shader_varying_map varying_map[12];
Constants are nice, of course.
+ case WINED3D_SHADER_TYPE_VERTEX: + { + struct wined3d_shader *ps = state->shader[WINED3D_SHADER_TYPE_PIXEL]; + struct shader_spirv_graphics_program_vk *ps_program = ps->backend_data; + struct shader_spirv_graphics_program_vk *vs_program = shader->backend_data; + unsigned int count = ARRAY_SIZE(args->u.vs.varying_map); + + if (shader->reg_maps.shader_version.major < 4) + { + vkd3d_shader_build_varying_map(&vs_program->signature_info.output, + &ps_program->signature_info.input, &count, args->u.vs.varying_map); + args->u.vs.varying_count = count; + } + break; + }
"ps" may be NULL. For example when using fixed-function fragment processing with sm1 shaders, but also when stream output is used.
We don't need "count", right?
+ else if (shader_type == WINED3D_SHADER_TYPE_VERTEX) + { + args->spirv_target.next = &args->varying_map; + + args->varying_map.type = VKD3D_SHADER_STRUCTURE_TYPE_VARYING_MAP_INFO; + args->varying_map.next = vkd3d_interface; + + if (source_type == VKD3D_SHADER_SOURCE_D3D_BYTECODE) + { + args->varying_map.varying_map = compile_args->u.vs.varying_map; + args->varying_map.varying_count = compile_args->u.vs.varying_count; + } + }
It's not wrong, but it seems somewhat superfluous to add an empty varying map to the chain for non-d3dbc sources.
+static enum vkd3d_shader_source_type shader_spirv_get_source_type(uint32_t magic) +{ + if (magic == TAG_DXBC) + return VKD3D_SHADER_SOURCE_DXBC_TPF; + else + return VKD3D_SHADER_SOURCE_D3D_BYTECODE; +}
That's not quite right, and somewhat unnecessary. I think we should store "source_type" from shader_init() in struct wined3d_shader, and use that instead.
Do we need to bump the required vkd3d version here? Perhaps it's somewhat moot because we're going to need vkd3d_shader_build_varying_map() and others in patch 3/3, but technically 1.10 isn't a compile-time dependency, and for bisects it tends to help to not bump requirements unnecessarily.
I suppose we could dynamically check for d3dbc source support, even to the point of using an ifdef to guard out vkd3d_shader_build_varying_map(). I don't particularly expect that'll be received well by the Wine maintainer, though, and otherwise I don't feel like it's particularly worth going out of our way to dynamically check if we're going to need vkd3d_shader_build_varying_map() anyway.
+ /* The maximum inter-stage register index for an sm1 shader is 11. */ + struct vkd3d_shader_varying_map varying_map[12];
Constants are nice, of course.
I've never felt like it's particularly useful to add a symbolic constant if it's only used in one place, which is why I didn't add one here. If anything it adds more noise. But I'll add one anyway.
+ case WINED3D_SHADER_TYPE_VERTEX: + { + struct wined3d_shader *ps = state->shader[WINED3D_SHADER_TYPE_PIXEL]; + struct shader_spirv_graphics_program_vk *ps_program = ps->backend_data; + struct shader_spirv_graphics_program_vk *vs_program = shader->backend_data; + unsigned int count = ARRAY_SIZE(args->u.vs.varying_map); + + if (shader->reg_maps.shader_version.major < 4) + { + vkd3d_shader_build_varying_map(&vs_program->signature_info.output, + &ps_program->signature_info.input, &count, args->u.vs.varying_map); + args->u.vs.varying_count = count; + } + break; + }
"ps" may be NULL. For example when using fixed-function fragment processing with sm1 shaders, but also when stream output is used.
Good catch, thanks.
We don't need "count", right?
No, that's probably a relic of older versions of the API.
+ else if (shader_type == WINED3D_SHADER_TYPE_VERTEX) + { + args->spirv_target.next = &args->varying_map; + + args->varying_map.type = VKD3D_SHADER_STRUCTURE_TYPE_VARYING_MAP_INFO; + args->varying_map.next = vkd3d_interface; + + if (source_type == VKD3D_SHADER_SOURCE_D3D_BYTECODE) + { + args->varying_map.varying_map = compile_args->u.vs.varying_map; + args->varying_map.varying_count = compile_args->u.vs.varying_count; + } + }
It's not wrong, but it seems somewhat superfluous to add an empty varying map to the chain for non-d3dbc sources.
I can't say I see why omitting the struct is better, but eh, it's a trivial change.