Refactor gl_FragCoord and gl_PointCoord usage in ProgramBinary::linkVaryings.

TRAC #22412 Signed-off-by: Nicolas Capens Signed-off-by: Shannon Woods Author: Jamie Madill git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@1785 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent 5bcf7dfb
...@@ -1168,9 +1168,11 @@ bool ProgramBinary::linkVaryings(InfoLog &infoLog, int registers, const Varying ...@@ -1168,9 +1168,11 @@ bool ProgramBinary::linkVaryings(InfoLog &infoLog, int registers, const Varying
const int shaderModel = mRenderer->getMajorShaderModel(); const int shaderModel = mRenderer->getMajorShaderModel();
const int maxVaryingVectors = mRenderer->getMaxVaryingVectors(); const int maxVaryingVectors = mRenderer->getMaxVaryingVectors();
if (registers == maxVaryingVectors && fragmentShader->mUsesFragCoord) const int registersNeeded = registers + (fragmentShader->mUsesFragCoord ? 1 : 0) + (fragmentShader->mUsesPointCoord ? 1 : 0);
if (registersNeeded > maxVaryingVectors)
{ {
infoLog.append("No varying registers left to support gl_FragCoord"); infoLog.append("No varying registers left to support gl_FragCoord/gl_PointCoord");
return false; return false;
} }
...@@ -1209,9 +1211,33 @@ bool ProgramBinary::linkVaryings(InfoLog &infoLog, int registers, const Varying ...@@ -1209,9 +1211,33 @@ bool ProgramBinary::linkVaryings(InfoLog &infoLog, int registers, const Varying
} }
mUsesPointSize = vertexShader->mUsesPointSize; mUsesPointSize = vertexShader->mUsesPointSize;
std::string varyingSemantic = (mUsesPointSize && shaderModel >= 3) ? "COLOR" : "TEXCOORD"; std::string varyingSemantic = (mUsesPointSize && shaderModel == 3) ? "COLOR" : "TEXCOORD";
std::string targetSemantic = (shaderModel >= 4) ? "SV_Target" : "COLOR"; std::string targetSemantic = (shaderModel >= 4) ? "SV_Target" : "COLOR";
std::string positionSemantic = (shaderModel >= 4) ? "SV_POSITION" : "POSITION"; std::string positionSemantic = (shaderModel >= 4) ? "SV_Position" : "POSITION";
// special varyings that use reserved registers
int reservedRegisterIndex = registers;
std::string fragCoordSemantic;
std::string pointCoordSemantic;
if (fragmentShader->mUsesFragCoord)
{
fragCoordSemantic = varyingSemantic + str(reservedRegisterIndex++);
}
if (fragmentShader->mUsesPointCoord)
{
// Shader model 3 uses a special TEXCOORD semantic for point sprite texcoords.
// In DX11 we compute this in the GS.
if (shaderModel == 3)
{
pointCoordSemantic = "TEXCOORD0";
}
else if (shaderModel >= 4)
{
pointCoordSemantic = varyingSemantic + str(reservedRegisterIndex++);
}
}
vertexHLSL += "struct VS_INPUT\n" vertexHLSL += "struct VS_INPUT\n"
"{\n"; "{\n";
...@@ -1250,7 +1276,7 @@ bool ProgramBinary::linkVaryings(InfoLog &infoLog, int registers, const Varying ...@@ -1250,7 +1276,7 @@ bool ProgramBinary::linkVaryings(InfoLog &infoLog, int registers, const Varying
if (fragmentShader->mUsesFragCoord) if (fragmentShader->mUsesFragCoord)
{ {
vertexHLSL += " float4 gl_FragCoord : " + varyingSemantic + str(registers) + ";\n"; vertexHLSL += " float4 gl_FragCoord : " + fragCoordSemantic + ";\n";
} }
if (vertexShader->mUsesPointSize && shaderModel >= 3) if (vertexShader->mUsesPointSize && shaderModel >= 3)
...@@ -1382,7 +1408,7 @@ bool ProgramBinary::linkVaryings(InfoLog &infoLog, int registers, const Varying ...@@ -1382,7 +1408,7 @@ bool ProgramBinary::linkVaryings(InfoLog &infoLog, int registers, const Varying
if (fragmentShader->mUsesFragCoord) if (fragmentShader->mUsesFragCoord)
{ {
pixelHLSL += " float4 gl_FragCoord : " + varyingSemantic + str(registers) + ";\n"; pixelHLSL += " float4 gl_FragCoord : " + fragCoordSemantic + ";\n";
if (shaderModel >= 4) if (shaderModel >= 4)
{ {
...@@ -1396,7 +1422,7 @@ bool ProgramBinary::linkVaryings(InfoLog &infoLog, int registers, const Varying ...@@ -1396,7 +1422,7 @@ bool ProgramBinary::linkVaryings(InfoLog &infoLog, int registers, const Varying
if (fragmentShader->mUsesPointCoord && shaderModel == 3) if (fragmentShader->mUsesPointCoord && shaderModel == 3)
{ {
pixelHLSL += " float2 gl_PointCoord : TEXCOORD0;\n"; pixelHLSL += " float2 gl_PointCoord : " + pointCoordSemantic + ";\n";
} }
pixelHLSL += "};\n" pixelHLSL += "};\n"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment