Module: vkd3d Branch: master Commit: 2a14718fe57b25fa5238ac0264b7f35681248f3f URL: https://source.winehq.org/git/vkd3d.git/?a=commit;h=2a14718fe57b25fa5238ac02...
Author: Henri Verbeet hverbeet@codeweavers.com Date: Mon Feb 28 12:23:46 2022 +0100
vkd3d-shader: Handle "mixed" data in vkd3d_shader_scan_typed_resource_declaration().
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
include/vkd3d_shader.h | 14 ++++++++------ libs/vkd3d-shader/vkd3d_shader_main.c | 25 +++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 6 deletions(-)
diff --git a/include/vkd3d_shader.h b/include/vkd3d_shader.h index fece054..1576411 100644 --- a/include/vkd3d_shader.h +++ b/include/vkd3d_shader.h @@ -1197,15 +1197,17 @@ enum vkd3d_shader_resource_type enum vkd3d_shader_resource_data_type { /** Unsigned normalized integer. */ - VKD3D_SHADER_RESOURCE_DATA_UNORM = 0x1, + VKD3D_SHADER_RESOURCE_DATA_UNORM = 0x1, /** Signed normalized integer. */ - VKD3D_SHADER_RESOURCE_DATA_SNORM = 0x2, + VKD3D_SHADER_RESOURCE_DATA_SNORM = 0x2, /** Signed integer. */ - VKD3D_SHADER_RESOURCE_DATA_INT = 0x3, + VKD3D_SHADER_RESOURCE_DATA_INT = 0x3, /** Unsigned integer. */ - VKD3D_SHADER_RESOURCE_DATA_UINT = 0x4, - /** IEEE floating-point. */ - VKD3D_SHADER_RESOURCE_DATA_FLOAT = 0x5, + VKD3D_SHADER_RESOURCE_DATA_UINT = 0x4, + /** IEEE single-precision floating-point. */ + VKD3D_SHADER_RESOURCE_DATA_FLOAT = 0x5, + /** Undefined/type-less. \since 1.3 */ + VKD3D_SHADER_RESOURCE_DATA_MIXED = 0x6,
VKD3D_FORCE_32_BIT_ENUM(VKD3D_SHADER_RESOURCE_DATA_TYPE), }; diff --git a/libs/vkd3d-shader/vkd3d_shader_main.c b/libs/vkd3d-shader/vkd3d_shader_main.c index a25e28a..298289c 100644 --- a/libs/vkd3d-shader/vkd3d_shader_main.c +++ b/libs/vkd3d-shader/vkd3d_shader_main.c @@ -477,6 +477,8 @@ struct vkd3d_shader_scan_context } *uav_ranges; size_t uav_ranges_size; size_t uav_range_count; + + enum vkd3d_shader_api_version api_version; };
static void vkd3d_shader_scan_context_init(struct vkd3d_shader_scan_context *context, @@ -484,11 +486,22 @@ static void vkd3d_shader_scan_context_init(struct vkd3d_shader_scan_context *con struct vkd3d_shader_scan_descriptor_info *scan_descriptor_info, struct vkd3d_shader_message_context *message_context) { + unsigned int i; + memset(context, 0, sizeof(*context)); context->scan_descriptor_info = scan_descriptor_info; context->message_context = message_context; context->location.source_name = compile_info->source_name; context->location.line = 2; /* Line 1 is the version token. */ + context->api_version = VKD3D_SHADER_API_VERSION_1_2; + + for (i = 0; i < compile_info->option_count; ++i) + { + const struct vkd3d_shader_compile_option *option = &compile_info->options[i]; + + if (option->name == VKD3D_SHADER_COMPILE_OPTION_API_VERSION) + context->api_version = option->value; + } }
static void vkd3d_shader_scan_context_cleanup(struct vkd3d_shader_scan_context *context) @@ -741,11 +754,23 @@ static void vkd3d_shader_scan_typed_resource_declaration(struct vkd3d_shader_sca case VKD3D_DATA_FLOAT: resource_data_type = VKD3D_SHADER_RESOURCE_DATA_FLOAT; break; + case VKD3D_DATA_MIXED: + resource_data_type = VKD3D_SHADER_RESOURCE_DATA_MIXED; + break; default: ERR("Invalid resource data type %#x.\n", semantic->resource_data_type[0]); resource_data_type = VKD3D_SHADER_RESOURCE_DATA_FLOAT; break; } + + if (context->api_version < VKD3D_SHADER_API_VERSION_1_3 + && resource_data_type >= VKD3D_SHADER_RESOURCE_DATA_MIXED) + { + ERR("Invalid resource data type %#x for API version %#x.\n", + semantic->resource_data_type[0], context->api_version); + resource_data_type = VKD3D_SHADER_RESOURCE_DATA_FLOAT; + } + vkd3d_shader_scan_resource_declaration(context, &semantic->resource, semantic->resource_type, resource_data_type); }