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