mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-09-12 18:50:22 -07:00
vkd3d-shader/hlsl: Implement input semantics for geometry shaders.
This commit is contained in:
Notes:
Henri Verbeet
2025-03-18 16:04:44 +01:00
Approved-by: Henri Verbeet (@hverbeet) Approved-by: Elizabeth Figura (@zfigura) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1431
@@ -2104,6 +2104,7 @@ static const char *get_semantic_register_name(enum vkd3d_shader_sysval_semantic
|
|||||||
{
|
{
|
||||||
switch (semantic)
|
switch (semantic)
|
||||||
{
|
{
|
||||||
|
case VKD3D_SHADER_SV_PRIMITIVE_ID: return "primID";
|
||||||
case VKD3D_SHADER_SV_DEPTH: return "oDepth";
|
case VKD3D_SHADER_SV_DEPTH: return "oDepth";
|
||||||
case VKD3D_SHADER_SV_DEPTH_GREATER_EQUAL: return "oDepthGE";
|
case VKD3D_SHADER_SV_DEPTH_GREATER_EQUAL: return "oDepthGE";
|
||||||
case VKD3D_SHADER_SV_DEPTH_LESS_EQUAL: return "oDepthLE";
|
case VKD3D_SHADER_SV_DEPTH_LESS_EQUAL: return "oDepthLE";
|
||||||
|
@@ -9135,9 +9135,17 @@ static void sm4_generate_vsir_instr_dcl_semantic(struct hlsl_ctx *ctx, struct vs
|
|||||||
? VKD3DSIH_DCL_INPUT_PS : VKD3DSIH_DCL_INPUT;
|
? VKD3DSIH_DCL_INPUT_PS : VKD3DSIH_DCL_INPUT;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case VKD3D_SHADER_SV_PRIMITIVE_ID:
|
||||||
|
if (version->type == VKD3D_SHADER_TYPE_PIXEL)
|
||||||
|
opcode = VKD3DSIH_DCL_INPUT_PS_SGV;
|
||||||
|
else if (version->type == VKD3D_SHADER_TYPE_GEOMETRY)
|
||||||
|
opcode = VKD3DSIH_DCL_INPUT;
|
||||||
|
else
|
||||||
|
opcode = VKD3DSIH_DCL_INPUT_SGV;
|
||||||
|
break;
|
||||||
|
|
||||||
case VKD3D_SHADER_SV_INSTANCE_ID:
|
case VKD3D_SHADER_SV_INSTANCE_ID:
|
||||||
case VKD3D_SHADER_SV_IS_FRONT_FACE:
|
case VKD3D_SHADER_SV_IS_FRONT_FACE:
|
||||||
case VKD3D_SHADER_SV_PRIMITIVE_ID:
|
|
||||||
case VKD3D_SHADER_SV_SAMPLE_INDEX:
|
case VKD3D_SHADER_SV_SAMPLE_INDEX:
|
||||||
case VKD3D_SHADER_SV_VERTEX_ID:
|
case VKD3D_SHADER_SV_VERTEX_ID:
|
||||||
opcode = (version->type == VKD3D_SHADER_TYPE_PIXEL)
|
opcode = (version->type == VKD3D_SHADER_TYPE_PIXEL)
|
||||||
@@ -9188,7 +9196,7 @@ static void sm4_generate_vsir_instr_dcl_semantic(struct hlsl_ctx *ctx, struct vs
|
|||||||
}
|
}
|
||||||
else if (opcode == VKD3DSIH_DCL_INPUT || opcode == VKD3DSIH_DCL_INPUT_PS)
|
else if (opcode == VKD3DSIH_DCL_INPUT || opcode == VKD3DSIH_DCL_INPUT_PS)
|
||||||
{
|
{
|
||||||
VKD3D_ASSERT(semantic == VKD3D_SHADER_SV_NONE || is_primitive);
|
VKD3D_ASSERT(semantic == VKD3D_SHADER_SV_NONE || is_primitive || version->type == VKD3D_SHADER_TYPE_GEOMETRY);
|
||||||
dst_param = &ins->declaration.dst;
|
dst_param = &ins->declaration.dst;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -12637,7 +12645,7 @@ static void process_entry_function(struct hlsl_ctx *ctx,
|
|||||||
|
|
||||||
if (var->storage_modifiers & HLSL_STORAGE_IN)
|
if (var->storage_modifiers & HLSL_STORAGE_IN)
|
||||||
{
|
{
|
||||||
if (profile->type == VKD3D_SHADER_TYPE_GEOMETRY)
|
if (profile->type == VKD3D_SHADER_TYPE_GEOMETRY && !var->semantic.name)
|
||||||
{
|
{
|
||||||
hlsl_error(ctx, &var->loc, VKD3D_SHADER_ERROR_HLSL_MISSING_PRIMITIVE_TYPE,
|
hlsl_error(ctx, &var->loc, VKD3D_SHADER_ERROR_HLSL_MISSING_PRIMITIVE_TYPE,
|
||||||
"Input parameter \"%s\" is missing a primitive type.", var->name);
|
"Input parameter \"%s\" is missing a primitive type.", var->name);
|
||||||
|
@@ -1721,7 +1721,7 @@ static void init_sm4_lookup_tables(struct vkd3d_sm4_lookup_tables *lookup)
|
|||||||
{VKD3D_SM5_RT_LOCAL_THREAD_ID, VKD3DSPR_LOCALTHREADID, VKD3D_SM4_SWIZZLE_VEC4},
|
{VKD3D_SM5_RT_LOCAL_THREAD_ID, VKD3DSPR_LOCALTHREADID, VKD3D_SM4_SWIZZLE_VEC4},
|
||||||
{VKD3D_SM5_RT_COVERAGE, VKD3DSPR_COVERAGE, VKD3D_SM4_SWIZZLE_VEC4},
|
{VKD3D_SM5_RT_COVERAGE, VKD3DSPR_COVERAGE, VKD3D_SM4_SWIZZLE_VEC4},
|
||||||
{VKD3D_SM5_RT_LOCAL_THREAD_INDEX, VKD3DSPR_LOCALTHREADINDEX,VKD3D_SM4_SWIZZLE_VEC4},
|
{VKD3D_SM5_RT_LOCAL_THREAD_INDEX, VKD3DSPR_LOCALTHREADINDEX,VKD3D_SM4_SWIZZLE_VEC4},
|
||||||
{VKD3D_SM5_RT_GS_INSTANCE_ID, VKD3DSPR_GSINSTID, VKD3D_SM4_SWIZZLE_VEC4},
|
{VKD3D_SM5_RT_GS_INSTANCE_ID, VKD3DSPR_GSINSTID, VKD3D_SM4_SWIZZLE_SCALAR},
|
||||||
{VKD3D_SM5_RT_DEPTHOUT_GREATER_EQUAL, VKD3DSPR_DEPTHOUTGE, VKD3D_SM4_SWIZZLE_VEC4},
|
{VKD3D_SM5_RT_DEPTHOUT_GREATER_EQUAL, VKD3DSPR_DEPTHOUTGE, VKD3D_SM4_SWIZZLE_VEC4},
|
||||||
{VKD3D_SM5_RT_DEPTHOUT_LESS_EQUAL, VKD3DSPR_DEPTHOUTLE, VKD3D_SM4_SWIZZLE_VEC4},
|
{VKD3D_SM5_RT_DEPTHOUT_LESS_EQUAL, VKD3DSPR_DEPTHOUTLE, VKD3D_SM4_SWIZZLE_VEC4},
|
||||||
{VKD3D_SM5_RT_OUTPUT_STENCIL_REF, VKD3DSPR_OUTSTENCILREF, VKD3D_SM4_SWIZZLE_VEC4},
|
{VKD3D_SM5_RT_OUTPUT_STENCIL_REF, VKD3DSPR_OUTSTENCILREF, VKD3D_SM4_SWIZZLE_VEC4},
|
||||||
@@ -2991,6 +2991,7 @@ bool sm4_register_from_semantic_name(const struct vkd3d_shader_version *version,
|
|||||||
{"sv_primitiveid", false, VKD3D_SHADER_TYPE_DOMAIN, VKD3DSPR_PRIMID, false},
|
{"sv_primitiveid", false, VKD3D_SHADER_TYPE_DOMAIN, VKD3DSPR_PRIMID, false},
|
||||||
|
|
||||||
{"sv_primitiveid", false, VKD3D_SHADER_TYPE_GEOMETRY, VKD3DSPR_PRIMID, false},
|
{"sv_primitiveid", false, VKD3D_SHADER_TYPE_GEOMETRY, VKD3DSPR_PRIMID, false},
|
||||||
|
{"sv_gsinstanceid", false, VKD3D_SHADER_TYPE_GEOMETRY, VKD3DSPR_GSINSTID, false},
|
||||||
|
|
||||||
{"sv_outputcontrolpointid", false, VKD3D_SHADER_TYPE_HULL, VKD3DSPR_OUTPOINTID, false},
|
{"sv_outputcontrolpointid", false, VKD3D_SHADER_TYPE_HULL, VKD3DSPR_OUTPOINTID, false},
|
||||||
{"sv_primitiveid", false, VKD3D_SHADER_TYPE_HULL, VKD3DSPR_PRIMID, false},
|
{"sv_primitiveid", false, VKD3D_SHADER_TYPE_HULL, VKD3DSPR_PRIMID, false},
|
||||||
@@ -3096,9 +3097,8 @@ bool sm4_sysval_semantic_from_semantic_name(enum vkd3d_shader_sysval_semantic *s
|
|||||||
|
|
||||||
{"sv_position", true, VKD3D_SHADER_TYPE_DOMAIN, VKD3D_SHADER_SV_POSITION},
|
{"sv_position", true, VKD3D_SHADER_TYPE_DOMAIN, VKD3D_SHADER_SV_POSITION},
|
||||||
|
|
||||||
{"position", false, VKD3D_SHADER_TYPE_GEOMETRY, VKD3D_SHADER_SV_POSITION},
|
|
||||||
{"sv_position", false, VKD3D_SHADER_TYPE_GEOMETRY, VKD3D_SHADER_SV_POSITION},
|
|
||||||
{"sv_primitiveid", false, VKD3D_SHADER_TYPE_GEOMETRY, VKD3D_SHADER_SV_PRIMITIVE_ID},
|
{"sv_primitiveid", false, VKD3D_SHADER_TYPE_GEOMETRY, VKD3D_SHADER_SV_PRIMITIVE_ID},
|
||||||
|
{"sv_gsinstanceid", false, VKD3D_SHADER_TYPE_GEOMETRY, ~0u},
|
||||||
|
|
||||||
{"position", true, VKD3D_SHADER_TYPE_GEOMETRY, VKD3D_SHADER_SV_POSITION},
|
{"position", true, VKD3D_SHADER_TYPE_GEOMETRY, VKD3D_SHADER_SV_POSITION},
|
||||||
{"sv_position", true, VKD3D_SHADER_TYPE_GEOMETRY, VKD3D_SHADER_SV_POSITION},
|
{"sv_position", true, VKD3D_SHADER_TYPE_GEOMETRY, VKD3D_SHADER_SV_POSITION},
|
||||||
@@ -3199,6 +3199,8 @@ bool sm4_sysval_semantic_from_semantic_name(enum vkd3d_shader_sysval_semantic *s
|
|||||||
|
|
||||||
if (has_sv_prefix)
|
if (has_sv_prefix)
|
||||||
return false;
|
return false;
|
||||||
|
if (!output && version->type == VKD3D_SHADER_TYPE_GEOMETRY)
|
||||||
|
return false;
|
||||||
|
|
||||||
*sysval_semantic = VKD3D_SHADER_SV_NONE;
|
*sysval_semantic = VKD3D_SHADER_SV_NONE;
|
||||||
return true;
|
return true;
|
||||||
|
Reference in New Issue
Block a user