GPU: Make perspective-correct color interpolation toggleable

This commit is contained in:
Connor McLaughlin
2022-10-03 20:03:30 +10:00
parent 6af5a2486c
commit 971bba07d6
20 changed files with 145 additions and 80 deletions

View File

@ -11,8 +11,7 @@
Log_SetChannel(ShaderGen);
ShaderGen::ShaderGen(RenderAPI render_api, bool supports_dual_source_blend)
: m_render_api(render_api),
m_glsl(render_api != RenderAPI::D3D11 && render_api != RenderAPI::D3D12),
: m_render_api(render_api), m_glsl(render_api != RenderAPI::D3D11 && render_api != RenderAPI::D3D12),
m_supports_dual_source_blend(supports_dual_source_blend), m_use_glsl_interface_blocks(false)
{
#if defined(WITH_OPENGL) || defined(WITH_VULKAN)
@ -24,7 +23,7 @@ ShaderGen::ShaderGen(RenderAPI render_api, bool supports_dual_source_blend)
m_use_glsl_interface_blocks = (IsVulkan() || GLAD_GL_ES_VERSION_3_2 || GLAD_GL_VERSION_3_2);
m_use_glsl_binding_layout = (IsVulkan() || UseGLSLBindingLayout());
if (m_render_api == RenderAPI::OpenGL)
{
// SSAA with interface blocks is broken on AMD's OpenGL driver.
@ -355,8 +354,8 @@ const char* ShaderGen::GetInterpolationQualifier(bool interface_block, bool cent
void ShaderGen::DeclareVertexEntryPoint(
std::stringstream& ss, const std::initializer_list<const char*>& attributes, u32 num_color_outputs,
u32 num_texcoord_outputs, const std::initializer_list<std::pair<const char*, const char*>>& additional_outputs,
bool declare_vertex_id /* = false */, const char* output_block_suffix /* = "" */,
bool centroid_interpolation /* = false */, bool sample_interpolation /* = false */)
bool declare_vertex_id /* = false */, const char* output_block_suffix /* = "" */, bool msaa /* = false */,
bool ssaa /* = false */, bool noperspective_color /* = false */)
{
if (m_glsl)
{
@ -377,7 +376,7 @@ void ShaderGen::DeclareVertexEntryPoint(
if (m_use_glsl_interface_blocks)
{
const char* qualifier = GetInterpolationQualifier(true, centroid_interpolation, sample_interpolation, true);
const char* qualifier = GetInterpolationQualifier(true, msaa, ssaa, true);
if (IsVulkan())
ss << "layout(location = 0) ";
@ -398,7 +397,7 @@ void ShaderGen::DeclareVertexEntryPoint(
}
else
{
const char* qualifier = GetInterpolationQualifier(false, centroid_interpolation, sample_interpolation, true);
const char* qualifier = GetInterpolationQualifier(false, msaa, ssaa, true);
for (u32 i = 0; i < num_color_outputs; i++)
ss << qualifier << "out float4 v_col" << i << ";\n";
@ -427,7 +426,7 @@ void ShaderGen::DeclareVertexEntryPoint(
}
else
{
const char* qualifier = GetInterpolationQualifier(false, centroid_interpolation, sample_interpolation, true);
const char* qualifier = GetInterpolationQualifier(false, msaa, ssaa, true);
ss << "void main(\n";
@ -442,7 +441,8 @@ void ShaderGen::DeclareVertexEntryPoint(
}
for (u32 i = 0; i < num_color_outputs; i++)
ss << " " << qualifier << "out float4 v_col" << i << " : COLOR" << i << ",\n";
ss << " " << qualifier << (noperspective_color ? "noperspective " : "") << "out float4 v_col" << i << " : COLOR"
<< i << ",\n";
for (u32 i = 0; i < num_texcoord_outputs; i++)
ss << " " << qualifier << "out float2 v_tex" << i << " : TEXCOORD" << i << ",\n";
@ -463,21 +463,21 @@ void ShaderGen::DeclareFragmentEntryPoint(
std::stringstream& ss, u32 num_color_inputs, u32 num_texcoord_inputs,
const std::initializer_list<std::pair<const char*, const char*>>& additional_inputs,
bool declare_fragcoord /* = false */, u32 num_color_outputs /* = 1 */, bool depth_output /* = false */,
bool centroid_interpolation /* = false */, bool sample_interpolation /* = false */,
bool declare_sample_id /* = false */)
bool msaa /* = false */, bool ssaa /* = false */, bool declare_sample_id /* = false */,
bool noperspective_color /* = false */)
{
if (m_glsl)
{
if (m_use_glsl_interface_blocks)
{
const char* qualifier = GetInterpolationQualifier(true, centroid_interpolation, sample_interpolation, false);
const char* qualifier = GetInterpolationQualifier(true, msaa, ssaa, false);
if (IsVulkan())
ss << "layout(location = 0) ";
ss << "in VertexData {\n";
for (u32 i = 0; i < num_color_inputs; i++)
ss << " " << qualifier << "float4 v_col" << i << ";\n";
ss << " " << qualifier << (noperspective_color ? "noperspective " : "") << "float4 v_col" << i << ";\n";
for (u32 i = 0; i < num_texcoord_inputs; i++)
ss << " " << qualifier << "float2 v_tex" << i << ";\n";
@ -491,10 +491,10 @@ void ShaderGen::DeclareFragmentEntryPoint(
}
else
{
const char* qualifier = GetInterpolationQualifier(false, centroid_interpolation, sample_interpolation, false);
const char* qualifier = GetInterpolationQualifier(false, msaa, ssaa, false);
for (u32 i = 0; i < num_color_inputs; i++)
ss << qualifier << "in float4 v_col" << i << ";\n";
ss << qualifier << (noperspective_color ? "noperspective " : "") << "in float4 v_col" << i << ";\n";
for (u32 i = 0; i < num_texcoord_inputs; i++)
ss << qualifier << "in float2 v_tex" << i << ";\n";
@ -541,12 +541,13 @@ void ShaderGen::DeclareFragmentEntryPoint(
}
else
{
const char* qualifier = GetInterpolationQualifier(false, centroid_interpolation, sample_interpolation, false);
const char* qualifier = GetInterpolationQualifier(false, msaa, ssaa, false);
ss << "void main(\n";
for (u32 i = 0; i < num_color_inputs; i++)
ss << " " << qualifier << "in float4 v_col" << i << " : COLOR" << i << ",\n";
ss << " " << qualifier << (noperspective_color ? "noperspective " : "") << "in float4 v_col" << i << " : COLOR"
<< i << ",\n";
for (u32 i = 0; i < num_texcoord_inputs; i++)
ss << " " << qualifier << "in float2 v_tex" << i << " : TEXCOORD" << i << ",\n";