mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-09-12 18:50:22 -07:00
vkd3d-shader/hlsl: Generate vsir signature entries for patch variables.
This commit is contained in:
Notes:
Henri Verbeet
2025-02-03 16:40:17 +01:00
Approved-by: Henri Verbeet (@hverbeet) Approved-by: Elizabeth Figura (@zfigura) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1362
@@ -5863,8 +5863,8 @@ static void allocate_semantic_register(struct hlsl_ctx *ctx, struct hlsl_ir_var
|
|||||||
enum vkd3d_shader_sysval_semantic semantic;
|
enum vkd3d_shader_sysval_semantic semantic;
|
||||||
bool has_idx;
|
bool has_idx;
|
||||||
|
|
||||||
if (!sm4_sysval_semantic_from_semantic_name(&semantic, &version, ctx->semantic_compat_mapping,
|
if (!sm4_sysval_semantic_from_semantic_name(&semantic, &version, ctx->semantic_compat_mapping, ctx->domain,
|
||||||
ctx->domain, var->semantic.name, var->semantic.index, output, ctx->is_patch_constant_func))
|
var->semantic.name, var->semantic.index, output, ctx->is_patch_constant_func, false))
|
||||||
{
|
{
|
||||||
hlsl_error(ctx, &var->loc, VKD3D_SHADER_ERROR_HLSL_INVALID_SEMANTIC,
|
hlsl_error(ctx, &var->loc, VKD3D_SHADER_ERROR_HLSL_INVALID_SEMANTIC,
|
||||||
"Invalid semantic '%s'.", var->semantic.name);
|
"Invalid semantic '%s'.", var->semantic.name);
|
||||||
@@ -7038,6 +7038,7 @@ static void generate_vsir_signature_entry(struct hlsl_ctx *ctx, struct vsir_prog
|
|||||||
{
|
{
|
||||||
enum vkd3d_shader_component_type component_type = VKD3D_SHADER_COMPONENT_VOID;
|
enum vkd3d_shader_component_type component_type = VKD3D_SHADER_COMPONENT_VOID;
|
||||||
enum vkd3d_shader_sysval_semantic sysval = VKD3D_SHADER_SV_NONE;
|
enum vkd3d_shader_sysval_semantic sysval = VKD3D_SHADER_SV_NONE;
|
||||||
|
bool is_patch = hlsl_type_is_patch_array(var->data_type);
|
||||||
unsigned int register_index, mask, use_mask;
|
unsigned int register_index, mask, use_mask;
|
||||||
const char *name = var->semantic.name;
|
const char *name = var->semantic.name;
|
||||||
enum vkd3d_shader_register_type type;
|
enum vkd3d_shader_register_type type;
|
||||||
@@ -7046,10 +7047,11 @@ static void generate_vsir_signature_entry(struct hlsl_ctx *ctx, struct vsir_prog
|
|||||||
if (hlsl_version_ge(ctx, 4, 0))
|
if (hlsl_version_ge(ctx, 4, 0))
|
||||||
{
|
{
|
||||||
struct vkd3d_string_buffer *string;
|
struct vkd3d_string_buffer *string;
|
||||||
|
enum hlsl_base_type numeric_type;
|
||||||
bool has_idx, ret;
|
bool has_idx, ret;
|
||||||
|
|
||||||
ret = sm4_sysval_semantic_from_semantic_name(&sysval, &program->shader_version, ctx->semantic_compat_mapping,
|
ret = sm4_sysval_semantic_from_semantic_name(&sysval, &program->shader_version, ctx->semantic_compat_mapping,
|
||||||
ctx->domain, var->semantic.name, var->semantic.index, output, ctx->is_patch_constant_func);
|
ctx->domain, var->semantic.name, var->semantic.index, output, ctx->is_patch_constant_func, is_patch);
|
||||||
VKD3D_ASSERT(ret);
|
VKD3D_ASSERT(ret);
|
||||||
if (sysval == ~0u)
|
if (sysval == ~0u)
|
||||||
return;
|
return;
|
||||||
@@ -7068,7 +7070,12 @@ static void generate_vsir_signature_entry(struct hlsl_ctx *ctx, struct vsir_prog
|
|||||||
|
|
||||||
use_mask = mask; /* FIXME: retrieve use mask accurately. */
|
use_mask = mask; /* FIXME: retrieve use mask accurately. */
|
||||||
|
|
||||||
switch (var->data_type->e.numeric.type)
|
if (var->data_type->class == HLSL_CLASS_ARRAY)
|
||||||
|
numeric_type = var->data_type->e.array.type->e.numeric.type;
|
||||||
|
else
|
||||||
|
numeric_type = var->data_type->e.numeric.type;
|
||||||
|
|
||||||
|
switch (numeric_type)
|
||||||
{
|
{
|
||||||
case HLSL_TYPE_FLOAT:
|
case HLSL_TYPE_FLOAT:
|
||||||
case HLSL_TYPE_HALF:
|
case HLSL_TYPE_HALF:
|
||||||
@@ -7185,19 +7192,24 @@ static void generate_vsir_signature(struct hlsl_ctx *ctx,
|
|||||||
{
|
{
|
||||||
bool is_patch = hlsl_type_is_patch_array(var->data_type);
|
bool is_patch = hlsl_type_is_patch_array(var->data_type);
|
||||||
|
|
||||||
if (is_patch)
|
|
||||||
{
|
|
||||||
hlsl_fixme(ctx, &var->loc, "Generating vsir signatures for patch semantic variables.");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ctx->is_patch_constant_func)
|
if (ctx->is_patch_constant_func)
|
||||||
|
{
|
||||||
|
if (!is_patch)
|
||||||
generate_vsir_signature_entry(ctx, program, &program->patch_constant_signature, false, var);
|
generate_vsir_signature_entry(ctx, program, &program->patch_constant_signature, false, var);
|
||||||
|
}
|
||||||
else if (is_domain)
|
else if (is_domain)
|
||||||
generate_vsir_signature_entry(ctx, program, &program->patch_constant_signature, false, var);
|
{
|
||||||
|
if (is_patch)
|
||||||
|
generate_vsir_signature_entry(ctx, program, &program->input_signature, false, var);
|
||||||
else
|
else
|
||||||
|
generate_vsir_signature_entry(ctx, program, &program->patch_constant_signature, false, var);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
generate_vsir_signature_entry(ctx, program, &program->input_signature, false, var);
|
generate_vsir_signature_entry(ctx, program, &program->input_signature, false, var);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (var->is_output_semantic)
|
if (var->is_output_semantic)
|
||||||
{
|
{
|
||||||
if (ctx->is_patch_constant_func)
|
if (ctx->is_patch_constant_func)
|
||||||
@@ -8917,8 +8929,8 @@ static void sm4_generate_vsir_instr_dcl_semantic(struct hlsl_ctx *ctx, struct vs
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
sm4_sysval_semantic_from_semantic_name(&semantic, version, ctx->semantic_compat_mapping,
|
sm4_sysval_semantic_from_semantic_name(&semantic, version, ctx->semantic_compat_mapping, ctx->domain,
|
||||||
ctx->domain, var->semantic.name, var->semantic.index, output, ctx->is_patch_constant_func);
|
var->semantic.name, var->semantic.index, output, ctx->is_patch_constant_func, is_patch);
|
||||||
if (semantic == ~0u)
|
if (semantic == ~0u)
|
||||||
semantic = VKD3D_SHADER_SV_NONE;
|
semantic = VKD3D_SHADER_SV_NONE;
|
||||||
|
|
||||||
|
@@ -3070,7 +3070,7 @@ static bool get_insidetessfactor_sysval_semantic(enum vkd3d_shader_sysval_semant
|
|||||||
|
|
||||||
bool sm4_sysval_semantic_from_semantic_name(enum vkd3d_shader_sysval_semantic *sysval_semantic,
|
bool sm4_sysval_semantic_from_semantic_name(enum vkd3d_shader_sysval_semantic *sysval_semantic,
|
||||||
const struct vkd3d_shader_version *version, bool semantic_compat_mapping, enum vkd3d_tessellator_domain domain,
|
const struct vkd3d_shader_version *version, bool semantic_compat_mapping, enum vkd3d_tessellator_domain domain,
|
||||||
const char *semantic_name, unsigned int semantic_idx, bool output, bool is_patch_constant_func)
|
const char *semantic_name, unsigned int semantic_idx, bool output, bool is_patch_constant_func, bool is_patch)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
@@ -3133,6 +3133,20 @@ bool sm4_sysval_semantic_from_semantic_name(enum vkd3d_shader_sysval_semantic *s
|
|||||||
};
|
};
|
||||||
bool has_sv_prefix = !ascii_strncasecmp(semantic_name, "sv_", 3);
|
bool has_sv_prefix = !ascii_strncasecmp(semantic_name, "sv_", 3);
|
||||||
|
|
||||||
|
if (is_patch)
|
||||||
|
{
|
||||||
|
VKD3D_ASSERT(!output);
|
||||||
|
|
||||||
|
if (!ascii_strcasecmp(semantic_name, "sv_position")
|
||||||
|
|| (semantic_compat_mapping && !ascii_strcasecmp(semantic_name, "position")))
|
||||||
|
*sysval_semantic = VKD3D_SHADER_SV_POSITION;
|
||||||
|
else if (has_sv_prefix)
|
||||||
|
return false;
|
||||||
|
else
|
||||||
|
*sysval_semantic = VKD3D_SHADER_SV_NONE;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if (is_patch_constant_func)
|
if (is_patch_constant_func)
|
||||||
{
|
{
|
||||||
if (output)
|
if (output)
|
||||||
|
@@ -1642,7 +1642,7 @@ bool sm4_register_from_semantic_name(const struct vkd3d_shader_version *version,
|
|||||||
bool shader_sm4_is_scalar_register(const struct vkd3d_shader_register *reg);
|
bool shader_sm4_is_scalar_register(const struct vkd3d_shader_register *reg);
|
||||||
bool sm4_sysval_semantic_from_semantic_name(enum vkd3d_shader_sysval_semantic *sysval_semantic,
|
bool sm4_sysval_semantic_from_semantic_name(enum vkd3d_shader_sysval_semantic *sysval_semantic,
|
||||||
const struct vkd3d_shader_version *version, bool semantic_compat_mapping, enum vkd3d_tessellator_domain domain,
|
const struct vkd3d_shader_version *version, bool semantic_compat_mapping, enum vkd3d_tessellator_domain domain,
|
||||||
const char *semantic_name, unsigned int semantic_idx, bool output, bool is_patch_constant_func);
|
const char *semantic_name, unsigned int semantic_idx, bool output, bool is_patch_constant_func, bool is_patch);
|
||||||
|
|
||||||
int d3dbc_parse(const struct vkd3d_shader_compile_info *compile_info, uint64_t config_flags,
|
int d3dbc_parse(const struct vkd3d_shader_compile_info *compile_info, uint64_t config_flags,
|
||||||
struct vkd3d_shader_message_context *message_context, struct vsir_program *program);
|
struct vkd3d_shader_message_context *message_context, struct vsir_program *program);
|
||||||
|
Reference in New Issue
Block a user