From 54ad4f8174593fe4854a9ef5952d4b02f1a82e35 Mon Sep 17 00:00:00 2001 From: Jamie Madill Date: Wed, 3 Sep 2014 09:40:46 -0400 Subject: Use the CollectVariables path on the HLSL translator. This approach consolidates our two methods, and lets us reuse the same code for both methods of variable collection. BUG=angle:466 Change-Id: Ie92f76ff0b6d0d0dbfd211a234d0ab86290fa798 Reviewed-on: https://chromium-review.googlesource.com/213504 Tested-by: Jamie Madill Reviewed-by: Nicolas Capens --- src/libGLESv2/renderer/d3d/DynamicHLSL.cpp | 25 +++++++++++-- src/libGLESv2/renderer/d3d/DynamicHLSL.h | 2 +- src/libGLESv2/renderer/d3d/ShaderD3D.cpp | 57 +++++++++++++++++++++--------- src/libGLESv2/renderer/d3d/ShaderD3D.h | 1 + 4 files changed, 65 insertions(+), 20 deletions(-) (limited to 'src/libGLESv2/renderer/d3d') diff --git a/src/libGLESv2/renderer/d3d/DynamicHLSL.cpp b/src/libGLESv2/renderer/d3d/DynamicHLSL.cpp index 404525ce..6aa0d137 100644 --- a/src/libGLESv2/renderer/d3d/DynamicHLSL.cpp +++ b/src/libGLESv2/renderer/d3d/DynamicHLSL.cpp @@ -223,6 +223,13 @@ int DynamicHLSL::packVaryings(InfoLog &infoLog, VaryingPacking packing, rx::Shad for (unsigned int varyingIndex = 0; varyingIndex < fragmentVaryings.size(); varyingIndex++) { PackedVarying *varying = &fragmentVaryings[varyingIndex]; + + // Do not assign registers to built-in or unreferenced varyings + if (varying->isBuiltIn() || !varying->staticUse) + { + continue; + } + if (packVarying(varying, maxVaryingVectors, packing)) { packedVaryings.insert(varying->name); @@ -278,17 +285,19 @@ int DynamicHLSL::packVaryings(InfoLog &infoLog, VaryingPacking packing, rx::Shad return registers; } -std::string DynamicHLSL::generateVaryingHLSL(rx::ShaderD3D *shader) const +std::string DynamicHLSL::generateVaryingHLSL(const ShaderD3D *shader) const { std::string varyingSemantic = getVaryingSemantic(shader->mUsesPointSize); std::string varyingHLSL; - std::vector &varyings = shader->getVaryings(); + const std::vector &varyings = shader->getVaryings(); + for (unsigned int varyingIndex = 0; varyingIndex < varyings.size(); varyingIndex++) { const PackedVarying &varying = varyings[varyingIndex]; if (varying.registerAssigned()) { + ASSERT(!varying.isBuiltIn()); GLenum transposedType = TransposeMatrixType(varying.type); int variableRows = (varying.isStruct() ? 1 : VariableRowCount(transposedType)); @@ -616,8 +625,10 @@ void DynamicHLSL::storeUserLinkedVaryings(const rx::ShaderD3D *vertexShader, for (unsigned int varyingIndex = 0; varyingIndex < varyings.size(); varyingIndex++) { const PackedVarying &varying = varyings[varyingIndex]; + if (varying.registerAssigned()) { + ASSERT(!varying.isBuiltIn()); GLenum transposedType = TransposeMatrixType(varying.type); int variableRows = (varying.isStruct() ? 1 : VariableRowCount(transposedType)); @@ -825,6 +836,8 @@ bool DynamicHLSL::generateShaderLinkHLSL(InfoLog &infoLog, int registers, const const std::string &variableName = "out_" + outputLocation.name; const std::string &elementString = (outputLocation.element == GL_INVALID_INDEX ? "" : Str(outputLocation.element)); + ASSERT(outputVariable.staticUse); + PixelShaderOuputVariable outputKeyVariable; outputKeyVariable.type = outputVariable.type; outputKeyVariable.name = variableName + elementString; @@ -907,6 +920,7 @@ bool DynamicHLSL::generateShaderLinkHLSL(InfoLog &infoLog, int registers, const const PackedVarying &varying = fragmentVaryings[varyingIndex]; if (varying.registerAssigned()) { + ASSERT(!varying.isBuiltIn()); for (unsigned int elementIndex = 0; elementIndex < varying.elementCount(); elementIndex++) { GLenum transposedType = TransposeMatrixType(varying.type); @@ -944,7 +958,10 @@ bool DynamicHLSL::generateShaderLinkHLSL(InfoLog &infoLog, int registers, const } } } - else UNREACHABLE(); + else + { + ASSERT(varying.isBuiltIn() || !varying.staticUse); + } } pixelHLSL += "\n" @@ -965,6 +982,8 @@ void DynamicHLSL::defineOutputVariables(rx::ShaderD3D *fragmentShader, std::map< const sh::Attribute &outputVariable = shaderOutputVars[outputVariableIndex]; const int baseLocation = outputVariable.location == -1 ? 0 : outputVariable.location; + ASSERT(outputVariable.staticUse); + if (outputVariable.arraySize > 0) { for (unsigned int elementIndex = 0; elementIndex < outputVariable.arraySize; elementIndex++) diff --git a/src/libGLESv2/renderer/d3d/DynamicHLSL.h b/src/libGLESv2/renderer/d3d/DynamicHLSL.h index cf619952..6242012f 100644 --- a/src/libGLESv2/renderer/d3d/DynamicHLSL.h +++ b/src/libGLESv2/renderer/d3d/DynamicHLSL.h @@ -87,7 +87,7 @@ class DynamicHLSL SemanticInfo getSemanticInfo(int startRegisters, bool fragCoord, bool pointCoord, bool pointSize, bool pixelShader) const; std::string generateVaryingLinkHLSL(const SemanticInfo &info, const std::string &varyingHLSL) const; - std::string generateVaryingHLSL(rx::ShaderD3D *shader) const; + std::string generateVaryingHLSL(const ShaderD3D *shader) const; void storeUserLinkedVaryings(const rx::ShaderD3D *vertexShader, std::vector *linkedVaryings) const; void storeBuiltinLinkedVaryings(const SemanticInfo &info, std::vector *linkedVaryings) const; void defineOutputVariables(rx::ShaderD3D *fragmentShader, std::map *programOutputVars) const; diff --git a/src/libGLESv2/renderer/d3d/ShaderD3D.cpp b/src/libGLESv2/renderer/d3d/ShaderD3D.cpp index a6d5266a..57edb290 100644 --- a/src/libGLESv2/renderer/d3d/ShaderD3D.cpp +++ b/src/libGLESv2/renderer/d3d/ShaderD3D.cpp @@ -16,13 +16,30 @@ namespace rx { +template +void FilterInactiveVariables(std::vector *variableList) +{ + ASSERT(variableList); + + for (size_t varIndex = 0; varIndex < variableList->size();) + { + if (!(*variableList)[varIndex].staticUse) + { + variableList->erase(variableList->begin() + varIndex); + } + else + { + varIndex++; + } + } +} + void *ShaderD3D::mFragmentCompiler = NULL; void *ShaderD3D::mVertexCompiler = NULL; template const std::vector *GetShaderVariables(const std::vector *variableList) { - // TODO: handle staticUse. for now, assume all returned variables are active. ASSERT(variableList); return variableList; } @@ -111,12 +128,12 @@ void ShaderD3D::parseVaryings(void *compiler) { if (!mHlsl.empty()) { - const std::vector *activeVaryings = ShGetVaryings(compiler); - ASSERT(activeVaryings); + const std::vector *varyings = ShGetVaryings(compiler); + ASSERT(varyings); - for (size_t varyingIndex = 0; varyingIndex < activeVaryings->size(); varyingIndex++) + for (size_t varyingIndex = 0; varyingIndex < varyings->size(); varyingIndex++) { - mVaryings.push_back(gl::PackedVarying((*activeVaryings)[varyingIndex])); + mVaryings.push_back(gl::PackedVarying((*varyings)[varyingIndex])); } mUsesMultipleRenderTargets = mHlsl.find("GL_USES_MRT") != std::string::npos; @@ -173,7 +190,7 @@ void ShaderD3D::compileToHLSL(void *compiler, const std::string &source) // ensure the compiler is loaded initializeCompiler(); - int compileOptions = SH_OBJECT_CODE; + int compileOptions = (SH_OBJECT_CODE | SH_VARIABLES); std::string sourcePath; if (gl::perfActive()) { @@ -251,12 +268,15 @@ void ShaderD3D::compileToHLSL(void *compiler, const std::string &source) { const sh::Uniform &uniform = mUniforms[uniformIndex]; - unsigned int index = -1; - bool result = ShGetUniformRegister(compiler, uniform.name.c_str(), &index); - UNUSED_ASSERTION_VARIABLE(result); - ASSERT(result); + if (uniform.staticUse) + { + unsigned int index = -1; + bool result = ShGetUniformRegister(compiler, uniform.name.c_str(), &index); + UNUSED_ASSERTION_VARIABLE(result); + ASSERT(result); - mUniformRegisterMap[uniform.name] = index; + mUniformRegisterMap[uniform.name] = index; + } } mInterfaceBlocks = *GetShaderVariables(ShGetInterfaceBlocks(compiler)); @@ -265,12 +285,15 @@ void ShaderD3D::compileToHLSL(void *compiler, const std::string &source) { const sh::InterfaceBlock &interfaceBlock = mInterfaceBlocks[blockIndex]; - unsigned int index = -1; - bool result = ShGetInterfaceBlockRegister(compiler, interfaceBlock.name.c_str(), &index); - UNUSED_ASSERTION_VARIABLE(result); - ASSERT(result); + if (interfaceBlock.staticUse) + { + unsigned int index = -1; + bool result = ShGetInterfaceBlockRegister(compiler, interfaceBlock.name.c_str(), &index); + UNUSED_ASSERTION_VARIABLE(result); + ASSERT(result); - mInterfaceBlockRegisterMap[interfaceBlock.name] = index; + mInterfaceBlockRegisterMap[interfaceBlock.name] = index; + } } } else @@ -393,6 +416,7 @@ bool ShaderD3D::compile(const std::string &source) if (!hlsl.empty()) { mActiveOutputVariables = *GetShaderVariables(ShGetOutputVariables(compiler)); + FilterInactiveVariables(&mActiveOutputVariables); } } @@ -405,6 +429,7 @@ void ShaderD3D::parseAttributes(void *compiler) if (!hlsl.empty()) { mActiveAttributes = *GetShaderVariables(ShGetAttributes(compiler)); + FilterInactiveVariables(&mActiveAttributes); } } diff --git a/src/libGLESv2/renderer/d3d/ShaderD3D.h b/src/libGLESv2/renderer/d3d/ShaderD3D.h index 9f7dc0b8..40e64cf3 100644 --- a/src/libGLESv2/renderer/d3d/ShaderD3D.h +++ b/src/libGLESv2/renderer/d3d/ShaderD3D.h @@ -16,6 +16,7 @@ namespace rx { +class DynamicHLSL; class Renderer; class ShaderD3D : public ShaderImpl -- cgit v1.2.3