14f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 20bbed38f417d490604909de5928d725fb39c5e3cshannon.woods%transgaming.com@gtempaccount.com// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved. 34f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// Use of this source code is governed by a BSD-style license that can be 44f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// found in the LICENSE file. 54f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 64f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 74f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 8774d70630a690b2449afdccfb29612393c65f212alokp@chromium.org// Implement the top-level of interface to the compiler, 94f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// as defined in ShaderLang.h 104f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 114f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 12ea0e1af4c3db538081d776e4ec1a588ca82cb9d9alokp@chromium.org#include "GLSLANG/ShaderLang.h" 134f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 14d4a3a3171ce8b72123e4eaa85a3c5d2b3130878cJamie Madill#include "compiler/translator/Compiler.h" 1517732823f9c21bdba9cc51ffaceb545ce3857a8cGeoff Lang#include "compiler/translator/InitializeDll.h" 165508f39d0cffc9a68565bbff2e6f61332a509cdfJamie Madill#include "compiler/translator/length_limits.h" 1717732823f9c21bdba9cc51ffaceb545ce3857a8cGeoff Lang#include "compiler/translator/TranslatorHLSL.h" 1817732823f9c21bdba9cc51ffaceb545ce3857a8cGeoff Lang#include "compiler/translator/VariablePacker.h" 19a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill#include "angle_gl.h" 204f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 21e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madillnamespace 22e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill{ 23e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill 24e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madillenum ShaderVariableType 25e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill{ 26e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill SHADERVAR_UNIFORM, 27e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill SHADERVAR_VARYING, 28e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill SHADERVAR_ATTRIBUTE, 29e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill SHADERVAR_OUTPUTVARIABLE, 30e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill SHADERVAR_INTERFACEBLOCK 31e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill}; 32e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill 33e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madillbool isInitialized = false; 34b4d192cd8c1573d7df93e64c98bddbe90b598618Jamie Madill 354f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 364f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// This is the platform independent interface between an OGL driver 37774d70630a690b2449afdccfb29612393c65f212alokp@chromium.org// and the shading language compiler. 384f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 394f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 40e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madillstatic bool CheckVariableMaxLengths(const ShHandle handle, 4174da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo size_t expectedValue) 42ee76f6af4554615109916db541cd1e613d553214alokp@chromium.org{ 43d64b3dab06c30da1e5dd9ba12667ff86388540e2shannon.woods@transgaming.com size_t activeUniformLimit = 0; 44221521178e28a58a7ac60726494600b833374f28kbr@chromium.org ShGetInfo(handle, SH_ACTIVE_UNIFORM_MAX_LENGTH, &activeUniformLimit); 45d64b3dab06c30da1e5dd9ba12667ff86388540e2shannon.woods@transgaming.com size_t activeAttribLimit = 0; 46221521178e28a58a7ac60726494600b833374f28kbr@chromium.org ShGetInfo(handle, SH_ACTIVE_ATTRIBUTE_MAX_LENGTH, &activeAttribLimit); 4774da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo size_t varyingLimit = 0; 4874da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo ShGetInfo(handle, SH_VARYING_MAX_LENGTH, &varyingLimit); 4974da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo return (expectedValue == activeUniformLimit && 5074da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo expectedValue == activeAttribLimit && 5174da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo expectedValue == varyingLimit); 52221521178e28a58a7ac60726494600b833374f28kbr@chromium.org} 53221521178e28a58a7ac60726494600b833374f28kbr@chromium.org 54e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madillbool CheckMappedNameMaxLength(const ShHandle handle, size_t expectedValue) 55221521178e28a58a7ac60726494600b833374f28kbr@chromium.org{ 56d64b3dab06c30da1e5dd9ba12667ff86388540e2shannon.woods@transgaming.com size_t mappedNameMaxLength = 0; 57221521178e28a58a7ac60726494600b833374f28kbr@chromium.org ShGetInfo(handle, SH_MAPPED_NAME_MAX_LENGTH, &mappedNameMaxLength); 58221521178e28a58a7ac60726494600b833374f28kbr@chromium.org return (expectedValue == mappedNameMaxLength); 59ee76f6af4554615109916db541cd1e613d553214alokp@chromium.org} 60ee76f6af4554615109916db541cd1e613d553214alokp@chromium.org 61a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madilltemplate <typename VarT> 62e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madillconst sh::ShaderVariable *ReturnVariable(const std::vector<VarT> &infoList, int index) 63a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill{ 64a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill if (index < 0 || static_cast<size_t>(index) >= infoList.size()) 65a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill { 66a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill return NULL; 67a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill } 68a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill 69a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill return &infoList[index]; 70a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill} 71a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill 72e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madillconst sh::ShaderVariable *GetVariable(const TCompiler *compiler, ShShaderInfo varType, int index) 73a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill{ 74a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill switch (varType) 75a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill { 76a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill case SH_ACTIVE_ATTRIBUTES: 77ed27c7296c9bc4e9d9901943a8a0147513d11fc6Jamie Madill return ReturnVariable(compiler->getAttributes(), index); 78a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill case SH_ACTIVE_UNIFORMS: 7923a8a433529d9db23882c702a29d5e594841563dJamie Madill return ReturnVariable(compiler->getExpandedUniforms(), index); 80a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill case SH_VARYINGS: 8123a8a433529d9db23882c702a29d5e594841563dJamie Madill return ReturnVariable(compiler->getExpandedVaryings(), index); 82a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill default: 83a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill UNREACHABLE(); 84a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill return NULL; 85a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill } 86a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill} 87a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill 88e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie MadillShPrecisionType ConvertPrecision(sh::GLenum precision) 89a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill{ 90a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill switch (precision) 91a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill { 92a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill case GL_HIGH_FLOAT: 93a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill case GL_HIGH_INT: 94a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill return SH_PRECISION_HIGHP; 95a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill case GL_MEDIUM_FLOAT: 96a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill case GL_MEDIUM_INT: 971da63af4678cb4b76ffc18e8711b702171d0bfa3Jamie Madill return SH_PRECISION_MEDIUMP; 98a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill case GL_LOW_FLOAT: 99a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill case GL_LOW_INT: 1001da63af4678cb4b76ffc18e8711b702171d0bfa3Jamie Madill return SH_PRECISION_LOWP; 101a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill default: 102a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill return SH_PRECISION_UNDEFINED; 103a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill } 104a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill} 105a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill 106e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madilltemplate <typename VarT> 107e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madillconst std::vector<VarT> *GetVariableList(const TCompiler *compiler, ShaderVariableType variableType); 108e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill 109e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madilltemplate <> 110e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madillconst std::vector<sh::Uniform> *GetVariableList(const TCompiler *compiler, ShaderVariableType) 111e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill{ 112e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill return &compiler->getUniforms(); 113e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill} 114e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill 115e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madilltemplate <> 116e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madillconst std::vector<sh::Varying> *GetVariableList(const TCompiler *compiler, ShaderVariableType) 117e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill{ 118e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill return &compiler->getVaryings(); 119e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill} 120e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill 121e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madilltemplate <> 122e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madillconst std::vector<sh::Attribute> *GetVariableList(const TCompiler *compiler, ShaderVariableType variableType) 123e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill{ 124e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill return (variableType == SHADERVAR_ATTRIBUTE ? 125e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill &compiler->getAttributes() : 126e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill &compiler->getOutputVariables()); 127e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill} 128e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill 129e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madilltemplate <> 130e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madillconst std::vector<sh::InterfaceBlock> *GetVariableList(const TCompiler *compiler, ShaderVariableType) 131e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill{ 132e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill return &compiler->getInterfaceBlocks(); 133e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill} 134e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill 135e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madilltemplate <typename VarT> 136e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madillconst std::vector<VarT> *GetShaderVariables(const ShHandle handle, ShaderVariableType variableType) 137e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill{ 138e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill if (!handle) 139e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill { 140e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill return NULL; 141e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill } 142e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill 143e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill TShHandleBase* base = static_cast<TShHandleBase*>(handle); 144e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill TCompiler* compiler = base->getAsCompiler(); 145e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill if (!compiler) 146e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill { 147e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill return NULL; 148e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill } 149e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill 150e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill return GetVariableList<VarT>(compiler, variableType); 151e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill} 152e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill 153e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill} 154e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill 1554f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 156b11713fb9cae53fd0577d90ab5576b1ea8b6f025Alok Priyadarshi// Driver must call this first, once, before doing any other compiler operations. 157b11713fb9cae53fd0577d90ab5576b1ea8b6f025Alok Priyadarshi// Subsequent calls to this function are no-op. 1584f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 1594f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comint ShInitialize() 1604f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{ 161477bc7811ffb19bb52710badf8063fa351a26b95Jamie Madill if (!isInitialized) 162477bc7811ffb19bb52710badf8063fa351a26b95Jamie Madill { 163477bc7811ffb19bb52710badf8063fa351a26b95Jamie Madill isInitialized = InitProcess(); 164477bc7811ffb19bb52710badf8063fa351a26b95Jamie Madill } 165b4d192cd8c1573d7df93e64c98bddbe90b598618Jamie Madill return isInitialized ? 1 : 0; 1664f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com} 1674f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 1684f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 16994a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org// Cleanup symbol tables 17094a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org// 17194a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.orgint ShFinalize() 17294a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org{ 173f20f0206c963546f293190f73b64d09ff00e7273Geoff Lang if (isInitialized) 174f20f0206c963546f293190f73b64d09ff00e7273Geoff Lang { 175f20f0206c963546f293190f73b64d09ff00e7273Geoff Lang DetachProcess(); 176f20f0206c963546f293190f73b64d09ff00e7273Geoff Lang isInitialized = false; 177f20f0206c963546f293190f73b64d09ff00e7273Geoff Lang } 17894a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org return 1; 17994a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org} 18094a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org 1814f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 18294a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org// Initialize built-in resources with minimum expected values. 18394a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org// 1844888ceb6681c3668d3afcbdafdbe2b7efdaa3d04alokp@chromium.orgvoid ShInitBuiltInResources(ShBuiltInResources* resources) 18594a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org{ 18694a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org // Constants. 18794a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org resources->MaxVertexAttribs = 8; 18894a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org resources->MaxVertexUniformVectors = 128; 18994a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org resources->MaxVaryingVectors = 8; 19094a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org resources->MaxVertexTextureImageUnits = 0; 19194a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org resources->MaxCombinedTextureImageUnits = 8; 19294a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org resources->MaxTextureImageUnits = 8; 19394a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org resources->MaxFragmentUniformVectors = 16; 19494a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org resources->MaxDrawBuffers = 1; 19594a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org 19694a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org // Extensions. 19794a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org resources->OES_standard_derivatives = 0; 19809c323a40ad0de489eee946bfe171d337616e09czmo@google.com resources->OES_EGL_image_external = 0; 199205fef3389c81637f689585431273cf83af02e94kbr@chromium.org resources->ARB_texture_rectangle = 0; 200550cd0988989cc3e117fb300c919504f7bd99c48shannon.woods@transgaming.com resources->EXT_draw_buffers = 0; 2012aeb26a4f6e21a923415eb00499795b63a17ef76Jamie Madill resources->EXT_frag_depth = 0; 202464850868307005a1287d79f7a640f05372358bbNicolas Capens resources->EXT_shader_texture_lod = 0; 203c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com 204cbb6b6a0416552b5e3fa8589194288532558ccb8shannon.woods%transgaming.com@gtempaccount.com // Disable highp precision in fragment shader by default. 205cbb6b6a0416552b5e3fa8589194288532558ccb8shannon.woods%transgaming.com@gtempaccount.com resources->FragmentPrecisionHigh = 0; 206cbb6b6a0416552b5e3fa8589194288532558ccb8shannon.woods%transgaming.com@gtempaccount.com 20774b86cffade4b3dbfddd3c601b35b87ef28a82a6shannonwoods@chromium.org // GLSL ES 3.0 constants. 20874b86cffade4b3dbfddd3c601b35b87ef28a82a6shannonwoods@chromium.org resources->MaxVertexOutputVectors = 16; 20974b86cffade4b3dbfddd3c601b35b87ef28a82a6shannonwoods@chromium.org resources->MaxFragmentInputVectors = 15; 21074b86cffade4b3dbfddd3c601b35b87ef28a82a6shannonwoods@chromium.org resources->MinProgramTexelOffset = -8; 21174b86cffade4b3dbfddd3c601b35b87ef28a82a6shannonwoods@chromium.org resources->MaxProgramTexelOffset = 7; 21274b86cffade4b3dbfddd3c601b35b87ef28a82a6shannonwoods@chromium.org 213c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com // Disable name hashing by default. 214c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com resources->HashFunction = NULL; 2151d432bb570bd175c3cdc51629a386e324e98b95bshannon.woods@transgaming.com 2161d432bb570bd175c3cdc51629a386e324e98b95bshannon.woods@transgaming.com resources->ArrayIndexClampingStrategy = SH_CLAMP_WITH_CLAMP_INTRINSIC; 2177d649a00979a248d273f362dbf6b8ac5df712dcaNicolas Capens 2187d649a00979a248d273f362dbf6b8ac5df712dcaNicolas Capens resources->MaxExpressionComplexity = 256; 2197d649a00979a248d273f362dbf6b8ac5df712dcaNicolas Capens resources->MaxCallStackDepth = 256; 22094a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org} 2214f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 22294a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org// 22394a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org// Driver calls these to create and destroy compiler objects. 22494a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org// 225183bde5527317fa2208401e5e6b803ef51a0fdcbJamie MadillShHandle ShConstructCompiler(sh::GLenum type, ShShaderSpec spec, 2265601ea0d66442518d4745bb02b7619485b9d305bzmo@google.com ShShaderOutput output, 2274888ceb6681c3668d3afcbdafdbe2b7efdaa3d04alokp@chromium.org const ShBuiltInResources* resources) 2284f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{ 2295601ea0d66442518d4745bb02b7619485b9d305bzmo@google.com TShHandleBase* base = static_cast<TShHandleBase*>(ConstructCompiler(type, spec, output)); 230e4249f0217bed043d645b6e01ae7d26f7c3e0093alokp@chromium.org TCompiler* compiler = base->getAsCompiler(); 231e4249f0217bed043d645b6e01ae7d26f7c3e0093alokp@chromium.org if (compiler == 0) 232e4249f0217bed043d645b6e01ae7d26f7c3e0093alokp@chromium.org return 0; 233e4249f0217bed043d645b6e01ae7d26f7c3e0093alokp@chromium.org 234e4249f0217bed043d645b6e01ae7d26f7c3e0093alokp@chromium.org // Generate built-in symbol table. 23507620a585ae04ba6a86f0c04a27b3cabd10cc6b8alokp@chromium.org if (!compiler->Init(*resources)) { 236e4249f0217bed043d645b6e01ae7d26f7c3e0093alokp@chromium.org ShDestruct(base); 237e4249f0217bed043d645b6e01ae7d26f7c3e0093alokp@chromium.org return 0; 238e4249f0217bed043d645b6e01ae7d26f7c3e0093alokp@chromium.org } 239e4249f0217bed043d645b6e01ae7d26f7c3e0093alokp@chromium.org 2404f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com return reinterpret_cast<void*>(base); 2414f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com} 2424f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 2434f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comvoid ShDestruct(ShHandle handle) 2444f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{ 2454f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com if (handle == 0) 2464f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com return; 2474f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 2484f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com TShHandleBase* base = static_cast<TShHandleBase*>(handle); 2494f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 2504f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com if (base->getAsCompiler()) 2514f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com DeleteCompiler(base->getAsCompiler()); 2524f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com} 2534f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 2542d76e5f66595e1cef04f4ad678deda0d0e4643d7Shannon Woodsvoid ShGetBuiltInResourcesString(const ShHandle handle, size_t outStringLen, char *outString) 2552d76e5f66595e1cef04f4ad678deda0d0e4643d7Shannon Woods{ 2562d76e5f66595e1cef04f4ad678deda0d0e4643d7Shannon Woods if (!handle || !outString) 2572d76e5f66595e1cef04f4ad678deda0d0e4643d7Shannon Woods { 2582d76e5f66595e1cef04f4ad678deda0d0e4643d7Shannon Woods return; 2592d76e5f66595e1cef04f4ad678deda0d0e4643d7Shannon Woods } 2602d76e5f66595e1cef04f4ad678deda0d0e4643d7Shannon Woods 2612d76e5f66595e1cef04f4ad678deda0d0e4643d7Shannon Woods TShHandleBase *base = static_cast<TShHandleBase*>(handle); 2622d76e5f66595e1cef04f4ad678deda0d0e4643d7Shannon Woods TCompiler *compiler = base->getAsCompiler(); 2632d76e5f66595e1cef04f4ad678deda0d0e4643d7Shannon Woods if (!compiler) 2642d76e5f66595e1cef04f4ad678deda0d0e4643d7Shannon Woods { 2652d76e5f66595e1cef04f4ad678deda0d0e4643d7Shannon Woods return; 2662d76e5f66595e1cef04f4ad678deda0d0e4643d7Shannon Woods } 2672d76e5f66595e1cef04f4ad678deda0d0e4643d7Shannon Woods 2682d76e5f66595e1cef04f4ad678deda0d0e4643d7Shannon Woods strncpy(outString, compiler->getBuiltInResourcesString().c_str(), outStringLen); 2692d76e5f66595e1cef04f4ad678deda0d0e4643d7Shannon Woods outString[outStringLen - 1] = '\0'; 2702d76e5f66595e1cef04f4ad678deda0d0e4643d7Shannon Woods} 2714f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 2722d76e5f66595e1cef04f4ad678deda0d0e4643d7Shannon Woods// Do an actual compile on the given strings. The result is left 2734f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// in the given compile object. 2744f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 2754f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// Return: The return value of ShCompile is really boolean, indicating 2764f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// success or failure. 2774f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 2784f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comint ShCompile( 2794f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com const ShHandle handle, 2804f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com const char* const shaderStrings[], 281d64b3dab06c30da1e5dd9ba12667ff86388540e2shannon.woods@transgaming.com size_t numStrings, 2827beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org int compileOptions) 2834f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{ 2844f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com if (handle == 0) 2854f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com return 0; 2864f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 2874f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com TShHandleBase* base = reinterpret_cast<TShHandleBase*>(handle); 2884f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com TCompiler* compiler = base->getAsCompiler(); 2894f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com if (compiler == 0) 2904f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com return 0; 2917beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org 29207620a585ae04ba6a86f0c04a27b3cabd10cc6b8alokp@chromium.org bool success = compiler->compile(shaderStrings, numStrings, compileOptions); 2934f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com return success ? 1 : 0; 2944f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com} 2954f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 296d64b3dab06c30da1e5dd9ba12667ff86388540e2shannon.woods@transgaming.comvoid ShGetInfo(const ShHandle handle, ShShaderInfo pname, size_t* params) 2977beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org{ 2987beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org if (!handle || !params) 2997beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org return; 3007beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org 3017beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org TShHandleBase* base = static_cast<TShHandleBase*>(handle); 3027beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org TCompiler* compiler = base->getAsCompiler(); 3037beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org if (!compiler) return; 3047beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org 3057beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org switch(pname) 3067beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org { 3077beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org case SH_INFO_LOG_LENGTH: 3087beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org *params = compiler->getInfoSink().info.size() + 1; 3097beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org break; 3107beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org case SH_OBJECT_CODE_LENGTH: 3117beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org *params = compiler->getInfoSink().obj.size() + 1; 3127beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org break; 3137beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org case SH_ACTIVE_UNIFORMS: 31423a8a433529d9db23882c702a29d5e594841563dJamie Madill *params = compiler->getExpandedUniforms().size(); 3157beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org break; 3167beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org case SH_ACTIVE_UNIFORM_MAX_LENGTH: 3177faf1a14deb3cdfc9f9137de95f9fc1552b603bdZhenyao Mo *params = 1 + GetGlobalMaxTokenSize(compiler->getShaderSpec()); 3187beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org break; 3197beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org case SH_ACTIVE_ATTRIBUTES: 320ed27c7296c9bc4e9d9901943a8a0147513d11fc6Jamie Madill *params = compiler->getAttributes().size(); 3217beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org break; 3227beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org case SH_ACTIVE_ATTRIBUTE_MAX_LENGTH: 3237faf1a14deb3cdfc9f9137de95f9fc1552b603bdZhenyao Mo *params = 1 + GetGlobalMaxTokenSize(compiler->getShaderSpec()); 3247beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org break; 32574da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo case SH_VARYINGS: 32623a8a433529d9db23882c702a29d5e594841563dJamie Madill *params = compiler->getExpandedVaryings().size(); 32774da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo break; 32874da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo case SH_VARYING_MAX_LENGTH: 3297faf1a14deb3cdfc9f9137de95f9fc1552b603bdZhenyao Mo *params = 1 + GetGlobalMaxTokenSize(compiler->getShaderSpec()); 33074da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo break; 331fd747b861195a03df634a722a9cf3505dcd41253zmo@google.com case SH_MAPPED_NAME_MAX_LENGTH: 332221521178e28a58a7ac60726494600b833374f28kbr@chromium.org // Use longer length than MAX_SHORTENED_IDENTIFIER_SIZE to 333221521178e28a58a7ac60726494600b833374f28kbr@chromium.org // handle array and struct dereferences. 3347faf1a14deb3cdfc9f9137de95f9fc1552b603bdZhenyao Mo *params = 1 + GetGlobalMaxTokenSize(compiler->getShaderSpec()); 335fd747b861195a03df634a722a9cf3505dcd41253zmo@google.com break; 336c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com case SH_NAME_MAX_LENGTH: 3377faf1a14deb3cdfc9f9137de95f9fc1552b603bdZhenyao Mo *params = 1 + GetGlobalMaxTokenSize(compiler->getShaderSpec()); 338c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com break; 339c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com case SH_HASHED_NAME_MAX_LENGTH: 340c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com if (compiler->getHashFunction() == NULL) { 341c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com *params = 0; 342c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com } else { 343c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com // 64 bits hashing output requires 16 bytes for hex 344c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com // representation. 345c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com const char HashedNamePrefix[] = HASHED_NAME_PREFIX; 346cebb5aa092f92e1f727fe5e4300dbd83abd49afbGeoff Lang (void)HashedNamePrefix; 347c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com *params = 16 + sizeof(HashedNamePrefix); 348c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com } 349c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com break; 350c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com case SH_HASHED_NAMES_COUNT: 351c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com *params = compiler->getNameMap().size(); 352c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com break; 3530bbed38f417d490604909de5928d725fb39c5e3cshannon.woods%transgaming.com@gtempaccount.com case SH_SHADER_VERSION: 3540bbed38f417d490604909de5928d725fb39c5e3cshannon.woods%transgaming.com@gtempaccount.com *params = compiler->getShaderVersion(); 3550bbed38f417d490604909de5928d725fb39c5e3cshannon.woods%transgaming.com@gtempaccount.com break; 3562d76e5f66595e1cef04f4ad678deda0d0e4643d7Shannon Woods case SH_RESOURCES_STRING_LENGTH: 3572d76e5f66595e1cef04f4ad678deda0d0e4643d7Shannon Woods *params = compiler->getBuiltInResourcesString().length() + 1; 3582d76e5f66595e1cef04f4ad678deda0d0e4643d7Shannon Woods break; 35968fe74aabbb4d8ae08aadcf22705f0d85a16e0b5Jamie Madill case SH_OUTPUT_TYPE: 36068fe74aabbb4d8ae08aadcf22705f0d85a16e0b5Jamie Madill *params = compiler->getOutputType(); 36168fe74aabbb4d8ae08aadcf22705f0d85a16e0b5Jamie Madill break; 3627beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org default: UNREACHABLE(); 3637beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org } 3647beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org} 3657beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org 3664f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 367774d70630a690b2449afdccfb29612393c65f212alokp@chromium.org// Return any compiler log of messages for the application. 3684f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 3697beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.orgvoid ShGetInfoLog(const ShHandle handle, char* infoLog) 3704f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{ 3717beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org if (!handle || !infoLog) 3727beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org return; 3734f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 3744f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com TShHandleBase* base = static_cast<TShHandleBase*>(handle); 3757beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org TCompiler* compiler = base->getAsCompiler(); 3767beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org if (!compiler) return; 3774f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 3787beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org TInfoSink& infoSink = compiler->getInfoSink(); 3797beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org strcpy(infoLog, infoSink.info.c_str()); 3804f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com} 3814f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 3824f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 383774d70630a690b2449afdccfb29612393c65f212alokp@chromium.org// Return any object code. 3844f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 3857beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.orgvoid ShGetObjectCode(const ShHandle handle, char* objCode) 3864f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{ 3877beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org if (!handle || !objCode) 3887beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org return; 3894f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 3904f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com TShHandleBase* base = static_cast<TShHandleBase*>(handle); 3917beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org TCompiler* compiler = base->getAsCompiler(); 3927beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org if (!compiler) return; 3934f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 3947beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org TInfoSink& infoSink = compiler->getInfoSink(); 3957beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org strcpy(objCode, infoSink.obj.c_str()); 3967beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org} 3974f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 39874da9f2f24093e828b30071cebc09f99088fc13cZhenyao Movoid ShGetVariableInfo(const ShHandle handle, 39974da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo ShShaderInfo varType, 4007beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org int index, 401d64b3dab06c30da1e5dd9ba12667ff86388540e2shannon.woods@transgaming.com size_t* length, 4027beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org int* size, 403183bde5527317fa2208401e5e6b803ef51a0fdcbJamie Madill sh::GLenum* type, 40474da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo ShPrecisionType* precision, 405d2d340b0da87296b1ec04799ef4c811966bfb7aeZhenyao Mo int* staticUse, 406fd747b861195a03df634a722a9cf3505dcd41253zmo@google.com char* name, 407fd747b861195a03df634a722a9cf3505dcd41253zmo@google.com char* mappedName) 4087beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org{ 409d2d340b0da87296b1ec04799ef4c811966bfb7aeZhenyao Mo if (!handle || !size || !type || !precision || !staticUse || !name) 41074da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo return; 41174da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo ASSERT((varType == SH_ACTIVE_ATTRIBUTES) || 41274da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo (varType == SH_ACTIVE_UNIFORMS) || 41374da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo (varType == SH_VARYINGS)); 4147beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org 41574da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo TShHandleBase* base = reinterpret_cast<TShHandleBase*>(handle); 41674da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo TCompiler* compiler = base->getAsCompiler(); 41774da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo if (compiler == 0) 41874da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo return; 41974da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo 420a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill const sh::ShaderVariable *varInfo = GetVariable(compiler, varType, index); 421a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill if (!varInfo) 422a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill { 42374da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo return; 42474da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo } 425a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill 426a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill if (length) *length = varInfo->name.size(); 427a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill *size = varInfo->elementCount(); 428a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill *type = varInfo->type; 429a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill *precision = ConvertPrecision(varInfo->precision); 430a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill *staticUse = varInfo->staticUse ? 1 : 0; 43174da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo 43274da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo // This size must match that queried by 43374da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo // SH_ACTIVE_UNIFORM_MAX_LENGTH, SH_ACTIVE_ATTRIBUTE_MAX_LENGTH, SH_VARYING_MAX_LENGTH 43474da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo // in ShGetInfo, below. 4357faf1a14deb3cdfc9f9137de95f9fc1552b603bdZhenyao Mo size_t variableLength = 1 + GetGlobalMaxTokenSize(compiler->getShaderSpec()); 436e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill ASSERT(CheckVariableMaxLengths(handle, variableLength)); 437a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill strncpy(name, varInfo->name.c_str(), variableLength); 43874da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo name[variableLength - 1] = 0; 439a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill if (mappedName) 440a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill { 44174da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo // This size must match that queried by 44274da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo // SH_MAPPED_NAME_MAX_LENGTH in ShGetInfo, below. 4437faf1a14deb3cdfc9f9137de95f9fc1552b603bdZhenyao Mo size_t maxMappedNameLength = 1 + GetGlobalMaxTokenSize(compiler->getShaderSpec()); 444e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill ASSERT(CheckMappedNameMaxLength(handle, maxMappedNameLength)); 445a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill strncpy(mappedName, varInfo->mappedName.c_str(), maxMappedNameLength); 44674da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo mappedName[maxMappedNameLength - 1] = 0; 44774da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo } 4484f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com} 449c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com 450c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.comvoid ShGetNameHashingEntry(const ShHandle handle, 451c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com int index, 452c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com char* name, 453c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com char* hashedName) 454c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com{ 455c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com if (!handle || !name || !hashedName || index < 0) 456c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com return; 457c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com 458c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com TShHandleBase* base = static_cast<TShHandleBase*>(handle); 459c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com TCompiler* compiler = base->getAsCompiler(); 460c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com if (!compiler) return; 461c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com 462c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com const NameMap& nameMap = compiler->getNameMap(); 463c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com if (index >= static_cast<int>(nameMap.size())) 464c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com return; 465c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com 466c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com NameMap::const_iterator it = nameMap.begin(); 467c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com for (int i = 0; i < index; ++i) 468c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com ++it; 469c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com 470c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com size_t len = it->first.length() + 1; 471d64b3dab06c30da1e5dd9ba12667ff86388540e2shannon.woods@transgaming.com size_t max_len = 0; 472c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com ShGetInfo(handle, SH_NAME_MAX_LENGTH, &max_len); 473d64b3dab06c30da1e5dd9ba12667ff86388540e2shannon.woods@transgaming.com if (len > max_len) { 474c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com ASSERT(false); 475c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com len = max_len; 476c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com } 477c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com strncpy(name, it->first.c_str(), len); 478c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com // To be on the safe side in case the source is longer than expected. 47975cb689bcfa026644949bf4e46f77bd7006d4d7bdaniel@transgaming.com name[len - 1] = '\0'; 480c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com 481c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com len = it->second.length() + 1; 482c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com max_len = 0; 483c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com ShGetInfo(handle, SH_HASHED_NAME_MAX_LENGTH, &max_len); 484d64b3dab06c30da1e5dd9ba12667ff86388540e2shannon.woods@transgaming.com if (len > max_len) { 485c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com ASSERT(false); 486c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com len = max_len; 487c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com } 488c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com strncpy(hashedName, it->second.c_str(), len); 489c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com // To be on the safe side in case the source is longer than expected. 49075cb689bcfa026644949bf4e46f77bd7006d4d7bdaniel@transgaming.com hashedName[len - 1] = '\0'; 491c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com} 492043da138a767ebdf9b4fff83b654f4bfb43ac4f2daniel@transgaming.com 493e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madillconst std::vector<sh::Uniform> *ShGetUniforms(const ShHandle handle) 494043da138a767ebdf9b4fff83b654f4bfb43ac4f2daniel@transgaming.com{ 495e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill return GetShaderVariables<sh::Uniform>(handle, SHADERVAR_UNIFORM); 496e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill} 497043da138a767ebdf9b4fff83b654f4bfb43ac4f2daniel@transgaming.com 498e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madillconst std::vector<sh::Varying> *ShGetVaryings(const ShHandle handle) 499e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill{ 500e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill return GetShaderVariables<sh::Varying>(handle, SHADERVAR_VARYING); 501e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill} 502043da138a767ebdf9b4fff83b654f4bfb43ac4f2daniel@transgaming.com 503e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madillconst std::vector<sh::Attribute> *ShGetAttributes(const ShHandle handle) 504e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill{ 505e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill return GetShaderVariables<sh::Attribute>(handle, SHADERVAR_ATTRIBUTE); 506e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill} 507e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill 508e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madillconst std::vector<sh::Attribute> *ShGetOutputVariables(const ShHandle handle) 509e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill{ 510e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill return GetShaderVariables<sh::Attribute>(handle, SHADERVAR_OUTPUTVARIABLE); 511e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill} 512e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill 513e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madillconst std::vector<sh::InterfaceBlock> *ShGetInterfaceBlocks(const ShHandle handle) 514e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill{ 515e294bb8741ec02fdb814ef3a3999c2d61c1e798fJamie Madill return GetShaderVariables<sh::InterfaceBlock>(handle, SHADERVAR_INTERFACEBLOCK); 5161d432bb570bd175c3cdc51629a386e324e98b95bshannon.woods@transgaming.com} 517a15f3e84bfc96b9ef97dd10150f8811adcbbdebfZhenyao Mo 518a15f3e84bfc96b9ef97dd10150f8811adcbbdebfZhenyao Moint ShCheckVariablesWithinPackingLimits( 519a15f3e84bfc96b9ef97dd10150f8811adcbbdebfZhenyao Mo int maxVectors, ShVariableInfo* varInfoArray, size_t varInfoArraySize) 520a15f3e84bfc96b9ef97dd10150f8811adcbbdebfZhenyao Mo{ 521a15f3e84bfc96b9ef97dd10150f8811adcbbdebfZhenyao Mo if (varInfoArraySize == 0) 522a15f3e84bfc96b9ef97dd10150f8811adcbbdebfZhenyao Mo return 1; 523a15f3e84bfc96b9ef97dd10150f8811adcbbdebfZhenyao Mo ASSERT(varInfoArray); 524a718c1e00264edf434aeddf7beb14f4fae0f07a0Jamie Madill std::vector<sh::ShaderVariable> variables; 525a15f3e84bfc96b9ef97dd10150f8811adcbbdebfZhenyao Mo for (size_t ii = 0; ii < varInfoArraySize; ++ii) 526a15f3e84bfc96b9ef97dd10150f8811adcbbdebfZhenyao Mo { 527a3fe2b4e1fce3d0637e2626c6154d19707313a85Jamie Madill sh::ShaderVariable var(varInfoArray[ii].type, varInfoArray[ii].size); 528a15f3e84bfc96b9ef97dd10150f8811adcbbdebfZhenyao Mo variables.push_back(var); 529a15f3e84bfc96b9ef97dd10150f8811adcbbdebfZhenyao Mo } 530a15f3e84bfc96b9ef97dd10150f8811adcbbdebfZhenyao Mo VariablePacker packer; 531a15f3e84bfc96b9ef97dd10150f8811adcbbdebfZhenyao Mo return packer.CheckVariablesWithinPackingLimits(maxVectors, variables) ? 1 : 0; 532a15f3e84bfc96b9ef97dd10150f8811adcbbdebfZhenyao Mo} 5334e1fd41255ab4ce8b2cd745033f385c3e8bd9e7aJamie Madill 5344e1fd41255ab4ce8b2cd745033f385c3e8bd9e7aJamie Madillbool ShGetInterfaceBlockRegister(const ShHandle handle, 5354e1fd41255ab4ce8b2cd745033f385c3e8bd9e7aJamie Madill const char *interfaceBlockName, 5364e1fd41255ab4ce8b2cd745033f385c3e8bd9e7aJamie Madill unsigned int *indexOut) 5374e1fd41255ab4ce8b2cd745033f385c3e8bd9e7aJamie Madill{ 5384e1fd41255ab4ce8b2cd745033f385c3e8bd9e7aJamie Madill if (!handle || !interfaceBlockName || !indexOut) 5394e1fd41255ab4ce8b2cd745033f385c3e8bd9e7aJamie Madill { 5404e1fd41255ab4ce8b2cd745033f385c3e8bd9e7aJamie Madill return false; 5414e1fd41255ab4ce8b2cd745033f385c3e8bd9e7aJamie Madill } 5424e1fd41255ab4ce8b2cd745033f385c3e8bd9e7aJamie Madill 5434e1fd41255ab4ce8b2cd745033f385c3e8bd9e7aJamie Madill TShHandleBase* base = static_cast<TShHandleBase*>(handle); 5444e1fd41255ab4ce8b2cd745033f385c3e8bd9e7aJamie Madill TranslatorHLSL* translator = base->getAsTranslatorHLSL(); 5454e1fd41255ab4ce8b2cd745033f385c3e8bd9e7aJamie Madill if (!translator) 5464e1fd41255ab4ce8b2cd745033f385c3e8bd9e7aJamie Madill { 5474e1fd41255ab4ce8b2cd745033f385c3e8bd9e7aJamie Madill return false; 5484e1fd41255ab4ce8b2cd745033f385c3e8bd9e7aJamie Madill } 5494e1fd41255ab4ce8b2cd745033f385c3e8bd9e7aJamie Madill 5504e1fd41255ab4ce8b2cd745033f385c3e8bd9e7aJamie Madill if (!translator->hasInterfaceBlock(interfaceBlockName)) 5514e1fd41255ab4ce8b2cd745033f385c3e8bd9e7aJamie Madill { 5524e1fd41255ab4ce8b2cd745033f385c3e8bd9e7aJamie Madill return false; 5534e1fd41255ab4ce8b2cd745033f385c3e8bd9e7aJamie Madill } 5544e1fd41255ab4ce8b2cd745033f385c3e8bd9e7aJamie Madill 5554e1fd41255ab4ce8b2cd745033f385c3e8bd9e7aJamie Madill *indexOut = translator->getInterfaceBlockRegister(interfaceBlockName); 5564e1fd41255ab4ce8b2cd745033f385c3e8bd9e7aJamie Madill return true; 5574e1fd41255ab4ce8b2cd745033f385c3e8bd9e7aJamie Madill} 5589fe25e9eaafd8de2e4890cfb926c678ab6e4abb8Jamie Madill 5599fe25e9eaafd8de2e4890cfb926c678ab6e4abb8Jamie Madillbool ShGetUniformRegister(const ShHandle handle, 5609fe25e9eaafd8de2e4890cfb926c678ab6e4abb8Jamie Madill const char *uniformName, 5619fe25e9eaafd8de2e4890cfb926c678ab6e4abb8Jamie Madill unsigned int *indexOut) 5629fe25e9eaafd8de2e4890cfb926c678ab6e4abb8Jamie Madill{ 5639fe25e9eaafd8de2e4890cfb926c678ab6e4abb8Jamie Madill if (!handle || !uniformName || !indexOut) 5649fe25e9eaafd8de2e4890cfb926c678ab6e4abb8Jamie Madill { 5659fe25e9eaafd8de2e4890cfb926c678ab6e4abb8Jamie Madill return false; 5669fe25e9eaafd8de2e4890cfb926c678ab6e4abb8Jamie Madill } 5679fe25e9eaafd8de2e4890cfb926c678ab6e4abb8Jamie Madill 5689fe25e9eaafd8de2e4890cfb926c678ab6e4abb8Jamie Madill TShHandleBase* base = static_cast<TShHandleBase*>(handle); 5699fe25e9eaafd8de2e4890cfb926c678ab6e4abb8Jamie Madill TranslatorHLSL* translator = base->getAsTranslatorHLSL(); 5709fe25e9eaafd8de2e4890cfb926c678ab6e4abb8Jamie Madill if (!translator) 5719fe25e9eaafd8de2e4890cfb926c678ab6e4abb8Jamie Madill { 5729fe25e9eaafd8de2e4890cfb926c678ab6e4abb8Jamie Madill return false; 5739fe25e9eaafd8de2e4890cfb926c678ab6e4abb8Jamie Madill } 5749fe25e9eaafd8de2e4890cfb926c678ab6e4abb8Jamie Madill 5759fe25e9eaafd8de2e4890cfb926c678ab6e4abb8Jamie Madill if (!translator->hasUniform(uniformName)) 5769fe25e9eaafd8de2e4890cfb926c678ab6e4abb8Jamie Madill { 5779fe25e9eaafd8de2e4890cfb926c678ab6e4abb8Jamie Madill return false; 5789fe25e9eaafd8de2e4890cfb926c678ab6e4abb8Jamie Madill } 5799fe25e9eaafd8de2e4890cfb926c678ab6e4abb8Jamie Madill 5809fe25e9eaafd8de2e4890cfb926c678ab6e4abb8Jamie Madill *indexOut = translator->getUniformRegister(uniformName); 5819fe25e9eaafd8de2e4890cfb926c678ab6e4abb8Jamie Madill return true; 5829fe25e9eaafd8de2e4890cfb926c678ab6e4abb8Jamie Madill} 583