vkd3d-shader/dxil: Set the parser status to VKD3D_ERROR_NOT_IMPLEMENTED on missing functionality.

This commit is contained in:
Francisco Casas
2025-10-01 16:36:51 -03:00
committed by Henri Verbeet
parent aa943c51ea
commit 1512c6c809
Notes: Henri Verbeet 2025-10-03 00:55:08 +02:00
Approved-by: Henri Verbeet (@hverbeet)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1761
3 changed files with 23 additions and 32 deletions

View File

@@ -3011,8 +3011,7 @@ static bool sm6_value_validate_is_backward_ref(const struct sm6_value *value, st
{ {
if (!value->is_back_ref) if (!value->is_back_ref)
{ {
FIXME("Forward-referenced pointers are not supported.\n"); vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_NOT_IMPLEMENTED,
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND,
"Forward-referenced pointer declarations are not supported."); "Forward-referenced pointer declarations are not supported.");
return false; return false;
} }
@@ -3224,8 +3223,7 @@ static enum vkd3d_result value_allocate_constant_array(struct sm6_value *dst, co
/* Multidimensional arrays are emitted in flattened form. */ /* Multidimensional arrays are emitted in flattened form. */
if (elem_type->class != TYPE_CLASS_INTEGER && elem_type->class != TYPE_CLASS_FLOAT) if (elem_type->class != TYPE_CLASS_INTEGER && elem_type->class != TYPE_CLASS_FLOAT)
{ {
FIXME("Unhandled element type %u for data array.\n", elem_type->class); vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_NOT_IMPLEMENTED,
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND,
"The element data type for an immediate constant buffer is not scalar integer or floating point."); "The element data type for an immediate constant buffer is not scalar integer or floating point.");
return VKD3D_ERROR_INVALID_SHADER; return VKD3D_ERROR_INVALID_SHADER;
} }
@@ -3776,11 +3774,8 @@ static void sm6_parser_declare_tgsm_raw(struct sm6_parser *sm6, const struct sm6
if (byte_count == 2) if (byte_count == 2)
byte_count = 4; byte_count = 4;
if (byte_count != 4) if (byte_count != 4)
{ vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_NOT_IMPLEMENTED,
FIXME("Unsupported byte count %u.\n", byte_count);
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND,
"Raw TGSM byte count %u is not supported.", byte_count); "Raw TGSM byte count %u is not supported.", byte_count);
}
ins->declaration.tgsm_raw.byte_count = byte_count; ins->declaration.tgsm_raw.byte_count = byte_count;
/* The initialiser value index will be resolved later when forward references can be handled. */ /* The initialiser value index will be resolved later when forward references can be handled. */
ins->flags = init; ins->flags = init;
@@ -3802,11 +3797,8 @@ static void sm6_parser_declare_tgsm_structured(struct sm6_parser *sm6, const str
dst->structure_stride = 4; dst->structure_stride = 4;
vsir_register_from_dxil_value(&ins->declaration.tgsm_structured.reg.reg, dst, 0, sm6); vsir_register_from_dxil_value(&ins->declaration.tgsm_structured.reg.reg, dst, 0, sm6);
if (dst->structure_stride != 4) if (dst->structure_stride != 4)
{ vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_NOT_IMPLEMENTED,
FIXME("Unsupported structure stride %u.\n", dst->structure_stride);
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND,
"Structured TGSM byte stride %u is not supported.", dst->structure_stride); "Structured TGSM byte stride %u is not supported.", dst->structure_stride);
}
ins->declaration.tgsm_structured.alignment = alignment; ins->declaration.tgsm_structured.alignment = alignment;
ins->declaration.tgsm_structured.byte_stride = dst->structure_stride; ins->declaration.tgsm_structured.byte_stride = dst->structure_stride;
ins->declaration.tgsm_structured.structure_count = count; ins->declaration.tgsm_structured.structure_count = count;
@@ -3831,8 +3823,7 @@ static bool sm6_parser_declare_global(struct sm6_parser *sm6, const struct dxil_
{ {
if (!sm6_type_is_scalar(type->u.array.elem_type)) if (!sm6_type_is_scalar(type->u.array.elem_type))
{ {
FIXME("Unsupported nested type class %u.\n", type->u.array.elem_type->class); vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_NOT_IMPLEMENTED,
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND,
"Global array variables with nested type class %u are not supported.", "Global array variables with nested type class %u are not supported.",
type->u.array.elem_type->class); type->u.array.elem_type->class);
return false; return false;
@@ -3847,8 +3838,7 @@ static bool sm6_parser_declare_global(struct sm6_parser *sm6, const struct dxil_
} }
else else
{ {
FIXME("Unsupported type class %u.\n", type->class); vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_NOT_IMPLEMENTED,
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND,
"Global variables of type class %u are not supported.", type->class); "Global variables of type class %u are not supported.", type->class);
return false; return false;
} }
@@ -3953,8 +3943,7 @@ static bool sm6_parser_declare_global(struct sm6_parser *sm6, const struct dxil_
} }
else else
{ {
FIXME("Unhandled address space %"PRIu64".\n", address_space); vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_NOT_IMPLEMENTED,
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND,
"Global variables with address space %"PRIu64" are not supported.", address_space); "Global variables with address space %"PRIu64" are not supported.", address_space);
return false; return false;
} }
@@ -4011,8 +4000,7 @@ static bool resolve_forward_zero_initialiser(size_t index, struct sm6_parser *sm
return false; return false;
} }
FIXME("Non-zero initialisers are not supported.\n"); vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_NOT_IMPLEMENTED,
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND,
"Non-zero TGSM initialisers are not supported."); "Non-zero TGSM initialisers are not supported.");
return false; return false;
} }
@@ -4364,8 +4352,7 @@ static void sm6_parser_emit_alloca(struct sm6_parser *sm6, const struct dxil_rec
WARN("Ignoring in_alloca flag.\n"); WARN("Ignoring in_alloca flag.\n");
if (!(packed_operands & ALLOCA_FLAG_EXPLICIT_TYPE)) if (!(packed_operands & ALLOCA_FLAG_EXPLICIT_TYPE))
{ {
FIXME("Unhandled implicit type.\n"); vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_NOT_IMPLEMENTED,
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND,
"Implicit result type for ALLOCA instructions is not supported."); "Implicit result type for ALLOCA instructions is not supported.");
return; return;
} }
@@ -4401,8 +4388,7 @@ static void sm6_parser_emit_alloca(struct sm6_parser *sm6, const struct dxil_rec
/* A size of 1 means one instance of type[0], i.e. one array. */ /* A size of 1 means one instance of type[0], i.e. one array. */
if (sm6_value_get_constant_uint(size, sm6) != 1) if (sm6_value_get_constant_uint(size, sm6) != 1)
{ {
FIXME("Allocation size is not 1.\n"); vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_NOT_IMPLEMENTED,
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND,
"ALLOCA instruction allocation sizes other than 1 are not supported."); "ALLOCA instruction allocation sizes other than 1 are not supported.");
return; return;
} }
@@ -4484,8 +4470,7 @@ static void sm6_parser_emit_atomicrmw(struct sm6_parser *sm6, const struct dxil_
if ((op = map_dx_atomicrmw_op(code = record->operands[i++])) == VSIR_OP_INVALID) if ((op = map_dx_atomicrmw_op(code = record->operands[i++])) == VSIR_OP_INVALID)
{ {
FIXME("Unhandled atomicrmw op %"PRIu64".\n", code); vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_NOT_IMPLEMENTED,
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND,
"Operation %"PRIu64" for an atomicrmw instruction is unhandled.", code); "Operation %"PRIu64" for an atomicrmw instruction is unhandled.", code);
return; return;
} }
@@ -4613,8 +4598,7 @@ static enum vkd3d_shader_opcode map_binary_op(uint64_t code, const struct sm6_ty
is_valid = is_int; is_valid = is_int;
break; break;
default: default:
FIXME("Unhandled binary op %#"PRIx64".\n", code); vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_NOT_IMPLEMENTED,
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND,
"Binary operation %#"PRIx64" is unhandled.", code); "Binary operation %#"PRIx64" is unhandled.", code);
return VSIR_OP_INVALID; return VSIR_OP_INVALID;
} }
@@ -5055,8 +5039,7 @@ static enum vkd3d_shader_opcode map_dx_atomic_binop(const struct sm6_value *oper
return VSIR_OP_IMM_ATOMIC_XOR; return VSIR_OP_IMM_ATOMIC_XOR;
/* DXIL currently doesn't use SUB and NAND. */ /* DXIL currently doesn't use SUB and NAND. */
default: default:
FIXME("Unhandled atomic binop %"PRIu64".\n", code); vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_NOT_IMPLEMENTED,
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND,
"Operation %"PRIu64" for an atomic binop instruction is unhandled.", code); "Operation %"PRIu64" for an atomic binop instruction is unhandled.", code);
return VSIR_OP_INVALID; return VSIR_OP_INVALID;
} }
@@ -5164,8 +5147,7 @@ static void sm6_parser_emit_dx_buffer_update_counter(struct sm6_parser *sm6, enu
if (!sm6_value_is_constant(operands[1])) if (!sm6_value_is_constant(operands[1]))
{ {
FIXME("Unsupported dynamic update operand.\n"); vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_NOT_IMPLEMENTED,
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND,
"A dynamic update value for a UAV counter operation is not supported."); "A dynamic update value for a UAV counter operation is not supported.");
return; return;
} }

