From: Conor McCarthy cmccarthy@codeweavers.com
Shader Model 6 introduces a 16-bit float (half) type, and 16-bit and 64-bit integer types. Storing extra info in the type enum simplifies checking if a type is any integer, floating point or numeric type, and the declaration of SPIR-V types. --- libs/vkd3d-shader/d3d_asm.c | 38 +++++++++------ libs/vkd3d-shader/vkd3d_shader_private.h | 59 ++++++++++++++++++------ 2 files changed, 68 insertions(+), 29 deletions(-)
diff --git a/libs/vkd3d-shader/d3d_asm.c b/libs/vkd3d-shader/d3d_asm.c index d72402eb..dbd764f9 100644 --- a/libs/vkd3d-shader/d3d_asm.c +++ b/libs/vkd3d-shader/d3d_asm.c @@ -601,19 +601,13 @@ static void shader_dump_data_type(struct vkd3d_d3d_asm_compiler *compiler, const { static const char *const data_type_names[] = { - [VKD3D_DATA_FLOAT ] = "float", - [VKD3D_DATA_INT ] = "int", - [VKD3D_DATA_RESOURCE ] = "resource", - [VKD3D_DATA_SAMPLER ] = "sampler", - [VKD3D_DATA_UAV ] = "uav", - [VKD3D_DATA_UINT ] = "uint", - [VKD3D_DATA_UNORM ] = "unorm", - [VKD3D_DATA_SNORM ] = "snorm", - [VKD3D_DATA_OPAQUE ] = "opaque", - [VKD3D_DATA_MIXED ] = "mixed", - [VKD3D_DATA_DOUBLE ] = "double", - [VKD3D_DATA_CONTINUED] = "<continued>", - [VKD3D_DATA_UNUSED ] = "<unused>", + [VKD3D_DATA_CLASS_RESOURCE ] = "resource", + [VKD3D_DATA_CLASS_SAMPLER ] = "sampler", + [VKD3D_DATA_CLASS_UAV ] = "uav", + [VKD3D_DATA_CLASS_OPAQUE ] = "opaque", + [VKD3D_DATA_CLASS_MIXED ] = "mixed", + [VKD3D_DATA_CLASS_CONTINUED] = "<continued>", + [VKD3D_DATA_CLASS_UNUSED ] = "<unused>", }; const char *name; int i; @@ -622,8 +616,22 @@ static void shader_dump_data_type(struct vkd3d_d3d_asm_compiler *compiler, const
for (i = 0; i < 4; i++) { - if (type[i] < ARRAY_SIZE(data_type_names)) - name = data_type_names[type[i]]; + enum vkd3d_data_type_class class = data_type_get_class(type[i]); + if (data_type_class_is_numeric(class)) + { + switch (type[i]) + { + case VKD3D_DATA_FLOAT: name = "float"; break; + case VKD3D_DATA_INT: name = "int"; break; + case VKD3D_DATA_UINT: name = "uint"; break; + case VKD3D_DATA_UNORM: name = "unorm"; break; + case VKD3D_DATA_SNORM: name = "snorm"; break; + case VKD3D_DATA_DOUBLE: name = "double"; break; + default: vkd3d_unreachable(); + } + } + else if (class < ARRAY_SIZE(data_type_names)) + name = data_type_names[class]; else name = "unknown"; vkd3d_string_buffer_printf(&compiler->buffer, "%s%s", i == 0 ? "" : ",", name); diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h index 0e93f3a5..cc9ec576 100644 --- a/libs/vkd3d-shader/vkd3d_shader_private.h +++ b/libs/vkd3d-shader/vkd3d_shader_private.h @@ -522,24 +522,55 @@ enum vkd3d_shader_register_precision VKD3D_SHADER_REGISTER_PRECISION_INVALID = ~0u, };
+#define DATA_TYPE_WIDTH_MASK 0xffu +#define DATA_TYPE_CLASS_SHIFT 8u +#define DATA_TYPE_CLASS_MASK (0x3fu << DATA_TYPE_CLASS_SHIFT) +#define DATA_TYPE_NORM_SHIFT 14u +#define DATA_TYPE_NORM_MASK (1u << DATA_TYPE_NORM_SHIFT) +#define DATA_TYPE_IS_SIGNED_SHIFT 15u +#define DATA_TYPE_IS_SIGNED_MASK (1u << DATA_TYPE_IS_SIGNED_SHIFT) + +enum vkd3d_data_type_class +{ + VKD3D_DATA_CLASS_FLOAT, + VKD3D_DATA_CLASS_INT, + VKD3D_DATA_CLASS_RESOURCE, + VKD3D_DATA_CLASS_SAMPLER, + VKD3D_DATA_CLASS_UAV, + VKD3D_DATA_CLASS_OPAQUE, + VKD3D_DATA_CLASS_MIXED, + VKD3D_DATA_CLASS_CONTINUED, + VKD3D_DATA_CLASS_UNUSED, +}; + enum vkd3d_data_type { - VKD3D_DATA_FLOAT, - VKD3D_DATA_INT, - VKD3D_DATA_RESOURCE, - VKD3D_DATA_SAMPLER, - VKD3D_DATA_UAV, - VKD3D_DATA_UINT, - VKD3D_DATA_UNORM, - VKD3D_DATA_SNORM, - VKD3D_DATA_OPAQUE, - VKD3D_DATA_MIXED, - VKD3D_DATA_DOUBLE, - VKD3D_DATA_CONTINUED, - VKD3D_DATA_UNUSED, - VKD3D_DATA_UINT8, + VKD3D_DATA_FLOAT = (VKD3D_DATA_CLASS_FLOAT << DATA_TYPE_CLASS_SHIFT) | 32, + VKD3D_DATA_INT = (VKD3D_DATA_CLASS_INT << DATA_TYPE_CLASS_SHIFT) | 32 | DATA_TYPE_IS_SIGNED_MASK, + VKD3D_DATA_RESOURCE = VKD3D_DATA_CLASS_RESOURCE << DATA_TYPE_CLASS_SHIFT, + VKD3D_DATA_SAMPLER = VKD3D_DATA_CLASS_SAMPLER << DATA_TYPE_CLASS_SHIFT, + VKD3D_DATA_UAV = VKD3D_DATA_CLASS_UAV << DATA_TYPE_CLASS_SHIFT, + VKD3D_DATA_UINT = (VKD3D_DATA_CLASS_INT << DATA_TYPE_CLASS_SHIFT) | 32, + VKD3D_DATA_UNORM = (VKD3D_DATA_CLASS_INT << DATA_TYPE_CLASS_SHIFT) | 32 | DATA_TYPE_NORM_MASK, + VKD3D_DATA_SNORM = (VKD3D_DATA_CLASS_INT << DATA_TYPE_CLASS_SHIFT) | 32 | DATA_TYPE_NORM_MASK | DATA_TYPE_IS_SIGNED_MASK, + VKD3D_DATA_OPAQUE = VKD3D_DATA_CLASS_OPAQUE << DATA_TYPE_CLASS_SHIFT, + VKD3D_DATA_MIXED = VKD3D_DATA_CLASS_MIXED << DATA_TYPE_CLASS_SHIFT, + VKD3D_DATA_DOUBLE = (VKD3D_DATA_CLASS_FLOAT << DATA_TYPE_CLASS_SHIFT) | 64, + VKD3D_DATA_CONTINUED = VKD3D_DATA_CLASS_CONTINUED << DATA_TYPE_CLASS_SHIFT, + VKD3D_DATA_UNUSED = VKD3D_DATA_CLASS_UNUSED << DATA_TYPE_CLASS_SHIFT, + VKD3D_DATA_UINT8 = (VKD3D_DATA_CLASS_INT << DATA_TYPE_CLASS_SHIFT) | 8, };
+static inline bool data_type_class_is_numeric(enum vkd3d_data_type_class class) +{ + return class <= VKD3D_DATA_CLASS_INT; +} + +static inline enum vkd3d_data_type_class data_type_get_class(enum vkd3d_data_type type) +{ + return (type & DATA_TYPE_CLASS_MASK) >> DATA_TYPE_CLASS_SHIFT; +} + enum vkd3d_immconst_type { VKD3D_IMMCONST_SCALAR,