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 1417732823f9c21bdba9cc51ffaceb545ce3857a8cGeoff Lang#include "compiler/translator/InitializeDll.h" 155508f39d0cffc9a68565bbff2e6f61332a509cdfJamie Madill#include "compiler/translator/length_limits.h" 1617732823f9c21bdba9cc51ffaceb545ce3857a8cGeoff Lang#include "compiler/translator/ShHandle.h" 1717732823f9c21bdba9cc51ffaceb545ce3857a8cGeoff Lang#include "compiler/translator/TranslatorHLSL.h" 1817732823f9c21bdba9cc51ffaceb545ce3857a8cGeoff Lang#include "compiler/translator/VariablePacker.h" 194f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 20b4d192cd8c1573d7df93e64c98bddbe90b598618Jamie Madillstatic bool isInitialized = false; 21b4d192cd8c1573d7df93e64c98bddbe90b598618Jamie Madill 224f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 234f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// This is the platform independent interface between an OGL driver 24774d70630a690b2449afdccfb29612393c65f212alokp@chromium.org// and the shading language compiler. 254f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 264f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 2774da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mostatic bool checkVariableMaxLengths(const ShHandle handle, 2874da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo size_t expectedValue) 29ee76f6af4554615109916db541cd1e613d553214alokp@chromium.org{ 30d64b3dab06c30da1e5dd9ba12667ff86388540e2shannon.woods@transgaming.com size_t activeUniformLimit = 0; 31221521178e28a58a7ac60726494600b833374f28kbr@chromium.org ShGetInfo(handle, SH_ACTIVE_UNIFORM_MAX_LENGTH, &activeUniformLimit); 32d64b3dab06c30da1e5dd9ba12667ff86388540e2shannon.woods@transgaming.com size_t activeAttribLimit = 0; 33221521178e28a58a7ac60726494600b833374f28kbr@chromium.org ShGetInfo(handle, SH_ACTIVE_ATTRIBUTE_MAX_LENGTH, &activeAttribLimit); 3474da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo size_t varyingLimit = 0; 3574da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo ShGetInfo(handle, SH_VARYING_MAX_LENGTH, &varyingLimit); 3674da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo return (expectedValue == activeUniformLimit && 3774da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo expectedValue == activeAttribLimit && 3874da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo expectedValue == varyingLimit); 39221521178e28a58a7ac60726494600b833374f28kbr@chromium.org} 40221521178e28a58a7ac60726494600b833374f28kbr@chromium.org 41d64b3dab06c30da1e5dd9ba12667ff86388540e2shannon.woods@transgaming.comstatic bool checkMappedNameMaxLength(const ShHandle handle, size_t expectedValue) 42221521178e28a58a7ac60726494600b833374f28kbr@chromium.org{ 43d64b3dab06c30da1e5dd9ba12667ff86388540e2shannon.woods@transgaming.com size_t mappedNameMaxLength = 0; 44221521178e28a58a7ac60726494600b833374f28kbr@chromium.org ShGetInfo(handle, SH_MAPPED_NAME_MAX_LENGTH, &mappedNameMaxLength); 45221521178e28a58a7ac60726494600b833374f28kbr@chromium.org return (expectedValue == mappedNameMaxLength); 46ee76f6af4554615109916db541cd1e613d553214alokp@chromium.org} 47ee76f6af4554615109916db541cd1e613d553214alokp@chromium.org 484f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 49b11713fb9cae53fd0577d90ab5576b1ea8b6f025Alok Priyadarshi// Driver must call this first, once, before doing any other compiler operations. 50b11713fb9cae53fd0577d90ab5576b1ea8b6f025Alok Priyadarshi// Subsequent calls to this function are no-op. 514f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 524f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comint ShInitialize() 534f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{ 54477bc7811ffb19bb52710badf8063fa351a26b95Jamie Madill if (!isInitialized) 55477bc7811ffb19bb52710badf8063fa351a26b95Jamie Madill { 56477bc7811ffb19bb52710badf8063fa351a26b95Jamie Madill isInitialized = InitProcess(); 57477bc7811ffb19bb52710badf8063fa351a26b95Jamie Madill } 58b4d192cd8c1573d7df93e64c98bddbe90b598618Jamie Madill return isInitialized ? 1 : 0; 594f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com} 604f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 614f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 6294a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org// Cleanup symbol tables 6394a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org// 6494a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.orgint ShFinalize() 6594a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org{ 66f20f0206c963546f293190f73b64d09ff00e7273Geoff Lang if (isInitialized) 67f20f0206c963546f293190f73b64d09ff00e7273Geoff Lang { 68f20f0206c963546f293190f73b64d09ff00e7273Geoff Lang DetachProcess(); 69f20f0206c963546f293190f73b64d09ff00e7273Geoff Lang isInitialized = false; 70f20f0206c963546f293190f73b64d09ff00e7273Geoff Lang } 7194a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org return 1; 7294a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org} 7394a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org 744f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 7594a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org// Initialize built-in resources with minimum expected values. 7694a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org// 774888ceb6681c3668d3afcbdafdbe2b7efdaa3d04alokp@chromium.orgvoid ShInitBuiltInResources(ShBuiltInResources* resources) 7894a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org{ 7994a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org // Constants. 8094a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org resources->MaxVertexAttribs = 8; 8194a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org resources->MaxVertexUniformVectors = 128; 8294a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org resources->MaxVaryingVectors = 8; 8394a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org resources->MaxVertexTextureImageUnits = 0; 8494a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org resources->MaxCombinedTextureImageUnits = 8; 8594a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org resources->MaxTextureImageUnits = 8; 8694a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org resources->MaxFragmentUniformVectors = 16; 8794a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org resources->MaxDrawBuffers = 1; 8894a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org 8994a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org // Extensions. 9094a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org resources->OES_standard_derivatives = 0; 9109c323a40ad0de489eee946bfe171d337616e09czmo@google.com resources->OES_EGL_image_external = 0; 92205fef3389c81637f689585431273cf83af02e94kbr@chromium.org resources->ARB_texture_rectangle = 0; 93550cd0988989cc3e117fb300c919504f7bd99c48shannon.woods@transgaming.com resources->EXT_draw_buffers = 0; 942aeb26a4f6e21a923415eb00499795b63a17ef76Jamie Madill resources->EXT_frag_depth = 0; 95464850868307005a1287d79f7a640f05372358bbNicolas Capens resources->EXT_shader_texture_lod = 0; 96c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com 97cbb6b6a0416552b5e3fa8589194288532558ccb8shannon.woods%transgaming.com@gtempaccount.com // Disable highp precision in fragment shader by default. 98cbb6b6a0416552b5e3fa8589194288532558ccb8shannon.woods%transgaming.com@gtempaccount.com resources->FragmentPrecisionHigh = 0; 99cbb6b6a0416552b5e3fa8589194288532558ccb8shannon.woods%transgaming.com@gtempaccount.com 10074b86cffade4b3dbfddd3c601b35b87ef28a82a6shannonwoods@chromium.org // GLSL ES 3.0 constants. 10174b86cffade4b3dbfddd3c601b35b87ef28a82a6shannonwoods@chromium.org resources->MaxVertexOutputVectors = 16; 10274b86cffade4b3dbfddd3c601b35b87ef28a82a6shannonwoods@chromium.org resources->MaxFragmentInputVectors = 15; 10374b86cffade4b3dbfddd3c601b35b87ef28a82a6shannonwoods@chromium.org resources->MinProgramTexelOffset = -8; 10474b86cffade4b3dbfddd3c601b35b87ef28a82a6shannonwoods@chromium.org resources->MaxProgramTexelOffset = 7; 10574b86cffade4b3dbfddd3c601b35b87ef28a82a6shannonwoods@chromium.org 106c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com // Disable name hashing by default. 107c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com resources->HashFunction = NULL; 1081d432bb570bd175c3cdc51629a386e324e98b95bshannon.woods@transgaming.com 1091d432bb570bd175c3cdc51629a386e324e98b95bshannon.woods@transgaming.com resources->ArrayIndexClampingStrategy = SH_CLAMP_WITH_CLAMP_INTRINSIC; 1107d649a00979a248d273f362dbf6b8ac5df712dcaNicolas Capens 1117d649a00979a248d273f362dbf6b8ac5df712dcaNicolas Capens resources->MaxExpressionComplexity = 256; 1127d649a00979a248d273f362dbf6b8ac5df712dcaNicolas Capens resources->MaxCallStackDepth = 256; 11394a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org} 1144f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 11594a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org// 11694a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org// Driver calls these to create and destroy compiler objects. 11794a86ad8f1ace86e9dc08088cd2e85d0b9f842f0alokp@chromium.org// 1184888ceb6681c3668d3afcbdafdbe2b7efdaa3d04alokp@chromium.orgShHandle ShConstructCompiler(ShShaderType type, ShShaderSpec spec, 1195601ea0d66442518d4745bb02b7619485b9d305bzmo@google.com ShShaderOutput output, 1204888ceb6681c3668d3afcbdafdbe2b7efdaa3d04alokp@chromium.org const ShBuiltInResources* resources) 1214f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{ 1225601ea0d66442518d4745bb02b7619485b9d305bzmo@google.com TShHandleBase* base = static_cast<TShHandleBase*>(ConstructCompiler(type, spec, output)); 123e4249f0217bed043d645b6e01ae7d26f7c3e0093alokp@chromium.org TCompiler* compiler = base->getAsCompiler(); 124e4249f0217bed043d645b6e01ae7d26f7c3e0093alokp@chromium.org if (compiler == 0) 125e4249f0217bed043d645b6e01ae7d26f7c3e0093alokp@chromium.org return 0; 126e4249f0217bed043d645b6e01ae7d26f7c3e0093alokp@chromium.org 127e4249f0217bed043d645b6e01ae7d26f7c3e0093alokp@chromium.org // Generate built-in symbol table. 12807620a585ae04ba6a86f0c04a27b3cabd10cc6b8alokp@chromium.org if (!compiler->Init(*resources)) { 129e4249f0217bed043d645b6e01ae7d26f7c3e0093alokp@chromium.org ShDestruct(base); 130e4249f0217bed043d645b6e01ae7d26f7c3e0093alokp@chromium.org return 0; 131e4249f0217bed043d645b6e01ae7d26f7c3e0093alokp@chromium.org } 132e4249f0217bed043d645b6e01ae7d26f7c3e0093alokp@chromium.org 1334f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com return reinterpret_cast<void*>(base); 1344f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com} 1354f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 1364f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comvoid ShDestruct(ShHandle handle) 1374f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{ 1384f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com if (handle == 0) 1394f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com return; 1404f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 1414f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com TShHandleBase* base = static_cast<TShHandleBase*>(handle); 1424f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 1434f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com if (base->getAsCompiler()) 1444f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com DeleteCompiler(base->getAsCompiler()); 1454f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com} 1464f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 1472d76e5f66595e1cef04f4ad678deda0d0e4643d7Shannon Woodsvoid ShGetBuiltInResourcesString(const ShHandle handle, size_t outStringLen, char *outString) 1482d76e5f66595e1cef04f4ad678deda0d0e4643d7Shannon Woods{ 1492d76e5f66595e1cef04f4ad678deda0d0e4643d7Shannon Woods if (!handle || !outString) 1502d76e5f66595e1cef04f4ad678deda0d0e4643d7Shannon Woods { 1512d76e5f66595e1cef04f4ad678deda0d0e4643d7Shannon Woods return; 1522d76e5f66595e1cef04f4ad678deda0d0e4643d7Shannon Woods } 1532d76e5f66595e1cef04f4ad678deda0d0e4643d7Shannon Woods 1542d76e5f66595e1cef04f4ad678deda0d0e4643d7Shannon Woods TShHandleBase *base = static_cast<TShHandleBase*>(handle); 1552d76e5f66595e1cef04f4ad678deda0d0e4643d7Shannon Woods TCompiler *compiler = base->getAsCompiler(); 1562d76e5f66595e1cef04f4ad678deda0d0e4643d7Shannon Woods if (!compiler) 1572d76e5f66595e1cef04f4ad678deda0d0e4643d7Shannon Woods { 1582d76e5f66595e1cef04f4ad678deda0d0e4643d7Shannon Woods return; 1592d76e5f66595e1cef04f4ad678deda0d0e4643d7Shannon Woods } 1602d76e5f66595e1cef04f4ad678deda0d0e4643d7Shannon Woods 1612d76e5f66595e1cef04f4ad678deda0d0e4643d7Shannon Woods strncpy(outString, compiler->getBuiltInResourcesString().c_str(), outStringLen); 1622d76e5f66595e1cef04f4ad678deda0d0e4643d7Shannon Woods outString[outStringLen - 1] = '\0'; 1632d76e5f66595e1cef04f4ad678deda0d0e4643d7Shannon Woods} 1644f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 1652d76e5f66595e1cef04f4ad678deda0d0e4643d7Shannon Woods// Do an actual compile on the given strings. The result is left 1664f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// in the given compile object. 1674f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 1684f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// Return: The return value of ShCompile is really boolean, indicating 1694f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// success or failure. 1704f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 1714f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comint ShCompile( 1724f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com const ShHandle handle, 1734f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com const char* const shaderStrings[], 174d64b3dab06c30da1e5dd9ba12667ff86388540e2shannon.woods@transgaming.com size_t numStrings, 1757beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org int compileOptions) 1764f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{ 1774f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com if (handle == 0) 1784f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com return 0; 1794f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 1804f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com TShHandleBase* base = reinterpret_cast<TShHandleBase*>(handle); 1814f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com TCompiler* compiler = base->getAsCompiler(); 1824f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com if (compiler == 0) 1834f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com return 0; 1847beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org 18507620a585ae04ba6a86f0c04a27b3cabd10cc6b8alokp@chromium.org bool success = compiler->compile(shaderStrings, numStrings, compileOptions); 1864f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com return success ? 1 : 0; 1874f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com} 1884f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 189d64b3dab06c30da1e5dd9ba12667ff86388540e2shannon.woods@transgaming.comvoid ShGetInfo(const ShHandle handle, ShShaderInfo pname, size_t* params) 1907beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org{ 1917beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org if (!handle || !params) 1927beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org return; 1937beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org 1947beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org TShHandleBase* base = static_cast<TShHandleBase*>(handle); 1957beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org TCompiler* compiler = base->getAsCompiler(); 1967beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org if (!compiler) return; 1977beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org 1987beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org switch(pname) 1997beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org { 2007beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org case SH_INFO_LOG_LENGTH: 2017beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org *params = compiler->getInfoSink().info.size() + 1; 2027beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org break; 2037beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org case SH_OBJECT_CODE_LENGTH: 2047beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org *params = compiler->getInfoSink().obj.size() + 1; 2057beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org break; 2067beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org case SH_ACTIVE_UNIFORMS: 207ee76f6af4554615109916db541cd1e613d553214alokp@chromium.org *params = compiler->getUniforms().size(); 2087beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org break; 2097beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org case SH_ACTIVE_UNIFORM_MAX_LENGTH: 2107faf1a14deb3cdfc9f9137de95f9fc1552b603bdZhenyao Mo *params = 1 + GetGlobalMaxTokenSize(compiler->getShaderSpec()); 2117beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org break; 2127beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org case SH_ACTIVE_ATTRIBUTES: 213ee76f6af4554615109916db541cd1e613d553214alokp@chromium.org *params = compiler->getAttribs().size(); 2147beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org break; 2157beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org case SH_ACTIVE_ATTRIBUTE_MAX_LENGTH: 2167faf1a14deb3cdfc9f9137de95f9fc1552b603bdZhenyao Mo *params = 1 + GetGlobalMaxTokenSize(compiler->getShaderSpec()); 2177beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org break; 21874da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo case SH_VARYINGS: 21974da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo *params = compiler->getVaryings().size(); 22074da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo break; 22174da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo case SH_VARYING_MAX_LENGTH: 2227faf1a14deb3cdfc9f9137de95f9fc1552b603bdZhenyao Mo *params = 1 + GetGlobalMaxTokenSize(compiler->getShaderSpec()); 22374da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo break; 224fd747b861195a03df634a722a9cf3505dcd41253zmo@google.com case SH_MAPPED_NAME_MAX_LENGTH: 225221521178e28a58a7ac60726494600b833374f28kbr@chromium.org // Use longer length than MAX_SHORTENED_IDENTIFIER_SIZE to 226221521178e28a58a7ac60726494600b833374f28kbr@chromium.org // handle array and struct dereferences. 2277faf1a14deb3cdfc9f9137de95f9fc1552b603bdZhenyao Mo *params = 1 + GetGlobalMaxTokenSize(compiler->getShaderSpec()); 228fd747b861195a03df634a722a9cf3505dcd41253zmo@google.com break; 229c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com case SH_NAME_MAX_LENGTH: 2307faf1a14deb3cdfc9f9137de95f9fc1552b603bdZhenyao Mo *params = 1 + GetGlobalMaxTokenSize(compiler->getShaderSpec()); 231c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com break; 232c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com case SH_HASHED_NAME_MAX_LENGTH: 233c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com if (compiler->getHashFunction() == NULL) { 234c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com *params = 0; 235c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com } else { 236c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com // 64 bits hashing output requires 16 bytes for hex 237c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com // representation. 238c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com const char HashedNamePrefix[] = HASHED_NAME_PREFIX; 239cebb5aa092f92e1f727fe5e4300dbd83abd49afbGeoff Lang (void)HashedNamePrefix; 240c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com *params = 16 + sizeof(HashedNamePrefix); 241c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com } 242c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com break; 243c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com case SH_HASHED_NAMES_COUNT: 244c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com *params = compiler->getNameMap().size(); 245c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com break; 2460bbed38f417d490604909de5928d725fb39c5e3cshannon.woods%transgaming.com@gtempaccount.com case SH_SHADER_VERSION: 2470bbed38f417d490604909de5928d725fb39c5e3cshannon.woods%transgaming.com@gtempaccount.com *params = compiler->getShaderVersion(); 2480bbed38f417d490604909de5928d725fb39c5e3cshannon.woods%transgaming.com@gtempaccount.com break; 2492d76e5f66595e1cef04f4ad678deda0d0e4643d7Shannon Woods case SH_RESOURCES_STRING_LENGTH: 2502d76e5f66595e1cef04f4ad678deda0d0e4643d7Shannon Woods *params = compiler->getBuiltInResourcesString().length() + 1; 2512d76e5f66595e1cef04f4ad678deda0d0e4643d7Shannon Woods break; 25268fe74aabbb4d8ae08aadcf22705f0d85a16e0b5Jamie Madill case SH_OUTPUT_TYPE: 25368fe74aabbb4d8ae08aadcf22705f0d85a16e0b5Jamie Madill *params = compiler->getOutputType(); 25468fe74aabbb4d8ae08aadcf22705f0d85a16e0b5Jamie Madill break; 2557beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org default: UNREACHABLE(); 2567beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org } 2577beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org} 2587beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org 2594f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 260774d70630a690b2449afdccfb29612393c65f212alokp@chromium.org// Return any compiler log of messages for the application. 2614f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 2627beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.orgvoid ShGetInfoLog(const ShHandle handle, char* infoLog) 2634f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{ 2647beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org if (!handle || !infoLog) 2657beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org return; 2664f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 2674f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com TShHandleBase* base = static_cast<TShHandleBase*>(handle); 2687beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org TCompiler* compiler = base->getAsCompiler(); 2697beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org if (!compiler) return; 2704f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 2717beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org TInfoSink& infoSink = compiler->getInfoSink(); 2727beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org strcpy(infoLog, infoSink.info.c_str()); 2734f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com} 2744f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 2754f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 276774d70630a690b2449afdccfb29612393c65f212alokp@chromium.org// Return any object code. 2774f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 2787beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.orgvoid ShGetObjectCode(const ShHandle handle, char* objCode) 2794f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{ 2807beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org if (!handle || !objCode) 2817beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org return; 2824f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 2834f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com TShHandleBase* base = static_cast<TShHandleBase*>(handle); 2847beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org TCompiler* compiler = base->getAsCompiler(); 2857beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org if (!compiler) return; 2864f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 2877beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org TInfoSink& infoSink = compiler->getInfoSink(); 2887beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org strcpy(objCode, infoSink.obj.c_str()); 2897beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org} 2904f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 29174da9f2f24093e828b30071cebc09f99088fc13cZhenyao Movoid ShGetVariableInfo(const ShHandle handle, 29274da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo ShShaderInfo varType, 2937beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org int index, 294d64b3dab06c30da1e5dd9ba12667ff86388540e2shannon.woods@transgaming.com size_t* length, 2957beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org int* size, 2964888ceb6681c3668d3afcbdafdbe2b7efdaa3d04alokp@chromium.org ShDataType* type, 29774da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo ShPrecisionType* precision, 298d2d340b0da87296b1ec04799ef4c811966bfb7aeZhenyao Mo int* staticUse, 299fd747b861195a03df634a722a9cf3505dcd41253zmo@google.com char* name, 300fd747b861195a03df634a722a9cf3505dcd41253zmo@google.com char* mappedName) 3017beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org{ 302d2d340b0da87296b1ec04799ef4c811966bfb7aeZhenyao Mo if (!handle || !size || !type || !precision || !staticUse || !name) 30374da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo return; 30474da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo ASSERT((varType == SH_ACTIVE_ATTRIBUTES) || 30574da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo (varType == SH_ACTIVE_UNIFORMS) || 30674da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo (varType == SH_VARYINGS)); 3077beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org 30874da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo TShHandleBase* base = reinterpret_cast<TShHandleBase*>(handle); 30974da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo TCompiler* compiler = base->getAsCompiler(); 31074da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo if (compiler == 0) 31174da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo return; 31274da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo 31374da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo const TVariableInfoList& varList = 31474da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo varType == SH_ACTIVE_ATTRIBUTES ? compiler->getAttribs() : 31574da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo (varType == SH_ACTIVE_UNIFORMS ? compiler->getUniforms() : 31674da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo compiler->getVaryings()); 31774da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo if (index < 0 || index >= static_cast<int>(varList.size())) 31874da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo return; 31974da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo 32074da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo const TVariableInfo& varInfo = varList[index]; 32174da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo if (length) *length = varInfo.name.size(); 32274da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo *size = varInfo.size; 32374da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo *type = varInfo.type; 32474da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo switch (varInfo.precision) { 32574da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo case EbpLow: 32674da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo *precision = SH_PRECISION_LOWP; 32774da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo break; 32874da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo case EbpMedium: 32974da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo *precision = SH_PRECISION_MEDIUMP; 33074da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo break; 33174da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo case EbpHigh: 33274da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo *precision = SH_PRECISION_HIGHP; 33374da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo break; 33474da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo default: 335fa3c346fe9d832b163cfcff29bba5965bcaff08eZhenyao Mo // Some types does not support precision, for example, boolean. 336fa3c346fe9d832b163cfcff29bba5965bcaff08eZhenyao Mo *precision = SH_PRECISION_UNDEFINED; 337fa3c346fe9d832b163cfcff29bba5965bcaff08eZhenyao Mo break; 33874da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo } 339d2d340b0da87296b1ec04799ef4c811966bfb7aeZhenyao Mo *staticUse = varInfo.staticUse ? 1 : 0; 34074da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo 34174da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo // This size must match that queried by 34274da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo // SH_ACTIVE_UNIFORM_MAX_LENGTH, SH_ACTIVE_ATTRIBUTE_MAX_LENGTH, SH_VARYING_MAX_LENGTH 34374da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo // in ShGetInfo, below. 3447faf1a14deb3cdfc9f9137de95f9fc1552b603bdZhenyao Mo size_t variableLength = 1 + GetGlobalMaxTokenSize(compiler->getShaderSpec()); 34574da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo ASSERT(checkVariableMaxLengths(handle, variableLength)); 34674da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo strncpy(name, varInfo.name.c_str(), variableLength); 34774da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo name[variableLength - 1] = 0; 34874da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo if (mappedName) { 34974da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo // This size must match that queried by 35074da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo // SH_MAPPED_NAME_MAX_LENGTH in ShGetInfo, below. 3517faf1a14deb3cdfc9f9137de95f9fc1552b603bdZhenyao Mo size_t maxMappedNameLength = 1 + GetGlobalMaxTokenSize(compiler->getShaderSpec()); 35274da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo ASSERT(checkMappedNameMaxLength(handle, maxMappedNameLength)); 35374da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo strncpy(mappedName, varInfo.mappedName.c_str(), maxMappedNameLength); 35474da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo mappedName[maxMappedNameLength - 1] = 0; 35574da9f2f24093e828b30071cebc09f99088fc13cZhenyao Mo } 3564f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com} 357c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com 358c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.comvoid ShGetNameHashingEntry(const ShHandle handle, 359c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com int index, 360c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com char* name, 361c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com char* hashedName) 362c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com{ 363c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com if (!handle || !name || !hashedName || index < 0) 364c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com return; 365c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com 366c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com TShHandleBase* base = static_cast<TShHandleBase*>(handle); 367c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com TCompiler* compiler = base->getAsCompiler(); 368c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com if (!compiler) return; 369c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com 370c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com const NameMap& nameMap = compiler->getNameMap(); 371c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com if (index >= static_cast<int>(nameMap.size())) 372c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com return; 373c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com 374c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com NameMap::const_iterator it = nameMap.begin(); 375c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com for (int i = 0; i < index; ++i) 376c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com ++it; 377c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com 378c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com size_t len = it->first.length() + 1; 379d64b3dab06c30da1e5dd9ba12667ff86388540e2shannon.woods@transgaming.com size_t max_len = 0; 380c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com ShGetInfo(handle, SH_NAME_MAX_LENGTH, &max_len); 381d64b3dab06c30da1e5dd9ba12667ff86388540e2shannon.woods@transgaming.com if (len > max_len) { 382c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com ASSERT(false); 383c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com len = max_len; 384c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com } 385c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com strncpy(name, it->first.c_str(), len); 386c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com // To be on the safe side in case the source is longer than expected. 38775cb689bcfa026644949bf4e46f77bd7006d4d7bdaniel@transgaming.com name[len - 1] = '\0'; 388c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com 389c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com len = it->second.length() + 1; 390c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com max_len = 0; 391c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com ShGetInfo(handle, SH_HASHED_NAME_MAX_LENGTH, &max_len); 392d64b3dab06c30da1e5dd9ba12667ff86388540e2shannon.woods@transgaming.com if (len > max_len) { 393c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com ASSERT(false); 394c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com len = max_len; 395c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com } 396c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com strncpy(hashedName, it->second.c_str(), len); 397c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com // To be on the safe side in case the source is longer than expected. 39875cb689bcfa026644949bf4e46f77bd7006d4d7bdaniel@transgaming.com hashedName[len - 1] = '\0'; 399c23f4611be61bccdbfe2a5c43f63c4d98537ef9fdaniel@transgaming.com} 400043da138a767ebdf9b4fff83b654f4bfb43ac4f2daniel@transgaming.com 401043da138a767ebdf9b4fff83b654f4bfb43ac4f2daniel@transgaming.comvoid ShGetInfoPointer(const ShHandle handle, ShShaderInfo pname, void** params) 402043da138a767ebdf9b4fff83b654f4bfb43ac4f2daniel@transgaming.com{ 403043da138a767ebdf9b4fff83b654f4bfb43ac4f2daniel@transgaming.com if (!handle || !params) 404043da138a767ebdf9b4fff83b654f4bfb43ac4f2daniel@transgaming.com return; 405043da138a767ebdf9b4fff83b654f4bfb43ac4f2daniel@transgaming.com 406043da138a767ebdf9b4fff83b654f4bfb43ac4f2daniel@transgaming.com TShHandleBase* base = static_cast<TShHandleBase*>(handle); 407043da138a767ebdf9b4fff83b654f4bfb43ac4f2daniel@transgaming.com TranslatorHLSL* translator = base->getAsTranslatorHLSL(); 408043da138a767ebdf9b4fff83b654f4bfb43ac4f2daniel@transgaming.com if (!translator) return; 409043da138a767ebdf9b4fff83b654f4bfb43ac4f2daniel@transgaming.com 410043da138a767ebdf9b4fff83b654f4bfb43ac4f2daniel@transgaming.com switch(pname) 411043da138a767ebdf9b4fff83b654f4bfb43ac4f2daniel@transgaming.com { 412043da138a767ebdf9b4fff83b654f4bfb43ac4f2daniel@transgaming.com case SH_ACTIVE_UNIFORMS_ARRAY: 413043da138a767ebdf9b4fff83b654f4bfb43ac4f2daniel@transgaming.com *params = (void*)&translator->getUniforms(); 414043da138a767ebdf9b4fff83b654f4bfb43ac4f2daniel@transgaming.com break; 4153f68bf0e3bf6bb76fdfb708218ef687097a9e731shannonwoods@chromium.org case SH_ACTIVE_INTERFACE_BLOCKS_ARRAY: 4163f68bf0e3bf6bb76fdfb708218ef687097a9e731shannonwoods@chromium.org *params = (void*)&translator->getInterfaceBlocks(); 4173f68bf0e3bf6bb76fdfb708218ef687097a9e731shannonwoods@chromium.org break; 41846131a3832c3478c1e0b48dbf6284799f3f86f04Jamie Madill case SH_ACTIVE_OUTPUT_VARIABLES_ARRAY: 41946131a3832c3478c1e0b48dbf6284799f3f86f04Jamie Madill *params = (void*)&translator->getOutputVariables(); 42046131a3832c3478c1e0b48dbf6284799f3f86f04Jamie Madill break; 421defb674aade4162d900a6f64abdebbb4f2256db1Jamie Madill case SH_ACTIVE_ATTRIBUTES_ARRAY: 422defb674aade4162d900a6f64abdebbb4f2256db1Jamie Madill *params = (void*)&translator->getAttributes(); 423defb674aade4162d900a6f64abdebbb4f2256db1Jamie Madill break; 42447fdd13e7c0ffa0a9c452a8659392b882ffbacccJamie Madill case SH_ACTIVE_VARYINGS_ARRAY: 42547fdd13e7c0ffa0a9c452a8659392b882ffbacccJamie Madill *params = (void*)&translator->getVaryings(); 42647fdd13e7c0ffa0a9c452a8659392b882ffbacccJamie Madill break; 427043da138a767ebdf9b4fff83b654f4bfb43ac4f2daniel@transgaming.com default: UNREACHABLE(); 428043da138a767ebdf9b4fff83b654f4bfb43ac4f2daniel@transgaming.com } 4291d432bb570bd175c3cdc51629a386e324e98b95bshannon.woods@transgaming.com} 430a15f3e84bfc96b9ef97dd10150f8811adcbbdebfZhenyao Mo 431a15f3e84bfc96b9ef97dd10150f8811adcbbdebfZhenyao Moint ShCheckVariablesWithinPackingLimits( 432a15f3e84bfc96b9ef97dd10150f8811adcbbdebfZhenyao Mo int maxVectors, ShVariableInfo* varInfoArray, size_t varInfoArraySize) 433a15f3e84bfc96b9ef97dd10150f8811adcbbdebfZhenyao Mo{ 434a15f3e84bfc96b9ef97dd10150f8811adcbbdebfZhenyao Mo if (varInfoArraySize == 0) 435a15f3e84bfc96b9ef97dd10150f8811adcbbdebfZhenyao Mo return 1; 436a15f3e84bfc96b9ef97dd10150f8811adcbbdebfZhenyao Mo ASSERT(varInfoArray); 437a15f3e84bfc96b9ef97dd10150f8811adcbbdebfZhenyao Mo TVariableInfoList variables; 438a15f3e84bfc96b9ef97dd10150f8811adcbbdebfZhenyao Mo for (size_t ii = 0; ii < varInfoArraySize; ++ii) 439a15f3e84bfc96b9ef97dd10150f8811adcbbdebfZhenyao Mo { 440a15f3e84bfc96b9ef97dd10150f8811adcbbdebfZhenyao Mo TVariableInfo var(varInfoArray[ii].type, varInfoArray[ii].size); 441a15f3e84bfc96b9ef97dd10150f8811adcbbdebfZhenyao Mo variables.push_back(var); 442a15f3e84bfc96b9ef97dd10150f8811adcbbdebfZhenyao Mo } 443a15f3e84bfc96b9ef97dd10150f8811adcbbdebfZhenyao Mo VariablePacker packer; 444a15f3e84bfc96b9ef97dd10150f8811adcbbdebfZhenyao Mo return packer.CheckVariablesWithinPackingLimits(maxVectors, variables) ? 1 : 0; 445a15f3e84bfc96b9ef97dd10150f8811adcbbdebfZhenyao Mo} 446