blob: 7c6c173d35be3b39ff306a86fb207fb7e30c7459 [file] [log] [blame]
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001//
shannon.woods%transgaming.com@gtempaccount.com0bbed382013-04-13 03:38:07 +00002// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7//
alokp@chromium.org774d7062010-07-21 18:55:45 +00008// Implement the top-level of interface to the compiler,
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009// as defined in ShaderLang.h
10//
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000011
alokp@chromium.orgea0e1af2010-03-22 19:33:14 +000012#include "GLSLANG/ShaderLang.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000013
Jamie Madilld4a3a312014-06-25 16:04:56 -040014#include "compiler/translator/Compiler.h"
Geoff Lang17732822013-08-29 13:46:49 -040015#include "compiler/translator/InitializeDll.h"
Jamie Madill5508f392014-02-20 13:31:36 -050016#include "compiler/translator/length_limits.h"
Geoff Lang17732822013-08-29 13:46:49 -040017#include "compiler/translator/TranslatorHLSL.h"
18#include "compiler/translator/VariablePacker.h"
Jamie Madilla718c1e2014-07-02 15:31:22 -040019#include "angle_gl.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000020
Jamie Madillb4d192c2014-02-26 09:54:10 -050021static bool isInitialized = false;
22
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000023//
24// This is the platform independent interface between an OGL driver
alokp@chromium.org774d7062010-07-21 18:55:45 +000025// and the shading language compiler.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000026//
27
Zhenyao Mo74da9f22013-09-23 14:57:01 -040028static bool checkVariableMaxLengths(const ShHandle handle,
29 size_t expectedValue)
alokp@chromium.orgee76f6a2010-09-27 19:28:55 +000030{
shannon.woods@transgaming.comd64b3da2013-02-28 23:19:26 +000031 size_t activeUniformLimit = 0;
kbr@chromium.org22152112011-10-26 01:18:28 +000032 ShGetInfo(handle, SH_ACTIVE_UNIFORM_MAX_LENGTH, &activeUniformLimit);
shannon.woods@transgaming.comd64b3da2013-02-28 23:19:26 +000033 size_t activeAttribLimit = 0;
kbr@chromium.org22152112011-10-26 01:18:28 +000034 ShGetInfo(handle, SH_ACTIVE_ATTRIBUTE_MAX_LENGTH, &activeAttribLimit);
Zhenyao Mo74da9f22013-09-23 14:57:01 -040035 size_t varyingLimit = 0;
36 ShGetInfo(handle, SH_VARYING_MAX_LENGTH, &varyingLimit);
37 return (expectedValue == activeUniformLimit &&
38 expectedValue == activeAttribLimit &&
39 expectedValue == varyingLimit);
kbr@chromium.org22152112011-10-26 01:18:28 +000040}
41
shannon.woods@transgaming.comd64b3da2013-02-28 23:19:26 +000042static bool checkMappedNameMaxLength(const ShHandle handle, size_t expectedValue)
kbr@chromium.org22152112011-10-26 01:18:28 +000043{
shannon.woods@transgaming.comd64b3da2013-02-28 23:19:26 +000044 size_t mappedNameMaxLength = 0;
kbr@chromium.org22152112011-10-26 01:18:28 +000045 ShGetInfo(handle, SH_MAPPED_NAME_MAX_LENGTH, &mappedNameMaxLength);
46 return (expectedValue == mappedNameMaxLength);
alokp@chromium.orgee76f6a2010-09-27 19:28:55 +000047}
48
Jamie Madilla718c1e2014-07-02 15:31:22 -040049template <typename VarT>
50static const sh::ShaderVariable *ReturnVariable(const std::vector<VarT> &infoList, int index)
51{
52 if (index < 0 || static_cast<size_t>(index) >= infoList.size())
53 {
54 return NULL;
55 }
56
57 return &infoList[index];
58}
59
60static const sh::ShaderVariable *GetVariable(const TCompiler *compiler, ShShaderInfo varType, int index)
61{
62 switch (varType)
63 {
64 case SH_ACTIVE_ATTRIBUTES:
Jamie Madilled27c722014-07-02 15:31:23 -040065 return ReturnVariable(compiler->getAttributes(), index);
Jamie Madilla718c1e2014-07-02 15:31:22 -040066 case SH_ACTIVE_UNIFORMS:
67 return ReturnVariable(compiler->getUniforms(), index);
68 case SH_VARYINGS:
69 return ReturnVariable(compiler->getVaryings(), index);
70 default:
71 UNREACHABLE();
72 return NULL;
73 }
74}
75
76static ShPrecisionType ConvertPrecision(sh::GLenum precision)
77{
78 switch (precision)
79 {
80 case GL_HIGH_FLOAT:
81 case GL_HIGH_INT:
82 return SH_PRECISION_HIGHP;
83 case GL_MEDIUM_FLOAT:
84 case GL_MEDIUM_INT:
Jamie Madill1da63af2014-07-03 15:00:53 -040085 return SH_PRECISION_MEDIUMP;
Jamie Madilla718c1e2014-07-02 15:31:22 -040086 case GL_LOW_FLOAT:
87 case GL_LOW_INT:
Jamie Madill1da63af2014-07-03 15:00:53 -040088 return SH_PRECISION_LOWP;
Jamie Madilla718c1e2014-07-02 15:31:22 -040089 default:
Jamie Madilla718c1e2014-07-02 15:31:22 -040090 return SH_PRECISION_UNDEFINED;
91 }
92}
93
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000094//
Alok Priyadarshib11713f2013-08-01 16:02:39 -070095// Driver must call this first, once, before doing any other compiler operations.
96// Subsequent calls to this function are no-op.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000097//
98int ShInitialize()
99{
Jamie Madill477bc782014-02-26 09:54:17 -0500100 if (!isInitialized)
101 {
102 isInitialized = InitProcess();
103 }
Jamie Madillb4d192c2014-02-26 09:54:10 -0500104 return isInitialized ? 1 : 0;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000105}
106
107//
alokp@chromium.org94a86ad2010-08-25 20:02:11 +0000108// Cleanup symbol tables
109//
110int ShFinalize()
111{
Geoff Langf20f0202014-04-28 11:02:07 -0400112 if (isInitialized)
113 {
114 DetachProcess();
115 isInitialized = false;
116 }
alokp@chromium.org94a86ad2010-08-25 20:02:11 +0000117 return 1;
118}
119
120//
121// Initialize built-in resources with minimum expected values.
122//
alokp@chromium.org4888ceb2010-10-01 21:13:12 +0000123void ShInitBuiltInResources(ShBuiltInResources* resources)
alokp@chromium.org94a86ad2010-08-25 20:02:11 +0000124{
125 // Constants.
126 resources->MaxVertexAttribs = 8;
127 resources->MaxVertexUniformVectors = 128;
128 resources->MaxVaryingVectors = 8;
129 resources->MaxVertexTextureImageUnits = 0;
130 resources->MaxCombinedTextureImageUnits = 8;
131 resources->MaxTextureImageUnits = 8;
132 resources->MaxFragmentUniformVectors = 16;
133 resources->MaxDrawBuffers = 1;
134
135 // Extensions.
136 resources->OES_standard_derivatives = 0;
zmo@google.com09c323a2011-08-12 18:22:25 +0000137 resources->OES_EGL_image_external = 0;
kbr@chromium.org205fef32011-11-22 20:50:02 +0000138 resources->ARB_texture_rectangle = 0;
shannon.woods@transgaming.com550cd092013-02-28 23:19:54 +0000139 resources->EXT_draw_buffers = 0;
Jamie Madill2aeb26a2013-07-08 14:02:55 -0400140 resources->EXT_frag_depth = 0;
Nicolas Capens46485082014-04-15 13:12:50 -0400141 resources->EXT_shader_texture_lod = 0;
daniel@transgaming.comc23f4612012-11-28 19:42:57 +0000142
shannon.woods%transgaming.com@gtempaccount.comcbb6b6a2013-04-13 03:27:47 +0000143 // Disable highp precision in fragment shader by default.
144 resources->FragmentPrecisionHigh = 0;
145
shannonwoods@chromium.org74b86cf2013-05-30 00:02:58 +0000146 // GLSL ES 3.0 constants.
147 resources->MaxVertexOutputVectors = 16;
148 resources->MaxFragmentInputVectors = 15;
149 resources->MinProgramTexelOffset = -8;
150 resources->MaxProgramTexelOffset = 7;
151
daniel@transgaming.comc23f4612012-11-28 19:42:57 +0000152 // Disable name hashing by default.
153 resources->HashFunction = NULL;
shannon.woods@transgaming.com1d432bb2013-01-25 21:57:28 +0000154
155 resources->ArrayIndexClampingStrategy = SH_CLAMP_WITH_CLAMP_INTRINSIC;
Nicolas Capens7d649a02014-02-07 11:24:32 -0500156
157 resources->MaxExpressionComplexity = 256;
158 resources->MaxCallStackDepth = 256;
alokp@chromium.org94a86ad2010-08-25 20:02:11 +0000159}
160
161//
alokp@chromium.org774d7062010-07-21 18:55:45 +0000162// Driver calls these to create and destroy compiler objects.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000163//
Jamie Madill183bde52014-07-02 15:31:19 -0400164ShHandle ShConstructCompiler(sh::GLenum type, ShShaderSpec spec,
zmo@google.com5601ea02011-06-10 18:23:25 +0000165 ShShaderOutput output,
alokp@chromium.org4888ceb2010-10-01 21:13:12 +0000166 const ShBuiltInResources* resources)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000167{
zmo@google.com5601ea02011-06-10 18:23:25 +0000168 TShHandleBase* base = static_cast<TShHandleBase*>(ConstructCompiler(type, spec, output));
alokp@chromium.orge4249f02010-07-26 18:13:52 +0000169 TCompiler* compiler = base->getAsCompiler();
170 if (compiler == 0)
171 return 0;
172
173 // Generate built-in symbol table.
alokp@chromium.org07620a52010-09-23 17:53:56 +0000174 if (!compiler->Init(*resources)) {
alokp@chromium.orge4249f02010-07-26 18:13:52 +0000175 ShDestruct(base);
176 return 0;
177 }
178
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000179 return reinterpret_cast<void*>(base);
180}
181
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000182void ShDestruct(ShHandle handle)
183{
184 if (handle == 0)
185 return;
186
187 TShHandleBase* base = static_cast<TShHandleBase*>(handle);
188
189 if (base->getAsCompiler())
190 DeleteCompiler(base->getAsCompiler());
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000191}
192
Shannon Woods2d76e5f2014-05-16 17:46:41 -0400193void ShGetBuiltInResourcesString(const ShHandle handle, size_t outStringLen, char *outString)
194{
195 if (!handle || !outString)
196 {
197 return;
198 }
199
200 TShHandleBase *base = static_cast<TShHandleBase*>(handle);
201 TCompiler *compiler = base->getAsCompiler();
202 if (!compiler)
203 {
204 return;
205 }
206
207 strncpy(outString, compiler->getBuiltInResourcesString().c_str(), outStringLen);
208 outString[outStringLen - 1] = '\0';
209}
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000210//
Shannon Woods2d76e5f2014-05-16 17:46:41 -0400211// Do an actual compile on the given strings. The result is left
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000212// in the given compile object.
213//
214// Return: The return value of ShCompile is really boolean, indicating
215// success or failure.
216//
217int ShCompile(
218 const ShHandle handle,
219 const char* const shaderStrings[],
shannon.woods@transgaming.comd64b3da2013-02-28 23:19:26 +0000220 size_t numStrings,
alokp@chromium.org7beea402010-09-15 21:18:34 +0000221 int compileOptions)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000222{
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000223 if (handle == 0)
224 return 0;
225
226 TShHandleBase* base = reinterpret_cast<TShHandleBase*>(handle);
227 TCompiler* compiler = base->getAsCompiler();
228 if (compiler == 0)
229 return 0;
alokp@chromium.org07620a52010-09-23 17:53:56 +0000230
alokp@chromium.org07620a52010-09-23 17:53:56 +0000231 bool success = compiler->compile(shaderStrings, numStrings, compileOptions);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000232 return success ? 1 : 0;
233}
234
shannon.woods@transgaming.comd64b3da2013-02-28 23:19:26 +0000235void ShGetInfo(const ShHandle handle, ShShaderInfo pname, size_t* params)
alokp@chromium.org7beea402010-09-15 21:18:34 +0000236{
237 if (!handle || !params)
238 return;
239
240 TShHandleBase* base = static_cast<TShHandleBase*>(handle);
241 TCompiler* compiler = base->getAsCompiler();
242 if (!compiler) return;
243
244 switch(pname)
245 {
246 case SH_INFO_LOG_LENGTH:
247 *params = compiler->getInfoSink().info.size() + 1;
248 break;
249 case SH_OBJECT_CODE_LENGTH:
250 *params = compiler->getInfoSink().obj.size() + 1;
251 break;
252 case SH_ACTIVE_UNIFORMS:
alokp@chromium.orgee76f6a2010-09-27 19:28:55 +0000253 *params = compiler->getUniforms().size();
alokp@chromium.org7beea402010-09-15 21:18:34 +0000254 break;
255 case SH_ACTIVE_UNIFORM_MAX_LENGTH:
Zhenyao Mo7faf1a12014-04-25 18:03:56 -0700256 *params = 1 + GetGlobalMaxTokenSize(compiler->getShaderSpec());
alokp@chromium.org7beea402010-09-15 21:18:34 +0000257 break;
258 case SH_ACTIVE_ATTRIBUTES:
Jamie Madilled27c722014-07-02 15:31:23 -0400259 *params = compiler->getAttributes().size();
alokp@chromium.org7beea402010-09-15 21:18:34 +0000260 break;
261 case SH_ACTIVE_ATTRIBUTE_MAX_LENGTH:
Zhenyao Mo7faf1a12014-04-25 18:03:56 -0700262 *params = 1 + GetGlobalMaxTokenSize(compiler->getShaderSpec());
alokp@chromium.org7beea402010-09-15 21:18:34 +0000263 break;
Zhenyao Mo74da9f22013-09-23 14:57:01 -0400264 case SH_VARYINGS:
265 *params = compiler->getVaryings().size();
266 break;
267 case SH_VARYING_MAX_LENGTH:
Zhenyao Mo7faf1a12014-04-25 18:03:56 -0700268 *params = 1 + GetGlobalMaxTokenSize(compiler->getShaderSpec());
Zhenyao Mo74da9f22013-09-23 14:57:01 -0400269 break;
zmo@google.comfd747b82011-04-23 01:30:07 +0000270 case SH_MAPPED_NAME_MAX_LENGTH:
kbr@chromium.org22152112011-10-26 01:18:28 +0000271 // Use longer length than MAX_SHORTENED_IDENTIFIER_SIZE to
272 // handle array and struct dereferences.
Zhenyao Mo7faf1a12014-04-25 18:03:56 -0700273 *params = 1 + GetGlobalMaxTokenSize(compiler->getShaderSpec());
zmo@google.comfd747b82011-04-23 01:30:07 +0000274 break;
daniel@transgaming.comc23f4612012-11-28 19:42:57 +0000275 case SH_NAME_MAX_LENGTH:
Zhenyao Mo7faf1a12014-04-25 18:03:56 -0700276 *params = 1 + GetGlobalMaxTokenSize(compiler->getShaderSpec());
daniel@transgaming.comc23f4612012-11-28 19:42:57 +0000277 break;
278 case SH_HASHED_NAME_MAX_LENGTH:
279 if (compiler->getHashFunction() == NULL) {
280 *params = 0;
281 } else {
282 // 64 bits hashing output requires 16 bytes for hex
283 // representation.
284 const char HashedNamePrefix[] = HASHED_NAME_PREFIX;
Geoff Langcebb5aa2014-04-07 14:13:40 -0400285 (void)HashedNamePrefix;
daniel@transgaming.comc23f4612012-11-28 19:42:57 +0000286 *params = 16 + sizeof(HashedNamePrefix);
287 }
288 break;
289 case SH_HASHED_NAMES_COUNT:
290 *params = compiler->getNameMap().size();
291 break;
shannon.woods%transgaming.com@gtempaccount.com0bbed382013-04-13 03:38:07 +0000292 case SH_SHADER_VERSION:
293 *params = compiler->getShaderVersion();
294 break;
Shannon Woods2d76e5f2014-05-16 17:46:41 -0400295 case SH_RESOURCES_STRING_LENGTH:
296 *params = compiler->getBuiltInResourcesString().length() + 1;
297 break;
Jamie Madill68fe74a2014-05-27 12:56:01 -0400298 case SH_OUTPUT_TYPE:
299 *params = compiler->getOutputType();
300 break;
alokp@chromium.org7beea402010-09-15 21:18:34 +0000301 default: UNREACHABLE();
302 }
303}
304
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000305//
alokp@chromium.org774d7062010-07-21 18:55:45 +0000306// Return any compiler log of messages for the application.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000307//
alokp@chromium.org7beea402010-09-15 21:18:34 +0000308void ShGetInfoLog(const ShHandle handle, char* infoLog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000309{
alokp@chromium.org7beea402010-09-15 21:18:34 +0000310 if (!handle || !infoLog)
311 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000312
313 TShHandleBase* base = static_cast<TShHandleBase*>(handle);
alokp@chromium.org7beea402010-09-15 21:18:34 +0000314 TCompiler* compiler = base->getAsCompiler();
315 if (!compiler) return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000316
alokp@chromium.org7beea402010-09-15 21:18:34 +0000317 TInfoSink& infoSink = compiler->getInfoSink();
318 strcpy(infoLog, infoSink.info.c_str());
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000319}
320
321//
alokp@chromium.org774d7062010-07-21 18:55:45 +0000322// Return any object code.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000323//
alokp@chromium.org7beea402010-09-15 21:18:34 +0000324void ShGetObjectCode(const ShHandle handle, char* objCode)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000325{
alokp@chromium.org7beea402010-09-15 21:18:34 +0000326 if (!handle || !objCode)
327 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000328
329 TShHandleBase* base = static_cast<TShHandleBase*>(handle);
alokp@chromium.org7beea402010-09-15 21:18:34 +0000330 TCompiler* compiler = base->getAsCompiler();
331 if (!compiler) return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000332
alokp@chromium.org7beea402010-09-15 21:18:34 +0000333 TInfoSink& infoSink = compiler->getInfoSink();
334 strcpy(objCode, infoSink.obj.c_str());
335}
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000336
Zhenyao Mo74da9f22013-09-23 14:57:01 -0400337void ShGetVariableInfo(const ShHandle handle,
338 ShShaderInfo varType,
alokp@chromium.org7beea402010-09-15 21:18:34 +0000339 int index,
shannon.woods@transgaming.comd64b3da2013-02-28 23:19:26 +0000340 size_t* length,
alokp@chromium.org7beea402010-09-15 21:18:34 +0000341 int* size,
Jamie Madill183bde52014-07-02 15:31:19 -0400342 sh::GLenum* type,
Zhenyao Mo74da9f22013-09-23 14:57:01 -0400343 ShPrecisionType* precision,
Zhenyao Mod2d340b2013-09-23 14:57:05 -0400344 int* staticUse,
zmo@google.comfd747b82011-04-23 01:30:07 +0000345 char* name,
346 char* mappedName)
alokp@chromium.org7beea402010-09-15 21:18:34 +0000347{
Zhenyao Mod2d340b2013-09-23 14:57:05 -0400348 if (!handle || !size || !type || !precision || !staticUse || !name)
Zhenyao Mo74da9f22013-09-23 14:57:01 -0400349 return;
350 ASSERT((varType == SH_ACTIVE_ATTRIBUTES) ||
351 (varType == SH_ACTIVE_UNIFORMS) ||
352 (varType == SH_VARYINGS));
alokp@chromium.org7beea402010-09-15 21:18:34 +0000353
Zhenyao Mo74da9f22013-09-23 14:57:01 -0400354 TShHandleBase* base = reinterpret_cast<TShHandleBase*>(handle);
355 TCompiler* compiler = base->getAsCompiler();
356 if (compiler == 0)
357 return;
358
Jamie Madilla718c1e2014-07-02 15:31:22 -0400359 const sh::ShaderVariable *varInfo = GetVariable(compiler, varType, index);
360 if (!varInfo)
361 {
Zhenyao Mo74da9f22013-09-23 14:57:01 -0400362 return;
Zhenyao Mo74da9f22013-09-23 14:57:01 -0400363 }
Jamie Madilla718c1e2014-07-02 15:31:22 -0400364
365 if (length) *length = varInfo->name.size();
366 *size = varInfo->elementCount();
367 *type = varInfo->type;
368 *precision = ConvertPrecision(varInfo->precision);
369 *staticUse = varInfo->staticUse ? 1 : 0;
Zhenyao Mo74da9f22013-09-23 14:57:01 -0400370
371 // This size must match that queried by
372 // SH_ACTIVE_UNIFORM_MAX_LENGTH, SH_ACTIVE_ATTRIBUTE_MAX_LENGTH, SH_VARYING_MAX_LENGTH
373 // in ShGetInfo, below.
Zhenyao Mo7faf1a12014-04-25 18:03:56 -0700374 size_t variableLength = 1 + GetGlobalMaxTokenSize(compiler->getShaderSpec());
Zhenyao Mo74da9f22013-09-23 14:57:01 -0400375 ASSERT(checkVariableMaxLengths(handle, variableLength));
Jamie Madilla718c1e2014-07-02 15:31:22 -0400376 strncpy(name, varInfo->name.c_str(), variableLength);
Zhenyao Mo74da9f22013-09-23 14:57:01 -0400377 name[variableLength - 1] = 0;
Jamie Madilla718c1e2014-07-02 15:31:22 -0400378 if (mappedName)
379 {
Zhenyao Mo74da9f22013-09-23 14:57:01 -0400380 // This size must match that queried by
381 // SH_MAPPED_NAME_MAX_LENGTH in ShGetInfo, below.
Zhenyao Mo7faf1a12014-04-25 18:03:56 -0700382 size_t maxMappedNameLength = 1 + GetGlobalMaxTokenSize(compiler->getShaderSpec());
Zhenyao Mo74da9f22013-09-23 14:57:01 -0400383 ASSERT(checkMappedNameMaxLength(handle, maxMappedNameLength));
Jamie Madilla718c1e2014-07-02 15:31:22 -0400384 strncpy(mappedName, varInfo->mappedName.c_str(), maxMappedNameLength);
Zhenyao Mo74da9f22013-09-23 14:57:01 -0400385 mappedName[maxMappedNameLength - 1] = 0;
386 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000387}
daniel@transgaming.comc23f4612012-11-28 19:42:57 +0000388
389void ShGetNameHashingEntry(const ShHandle handle,
390 int index,
391 char* name,
392 char* hashedName)
393{
394 if (!handle || !name || !hashedName || index < 0)
395 return;
396
397 TShHandleBase* base = static_cast<TShHandleBase*>(handle);
398 TCompiler* compiler = base->getAsCompiler();
399 if (!compiler) return;
400
401 const NameMap& nameMap = compiler->getNameMap();
402 if (index >= static_cast<int>(nameMap.size()))
403 return;
404
405 NameMap::const_iterator it = nameMap.begin();
406 for (int i = 0; i < index; ++i)
407 ++it;
408
409 size_t len = it->first.length() + 1;
shannon.woods@transgaming.comd64b3da2013-02-28 23:19:26 +0000410 size_t max_len = 0;
daniel@transgaming.comc23f4612012-11-28 19:42:57 +0000411 ShGetInfo(handle, SH_NAME_MAX_LENGTH, &max_len);
shannon.woods@transgaming.comd64b3da2013-02-28 23:19:26 +0000412 if (len > max_len) {
daniel@transgaming.comc23f4612012-11-28 19:42:57 +0000413 ASSERT(false);
414 len = max_len;
415 }
416 strncpy(name, it->first.c_str(), len);
417 // To be on the safe side in case the source is longer than expected.
daniel@transgaming.com75cb6892013-02-01 03:20:26 +0000418 name[len - 1] = '\0';
daniel@transgaming.comc23f4612012-11-28 19:42:57 +0000419
420 len = it->second.length() + 1;
421 max_len = 0;
422 ShGetInfo(handle, SH_HASHED_NAME_MAX_LENGTH, &max_len);
shannon.woods@transgaming.comd64b3da2013-02-28 23:19:26 +0000423 if (len > max_len) {
daniel@transgaming.comc23f4612012-11-28 19:42:57 +0000424 ASSERT(false);
425 len = max_len;
426 }
427 strncpy(hashedName, it->second.c_str(), len);
428 // To be on the safe side in case the source is longer than expected.
daniel@transgaming.com75cb6892013-02-01 03:20:26 +0000429 hashedName[len - 1] = '\0';
daniel@transgaming.comc23f4612012-11-28 19:42:57 +0000430}
daniel@transgaming.com043da132012-12-20 21:12:22 +0000431
432void ShGetInfoPointer(const ShHandle handle, ShShaderInfo pname, void** params)
433{
434 if (!handle || !params)
435 return;
436
437 TShHandleBase* base = static_cast<TShHandleBase*>(handle);
438 TranslatorHLSL* translator = base->getAsTranslatorHLSL();
439 if (!translator) return;
440
441 switch(pname)
442 {
443 case SH_ACTIVE_UNIFORMS_ARRAY:
444 *params = (void*)&translator->getUniforms();
445 break;
shannonwoods@chromium.org3f68bf02013-05-30 00:12:43 +0000446 case SH_ACTIVE_INTERFACE_BLOCKS_ARRAY:
447 *params = (void*)&translator->getInterfaceBlocks();
448 break;
Jamie Madill46131a32013-06-20 11:55:50 -0400449 case SH_ACTIVE_OUTPUT_VARIABLES_ARRAY:
450 *params = (void*)&translator->getOutputVariables();
451 break;
Jamie Madilldefb6742013-06-20 11:55:51 -0400452 case SH_ACTIVE_ATTRIBUTES_ARRAY:
453 *params = (void*)&translator->getAttributes();
454 break;
Jamie Madill47fdd132013-08-30 13:21:04 -0400455 case SH_ACTIVE_VARYINGS_ARRAY:
456 *params = (void*)&translator->getVaryings();
457 break;
daniel@transgaming.com043da132012-12-20 21:12:22 +0000458 default: UNREACHABLE();
459 }
shannon.woods@transgaming.com1d432bb2013-01-25 21:57:28 +0000460}
Zhenyao Moa15f3e82013-09-23 14:57:08 -0400461
462int ShCheckVariablesWithinPackingLimits(
463 int maxVectors, ShVariableInfo* varInfoArray, size_t varInfoArraySize)
464{
465 if (varInfoArraySize == 0)
466 return 1;
467 ASSERT(varInfoArray);
Jamie Madilla718c1e2014-07-02 15:31:22 -0400468 std::vector<sh::ShaderVariable> variables;
Zhenyao Moa15f3e82013-09-23 14:57:08 -0400469 for (size_t ii = 0; ii < varInfoArraySize; ++ii)
470 {
Jamie Madilla718c1e2014-07-02 15:31:22 -0400471 sh::ShaderVariable var(varInfoArray[ii].type, (sh::GLenum)0, "", varInfoArray[ii].size);
Zhenyao Moa15f3e82013-09-23 14:57:08 -0400472 variables.push_back(var);
473 }
474 VariablePacker packer;
475 return packer.CheckVariablesWithinPackingLimits(maxVectors, variables) ? 1 : 0;
476}