summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon
diff options
context:
space:
mode:
authorStenzek <stenzek@gmail.com>2016-08-13 00:40:18 +1000
committerStenzek <stenzek@gmail.com>2016-10-01 01:09:11 +1000
commitd9c034e8ccaad6db870df765e01d5963af84c9c5 (patch)
tree275437c1e1377e691087655f5f306f154c109154 /Source/Core/VideoCommon
parentf3cdc6433cba253fa4485cd7e27025c31410ed0c (diff)
ShaderGen: Specify attribute/output locations/bindings explicitly
This also shifts the SSBO index from index 3 to index 0.
Diffstat (limited to 'Source/Core/VideoCommon')
-rw-r--r--Source/Core/VideoCommon/GeometryShaderGen.cpp7
-rw-r--r--Source/Core/VideoCommon/PixelShaderGen.cpp30
-rw-r--r--Source/Core/VideoCommon/TextureConversionShader.cpp2
-rw-r--r--Source/Core/VideoCommon/VertexShaderGen.cpp25
4 files changed, 31 insertions, 33 deletions
diff --git a/Source/Core/VideoCommon/GeometryShaderGen.cpp b/Source/Core/VideoCommon/GeometryShaderGen.cpp
index 83b30943bc..6aefdf3e69 100644
--- a/Source/Core/VideoCommon/GeometryShaderGen.cpp
+++ b/Source/Core/VideoCommon/GeometryShaderGen.cpp
@@ -78,8 +78,7 @@ ShaderCode GenerateGeometryShaderCode(APIType ApiType, const geometry_shader_uid
// uniforms
if (ApiType == APIType::OpenGL)
- out.Write("layout(std140%s) uniform GSBlock {\n",
- g_ActiveConfig.backend_info.bSupportsBindingLayout ? ", binding = 3" : "");
+ out.Write("UBO_BINDING(std140, 3) uniform GSBlock {\n");
else
out.Write("cbuffer GSBlock {\n");
out.Write("\tfloat4 " I_STEREOPARAMS ";\n"
@@ -97,13 +96,13 @@ ShaderCode GenerateGeometryShaderCode(APIType ApiType, const geometry_shader_uid
if (g_ActiveConfig.backend_info.bSupportsGSInstancing)
out.Write("#define InstanceID gl_InvocationID\n");
- out.Write("in VertexData {\n");
+ out.Write("VARYING_LOCATION(0) in VertexData {\n");
GenerateVSOutputMembers<ShaderCode>(
out, ApiType, uid_data->numTexGens, uid_data->pixel_lighting,
GetInterpolationQualifier(uid_data->msaa, uid_data->ssaa, true, true));
out.Write("} vs[%d];\n", vertex_in);
- out.Write("out VertexData {\n");
+ out.Write("VARYING_LOCATION(0) out VertexData {\n");
GenerateVSOutputMembers<ShaderCode>(
out, ApiType, uid_data->numTexGens, uid_data->pixel_lighting,
GetInterpolationQualifier(uid_data->msaa, uid_data->ssaa, false, true));
diff --git a/Source/Core/VideoCommon/PixelShaderGen.cpp b/Source/Core/VideoCommon/PixelShaderGen.cpp
index 13d6bdd13e..65722fb7d4 100644
--- a/Source/Core/VideoCommon/PixelShaderGen.cpp
+++ b/Source/Core/VideoCommon/PixelShaderGen.cpp
@@ -394,14 +394,10 @@ ShaderCode GeneratePixelShaderCode(DSTALPHA_MODE dstAlphaMode, APIType ApiType,
out.Write("\n");
if (ApiType == APIType::OpenGL)
- {
- out.Write("layout(std140%s) uniform PSBlock {\n",
- g_ActiveConfig.backend_info.bSupportsBindingLayout ? ", binding = 1" : "");
- }
+ out.Write("UBO_BINDING(std140, 1) uniform PSBlock {\n");
else
- {
out.Write("cbuffer PSBlock : register(b0) {\n");
- }
+
out.Write("\tint4 " I_COLORS "[4];\n"
"\tint4 " I_KCOLORS "[4];\n"
"\tint4 " I_ALPHA ";\n"
@@ -421,14 +417,10 @@ ShaderCode GeneratePixelShaderCode(DSTALPHA_MODE dstAlphaMode, APIType ApiType,
out.Write("%s", s_lighting_struct);
if (ApiType == APIType::OpenGL)
- {
- out.Write("layout(std140%s) uniform VSBlock {\n",
- g_ActiveConfig.backend_info.bSupportsBindingLayout ? ", binding = 2" : "");
- }
+ out.Write("UBO_BINDING(std140, 2) uniform VSBlock {\n");
else
- {
out.Write("cbuffer VSBlock : register(b1) {\n");
- }
+
out.Write(s_shader_uniforms);
out.Write("};\n");
}
@@ -437,7 +429,7 @@ ShaderCode GeneratePixelShaderCode(DSTALPHA_MODE dstAlphaMode, APIType ApiType,
{
if (ApiType == APIType::OpenGL)
{
- out.Write("layout(std140, binding = 3) buffer BBox {\n"
+ out.Write("SSBO_BINDING(0) buffer BBox {\n"
"\tint4 bbox_data;\n"
"};\n");
}
@@ -512,16 +504,22 @@ ShaderCode GeneratePixelShaderCode(DSTALPHA_MODE dstAlphaMode, APIType ApiType,
if (ApiType == APIType::OpenGL)
{
- out.Write("out vec4 ocol0;\n");
if (dstAlphaMode == DSTALPHA_DUAL_SOURCE_BLEND)
- out.Write("out vec4 ocol1;\n");
+ {
+ out.Write("FRAGMENT_OUTPUT_LOCATION_INDEXED(0, 0) out vec4 ocol0;\n");
+ out.Write("FRAGMENT_OUTPUT_LOCATION_INDEXED(0, 1) out vec4 ocol1;\n");
+ }
+ else
+ {
+ out.Write("FRAGMENT_OUTPUT_LOCATION(0) out vec4 ocol0;\n");
+ }
if (uid_data->per_pixel_depth)
out.Write("#define depth gl_FragDepth\n");
if (g_ActiveConfig.backend_info.bSupportsGeometryShaders)
{
- out.Write("in VertexData {\n");
+ out.Write("VARYING_LOCATION(0) in VertexData {\n");
GenerateVSOutputMembers(
out, ApiType, uid_data->genMode_numtexgens, uid_data->per_pixel_lighting,
GetInterpolationQualifier(uid_data->msaa, uid_data->ssaa, true, true));
diff --git a/Source/Core/VideoCommon/TextureConversionShader.cpp b/Source/Core/VideoCommon/TextureConversionShader.cpp
index cccb7e7334..16ea016675 100644
--- a/Source/Core/VideoCommon/TextureConversionShader.cpp
+++ b/Source/Core/VideoCommon/TextureConversionShader.cpp
@@ -92,7 +92,7 @@ static void WriteSwizzler(char*& p, u32 format, APIType ApiType)
WRITE(p, "#define samp0 samp9\n");
WRITE(p, "SAMPLER_BINDING(9) uniform sampler2DArray samp0;\n");
- WRITE(p, " out vec4 ocol0;\n");
+ WRITE(p, "FRAGMENT_OUTPUT_LOCATION(0) out vec4 ocol0;\n");
WRITE(p, "void main()\n");
WRITE(p, "{\n"
" int2 sampleUv;\n"
diff --git a/Source/Core/VideoCommon/VertexShaderGen.cpp b/Source/Core/VideoCommon/VertexShaderGen.cpp
index 8376d6b8ea..e7748bd1ae 100644
--- a/Source/Core/VideoCommon/VertexShaderGen.cpp
+++ b/Source/Core/VideoCommon/VertexShaderGen.cpp
@@ -86,8 +86,7 @@ ShaderCode GenerateVertexShaderCode(APIType api_type, const vertex_shader_uid_da
// uniforms
if (api_type == APIType::OpenGL)
- out.Write("layout(std140%s) uniform VSBlock {\n",
- g_ActiveConfig.backend_info.bSupportsBindingLayout ? ", binding = 2" : "");
+ out.Write("UBO_BINDING(std140, 2) uniform VSBlock {\n");
else
out.Write("cbuffer VSBlock {\n");
out.Write(s_shader_uniforms);
@@ -99,32 +98,34 @@ ShaderCode GenerateVertexShaderCode(APIType api_type, const vertex_shader_uid_da
if (api_type == APIType::OpenGL)
{
- out.Write("in float4 rawpos; // ATTR%d,\n", SHADER_POSITION_ATTRIB);
+ out.Write("ATTRIBUTE_LOCATION(%d) in float4 rawpos;\n", SHADER_POSITION_ATTRIB);
if (uid_data->components & VB_HAS_POSMTXIDX)
- out.Write("in int posmtx; // ATTR%d,\n", SHADER_POSMTX_ATTRIB);
+ out.Write("ATTRIBUTE_LOCATION(%d) in int posmtx;\n", SHADER_POSMTX_ATTRIB);
if (uid_data->components & VB_HAS_NRM0)
- out.Write("in float3 rawnorm0; // ATTR%d,\n", SHADER_NORM0_ATTRIB);
+ out.Write("ATTRIBUTE_LOCATION(%d) in float3 rawnorm0;\n", SHADER_NORM0_ATTRIB);
if (uid_data->components & VB_HAS_NRM1)
- out.Write("in float3 rawnorm1; // ATTR%d,\n", SHADER_NORM1_ATTRIB);
+ out.Write("ATTRIBUTE_LOCATION(%d) in float3 rawnorm1;\n", SHADER_NORM1_ATTRIB);
if (uid_data->components & VB_HAS_NRM2)
- out.Write("in float3 rawnorm2; // ATTR%d,\n", SHADER_NORM2_ATTRIB);
+ out.Write("ATTRIBUTE_LOCATION(%d) in float3 rawnorm2;\n", SHADER_NORM2_ATTRIB);
if (uid_data->components & VB_HAS_COL0)
- out.Write("in float4 color0; // ATTR%d,\n", SHADER_COLOR0_ATTRIB);
+ out.Write("ATTRIBUTE_LOCATION(%d) in float4 color0;\n", SHADER_COLOR0_ATTRIB);
if (uid_data->components & VB_HAS_COL1)
- out.Write("in float4 color1; // ATTR%d,\n", SHADER_COLOR1_ATTRIB);
+ out.Write("ATTRIBUTE_LOCATION(%d) in float4 color1;\n", SHADER_COLOR1_ATTRIB);
for (int i = 0; i < 8; ++i)
{
u32 hastexmtx = (uid_data->components & (VB_HAS_TEXMTXIDX0 << i));
if ((uid_data->components & (VB_HAS_UV0 << i)) || hastexmtx)
- out.Write("in float%d tex%d; // ATTR%d,\n", hastexmtx ? 3 : 2, i,
- SHADER_TEXTURE0_ATTRIB + i);
+ {
+ out.Write("ATTRIBUTE_LOCATION(%d) in float%d tex%d;\n", SHADER_TEXTURE0_ATTRIB + i,
+ hastexmtx ? 3 : 2, i);
+ }
}
if (g_ActiveConfig.backend_info.bSupportsGeometryShaders)
{
- out.Write("out VertexData {\n");
+ out.Write("VARYING_LOCATION(0) out VertexData {\n");
GenerateVSOutputMembers(
out, api_type, uid_data->numTexGens, uid_data->pixel_lighting,
GetInterpolationQualifier(uid_data->msaa, uid_data->ssaa, false, true));