Commit 73e32ee1 by Cooper Partin Committed by Jamie Madill

Fixed FL9_3 shaders that use glPointCoord without glPointSize.

This change fixes a Shader error on FL9_3 that reports Vertex/Pixel Shader linkage signatures between stages being incompatible when glPointCoord is used without glPointSize. Change-Id: I93ffb6c6dd38f26e2156a374b1b58ecc3a5f250b Reviewed-on: https://chromium-review.googlesource.com/301450Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Tested-by: 's avatarCooper Partin <coopp@microsoft.com>
parent 02f98029
...@@ -775,6 +775,10 @@ bool DynamicHLSL::generateShaderLinkHLSL(const gl::Data &data, ...@@ -775,6 +775,10 @@ bool DynamicHLSL::generateShaderLinkHLSL(const gl::Data &data,
bool usesPointCoord = fragmentShader->mUsesPointCoord; bool usesPointCoord = fragmentShader->mUsesPointCoord;
bool usesPointSize = vertexShader->mUsesPointSize; bool usesPointSize = vertexShader->mUsesPointSize;
bool useInstancedPointSpriteEmulation = usesPointSize && mRenderer->getWorkarounds().useInstancedPointSpriteEmulation; bool useInstancedPointSpriteEmulation = usesPointSize && mRenderer->getWorkarounds().useInstancedPointSpriteEmulation;
bool insertDummyPointCoordValue = !usesPointSize && usesPointCoord &&
mRenderer->getWorkarounds().useInstancedPointSpriteEmulation;
bool addPointCoord = (useInstancedPointSpriteEmulation && usesPointCoord) ||
insertDummyPointCoordValue || (!usesPointSize && usesPointCoord);
// Validation done in the compiler // Validation done in the compiler
ASSERT(!fragmentShader->mUsesFragColor || !fragmentShader->mUsesFragData); ASSERT(!fragmentShader->mUsesFragColor || !fragmentShader->mUsesFragData);
...@@ -811,9 +815,9 @@ bool DynamicHLSL::generateShaderLinkHLSL(const gl::Data &data, ...@@ -811,9 +815,9 @@ bool DynamicHLSL::generateShaderLinkHLSL(const gl::Data &data,
// generated pixel shader. // generated pixel shader.
// The Geometry Shader point sprite implementation needs gl_PointSize to be in VS_OUTPUT and GS_INPUT. // The Geometry Shader point sprite implementation needs gl_PointSize to be in VS_OUTPUT and GS_INPUT.
// Instanced point sprites doesn't need gl_PointSize in VS_OUTPUT. // Instanced point sprites doesn't need gl_PointSize in VS_OUTPUT.
const SemanticInfo &vertexSemantics = getSemanticInfo(registers, outputPositionFromVS, const SemanticInfo &vertexSemantics =
usesFragCoord, (useInstancedPointSpriteEmulation && usesPointCoord), getSemanticInfo(registers, outputPositionFromVS, usesFragCoord, addPointCoord,
(!useInstancedPointSpriteEmulation && usesPointSize), false); (!useInstancedPointSpriteEmulation && usesPointSize), false);
storeUserLinkedVaryings(packedVaryings, usesPointSize, linkedVaryings); storeUserLinkedVaryings(packedVaryings, usesPointSize, linkedVaryings);
storeBuiltinLinkedVaryings(vertexSemantics, linkedVaryings); storeBuiltinLinkedVaryings(vertexSemantics, linkedVaryings);
...@@ -929,6 +933,18 @@ bool DynamicHLSL::generateShaderLinkHLSL(const gl::Data &data, ...@@ -929,6 +933,18 @@ bool DynamicHLSL::generateShaderLinkHLSL(const gl::Data &data,
} }
} }
// Renderers that enable instanced pointsprite emulation require the vertex shader output member
// gl_PointCoord
// to be set to a default value if used without gl_PointSize. 0.5,0.5 is the same default value
// used in the
// generated pixel shader.
if (insertDummyPointCoordValue)
{
vertexHLSL +=
"\n"
" output.gl_PointCoord = float2(0.5, 0.5);\n";
}
vertexHLSL += "\n" vertexHLSL += "\n"
" return output;\n" " return output;\n"
"}\n"; "}\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