From fe4143ad1937640361163c5817c293a6c7a6cb14 Mon Sep 17 00:00:00 2001 From: Henri Verbeet Date: Wed, 5 Feb 2025 17:54:39 +0100 Subject: [PATCH] vkd3d-shader/dxil: Generate I/O signatures with 16-bit component types for native 16-bit shaders. Which incidentally matches the I/O signatures from the DXBC container. --- include/vkd3d_shader.h | 8 ++++++++ libs/vkd3d-shader/d3d_asm.c | 23 ++++++++++++++-------- libs/vkd3d-shader/dxil.c | 25 ++++++++++++++++++++---- libs/vkd3d-shader/ir.c | 3 +++ libs/vkd3d-shader/spirv.c | 3 ++- libs/vkd3d-shader/vkd3d_shader_private.h | 2 +- 6 files changed, 50 insertions(+), 14 deletions(-) diff --git a/include/vkd3d_shader.h b/include/vkd3d_shader.h index 7a5d4eecb..7e51bdd51 100644 --- a/include/vkd3d_shader.h +++ b/include/vkd3d_shader.h @@ -2286,6 +2286,14 @@ enum vkd3d_shader_component_type VKD3D_SHADER_COMPONENT_DOUBLE = 0x5, /** 64-bit unsigned integer. \since 1.11 */ VKD3D_SHADER_COMPONENT_UINT64 = 0x6, + /** 64-bit signed integer. \since 1.16 */ + VKD3D_SHADER_COMPONENT_INT64 = 0x7, + /** 16-bit IEEE floating-point. \since 1.16 */ + VKD3D_SHADER_COMPONENT_FLOAT16 = 0x8, + /** 16-bit unsigned integer. \since 1.16 */ + VKD3D_SHADER_COMPONENT_UINT16 = 0x9, + /** 16-bit signed integer. \since 1.16 */ + VKD3D_SHADER_COMPONENT_INT16 = 0xa, VKD3D_FORCE_32_BIT_ENUM(VKD3D_SHADER_COMPONENT_TYPE), }; diff --git a/libs/vkd3d-shader/d3d_asm.c b/libs/vkd3d-shader/d3d_asm.c index 0639da83a..7b69535a4 100644 --- a/libs/vkd3d-shader/d3d_asm.c +++ b/libs/vkd3d-shader/d3d_asm.c @@ -2069,15 +2069,22 @@ static const char *get_component_type_name(enum vkd3d_shader_component_type type { switch (type) { - case VKD3D_SHADER_COMPONENT_VOID: return "void"; - case VKD3D_SHADER_COMPONENT_UINT: return "uint"; - case VKD3D_SHADER_COMPONENT_INT: return "int"; - case VKD3D_SHADER_COMPONENT_FLOAT: return "float"; - case VKD3D_SHADER_COMPONENT_BOOL: return "bool"; - case VKD3D_SHADER_COMPONENT_DOUBLE: return "double"; - case VKD3D_SHADER_COMPONENT_UINT64: return "uint64"; - default: return "??"; + case VKD3D_SHADER_COMPONENT_VOID: return "void"; + case VKD3D_SHADER_COMPONENT_UINT: return "uint"; + case VKD3D_SHADER_COMPONENT_INT: return "int"; + case VKD3D_SHADER_COMPONENT_FLOAT: return "float"; + case VKD3D_SHADER_COMPONENT_BOOL: return "bool"; + case VKD3D_SHADER_COMPONENT_DOUBLE: return "double"; + case VKD3D_SHADER_COMPONENT_UINT64: return "uint64"; + case VKD3D_SHADER_COMPONENT_INT64: return "int64"; + case VKD3D_SHADER_COMPONENT_FLOAT16: return "float16"; + case VKD3D_SHADER_COMPONENT_UINT16: return "uint16"; + case VKD3D_SHADER_COMPONENT_INT16: return "int16"; + case VKD3D_SHADER_COMPONENT_TYPE_FORCE_32BIT: + break; } + + return "??"; } static const char *get_minimum_precision_name(enum vkd3d_shader_minimum_precision prec) diff --git a/libs/vkd3d-shader/dxil.c b/libs/vkd3d-shader/dxil.c index d13c2791f..abcfb4373 100644 --- a/libs/vkd3d-shader/dxil.c +++ b/libs/vkd3d-shader/dxil.c @@ -8578,19 +8578,29 @@ static enum vkd3d_result sm6_parser_metadata_init(struct sm6_parser *sm6, const return VKD3D_OK; } -static enum vkd3d_shader_component_type vkd3d_component_type_from_dxil_component_type(enum dxil_component_type type) +static enum vkd3d_shader_component_type vkd3d_component_type_from_dxil_component_type( + enum dxil_component_type type, bool native_16bit) { switch (type) { case COMPONENT_TYPE_I1: return VKD3D_SHADER_COMPONENT_BOOL; case COMPONENT_TYPE_I16: + if (native_16bit) + return VKD3D_SHADER_COMPONENT_INT16; + return VKD3D_SHADER_COMPONENT_INT; case COMPONENT_TYPE_I32: return VKD3D_SHADER_COMPONENT_INT; case COMPONENT_TYPE_U16: + if (native_16bit) + return VKD3D_SHADER_COMPONENT_UINT16; + return VKD3D_SHADER_COMPONENT_UINT; case COMPONENT_TYPE_U32: return VKD3D_SHADER_COMPONENT_UINT; case COMPONENT_TYPE_F16: + if (native_16bit) + return VKD3D_SHADER_COMPONENT_FLOAT16; + return VKD3D_SHADER_COMPONENT_FLOAT; case COMPONENT_TYPE_F32: case COMPONENT_TYPE_SNORMF32: case COMPONENT_TYPE_UNORMF32: @@ -8605,8 +8615,12 @@ static enum vkd3d_shader_component_type vkd3d_component_type_from_dxil_component } } -static enum vkd3d_shader_minimum_precision minimum_precision_from_dxil_component_type(enum dxil_component_type type) +static enum vkd3d_shader_minimum_precision minimum_precision_from_dxil_component_type( + enum dxil_component_type type, bool native_16bit) { + if (native_16bit) + return VKD3D_SHADER_MINIMUM_PRECISION_NONE; + switch (type) { case COMPONENT_TYPE_F16: @@ -9432,8 +9446,10 @@ static enum vkd3d_result sm6_parser_read_signature(struct sm6_parser *sm6, const { unsigned int i, j, column_count, operand_count, index; const struct sm6_metadata_node *node, *element_node; + struct vsir_program *program = sm6->p.program; struct signature_element *elements, *e; unsigned int values[10]; + bool native_16bit; bool is_register; if (!m) @@ -9458,6 +9474,7 @@ static enum vkd3d_result sm6_parser_read_signature(struct sm6_parser *sm6, const return VKD3D_ERROR_OUT_OF_MEMORY; } + native_16bit = program->global_flags & VKD3DSGF_FORCE_NATIVE_LOW_PRECISION; for (i = 0; i < operand_count; ++i) { m = node->operands[i]; @@ -9518,8 +9535,8 @@ static enum vkd3d_result sm6_parser_read_signature(struct sm6_parser *sm6, const } e->semantic_name = element_node->operands[1]->u.string_value; - e->component_type = vkd3d_component_type_from_dxil_component_type(values[2]); - e->min_precision = minimum_precision_from_dxil_component_type(values[2]); + e->component_type = vkd3d_component_type_from_dxil_component_type(values[2], native_16bit); + e->min_precision = minimum_precision_from_dxil_component_type(values[2], native_16bit); j = values[3]; e->sysval_semantic = sysval_semantic_from_dxil_semantic_kind(j, tessellator_domain); diff --git a/libs/vkd3d-shader/ir.c b/libs/vkd3d-shader/ir.c index d145617ec..41aa99fbc 100644 --- a/libs/vkd3d-shader/ir.c +++ b/libs/vkd3d-shader/ir.c @@ -8520,10 +8520,13 @@ static void vsir_validate_signature_element(struct validation_context *ctx, { case VKD3D_SHADER_COMPONENT_INT: case VKD3D_SHADER_COMPONENT_UINT: + case VKD3D_SHADER_COMPONENT_INT16: + case VKD3D_SHADER_COMPONENT_UINT16: integer_type = true; break; case VKD3D_SHADER_COMPONENT_FLOAT: + case VKD3D_SHADER_COMPONENT_FLOAT16: break; default: diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c index 010f076e3..17ae2c1f4 100644 --- a/libs/vkd3d-shader/spirv.c +++ b/libs/vkd3d-shader/spirv.c @@ -3375,7 +3375,8 @@ static uint32_t spirv_compiler_get_constant(struct spirv_compiler *compiler, "Vectors of bool type are not supported."); return vkd3d_spirv_get_op_undef(builder, type_id); default: - FIXME("Unhandled component_type %#x.\n", component_type); + spirv_compiler_error(compiler, VKD3D_SHADER_ERROR_SPV_INVALID_TYPE, + "Unhandled component_type %#x.", component_type); return vkd3d_spirv_get_op_undef(builder, type_id); } diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h index 4f17677e2..48176d85d 100644 --- a/libs/vkd3d-shader/vkd3d_shader_private.h +++ b/libs/vkd3d-shader/vkd3d_shader_private.h @@ -59,7 +59,7 @@ #define VKD3D_VEC4_SIZE 4 #define VKD3D_DVEC2_SIZE 2 -#define VKD3D_SHADER_COMPONENT_TYPE_COUNT (VKD3D_SHADER_COMPONENT_UINT64 + 1) +#define VKD3D_SHADER_COMPONENT_TYPE_COUNT (VKD3D_SHADER_COMPONENT_INT16 + 1) #define VKD3D_SHADER_MINIMUM_PRECISION_COUNT (VKD3D_SHADER_MINIMUM_PRECISION_UINT_16 + 1) #define VKD3D_MAX_STREAM_COUNT 4