HLSL: Implement SM 6.8 BaseVertex/BaseInstance.

This commit is contained in:
Hans-Kristian Arntzen 2024-07-15 13:20:31 +02:00
parent d17a2d6940
commit 1de3f8c1f2
10 changed files with 183 additions and 10 deletions

View File

@ -0,0 +1,25 @@
static float4 gl_Position;
static int gl_BaseInstanceARB;
struct SPIRV_Cross_Input
{
uint gl_BaseInstanceARB : SV_StartInstanceLocation;
};
struct SPIRV_Cross_Output
{
float4 gl_Position : SV_Position;
};
void vert_main()
{
gl_Position = float(gl_BaseInstanceARB).xxxx;
}
SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input)
{
gl_BaseInstanceARB = stage_input.gl_BaseInstanceARB;
vert_main();
SPIRV_Cross_Output stage_output;
stage_output.gl_Position = gl_Position;
return stage_output;
}

View File

@ -0,0 +1,25 @@
static float4 gl_Position;
static int gl_BaseVertexARB;
struct SPIRV_Cross_Input
{
uint gl_BaseVertexARB : SV_StartVertexLocation;
};
struct SPIRV_Cross_Output
{
float4 gl_Position : SV_Position;
};
void vert_main()
{
gl_Position = float(gl_BaseVertexARB).xxxx;
}
SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input)
{
gl_BaseVertexARB = stage_input.gl_BaseVertexARB;
vert_main();
SPIRV_Cross_Output stage_output;
stage_output.gl_Position = gl_Position;
return stage_output;
}

View File

@ -0,0 +1,28 @@
static float4 gl_Position;
static int gl_InstanceIndex;
static int gl_BaseInstanceARB;
struct SPIRV_Cross_Input
{
uint gl_InstanceIndex : SV_InstanceID;
uint gl_BaseInstanceARB : SV_StartInstanceLocation;
};
struct SPIRV_Cross_Output
{
float4 gl_Position : SV_Position;
};
void vert_main()
{
gl_Position = float(gl_InstanceIndex).xxxx;
}
SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input)
{
gl_InstanceIndex = int(stage_input.gl_InstanceIndex + stage_input.gl_BaseInstanceARB);
gl_BaseInstanceARB = stage_input.gl_BaseInstanceARB;
vert_main();
SPIRV_Cross_Output stage_output;
stage_output.gl_Position = gl_Position;
return stage_output;
}

View File

@ -0,0 +1,28 @@
static float4 gl_Position;
static int gl_VertexIndex;
static int gl_BaseVertexARB;
struct SPIRV_Cross_Input
{
uint gl_VertexIndex : SV_VertexID;
uint gl_BaseVertexARB : SV_StartVertexLocation;
};
struct SPIRV_Cross_Output
{
float4 gl_Position : SV_Position;
};
void vert_main()
{
gl_Position = float(gl_VertexIndex).xxxx;
}
SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input)
{
gl_VertexIndex = int(stage_input.gl_VertexIndex + stage_input.gl_BaseVertexARB);
gl_BaseVertexARB = stage_input.gl_BaseVertexARB;
vert_main();
SPIRV_Cross_Output stage_output;
stage_output.gl_Position = gl_Position;
return stage_output;
}

View File

@ -0,0 +1,7 @@
#version 450
#extension GL_ARB_shader_draw_parameters : require
void main()
{
gl_Position = vec4(gl_BaseInstanceARB);
}

View File

@ -0,0 +1,7 @@
#version 450
#extension GL_ARB_shader_draw_parameters : require
void main()
{
gl_Position = vec4(gl_BaseVertexARB);
}

View File

@ -0,0 +1,6 @@
#version 450
void main()
{
gl_Position = vec4(gl_InstanceIndex);
}

View File

@ -0,0 +1,6 @@
#version 450
void main()
{
gl_Position = vec4(gl_VertexIndex);
}

View File

