Always link uniforms directly retrieved from the compiler.

TRAC #22326 Signed-off-by: Daniel Koch Signed-off-by: Shannon Woods Author: Nicolas Capens git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@1633 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent c7ae02ec
...@@ -1801,18 +1801,10 @@ bool ProgramBinary::link(InfoLog &infoLog, const AttributeBindings &attributeBin ...@@ -1801,18 +1801,10 @@ bool ProgramBinary::link(InfoLog &infoLog, const AttributeBindings &attributeBin
} }
bool success = true; bool success = true;
rx::D3DConstantTable *constantTableVS = NULL;
rx::D3DConstantTable *constantTablePS = NULL;
mVertexExecutable = mRenderer->compileToExecutable(infoLog, vertexHLSL.c_str(), GL_VERTEX_SHADER); mVertexExecutable = mRenderer->compileToExecutable(infoLog, vertexHLSL.c_str(), GL_VERTEX_SHADER);
mPixelExecutable = mRenderer->compileToExecutable(infoLog, pixelHLSL.c_str(), GL_FRAGMENT_SHADER); mPixelExecutable = mRenderer->compileToExecutable(infoLog, pixelHLSL.c_str(), GL_FRAGMENT_SHADER);
if (mVertexExecutable && mPixelExecutable) if (!mVertexExecutable || !mPixelExecutable)
{
// D3D9_REPLACE
constantTableVS = mVertexExecutable->getConstantTable();
constantTablePS = mPixelExecutable->getConstantTable();
}
else
{ {
infoLog.append("Failed to create D3D shaders."); infoLog.append("Failed to create D3D shaders.");
success = false; success = false;
...@@ -1828,32 +1820,9 @@ bool ProgramBinary::link(InfoLog &infoLog, const AttributeBindings &attributeBin ...@@ -1828,32 +1820,9 @@ bool ProgramBinary::link(InfoLog &infoLog, const AttributeBindings &attributeBin
success = false; success = false;
} }
if (constantTableVS && constantTablePS) // D3D9_REPLACE if (!linkUniforms(infoLog, vertexShader->getUniforms(), fragmentShader->getUniforms()))
{
if (!linkUniforms(infoLog, constantTableVS, constantTablePS))
{
success = false;
}
}
else
{
for (sh::ActiveUniforms::const_iterator uniform = vertexShader->getUniforms().begin(); uniform != vertexShader->getUniforms().end(); uniform++)
{
if (!defineUniform(GL_VERTEX_SHADER, *uniform, infoLog))
{
success = false;
break;
}
}
for (sh::ActiveUniforms::const_iterator uniform = fragmentShader->getUniforms().begin(); uniform != fragmentShader->getUniforms().end(); uniform++)
{
if (!defineUniform(GL_FRAGMENT_SHADER, *uniform, infoLog))
{ {
success = false; success = false;
break;
}
}
} }
Context *context = getContext(); Context *context = getContext();
...@@ -1932,27 +1901,24 @@ bool ProgramBinary::linkAttributes(InfoLog &infoLog, const AttributeBindings &at ...@@ -1932,27 +1901,24 @@ bool ProgramBinary::linkAttributes(InfoLog &infoLog, const AttributeBindings &at
return true; return true;
} }
bool ProgramBinary::linkUniforms(InfoLog &infoLog, rx::D3DConstantTable *vsConstantTable, rx::D3DConstantTable *psConstantTable) bool ProgramBinary::linkUniforms(InfoLog &infoLog, const sh::ActiveUniforms &vertexUniforms, const sh::ActiveUniforms &fragmentUniforms)
{ {
for (unsigned int constantIndex = 0; constantIndex < psConstantTable->constants(); constantIndex++) for (sh::ActiveUniforms::const_iterator uniform = vertexUniforms.begin(); uniform != vertexUniforms.end(); uniform++)
{ {
const rx::D3DConstant *constant = psConstantTable->getConstant(constantIndex); if (!defineUniform(GL_VERTEX_SHADER, *uniform, infoLog))
if (!defineUniform(infoLog, GL_FRAGMENT_SHADER, constant, "", vsConstantTable, psConstantTable))
{ {
return false; return false;
} }
} }
for (unsigned int constantIndex = 0; constantIndex < vsConstantTable->constants(); constantIndex++) for (sh::ActiveUniforms::const_iterator uniform = fragmentUniforms.begin(); uniform != fragmentUniforms.end(); uniform++)
{ {
const rx::D3DConstant *constant = vsConstantTable->getConstant(constantIndex); if (!defineUniform(GL_FRAGMENT_SHADER, *uniform, infoLog))
if (!defineUniform(infoLog, GL_VERTEX_SHADER, constant, "", vsConstantTable, psConstantTable))
{ {
return false; return false;
} }
} }
return true; return true;
} }
......
...@@ -117,7 +117,7 @@ class ProgramBinary : public RefCountObject ...@@ -117,7 +117,7 @@ class ProgramBinary : public RefCountObject
bool linkAttributes(InfoLog &infoLog, const AttributeBindings &attributeBindings, FragmentShader *fragmentShader, VertexShader *vertexShader); bool linkAttributes(InfoLog &infoLog, const AttributeBindings &attributeBindings, FragmentShader *fragmentShader, VertexShader *vertexShader);
bool linkUniforms(InfoLog &infoLog, rx::D3DConstantTable *vsConstantTable, rx::D3DConstantTable *psConstantTable); bool linkUniforms(InfoLog &infoLog, const sh::ActiveUniforms &vertexUniforms, const sh::ActiveUniforms &fragmentUniforms);
bool defineUniform(InfoLog &infoLog, GLenum shader, const rx::D3DConstant *constant, const std::string &name, bool defineUniform(InfoLog &infoLog, GLenum shader, const rx::D3DConstant *constant, const std::string &name,
rx::D3DConstantTable *vsConstantTable, rx::D3DConstantTable *psConstantTable); rx::D3DConstantTable *vsConstantTable, rx::D3DConstantTable *psConstantTable);
bool defineUniform(GLenum shader, const rx::D3DConstant *constant, const std::string &name); bool defineUniform(GLenum shader, const rx::D3DConstant *constant, const std::string &name);
......
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