mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-12-15 08:03:30 -08:00
vkd3d-shader/dxil: Set the parser status to VKD3D_ERROR_NOT_IMPLEMENTED on missing functionality.
This commit is contained in:
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
@@ -3011,8 +3011,7 @@ static bool sm6_value_validate_is_backward_ref(const struct sm6_value *value, st
|
||||
{
|
||||
if (!value->is_back_ref)
|
||||
{
|
||||
FIXME("Forward-referenced pointers are not supported.\n");
|
||||
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND,
|
||||
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_NOT_IMPLEMENTED,
|
||||
"Forward-referenced pointer declarations are not supported.");
|
||||
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. */
|
||||
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_INVALID_OPERAND,
|
||||
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_NOT_IMPLEMENTED,
|
||||
"The element data type for an immediate constant buffer is not scalar integer or floating point.");
|
||||
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)
|
||||
byte_count = 4;
|
||||
if (byte_count != 4)
|
||||
{
|
||||
FIXME("Unsupported byte count %u.\n", byte_count);
|
||||
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND,
|
||||
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_NOT_IMPLEMENTED,
|
||||
"Raw TGSM byte count %u is not supported.", byte_count);
|
||||
}
|
||||
ins->declaration.tgsm_raw.byte_count = byte_count;
|
||||
/* The initialiser value index will be resolved later when forward references can be handled. */
|
||||
ins->flags = init;
|
||||
@@ -3802,11 +3797,8 @@ static void sm6_parser_declare_tgsm_structured(struct sm6_parser *sm6, const str
|
||||
dst->structure_stride = 4;
|
||||
vsir_register_from_dxil_value(&ins->declaration.tgsm_structured.reg.reg, dst, 0, sm6);
|
||||
if (dst->structure_stride != 4)
|
||||
{
|
||||
FIXME("Unsupported structure stride %u.\n", dst->structure_stride);
|
||||
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND,
|
||||
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_NOT_IMPLEMENTED,
|
||||
"Structured TGSM byte stride %u is not supported.", dst->structure_stride);
|
||||
}
|
||||
ins->declaration.tgsm_structured.alignment = alignment;
|
||||
ins->declaration.tgsm_structured.byte_stride = dst->structure_stride;
|
||||
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))
|
||||
{
|
||||
FIXME("Unsupported nested type class %u.\n", type->u.array.elem_type->class);
|
||||
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND,
|
||||
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_NOT_IMPLEMENTED,
|
||||
"Global array variables with nested type class %u are not supported.",
|
||||
type->u.array.elem_type->class);
|
||||
return false;
|
||||
@@ -3847,8 +3838,7 @@ static bool sm6_parser_declare_global(struct sm6_parser *sm6, const struct dxil_
|
||||
}
|
||||
else
|
||||
{
|
||||
FIXME("Unsupported type class %u.\n", type->class);
|
||||
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND,
|
||||
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_NOT_IMPLEMENTED,
|
||||
"Global variables of type class %u are not supported.", type->class);
|
||||
return false;
|
||||
}
|
||||
@@ -3953,8 +3943,7 @@ static bool sm6_parser_declare_global(struct sm6_parser *sm6, const struct dxil_
|
||||
}
|
||||
else
|
||||
{
|
||||
FIXME("Unhandled address space %"PRIu64".\n", address_space);
|
||||
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND,
|
||||
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_NOT_IMPLEMENTED,
|
||||
"Global variables with address space %"PRIu64" are not supported.", address_space);
|
||||
return false;
|
||||
}
|
||||
@@ -4011,8 +4000,7 @@ static bool resolve_forward_zero_initialiser(size_t index, struct sm6_parser *sm
|
||||
return false;
|
||||
}
|
||||
|
||||
FIXME("Non-zero initialisers are not supported.\n");
|
||||
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND,
|
||||
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_NOT_IMPLEMENTED,
|
||||
"Non-zero TGSM initialisers are not supported.");
|
||||
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");
|
||||
if (!(packed_operands & ALLOCA_FLAG_EXPLICIT_TYPE))
|
||||
{
|
||||
FIXME("Unhandled implicit type.\n");
|
||||
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND,
|
||||
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_NOT_IMPLEMENTED,
|
||||
"Implicit result type for ALLOCA instructions is not supported.");
|
||||
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. */
|
||||
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_INVALID_OPERAND,
|
||||
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_NOT_IMPLEMENTED,
|
||||
"ALLOCA instruction allocation sizes other than 1 are not supported.");
|
||||
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)
|
||||
{
|
||||
FIXME("Unhandled atomicrmw op %"PRIu64".\n", code);
|
||||
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND,
|
||||
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_NOT_IMPLEMENTED,
|
||||
"Operation %"PRIu64" for an atomicrmw instruction is unhandled.", code);
|
||||
return;
|
||||
}
|
||||
@@ -4613,8 +4598,7 @@ static enum vkd3d_shader_opcode map_binary_op(uint64_t code, const struct sm6_ty
|
||||
is_valid = is_int;
|
||||
break;
|
||||
default:
|
||||
FIXME("Unhandled binary op %#"PRIx64".\n", code);
|
||||
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND,
|
||||
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_NOT_IMPLEMENTED,
|
||||
"Binary operation %#"PRIx64" is unhandled.", code);
|
||||
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;
|
||||
/* DXIL currently doesn't use SUB and NAND. */
|
||||
default:
|
||||
FIXME("Unhandled atomic binop %"PRIu64".\n", code);
|
||||
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND,
|
||||
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_NOT_IMPLEMENTED,
|
||||
"Operation %"PRIu64" for an atomic binop instruction is unhandled.", code);
|
||||
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]))
|
||||
{
|
||||
FIXME("Unsupported dynamic update operand.\n");
|
||||
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND,
|
||||
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_NOT_IMPLEMENTED,
|
||||
"A dynamic update value for a UAV counter operation is not supported.");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -746,6 +746,14 @@ void VKD3D_PRINTF_FUNC(3, 4) vkd3d_shader_parser_error(struct vkd3d_shader_parse
|
||||
{
|
||||
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_TPF_OUT_OF_MEMORY:
|
||||
case VKD3D_SHADER_ERROR_SPV_OUT_OF_MEMORY:
|
||||
|
||||
@@ -226,6 +226,7 @@ enum vkd3d_shader_error
|
||||
VKD3D_SHADER_ERROR_DXIL_INVALID_RESOURCES = 8018,
|
||||
VKD3D_SHADER_ERROR_DXIL_INVALID_RESOURCE_HANDLE = 8019,
|
||||
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_SHADER_TYPE = 8301,
|
||||
|
||||
Reference in New Issue
Block a user