mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-01-28 13:05:02 -08:00
vkd3d-shader/tpf: Handle the dimension bitfield in src param tokens.
This commit is contained in:
parent
5c706152fa
commit
7e5d9e3b6f
Notes:
Alexandre Julliard
2023-08-28 22:16:25 +02:00
Approved-by: Giovanni Mascellani (@giomasce) Approved-by: Francisco Casas (@fcasas) Approved-by: Henri Verbeet (@hverbeet) Approved-by: Alexandre Julliard (@julliard) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/225
@ -2643,6 +2643,16 @@ static void VKD3D_PRINTF_FUNC(3, 4) spirv_compiler_error(struct spirv_compiler *
|
||||
compiler->failed = true;
|
||||
}
|
||||
|
||||
static void VKD3D_PRINTF_FUNC(3, 4) spirv_compiler_warning(struct spirv_compiler *compiler,
|
||||
enum vkd3d_shader_error error, const char *format, ...)
|
||||
{
|
||||
va_list args;
|
||||
|
||||
va_start(args, format);
|
||||
vkd3d_shader_vwarning(compiler->message_context, &compiler->location, error, format, args);
|
||||
va_end(args);
|
||||
}
|
||||
|
||||
static struct vkd3d_string_buffer *vkd3d_shader_register_range_string(struct spirv_compiler *compiler,
|
||||
const struct vkd3d_shader_register_range *range)
|
||||
{
|
||||
@ -7466,7 +7476,13 @@ static int spirv_compiler_emit_control_flow_instruction(struct spirv_compiler *c
|
||||
assert(compiler->control_flow_depth);
|
||||
assert(cf_info->current_block == VKD3D_BLOCK_SWITCH);
|
||||
|
||||
assert(src->swizzle == VKD3D_SHADER_NO_SWIZZLE && src->reg.type == VKD3DSPR_IMMCONST);
|
||||
if (src->swizzle != VKD3D_SHADER_SWIZZLE(X, X, X, X))
|
||||
{
|
||||
WARN("Unexpected src swizzle %#x.\n", src->swizzle);
|
||||
spirv_compiler_warning(compiler, VKD3D_SHADER_WARNING_SPV_INVALID_SWIZZLE,
|
||||
"The swizzle for a switch case value is not scalar.");
|
||||
}
|
||||
assert(src->reg.type == VKD3DSPR_IMMCONST);
|
||||
value = *src->reg.u.immconst_uint;
|
||||
|
||||
if (!vkd3d_array_reserve((void **)&cf_info->u.switch_.case_blocks, &cf_info->u.switch_.case_blocks_size,
|
||||
|
@ -2026,6 +2026,7 @@ static bool shader_sm4_validate_input_output_register(struct vkd3d_shader_sm4_pa
|
||||
static bool shader_sm4_read_src_param(struct vkd3d_shader_sm4_parser *priv, const uint32_t **ptr,
|
||||
const uint32_t *end, enum vkd3d_data_type data_type, struct vkd3d_shader_src_param *src_param)
|
||||
{
|
||||
unsigned int dimension;
|
||||
DWORD token;
|
||||
|
||||
if (*ptr >= end)
|
||||
@ -2041,37 +2042,50 @@ static bool shader_sm4_read_src_param(struct vkd3d_shader_sm4_parser *priv, cons
|
||||
return false;
|
||||
}
|
||||
|
||||
if (src_param->reg.type == VKD3DSPR_IMMCONST || src_param->reg.type == VKD3DSPR_IMMCONST64)
|
||||
switch ((dimension = (token & VKD3D_SM4_DIMENSION_MASK) >> VKD3D_SM4_DIMENSION_SHIFT))
|
||||
{
|
||||
src_param->swizzle = VKD3D_SHADER_NO_SWIZZLE;
|
||||
}
|
||||
else
|
||||
{
|
||||
enum vkd3d_sm4_swizzle_type swizzle_type =
|
||||
(token & VKD3D_SM4_SWIZZLE_TYPE_MASK) >> VKD3D_SM4_SWIZZLE_TYPE_SHIFT;
|
||||
case VKD3D_SM4_DIMENSION_NONE:
|
||||
case VKD3D_SM4_DIMENSION_SCALAR:
|
||||
src_param->swizzle = VKD3D_SHADER_SWIZZLE(X, X, X, X);
|
||||
break;
|
||||
|
||||
switch (swizzle_type)
|
||||
case VKD3D_SM4_DIMENSION_VEC4:
|
||||
{
|
||||
case VKD3D_SM4_SWIZZLE_NONE:
|
||||
if (shader_sm4_is_scalar_register(&src_param->reg))
|
||||
src_param->swizzle = VKD3D_SHADER_SWIZZLE(X, X, X, X);
|
||||
else
|
||||
src_param->swizzle = VKD3D_SHADER_NO_SWIZZLE;
|
||||
break;
|
||||
enum vkd3d_sm4_swizzle_type swizzle_type =
|
||||
(token & VKD3D_SM4_SWIZZLE_TYPE_MASK) >> VKD3D_SM4_SWIZZLE_TYPE_SHIFT;
|
||||
|
||||
case VKD3D_SM4_SWIZZLE_SCALAR:
|
||||
src_param->swizzle = (token & VKD3D_SM4_SWIZZLE_MASK) >> VKD3D_SM4_SWIZZLE_SHIFT;
|
||||
src_param->swizzle = (src_param->swizzle & 0x3) * 0x01010101;
|
||||
break;
|
||||
switch (swizzle_type)
|
||||
{
|
||||
case VKD3D_SM4_SWIZZLE_NONE:
|
||||
if (shader_sm4_is_scalar_register(&src_param->reg))
|
||||
src_param->swizzle = VKD3D_SHADER_SWIZZLE(X, X, X, X);
|
||||
else
|
||||
src_param->swizzle = VKD3D_SHADER_NO_SWIZZLE;
|
||||
break;
|
||||
|
||||
case VKD3D_SM4_SWIZZLE_VEC4:
|
||||
src_param->swizzle = swizzle_from_sm4((token & VKD3D_SM4_SWIZZLE_MASK) >> VKD3D_SM4_SWIZZLE_SHIFT);
|
||||
break;
|
||||
case VKD3D_SM4_SWIZZLE_SCALAR:
|
||||
src_param->swizzle = (token & VKD3D_SM4_SWIZZLE_MASK) >> VKD3D_SM4_SWIZZLE_SHIFT;
|
||||
src_param->swizzle = (src_param->swizzle & 0x3) * 0x01010101;
|
||||
break;
|
||||
|
||||
default:
|
||||
FIXME("Unhandled swizzle type %#x.\n", swizzle_type);
|
||||
break;
|
||||
case VKD3D_SM4_SWIZZLE_VEC4:
|
||||
src_param->swizzle = swizzle_from_sm4((token & VKD3D_SM4_SWIZZLE_MASK) >> VKD3D_SM4_SWIZZLE_SHIFT);
|
||||
break;
|
||||
|
||||
default:
|
||||
FIXME("Unhandled swizzle type %#x.\n", swizzle_type);
|
||||
vkd3d_shader_parser_error(&priv->p, VKD3D_SHADER_ERROR_TPF_INVALID_REGISTER_SWIZZLE,
|
||||
"Source register swizzle type %#x is invalid.", swizzle_type);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
FIXME("Unhandled dimension %#x.\n", dimension);
|
||||
vkd3d_shader_parser_error(&priv->p, VKD3D_SHADER_ERROR_TPF_INVALID_REGISTER_DIMENSION,
|
||||
"Source register dimension %#x is invalid.", dimension);
|
||||
break;
|
||||
}
|
||||
|
||||
if (register_is_input_output(&src_param->reg) && !shader_sm4_validate_input_output_register(priv,
|
||||
|
@ -79,6 +79,8 @@ enum vkd3d_shader_error
|
||||
VKD3D_SHADER_ERROR_TPF_INVALID_IO_REGISTER = 1005,
|
||||
VKD3D_SHADER_ERROR_TPF_INVALID_INDEX_RANGE_DCL = 1006,
|
||||
VKD3D_SHADER_ERROR_TPF_INVALID_CASE_VALUE = 1007,
|
||||
VKD3D_SHADER_ERROR_TPF_INVALID_REGISTER_DIMENSION = 1008,
|
||||
VKD3D_SHADER_ERROR_TPF_INVALID_REGISTER_SWIZZLE = 1009,
|
||||
|
||||
VKD3D_SHADER_WARNING_TPF_MASK_NOT_CONTIGUOUS = 1300,
|
||||
VKD3D_SHADER_WARNING_TPF_UNHANDLED_INDEX_RANGE_MASK = 1301,
|
||||
@ -89,6 +91,8 @@ enum vkd3d_shader_error
|
||||
VKD3D_SHADER_ERROR_SPV_DESCRIPTOR_IDX_UNSUPPORTED = 2003,
|
||||
VKD3D_SHADER_ERROR_SPV_STENCIL_EXPORT_UNSUPPORTED = 2004,
|
||||
|
||||
VKD3D_SHADER_WARNING_SPV_INVALID_SWIZZLE = 2300,
|
||||
|
||||
VKD3D_SHADER_ERROR_RS_OUT_OF_MEMORY = 3000,
|
||||
VKD3D_SHADER_ERROR_RS_INVALID_VERSION = 3001,
|
||||
VKD3D_SHADER_ERROR_RS_INVALID_ROOT_PARAMETER_TYPE = 3002,
|
||||
|
Loading…
x
Reference in New Issue
Block a user