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