blob: 07bd46493d99ff7489df209d24f74791c67f14f8 [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
Geoff Lang17732822013-08-29 13:46:49 -040014#include "compiler/translator/InitializeDll.h"
Jamie Madill5508f392014-02-20 13:31:36 -050015#include "compiler/translator/length_limits.h"
Geoff Lang17732822013-08-29 13:46:49 -040016#include "compiler/translator/ShHandle.h"
17#include "compiler/translator/TranslatorHLSL.h"
18#include "compiler/translator/VariablePacker.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000019
Jamie Madillb4d192c2014-02-26 09:54:10 -050020static bool isInitialized = false;
21
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000022//
23// This is the platform independent interface between an OGL driver
alokp@chromium.org774d7062010-07-21 18:55:45 +000024// and the shading language compiler.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000025//
26
Zhenyao Mo74da9f22013-09-23 14:57:01 -040027static bool checkVariableMaxLengths(const ShHandle handle,
28 size_t expectedValue)
alokp@chromium.orgee76f6a2010-09-27 19:28:55 +000029{
shannon.woods@transgaming.comd64b3da2013-02-28 23:19:26 +000030 size_t activeUniformLimit = 0;
kbr@chromium.org22152112011-10-26 01:18:28 +000031 ShGetInfo(handle, SH_ACTIVE_UNIFORM_MAX_LENGTH, &activeUniformLimit);
shannon.woods@transgaming.comd64b3da2013-02-28 23:19:26 +000032 size_t activeAttribLimit = 0;
kbr@chromium.org22152112011-10-26 01:18:28 +000033 ShGetInfo(handle, SH_ACTIVE_ATTRIBUTE_MAX_LENGTH, &activeAttribLimit);
Zhenyao Mo74da9f22013-09-23 14:57:01 -040034 size_t varyingLimit = 0;
35 ShGetInfo(handle, SH_VARYING_MAX_LENGTH, &varyingLimit);
36 return (expectedValue == activeUniformLimit &&
37 expectedValue == activeAttribLimit &&
38 expectedValue == varyingLimit);
kbr@chromium.org22152112011-10-26 01:18:28 +000039}
40
shannon.woods@transgaming.comd64b3da2013-02-28 23:19:26 +000041static bool checkMappedNameMaxLength(const ShHandle handle, size_t expectedValue)
kbr@chromium.org22152112011-10-26 01:18:28 +000042{
shannon.woods@transgaming.comd64b3da2013-02-28 23:19:26 +000043 size_t mappedNameMaxLength = 0;
kbr@chromium.org22152112011-10-26 01:18:28 +000044 ShGetInfo(handle, SH_MAPPED_NAME_MAX_LENGTH, &mappedNameMaxLength);
45 return (expectedValue == mappedNameMaxLength);
alokp@chromium.orgee76f6a2010-09-27 19:28:55 +000046}
47
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000048//
Alok Priyadarshib11713f2013-08-01 16:02:39 -070049// Driver must call this first, once, before doing any other compiler operations.
50// Subsequent calls to this function are no-op.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000051//
52int ShInitialize()
53{
Jamie Madill477bc782014-02-26 09:54:17 -050054 if (!isInitialized)
55 {
56 isInitialized = InitProcess();
57 }
Jamie Madillb4d192c2014-02-26 09:54:10 -050058 return isInitialized ? 1 : 0;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000059}
60
61//
alokp@chromium.org94a86ad2010-08-25 20:02:11 +000062// Cleanup symbol tables
63//
64int ShFinalize()
65{
Geoff Langf20f0202014-04-28 11:02:07 -040066 if (isInitialized)
67 {
68 DetachProcess();
69 isInitialized = false;
70 }
alokp@chromium.org94a86ad2010-08-25 20:02:11 +000071 return 1;
72}
73
74//
75// Initialize built-in resources with minimum expected values.
76//
alokp@chromium.org4888ceb2010-10-01 21:13:12 +000077void ShInitBuiltInResources(ShBuiltInResources* resources)
alokp@chromium.org94a86ad2010-08-25 20:02:11 +000078{
79 // Constants.
80 resources->MaxVertexAttribs = 8;
81 resources->MaxVertexUniformVectors = 128;
82 resources->MaxVaryingVectors = 8;
83 resources->MaxVertexTextureImageUnits = 0;
84 resources->MaxCombinedTextureImageUnits = 8;
85 resources->MaxTextureImageUnits = 8;
86 resources->MaxFragmentUniformVectors = 16;
87 resources->MaxDrawBuffers = 1;
88
89 // Extensions.
90 resources->OES_standard_derivatives = 0;
zmo@google.com09c323a2011-08-12 18:22:25 +000091 resources->OES_EGL_image_external = 0;
kbr@chromium.org205fef32011-11-22 20:50:02 +000092 resources->ARB_texture_rectangle = 0;
shannon.woods@transgaming.com550cd092013-02-28 23:19:54 +000093 resources->EXT_draw_buffers = 0;
Jamie Madill2aeb26a2013-07-08 14:02:55 -040094 resources->EXT_frag_depth = 0;
Nicolas Capens46485082014-04-15 13:12:50 -040095 resources->EXT_shader_texture_lod = 0;
daniel@transgaming.comc23f4612012-11-28 19:42:57 +000096
shannon.woods%transgaming.com@gtempaccount.comcbb6b6a2013-04-13 03:27:47 +000097 // Disable highp precision in fragment shader by default.
98 resources->FragmentPrecisionHigh = 0;
99
shannonwoods@chromium.org74b86cf2013-05-30 00:02:58 +0000100 // GLSL ES 3.0 constants.
101 resources->MaxVertexOutputVectors = 16;
102 resources->MaxFragmentInputVectors = 15;
103 resources->MinProgramTexelOffset = -8;
104 resources->MaxProgramTexelOffset = 7;
105
daniel@transgaming.comc23f4612012-11-28 19:42:57 +0000106 // Disable name hashing by default.
107 resources->HashFunction = NULL;
shannon.woods@transgaming.com1d432bb2013-01-25 21:57:28 +0000108
109 resources->ArrayIndexClampingStrategy = SH_CLAMP_WITH_CLAMP_INTRINSIC;
Nicolas Capens7d649a02014-02-07 11:24:32 -0500110
111 resources->MaxExpressionComplexity = 256;
112 resources->MaxCallStackDepth = 256;
alokp@chromium.org94a86ad2010-08-25 20:02:11 +0000113}
114
115//
alokp@chromium.org774d7062010-07-21 18:55:45 +0000116// Driver calls these to create and destroy compiler objects.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000117//
alokp@chromium.org4888ceb2010-10-01 21:13:12 +0000118ShHandle ShConstructCompiler(ShShaderType type, ShShaderSpec spec,
zmo@google.com5601ea02011-06-10 18:23:25 +0000119 ShShaderOutput output,
alokp@chromium.org4888ceb2010-10-01 21:13:12 +0000120 const ShBuiltInResources* resources)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000121{
zmo@google.com5601ea02011-06-10 18:23:25 +0000122 TShHandleBase* base = static_cast<TShHandleBase*>(ConstructCompiler(type, spec, output));
alokp@chromium.orge4249f02010-07-26 18:13:52 +0000123 TCompiler* compiler = base->getAsCompiler();
124 if (compiler == 0)
125 return 0;
126
127 // Generate built-in symbol table.
alokp@chromium.org07620a52010-09-23 17:53:56 +0000128 if (!compiler->Init(*resources)) {
alokp@chromium.orge4249f02010-07-26 18:13:52 +0000129 ShDestruct(base);
130 return 0;
131 }
132
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000133 return reinterpret_cast<void*>(base);
134}
135
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000136void ShDestruct(ShHandle handle)
137{
138 if (handle == 0)
139 return;
140
141 TShHandleBase* base = static_cast<TShHandleBase*>(handle);
142
143 if (base->getAsCompiler())
144 DeleteCompiler(base->getAsCompiler());
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000145}
146
Shannon Woods2d76e5f2014-05-16 17:46:41 -0400147void ShGetBuiltInResourcesString(const ShHandle handle, size_t outStringLen, char *outString)
148{
149 if (!handle || !outString)
150 {
151 return;
152 }
153
154 TShHandleBase *base = static_cast<TShHandleBase*>(handle);
155 TCompiler *compiler = base->getAsCompiler();
156 if (!compiler)
157 {
158 return;
159 }
160
161 strncpy(outString, compiler->getBuiltInResourcesString().c_str(), outStringLen);
162 outString[outStringLen - 1] = '\0';
163}
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000164//
Shannon Woods2d76e5f2014-05-16 17:46:41 -0400165// Do an actual compile on the given strings. The result is left
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000166// in the given compile object.
167//
168// Return: The return value of ShCompile is really boolean, indicating
169// success or failure.
170//
171int ShCompile(
172 const ShHandle handle,
173 const char* const shaderStrings[],
shannon.woods@transgaming.comd64b3da2013-02-28 23:19:26 +0000174 size_t numStrings,
alokp@chromium.org7beea402010-09-15 21:18:34 +0000175 int compileOptions)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000176{
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000177 if (handle == 0)
178 return 0;
179
180 TShHandleBase* base = reinterpret_cast<TShHandleBase*>(handle);
181 TCompiler* compiler = base->getAsCompiler();
182 if (compiler == 0)
183 return 0;
alokp@chromium.org07620a52010-09-23 17:53:56 +0000184
alokp@chromium.org07620a52010-09-23 17:53:56 +0000185 bool success = compiler->compile(shaderStrings, numStrings, compileOptions);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000186 return success ? 1 : 0;
187}
188
shannon.woods@transgaming.comd64b3da2013-02-28 23:19:26 +0000189void ShGetInfo(const ShHandle handle, ShShaderInfo pname, size_t* params)
alokp@chromium.org7beea402010-09-15 21:18:34 +0000190{
191 if (!handle || !params)
192 return;
193
194 TShHandleBase* base = static_cast<TShHandleBase*>(handle);
195 TCompiler* compiler = base->getAsCompiler();
196 if (!compiler) return;
197
198 switch(pname)
199 {
200 case SH_INFO_LOG_LENGTH:
201 *params = compiler->getInfoSink().info.size() + 1;
202 break;
203 case SH_OBJECT_CODE_LENGTH:
204 *params = compiler->getInfoSink().obj.size() + 1;
205 break;
206 case SH_ACTIVE_UNIFORMS:
alokp@chromium.orgee76f6a2010-09-27 19:28:55 +0000207 *params = compiler->getUniforms().size();
alokp@chromium.org7beea402010-09-15 21:18:34 +0000208 break;
209 case SH_ACTIVE_UNIFORM_MAX_LENGTH:
Zhenyao Mo7faf1a12014-04-25 18:03:56 -0700210 *params = 1 + GetGlobalMaxTokenSize(compiler->getShaderSpec());
alokp@chromium.org7beea402010-09-15 21:18:34 +0000211 break;
212 case SH_ACTIVE_ATTRIBUTES:
alokp@chromium.orgee76f6a2010-09-27 19:28:55 +0000213 *params = compiler->getAttribs().size();
alokp@chromium.org7beea402010-09-15 21:18:34 +0000214 break;
215 case SH_ACTIVE_ATTRIBUTE_MAX_LENGTH:
Zhenyao Mo7faf1a12014-04-25 18:03:56 -0700216 *params = 1 + GetGlobalMaxTokenSize(compiler->getShaderSpec());
alokp@chromium.org7beea402010-09-15 21:18:34 +0000217 break;
Zhenyao Mo74da9f22013-09-23 14:57:01 -0400218 case SH_VARYINGS:
219 *params = compiler->getVaryings().size();
220 break;
221 case SH_VARYING_MAX_LENGTH:
Zhenyao Mo7faf1a12014-04-25 18:03:56 -0700222 *params = 1 + GetGlobalMaxTokenSize(compiler->getShaderSpec());
Zhenyao Mo74da9f22013-09-23 14:57:01 -0400223 break;
zmo@google.comfd747b82011-04-23 01:30:07 +0000224 case SH_MAPPED_NAME_MAX_LENGTH:
kbr@chromium.org22152112011-10-26 01:18:28 +0000225 // Use longer length than MAX_SHORTENED_IDENTIFIER_SIZE to
226 // handle array and struct dereferences.
Zhenyao Mo7faf1a12014-04-25 18:03:56 -0700227 *params = 1 + GetGlobalMaxTokenSize(compiler->getShaderSpec());
zmo@google.comfd747b82011-04-23 01:30:07 +0000228 break;
daniel@transgaming.comc23f4612012-11-28 19:42:57 +0000229 case SH_NAME_MAX_LENGTH:
Zhenyao Mo7faf1a12014-04-25 18:03:56 -0700230 *params = 1 + GetGlobalMaxTokenSize(compiler->getShaderSpec());
daniel@transgaming.comc23f4612012-11-28 19:42:57 +0000231 break;
232 case SH_HASHED_NAME_MAX_LENGTH:
233 if (compiler->getHashFunction() == NULL) {
234 *params = 0;
235 } else {
236 // 64 bits hashing output requires 16 bytes for hex
237 // representation.
238 const char HashedNamePrefix[] = HASHED_NAME_PREFIX;
Geoff Langcebb5aa2014-04-07 14:13:40 -0400239 (void)HashedNamePrefix;
daniel@transgaming.comc23f4612012-11-28 19:42:57 +0000240 *params = 16 + sizeof(HashedNamePrefix);
241 }
242 break;
243 case SH_HASHED_NAMES_COUNT:
244 *params = compiler->getNameMap().size();
245 break;
shannon.woods%transgaming.com@gtempaccount.com0bbed382013-04-13 03:38:07 +0000246 case SH_SHADER_VERSION:
247 *params = compiler->getShaderVersion();
248 break;
Shannon Woods2d76e5f2014-05-16 17:46:41 -0400249 case SH_RESOURCES_STRING_LENGTH:
250 *params = compiler->getBuiltInResourcesString().length() + 1;
251 break;
alokp@chromium.org7beea402010-09-15 21:18:34 +0000252 default: UNREACHABLE();
253 }
254}
255
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000256//
alokp@chromium.org774d7062010-07-21 18:55:45 +0000257// Return any compiler log of messages for the application.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000258//
alokp@chromium.org7beea402010-09-15 21:18:34 +0000259void ShGetInfoLog(const ShHandle handle, char* infoLog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000260{
alokp@chromium.org7beea402010-09-15 21:18:34 +0000261 if (!handle || !infoLog)
262 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000263
264 TShHandleBase* base = static_cast<TShHandleBase*>(handle);
alokp@chromium.org7beea402010-09-15 21:18:34 +0000265 TCompiler* compiler = base->getAsCompiler();
266 if (!compiler) return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000267
alokp@chromium.org7beea402010-09-15 21:18:34 +0000268 TInfoSink& infoSink = compiler->getInfoSink();
269 strcpy(infoLog, infoSink.info.c_str());
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000270}
271
272//
alokp@chromium.org774d7062010-07-21 18:55:45 +0000273// Return any object code.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000274//
alokp@chromium.org7beea402010-09-15 21:18:34 +0000275void ShGetObjectCode(const ShHandle handle, char* objCode)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000276{
alokp@chromium.org7beea402010-09-15 21:18:34 +0000277 if (!handle || !objCode)
278 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000279
280 TShHandleBase* base = static_cast<TShHandleBase*>(handle);
alokp@chromium.org7beea402010-09-15 21:18:34 +0000281 TCompiler* compiler = base->getAsCompiler();
282 if (!compiler) return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000283
alokp@chromium.org7beea402010-09-15 21:18:34 +0000284 TInfoSink& infoSink = compiler->getInfoSink();
285 strcpy(objCode, infoSink.obj.c_str());
286}
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000287
Zhenyao Mo74da9f22013-09-23 14:57:01 -0400288void ShGetVariableInfo(const ShHandle handle,
289 ShShaderInfo varType,
alokp@chromium.org7beea402010-09-15 21:18:34 +0000290 int index,
shannon.woods@transgaming.comd64b3da2013-02-28 23:19:26 +0000291 size_t* length,
alokp@chromium.org7beea402010-09-15 21:18:34 +0000292 int* size,
alokp@chromium.org4888ceb2010-10-01 21:13:12 +0000293 ShDataType* type,
Zhenyao Mo74da9f22013-09-23 14:57:01 -0400294 ShPrecisionType* precision,
Zhenyao Mod2d340b2013-09-23 14:57:05 -0400295 int* staticUse,
zmo@google.comfd747b82011-04-23 01:30:07 +0000296 char* name,
297 char* mappedName)
alokp@chromium.org7beea402010-09-15 21:18:34 +0000298{
Zhenyao Mod2d340b2013-09-23 14:57:05 -0400299 if (!handle || !size || !type || !precision || !staticUse || !name)
Zhenyao Mo74da9f22013-09-23 14:57:01 -0400300 return;
301 ASSERT((varType == SH_ACTIVE_ATTRIBUTES) ||
302 (varType == SH_ACTIVE_UNIFORMS) ||
303 (varType == SH_VARYINGS));
alokp@chromium.org7beea402010-09-15 21:18:34 +0000304
Zhenyao Mo74da9f22013-09-23 14:57:01 -0400305 TShHandleBase* base = reinterpret_cast<TShHandleBase*>(handle);
306 TCompiler* compiler = base->getAsCompiler();
307 if (compiler == 0)
308 return;
309
310 const TVariableInfoList& varList =
311 varType == SH_ACTIVE_ATTRIBUTES ? compiler->getAttribs() :
312 (varType == SH_ACTIVE_UNIFORMS ? compiler->getUniforms() :
313 compiler->getVaryings());
314 if (index < 0 || index >= static_cast<int>(varList.size()))
315 return;
316
317 const TVariableInfo& varInfo = varList[index];
318 if (length) *length = varInfo.name.size();
319 *size = varInfo.size;
320 *type = varInfo.type;
321 switch (varInfo.precision) {
322 case EbpLow:
323 *precision = SH_PRECISION_LOWP;
324 break;
325 case EbpMedium:
326 *precision = SH_PRECISION_MEDIUMP;
327 break;
328 case EbpHigh:
329 *precision = SH_PRECISION_HIGHP;
330 break;
331 default:
Zhenyao Mofa3c3462013-09-23 14:57:04 -0400332 // Some types does not support precision, for example, boolean.
333 *precision = SH_PRECISION_UNDEFINED;
334 break;
Zhenyao Mo74da9f22013-09-23 14:57:01 -0400335 }
Zhenyao Mod2d340b2013-09-23 14:57:05 -0400336 *staticUse = varInfo.staticUse ? 1 : 0;
Zhenyao Mo74da9f22013-09-23 14:57:01 -0400337
338 // This size must match that queried by
339 // SH_ACTIVE_UNIFORM_MAX_LENGTH, SH_ACTIVE_ATTRIBUTE_MAX_LENGTH, SH_VARYING_MAX_LENGTH
340 // in ShGetInfo, below.
Zhenyao Mo7faf1a12014-04-25 18:03:56 -0700341 size_t variableLength = 1 + GetGlobalMaxTokenSize(compiler->getShaderSpec());
Zhenyao Mo74da9f22013-09-23 14:57:01 -0400342 ASSERT(checkVariableMaxLengths(handle, variableLength));
343 strncpy(name, varInfo.name.c_str(), variableLength);
344 name[variableLength - 1] = 0;
345 if (mappedName) {
346 // This size must match that queried by
347 // SH_MAPPED_NAME_MAX_LENGTH in ShGetInfo, below.
Zhenyao Mo7faf1a12014-04-25 18:03:56 -0700348 size_t maxMappedNameLength = 1 + GetGlobalMaxTokenSize(compiler->getShaderSpec());
Zhenyao Mo74da9f22013-09-23 14:57:01 -0400349 ASSERT(checkMappedNameMaxLength(handle, maxMappedNameLength));
350 strncpy(mappedName, varInfo.mappedName.c_str(), maxMappedNameLength);
351 mappedName[maxMappedNameLength - 1] = 0;
352 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000353}
daniel@transgaming.comc23f4612012-11-28 19:42:57 +0000354
355void ShGetNameHashingEntry(const ShHandle handle,
356 int index,
357 char* name,
358 char* hashedName)
359{
360 if (!handle || !name || !hashedName || index < 0)
361 return;
362
363 TShHandleBase* base = static_cast<TShHandleBase*>(handle);
364 TCompiler* compiler = base->getAsCompiler();
365 if (!compiler) return;
366
367 const NameMap& nameMap = compiler->getNameMap();
368 if (index >= static_cast<int>(nameMap.size()))
369 return;
370
371 NameMap::const_iterator it = nameMap.begin();
372 for (int i = 0; i < index; ++i)
373 ++it;
374
375 size_t len = it->first.length() + 1;
shannon.woods@transgaming.comd64b3da2013-02-28 23:19:26 +0000376 size_t max_len = 0;
daniel@transgaming.comc23f4612012-11-28 19:42:57 +0000377 ShGetInfo(handle, SH_NAME_MAX_LENGTH, &max_len);
shannon.woods@transgaming.comd64b3da2013-02-28 23:19:26 +0000378 if (len > max_len) {
daniel@transgaming.comc23f4612012-11-28 19:42:57 +0000379 ASSERT(false);
380 len = max_len;
381 }
382 strncpy(name, it->first.c_str(), len);
383 // To be on the safe side in case the source is longer than expected.
daniel@transgaming.com75cb6892013-02-01 03:20:26 +0000384 name[len - 1] = '\0';
daniel@transgaming.comc23f4612012-11-28 19:42:57 +0000385
386 len = it->second.length() + 1;
387 max_len = 0;
388 ShGetInfo(handle, SH_HASHED_NAME_MAX_LENGTH, &max_len);
shannon.woods@transgaming.comd64b3da2013-02-28 23:19:26 +0000389 if (len > max_len) {
daniel@transgaming.comc23f4612012-11-28 19:42:57 +0000390 ASSERT(false);
391 len = max_len;
392 }
393 strncpy(hashedName, it->second.c_str(), len);
394 // To be on the safe side in case the source is longer than expected.
daniel@transgaming.com75cb6892013-02-01 03:20:26 +0000395 hashedName[len - 1] = '\0';
daniel@transgaming.comc23f4612012-11-28 19:42:57 +0000396}
daniel@transgaming.com043da132012-12-20 21:12:22 +0000397
398void ShGetInfoPointer(const ShHandle handle, ShShaderInfo pname, void** params)
399{
400 if (!handle || !params)
401 return;
402
403 TShHandleBase* base = static_cast<TShHandleBase*>(handle);
404 TranslatorHLSL* translator = base->getAsTranslatorHLSL();
405 if (!translator) return;
406
407 switch(pname)
408 {
409 case SH_ACTIVE_UNIFORMS_ARRAY:
410 *params = (void*)&translator->getUniforms();
411 break;
shannonwoods@chromium.org3f68bf02013-05-30 00:12:43 +0000412 case SH_ACTIVE_INTERFACE_BLOCKS_ARRAY:
413 *params = (void*)&translator->getInterfaceBlocks();
414 break;
Jamie Madill46131a32013-06-20 11:55:50 -0400415 case SH_ACTIVE_OUTPUT_VARIABLES_ARRAY:
416 *params = (void*)&translator->getOutputVariables();
417 break;
Jamie Madilldefb6742013-06-20 11:55:51 -0400418 case SH_ACTIVE_ATTRIBUTES_ARRAY:
419 *params = (void*)&translator->getAttributes();
420 break;
Jamie Madill47fdd132013-08-30 13:21:04 -0400421 case SH_ACTIVE_VARYINGS_ARRAY:
422 *params = (void*)&translator->getVaryings();
423 break;
daniel@transgaming.com043da132012-12-20 21:12:22 +0000424 default: UNREACHABLE();
425 }
shannon.woods@transgaming.com1d432bb2013-01-25 21:57:28 +0000426}
Zhenyao Moa15f3e82013-09-23 14:57:08 -0400427
428int ShCheckVariablesWithinPackingLimits(
429 int maxVectors, ShVariableInfo* varInfoArray, size_t varInfoArraySize)
430{
431 if (varInfoArraySize == 0)
432 return 1;
433 ASSERT(varInfoArray);
434 TVariableInfoList variables;
435 for (size_t ii = 0; ii < varInfoArraySize; ++ii)
436 {
437 TVariableInfo var(varInfoArray[ii].type, varInfoArray[ii].size);
438 variables.push_back(var);
439 }
440 VariablePacker packer;
441 return packer.CheckVariablesWithinPackingLimits(maxVectors, variables) ? 1 : 0;
442}