View File

@@ -746,6 +746,14 @@ void VKD3D_PRINTF_FUNC(3, 4) vkd3d_shader_parser_error(struct vkd3d_shader_parse
{ {
switch (error) switch (error)
{ {
case VKD3D_SHADER_ERROR_SPV_NOT_IMPLEMENTED:
case VKD3D_SHADER_ERROR_HLSL_NOT_IMPLEMENTED:
case VKD3D_SHADER_ERROR_D3DBC_NOT_IMPLEMENTED:
case VKD3D_SHADER_ERROR_DXIL_NOT_IMPLEMENTED:
case VKD3D_SHADER_ERROR_VSIR_NOT_IMPLEMENTED:
case VKD3D_SHADER_ERROR_FX_NOT_IMPLEMENTED:
parser->status = VKD3D_ERROR_NOT_IMPLEMENTED;
break;
case VKD3D_SHADER_ERROR_DXBC_OUT_OF_MEMORY: case VKD3D_SHADER_ERROR_DXBC_OUT_OF_MEMORY:
case VKD3D_SHADER_ERROR_TPF_OUT_OF_MEMORY: case VKD3D_SHADER_ERROR_TPF_OUT_OF_MEMORY:
case VKD3D_SHADER_ERROR_SPV_OUT_OF_MEMORY: case VKD3D_SHADER_ERROR_SPV_OUT_OF_MEMORY:

View File

@@ -226,6 +226,7 @@ enum vkd3d_shader_error
VKD3D_SHADER_ERROR_DXIL_INVALID_RESOURCES = 8018, VKD3D_SHADER_ERROR_DXIL_INVALID_RESOURCES = 8018,
VKD3D_SHADER_ERROR_DXIL_INVALID_RESOURCE_HANDLE = 8019, VKD3D_SHADER_ERROR_DXIL_INVALID_RESOURCE_HANDLE = 8019,
VKD3D_SHADER_ERROR_DXIL_INVALID_CONSTANT = 8020, VKD3D_SHADER_ERROR_DXIL_INVALID_CONSTANT = 8020,
VKD3D_SHADER_ERROR_DXIL_NOT_IMPLEMENTED = 8021,
VKD3D_SHADER_WARNING_DXIL_UNKNOWN_MAGIC_NUMBER = 8300, VKD3D_SHADER_WARNING_DXIL_UNKNOWN_MAGIC_NUMBER = 8300,
VKD3D_SHADER_WARNING_DXIL_UNKNOWN_SHADER_TYPE = 8301, VKD3D_SHADER_WARNING_DXIL_UNKNOWN_SHADER_TYPE = 8301,