@ -849,11 +849,25 @@ void CompilerHLSL::emit_builtin_inputs_in_struct()
case BuiltInSubgroupLeMask: case BuiltInSubgroupLeMask:
case BuiltInSubgroupGtMask: case BuiltInSubgroupGtMask:
case BuiltInSubgroupGeMask: case BuiltInSubgroupGeMask:
case BuiltInBaseVertex:
case BuiltInBaseInstance:
// Handled specially. // Handled specially.
break; break;
case BuiltInBaseVertex:
if (hlsl_options.shader_model >= 68)
{
type = "uint";
semantic = "SV_StartVertexLocation";
}
break;
case BuiltInBaseInstance:
if (hlsl_options.shader_model >= 68)
{
type = "uint";
semantic = "SV_StartInstanceLocation";
}
break;
case BuiltInHelperInvocation: case BuiltInHelperInvocation:
if (hlsl_options.shader_model < 50 || get_entry_point().model != ExecutionModelFragment) if (hlsl_options.shader_model < 50 || get_entry_point().model != ExecutionModelFragment)
SPIRV_CROSS_THROW("Helper Invocation input is only supported in PS 5.0 or higher."); SPIRV_CROSS_THROW("Helper Invocation input is only supported in PS 5.0 or higher.");
@ -1231,7 +1245,7 @@ void CompilerHLSL::emit_builtin_variables()
case BuiltInVertexIndex: case BuiltInVertexIndex:
case BuiltInInstanceIndex: case BuiltInInstanceIndex:
type = "int"; type = "int";
if (hlsl_options.support_nonzero_base_vertex_base_instance) if (hlsl_options.support_nonzero_base_vertex_base_instance || hlsl_options.shader_model >= 68)
base_vertex_info.used = true; base_vertex_info.used = true;
break; break;
@ -1353,7 +1367,7 @@ void CompilerHLSL::emit_builtin_variables()
} }
}); });
if (base_vertex_info.used) if (base_vertex_info.used && hlsl_options.shader_model < 68)
{ {
string binding_info; string binding_info;
if (base_vertex_info.explicit_binding) if (base_vertex_info.explicit_binding)
@ -3136,23 +3150,39 @@ void CompilerHLSL::emit_hlsl_entry_point()
case BuiltInVertexIndex: case BuiltInVertexIndex:
case BuiltInInstanceIndex: case BuiltInInstanceIndex:
// D3D semantics are uint, but shader wants int. // D3D semantics are uint, but shader wants int.
if (hlsl_options.support_nonzero_base_vertex_base_instance) if (hlsl_options.support_nonzero_base_vertex_base_instance || hlsl_options.shader_model >= 68)
{ {
if (static_cast<BuiltIn>(i) == BuiltInInstanceIndex) if (hlsl_options.shader_model >= 68)
statement(builtin, " = int(stage_input.", builtin, ") + SPIRV_Cross_BaseInstance;"); {
if (static_cast<BuiltIn>(i) == BuiltInInstanceIndex)
statement(builtin, " = int(stage_input.", builtin, " + stage_input.gl_BaseInstanceARB);");
else
statement(builtin, " = int(stage_input.", builtin, " + stage_input.gl_BaseVertexARB);");
}
else else
statement(builtin, " = int(stage_input.", builtin, ") + SPIRV_Cross_BaseVertex;"); {
if (static_cast<BuiltIn>(i) == BuiltInInstanceIndex)
statement(builtin, " = int(stage_input.", builtin, ") + SPIRV_Cross_BaseInstance;");
else
statement(builtin, " = int(stage_input.", builtin, ") + SPIRV_Cross_BaseVertex;");
}
} }
else else
statement(builtin, " = int(stage_input.", builtin, ");"); statement(builtin, " = int(stage_input.", builtin, ");");
break; break;
case BuiltInBaseVertex: case BuiltInBaseVertex:
statement(builtin, " = SPIRV_Cross_BaseVertex;"); if (hlsl_options.shader_model >= 68)
statement(builtin, " = stage_input.gl_BaseVertexARB;");
else
statement(builtin, " = SPIRV_Cross_BaseVertex;");
break; break;
case BuiltInBaseInstance: case BuiltInBaseInstance:
statement(builtin, " = SPIRV_Cross_BaseInstance;"); if (hlsl_options.shader_model >= 68)
statement(builtin, " = stage_input.gl_BaseInstanceARB;");
else
statement(builtin, " = SPIRV_Cross_BaseInstance;");
break; break;
case BuiltInInstanceId: case BuiltInInstanceId:
@ -6714,6 +6744,15 @@ string CompilerHLSL::compile()
if (need_subpass_input) if (need_subpass_input)
active_input_builtins.set(BuiltInFragCoord); active_input_builtins.set(BuiltInFragCoord);
// Need to offset by BaseVertex/BaseInstance in SM 6.8+.
if (hlsl_options.shader_model >= 68)
{
if (active_input_builtins.get(BuiltInVertexIndex))
active_input_builtins.set(BuiltInBaseVertex);
if (active_input_builtins.get(BuiltInInstanceIndex))
active_input_builtins.set(BuiltInBaseInstance);
}
uint32_t pass_count = 0; uint32_t pass_count = 0;
do do
{ {

View File

@ -494,6 +494,8 @@ def shader_to_sm(shader):
return '62' return '62'
elif '.sm60.' in shader: elif '.sm60.' in shader:
return '60' return '60'
elif '.sm68.' in shader:
return '68'
elif '.sm51.' in shader: elif '.sm51.' in shader:
return '51' return '51'
elif '.sm30.' in shader: elif '.sm30.' in shader: