mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2024-09-13 09:16:14 -07:00
vkd3d-shader/hlsl: Parse the outputcontrolpoints attribute.
This commit is contained in:
parent
4dfd682446
commit
dae88bab52
Notes:
Henri Verbeet
2024-09-04 18:50:05 +02:00
Approved-by: Elizabeth Figura (@zfigura) Approved-by: Henri Verbeet (@hverbeet) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1015
@ -4275,6 +4275,7 @@ static bool hlsl_ctx_init(struct hlsl_ctx *ctx, const struct vkd3d_shader_compil
|
||||
}
|
||||
|
||||
ctx->domain = VKD3D_TESSELLATOR_DOMAIN_INVALID;
|
||||
ctx->output_control_point_count = UINT_MAX;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -1074,6 +1074,7 @@ struct hlsl_ctx
|
||||
uint32_t thread_count[3];
|
||||
|
||||
enum vkd3d_tessellator_domain domain;
|
||||
unsigned int output_control_point_count;
|
||||
|
||||
/* In some cases we generate opcodes by parsing an HLSL function and then
|
||||
* invoking it. If not NULL, this field is the name of the function that we
|
||||
|
@ -5892,6 +5892,50 @@ static void parse_domain_attribute(struct hlsl_ctx *ctx, const struct hlsl_attri
|
||||
value);
|
||||
}
|
||||
|
||||
static void parse_outputcontrolpoints_attribute(struct hlsl_ctx *ctx, const struct hlsl_attribute *attr)
|
||||
{
|
||||
const struct hlsl_ir_node *instr;
|
||||
const struct hlsl_type *type;
|
||||
const struct hlsl_ir_constant *constant;
|
||||
|
||||
if (attr->args_count != 1)
|
||||
{
|
||||
hlsl_error(ctx, &attr->loc, VKD3D_SHADER_ERROR_HLSL_WRONG_PARAMETER_COUNT,
|
||||
"Expected 1 parameter for [outputcontrolpoints] attribute, but got %u.", attr->args_count);
|
||||
return;
|
||||
}
|
||||
|
||||
instr = attr->args[0].node;
|
||||
type = instr->data_type;
|
||||
|
||||
if (type->class != HLSL_CLASS_SCALAR
|
||||
|| (type->e.numeric.type != HLSL_TYPE_INT && type->e.numeric.type != HLSL_TYPE_UINT))
|
||||
{
|
||||
struct vkd3d_string_buffer *string;
|
||||
|
||||
if ((string = hlsl_type_to_string(ctx, type)))
|
||||
hlsl_error(ctx, &instr->loc, VKD3D_SHADER_ERROR_HLSL_INVALID_TYPE,
|
||||
"Wrong type for argument 0 of [outputcontrolpoints]: expected int or uint, but got %s.",
|
||||
string->buffer);
|
||||
hlsl_release_string_buffer(ctx, string);
|
||||
return;
|
||||
}
|
||||
|
||||
if (instr->type != HLSL_IR_CONSTANT)
|
||||
{
|
||||
hlsl_fixme(ctx, &instr->loc, "Non-constant expression in [outputcontrolpoints] initializer.");
|
||||
return;
|
||||
}
|
||||
constant = hlsl_ir_constant(instr);
|
||||
|
||||
if ((type->e.numeric.type == HLSL_TYPE_INT && constant->value.u[0].i < 0)
|
||||
|| constant->value.u[0].u > 32)
|
||||
hlsl_error(ctx, &instr->loc, VKD3D_SHADER_ERROR_HLSL_INVALID_CONTROL_POINT_COUNT,
|
||||
"Output control point count must be between 0 and 32.");
|
||||
|
||||
ctx->output_control_point_count = constant->value.u[0].u;
|
||||
}
|
||||
|
||||
static void parse_entry_function_attributes(struct hlsl_ctx *ctx, const struct hlsl_ir_function_decl *entry_func)
|
||||
{
|
||||
const struct hlsl_profile_info *profile = ctx->profile;
|
||||
@ -5906,6 +5950,8 @@ static void parse_entry_function_attributes(struct hlsl_ctx *ctx, const struct h
|
||||
else if (!strcmp(attr->name, "domain")
|
||||
&& (profile->type == VKD3D_SHADER_TYPE_HULL || profile->type == VKD3D_SHADER_TYPE_DOMAIN))
|
||||
parse_domain_attribute(ctx, attr);
|
||||
else if (!strcmp(attr->name, "outputcontrolpoints") && profile->type == VKD3D_SHADER_TYPE_HULL)
|
||||
parse_outputcontrolpoints_attribute(ctx, attr);
|
||||
else
|
||||
hlsl_warning(ctx, &entry_func->attrs[i]->loc, VKD3D_SHADER_WARNING_HLSL_UNKNOWN_ATTRIBUTE,
|
||||
"Ignoring unknown attribute \"%s\".", entry_func->attrs[i]->name);
|
||||
|
@ -155,6 +155,7 @@ enum vkd3d_shader_error
|
||||
VKD3D_SHADER_ERROR_HLSL_INVALID_PROFILE = 5033,
|
||||
VKD3D_SHADER_ERROR_HLSL_MISPLACED_COMPILE = 5034,
|
||||
VKD3D_SHADER_ERROR_HLSL_INVALID_DOMAIN = 5035,
|
||||
VKD3D_SHADER_ERROR_HLSL_INVALID_CONTROL_POINT_COUNT = 5036,
|
||||
|
||||
VKD3D_SHADER_WARNING_HLSL_IMPLICIT_TRUNCATION = 5300,
|
||||
VKD3D_SHADER_WARNING_HLSL_DIVISION_BY_ZERO = 5301,
|
||||
|
@ -437,7 +437,7 @@ float4 main() : POSITION
|
||||
return 0;
|
||||
}
|
||||
|
||||
[hull shader fail todo]
|
||||
[hull shader fail]
|
||||
struct patch_constant_data
|
||||
{
|
||||
float edges[2] : SV_TessFactor;
|
||||
|
Loading…
Reference in New Issue
Block a user