ShaderGen: Don't use interface blocks on Vulkan without GS

Doing so causes the Adreno driver to choke and spew errors about
too many output locations/components, when clearly we're under
the limit.
This commit is contained in:
Stenzek 2019-01-23 18:12:13 +10:00
parent 68cb24172b
commit 1d61041985
4 changed files with 66 additions and 41 deletions

View File

@ -587,8 +587,7 @@ ShaderCode GeneratePixelShaderCode(APIType ApiType, const ShaderHostConfig& host
if (uid_data->per_pixel_depth) if (uid_data->per_pixel_depth)
out.Write("#define depth gl_FragDepth\n"); out.Write("#define depth gl_FragDepth\n");
// We need to always use output blocks for Vulkan, but geometry shaders are also optional. if (host_config.backend_geometry_shaders)
if (host_config.backend_geometry_shaders || ApiType == APIType::Vulkan)
{ {
out.Write("VARYING_LOCATION(0) in VertexData {\n"); out.Write("VARYING_LOCATION(0) in VertexData {\n");
GenerateVSOutputMembers(out, ApiType, uid_data->genMode_numtexgens, host_config, GenerateVSOutputMembers(out, ApiType, uid_data->genMode_numtexgens, host_config,
@ -601,20 +600,26 @@ ShaderCode GeneratePixelShaderCode(APIType ApiType, const ShaderHostConfig& host
} }
else else
{ {
out.Write("%s in float4 colors_0;\n", GetInterpolationQualifier(msaa, ssaa));
out.Write("%s in float4 colors_1;\n", GetInterpolationQualifier(msaa, ssaa));
// compute window position if needed because binding semantic WPOS is not widely supported
// Let's set up attributes // Let's set up attributes
u32 counter = 0;
out.Write("VARYING_LOCATION(%u) %s in float4 colors_0;\n", counter++,
GetInterpolationQualifier(msaa, ssaa));
out.Write("VARYING_LOCATION(%u) %s in float4 colors_1;\n", counter++,
GetInterpolationQualifier(msaa, ssaa));
for (unsigned int i = 0; i < uid_data->genMode_numtexgens; ++i) for (unsigned int i = 0; i < uid_data->genMode_numtexgens; ++i)
{ {
out.Write("%s in float3 tex%d;\n", GetInterpolationQualifier(msaa, ssaa), i); out.Write("VARYING_LOCATION(%u) %s in float3 tex%d;\n", counter++,
GetInterpolationQualifier(msaa, ssaa), i);
} }
if (!host_config.fast_depth_calc) if (!host_config.fast_depth_calc)
out.Write("%s in float4 clipPos;\n", GetInterpolationQualifier(msaa, ssaa)); out.Write("VARYING_LOCATION(%u) %s in float4 clipPos;\n", counter++,
GetInterpolationQualifier(msaa, ssaa));
if (per_pixel_lighting) if (per_pixel_lighting)
{ {
out.Write("%s in float3 Normal;\n", GetInterpolationQualifier(msaa, ssaa)); out.Write("VARYING_LOCATION(%u) %s in float3 Normal;\n", counter++,
out.Write("%s in float3 WorldPos;\n", GetInterpolationQualifier(msaa, ssaa)); GetInterpolationQualifier(msaa, ssaa));
out.Write("VARYING_LOCATION(%u) %s in float3 WorldPos;\n", counter++,
GetInterpolationQualifier(msaa, ssaa));
} }
} }

View File

@ -103,7 +103,7 @@ ShaderCode GenPixelShader(APIType ApiType, const ShaderHostConfig& host_config,
if (per_pixel_depth) if (per_pixel_depth)
out.Write("#define depth gl_FragDepth\n"); out.Write("#define depth gl_FragDepth\n");
if (host_config.backend_geometry_shaders || ApiType == APIType::Vulkan) if (host_config.backend_geometry_shaders)
{ {
out.Write("VARYING_LOCATION(0) in VertexData {\n"); out.Write("VARYING_LOCATION(0) in VertexData {\n");
GenerateVSOutputMembers(out, ApiType, numTexgen, host_config, GenerateVSOutputMembers(out, ApiType, numTexgen, host_config,
@ -116,18 +116,26 @@ ShaderCode GenPixelShader(APIType ApiType, const ShaderHostConfig& host_config,
} }
else else
{ {
out.Write("%s in float4 colors_0;\n", GetInterpolationQualifier(msaa, ssaa));
out.Write("%s in float4 colors_1;\n", GetInterpolationQualifier(msaa, ssaa));
// compute window position if needed because binding semantic WPOS is not widely supported
// Let's set up attributes // Let's set up attributes
for (u32 i = 0; i < numTexgen; ++i) u32 counter = 0;
out.Write("%s in float3 tex%d;\n", GetInterpolationQualifier(msaa, ssaa), i); out.Write("VARYING_LOCATION(%u) %s in float4 colors_0;\n", counter++,
GetInterpolationQualifier(msaa, ssaa));
out.Write("VARYING_LOCATION(%u) %s in float4 colors_1;\n", counter++,
GetInterpolationQualifier(msaa, ssaa));
for (unsigned int i = 0; i < numTexgen; ++i)
{
out.Write("VARYING_LOCATION(%u) %s in float3 tex%d;\n", counter++,
GetInterpolationQualifier(msaa, ssaa), i);
}
if (!host_config.fast_depth_calc) if (!host_config.fast_depth_calc)
out.Write("%s in float4 clipPos;\n", GetInterpolationQualifier(msaa, ssaa)); out.Write("VARYING_LOCATION(%u) %s in float4 clipPos;\n", counter++,
GetInterpolationQualifier(msaa, ssaa));
if (per_pixel_lighting) if (per_pixel_lighting)
{ {
out.Write("%s in float3 Normal;\n", GetInterpolationQualifier(msaa, ssaa)); out.Write("VARYING_LOCATION(%u) %s in float3 Normal;\n", counter++,
out.Write("%s in float3 WorldPos;\n", GetInterpolationQualifier(msaa, ssaa)); GetInterpolationQualifier(msaa, ssaa));
out.Write("VARYING_LOCATION(%u) %s in float3 WorldPos;\n", counter++,
GetInterpolationQualifier(msaa, ssaa));
} }
} }
} }

View File

@ -63,8 +63,7 @@ ShaderCode GenVertexShader(APIType ApiType, const ShaderHostConfig& host_config,
for (int i = 0; i < 8; ++i) for (int i = 0; i < 8; ++i)
out.Write("ATTRIBUTE_LOCATION(%d) in float3 rawtex%d;\n", SHADER_TEXTURE0_ATTRIB + i, i); out.Write("ATTRIBUTE_LOCATION(%d) in float3 rawtex%d;\n", SHADER_TEXTURE0_ATTRIB + i, i);
// We need to always use output blocks for Vulkan, but geometry shaders are also optional. if (host_config.backend_geometry_shaders)
if (host_config.backend_geometry_shaders || ApiType == APIType::Vulkan)
{ {
out.Write("VARYING_LOCATION(0) out VertexData {\n"); out.Write("VARYING_LOCATION(0) out VertexData {\n");
GenerateVSOutputMembers(out, ApiType, numTexgen, host_config, GenerateVSOutputMembers(out, ApiType, numTexgen, host_config,
@ -74,18 +73,28 @@ ShaderCode GenVertexShader(APIType ApiType, const ShaderHostConfig& host_config,
else else
{ {
// Let's set up attributes // Let's set up attributes
u32 counter = 0;
out.Write("VARYING_LOCATION(%u) %s out float4 colors_0;\n", counter++,
GetInterpolationQualifier(msaa, ssaa));
out.Write("VARYING_LOCATION(%u) %s out float4 colors_1;\n", counter++,
GetInterpolationQualifier(msaa, ssaa));
for (u32 i = 0; i < numTexgen; ++i) for (u32 i = 0; i < numTexgen; ++i)
out.Write("%s out float3 tex%u;\n", GetInterpolationQualifier(msaa, ssaa), i); {
out.Write("VARYING_LOCATION(%u) %s out float3 tex%u;\n", counter++,
GetInterpolationQualifier(msaa, ssaa), i);
}
if (!host_config.fast_depth_calc) if (!host_config.fast_depth_calc)
out.Write("%s out float4 clipPos;\n", GetInterpolationQualifier(msaa, ssaa)); {
out.Write("VARYING_LOCATION(%u) %s out float4 clipPos;\n", counter++,
GetInterpolationQualifier(msaa, ssaa));
}
if (per_pixel_lighting) if (per_pixel_lighting)
{ {
out.Write("%s out float3 Normal;\n", GetInterpolationQualifier(msaa, ssaa)); out.Write("VARYING_LOCATION(%u) %s out float3 Normal;\n", counter++,
out.Write("%s out float3 WorldPos;\n", GetInterpolationQualifier(msaa, ssaa)); GetInterpolationQualifier(msaa, ssaa));
out.Write("VARYING_LOCATION(%u) %s out float3 WorldPos;\n", counter++,
GetInterpolationQualifier(msaa, ssaa));
} }
out.Write("%s out float4 colors_0;\n", GetInterpolationQualifier(msaa, ssaa));
out.Write("%s out float4 colors_1;\n", GetInterpolationQualifier(msaa, ssaa));
} }
out.Write("void main()\n{\n"); out.Write("void main()\n{\n");
@ -276,7 +285,7 @@ ShaderCode GenVertexShader(APIType ApiType, const ShaderHostConfig& host_config,
if (ApiType == APIType::OpenGL || ApiType == APIType::Vulkan) if (ApiType == APIType::OpenGL || ApiType == APIType::Vulkan)
{ {
if (host_config.backend_geometry_shaders || ApiType == APIType::Vulkan) if (host_config.backend_geometry_shaders)
{ {
AssignVSOutputMembers(out, "vs", "o", numTexgen, host_config); AssignVSOutputMembers(out, "vs", "o", numTexgen, host_config);
} }

View File

@ -128,8 +128,7 @@ ShaderCode GenerateVertexShaderCode(APIType api_type, const ShaderHostConfig& ho
} }
} }
// We need to always use output blocks for Vulkan, but geometry shaders are also optional. if (host_config.backend_geometry_shaders)
if (host_config.backend_geometry_shaders || api_type == APIType::Vulkan)
{ {
out.Write("VARYING_LOCATION(0) out VertexData {\n"); out.Write("VARYING_LOCATION(0) out VertexData {\n");
GenerateVSOutputMembers(out, api_type, uid_data->numTexGens, host_config, GenerateVSOutputMembers(out, api_type, uid_data->numTexGens, host_config,
@ -139,22 +138,26 @@ ShaderCode GenerateVertexShaderCode(APIType api_type, const ShaderHostConfig& ho
else else
{ {
// Let's set up attributes // Let's set up attributes
for (u32 i = 0; i < 8; ++i) u32 counter = 0;
out.Write("VARYING_LOCATION(%u) %s out float4 colors_0;\n", counter++,
GetInterpolationQualifier(msaa, ssaa));
out.Write("VARYING_LOCATION(%u) %s out float4 colors_1;\n", counter++,
GetInterpolationQualifier(msaa, ssaa));
for (u32 i = 0; i < uid_data->numTexGens; ++i)
{ {
if (i < uid_data->numTexGens) out.Write("VARYING_LOCATION(%u) %s out float3 tex%u;\n", counter++,
{ GetInterpolationQualifier(msaa, ssaa), i);
out.Write("%s out float3 tex%u;\n", GetInterpolationQualifier(msaa, ssaa), i);
}
} }
if (!host_config.fast_depth_calc) if (!host_config.fast_depth_calc)
out.Write("%s out float4 clipPos;\n", GetInterpolationQualifier(msaa, ssaa)); out.Write("VARYING_LOCATION(%u) %s out float4 clipPos;\n", counter++,
GetInterpolationQualifier(msaa, ssaa));
if (per_pixel_lighting) if (per_pixel_lighting)
{ {
out.Write("%s out float3 Normal;\n", GetInterpolationQualifier(msaa, ssaa)); out.Write("VARYING_LOCATION(%u) %s out float3 Normal;\n", counter++,
out.Write("%s out float3 WorldPos;\n", GetInterpolationQualifier(msaa, ssaa)); GetInterpolationQualifier(msaa, ssaa));
out.Write("VARYING_LOCATION(%u) %s out float3 WorldPos;\n", counter++,
GetInterpolationQualifier(msaa, ssaa));
} }
out.Write("%s out float4 colors_0;\n", GetInterpolationQualifier(msaa, ssaa));
out.Write("%s out float4 colors_1;\n", GetInterpolationQualifier(msaa, ssaa));
} }
out.Write("void main()\n{\n"); out.Write("void main()\n{\n");
@ -492,7 +495,7 @@ ShaderCode GenerateVertexShaderCode(APIType api_type, const ShaderHostConfig& ho
if (api_type == APIType::OpenGL || api_type == APIType::Vulkan) if (api_type == APIType::OpenGL || api_type == APIType::Vulkan)
{ {
if (host_config.backend_geometry_shaders || api_type == APIType::Vulkan) if (host_config.backend_geometry_shaders)
{ {
AssignVSOutputMembers(out, "vs", "o", uid_data->numTexGens, host_config); AssignVSOutputMembers(out, "vs", "o", uid_data->numTexGens, host_config);
} }