blob: 56f5c7f2ec00724b69a220e568a07346cbca30ab [file] [log] [blame]
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001//
kbr@chromium.org22152112011-10-26 01:18:28 +00002// Copyright (c) 2002-2011 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
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000014#include "compiler/InitializeDll.h"
kbr@chromium.org22152112011-10-26 01:18:28 +000015#include "compiler/preprocessor/length_limits.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000016#include "compiler/ShHandle.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000017
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000018//
19// This is the platform independent interface between an OGL driver
alokp@chromium.org774d7062010-07-21 18:55:45 +000020// and the shading language compiler.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000021//
22
kbr@chromium.org22152112011-10-26 01:18:28 +000023static bool checkActiveUniformAndAttribMaxLengths(const ShHandle handle,
24 int expectedValue)
alokp@chromium.orgee76f6a2010-09-27 19:28:55 +000025{
kbr@chromium.org22152112011-10-26 01:18:28 +000026 int activeUniformLimit = 0;
27 ShGetInfo(handle, SH_ACTIVE_UNIFORM_MAX_LENGTH, &activeUniformLimit);
28 int activeAttribLimit = 0;
29 ShGetInfo(handle, SH_ACTIVE_ATTRIBUTE_MAX_LENGTH, &activeAttribLimit);
30 return (expectedValue == activeUniformLimit && expectedValue == activeAttribLimit);
31}
32
33static bool checkMappedNameMaxLength(const ShHandle handle, int expectedValue)
34{
35 int mappedNameMaxLength = 0;
36 ShGetInfo(handle, SH_MAPPED_NAME_MAX_LENGTH, &mappedNameMaxLength);
37 return (expectedValue == mappedNameMaxLength);
alokp@chromium.orgee76f6a2010-09-27 19:28:55 +000038}
39
alokp@chromium.org4888ceb2010-10-01 21:13:12 +000040static void getVariableInfo(ShShaderInfo varType,
alokp@chromium.orgee76f6a2010-09-27 19:28:55 +000041 const ShHandle handle,
42 int index,
43 int* length,
44 int* size,
alokp@chromium.org4888ceb2010-10-01 21:13:12 +000045 ShDataType* type,
zmo@google.comfd747b82011-04-23 01:30:07 +000046 char* name,
47 char* mappedName)
alokp@chromium.orgee76f6a2010-09-27 19:28:55 +000048{
49 if (!handle || !size || !type || !name)
50 return;
51 ASSERT((varType == SH_ACTIVE_ATTRIBUTES) ||
52 (varType == SH_ACTIVE_UNIFORMS));
53
54 TShHandleBase* base = reinterpret_cast<TShHandleBase*>(handle);
55 TCompiler* compiler = base->getAsCompiler();
56 if (compiler == 0)
57 return;
58
59 const TVariableInfoList& varList = varType == SH_ACTIVE_ATTRIBUTES ?
60 compiler->getAttribs() : compiler->getUniforms();
61 if (index < 0 || index >= static_cast<int>(varList.size()))
62 return;
63
64 const TVariableInfo& varInfo = varList[index];
65 if (length) *length = varInfo.name.size();
66 *size = varInfo.size;
67 *type = varInfo.type;
kbr@chromium.org22152112011-10-26 01:18:28 +000068
69 // This size must match that queried by
70 // SH_ACTIVE_UNIFORM_MAX_LENGTH and SH_ACTIVE_ATTRIBUTE_MAX_LENGTH
71 // in ShGetInfo, below.
72 int activeUniformAndAttribLength = 1 + MAX_SYMBOL_NAME_LEN;
73 ASSERT(checkActiveUniformAndAttribMaxLengths(handle, activeUniformAndAttribLength));
74 strncpy(name, varInfo.name.c_str(), activeUniformAndAttribLength);
jacob.benoit.1@gmail.comb45306b2012-05-07 02:12:34 +000075 name[activeUniformAndAttribLength - 1] = 0;
kbr@chromium.org22152112011-10-26 01:18:28 +000076 if (mappedName) {
77 // This size must match that queried by
78 // SH_MAPPED_NAME_MAX_LENGTH in ShGetInfo, below.
79 int maxMappedNameLength = 1 + MAX_SYMBOL_NAME_LEN;
80 ASSERT(checkMappedNameMaxLength(handle, maxMappedNameLength));
81 strncpy(mappedName, varInfo.mappedName.c_str(), maxMappedNameLength);
jacob.benoit.1@gmail.comb45306b2012-05-07 02:12:34 +000082 mappedName[maxMappedNameLength - 1] = 0;
kbr@chromium.org22152112011-10-26 01:18:28 +000083 }
alokp@chromium.orgee76f6a2010-09-27 19:28:55 +000084}
85
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000086//
87// Driver must call this first, once, before doing any other
alokp@chromium.org774d7062010-07-21 18:55:45 +000088// compiler operations.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000089//
90int ShInitialize()
91{
alokp@chromium.org34b99cd2010-07-27 18:37:55 +000092 if (!InitProcess())
93 return 0;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000094
alokp@chromium.org34b99cd2010-07-27 18:37:55 +000095 return 1;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000096}
97
98//
alokp@chromium.org94a86ad2010-08-25 20:02:11 +000099// Cleanup symbol tables
100//
101int ShFinalize()
102{
103 if (!DetachProcess())
104 return 0;
105
106 return 1;
107}
108
109//
110// Initialize built-in resources with minimum expected values.
111//
alokp@chromium.org4888ceb2010-10-01 21:13:12 +0000112void ShInitBuiltInResources(ShBuiltInResources* resources)
alokp@chromium.org94a86ad2010-08-25 20:02:11 +0000113{
114 // Constants.
115 resources->MaxVertexAttribs = 8;
116 resources->MaxVertexUniformVectors = 128;
117 resources->MaxVaryingVectors = 8;
118 resources->MaxVertexTextureImageUnits = 0;
119 resources->MaxCombinedTextureImageUnits = 8;
120 resources->MaxTextureImageUnits = 8;
121 resources->MaxFragmentUniformVectors = 16;
122 resources->MaxDrawBuffers = 1;
123
124 // Extensions.
125 resources->OES_standard_derivatives = 0;
zmo@google.com09c323a2011-08-12 18:22:25 +0000126 resources->OES_EGL_image_external = 0;
kbr@chromium.org205fef32011-11-22 20:50:02 +0000127 resources->ARB_texture_rectangle = 0;
alokp@chromium.org94a86ad2010-08-25 20:02:11 +0000128}
129
130//
alokp@chromium.org774d7062010-07-21 18:55:45 +0000131// Driver calls these to create and destroy compiler objects.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000132//
alokp@chromium.org4888ceb2010-10-01 21:13:12 +0000133ShHandle ShConstructCompiler(ShShaderType type, ShShaderSpec spec,
zmo@google.com5601ea02011-06-10 18:23:25 +0000134 ShShaderOutput output,
alokp@chromium.org4888ceb2010-10-01 21:13:12 +0000135 const ShBuiltInResources* resources)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000136{
137 if (!InitThread())
138 return 0;
139
zmo@google.com5601ea02011-06-10 18:23:25 +0000140 TShHandleBase* base = static_cast<TShHandleBase*>(ConstructCompiler(type, spec, output));
alokp@chromium.orge4249f02010-07-26 18:13:52 +0000141 TCompiler* compiler = base->getAsCompiler();
142 if (compiler == 0)
143 return 0;
144
145 // Generate built-in symbol table.
alokp@chromium.org07620a52010-09-23 17:53:56 +0000146 if (!compiler->Init(*resources)) {
alokp@chromium.orge4249f02010-07-26 18:13:52 +0000147 ShDestruct(base);
148 return 0;
149 }
150
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000151 return reinterpret_cast<void*>(base);
152}
153
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000154void ShDestruct(ShHandle handle)
155{
156 if (handle == 0)
157 return;
158
159 TShHandleBase* base = static_cast<TShHandleBase*>(handle);
160
161 if (base->getAsCompiler())
162 DeleteCompiler(base->getAsCompiler());
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000163}
164
165//
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000166// Do an actual compile on the given strings. The result is left
167// in the given compile object.
168//
169// Return: The return value of ShCompile is really boolean, indicating
170// success or failure.
171//
172int ShCompile(
173 const ShHandle handle,
174 const char* const shaderStrings[],
175 const int numStrings,
alokp@chromium.org7beea402010-09-15 21:18:34 +0000176 int compileOptions)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000177{
178 if (!InitThread())
179 return 0;
180
181 if (handle == 0)
182 return 0;
183
184 TShHandleBase* base = reinterpret_cast<TShHandleBase*>(handle);
185 TCompiler* compiler = base->getAsCompiler();
186 if (compiler == 0)
187 return 0;
alokp@chromium.org07620a52010-09-23 17:53:56 +0000188
alokp@chromium.org07620a52010-09-23 17:53:56 +0000189 bool success = compiler->compile(shaderStrings, numStrings, compileOptions);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000190 return success ? 1 : 0;
191}
192
alokp@chromium.org4888ceb2010-10-01 21:13:12 +0000193void ShGetInfo(const ShHandle handle, ShShaderInfo pname, int* params)
alokp@chromium.org7beea402010-09-15 21:18:34 +0000194{
195 if (!handle || !params)
196 return;
197
198 TShHandleBase* base = static_cast<TShHandleBase*>(handle);
199 TCompiler* compiler = base->getAsCompiler();
200 if (!compiler) return;
201
202 switch(pname)
203 {
204 case SH_INFO_LOG_LENGTH:
205 *params = compiler->getInfoSink().info.size() + 1;
206 break;
207 case SH_OBJECT_CODE_LENGTH:
208 *params = compiler->getInfoSink().obj.size() + 1;
209 break;
210 case SH_ACTIVE_UNIFORMS:
alokp@chromium.orgee76f6a2010-09-27 19:28:55 +0000211 *params = compiler->getUniforms().size();
alokp@chromium.org7beea402010-09-15 21:18:34 +0000212 break;
213 case SH_ACTIVE_UNIFORM_MAX_LENGTH:
kbr@chromium.org22152112011-10-26 01:18:28 +0000214 *params = 1 + MAX_SYMBOL_NAME_LEN;
alokp@chromium.org7beea402010-09-15 21:18:34 +0000215 break;
216 case SH_ACTIVE_ATTRIBUTES:
alokp@chromium.orgee76f6a2010-09-27 19:28:55 +0000217 *params = compiler->getAttribs().size();
alokp@chromium.org7beea402010-09-15 21:18:34 +0000218 break;
219 case SH_ACTIVE_ATTRIBUTE_MAX_LENGTH:
kbr@chromium.org22152112011-10-26 01:18:28 +0000220 *params = 1 + MAX_SYMBOL_NAME_LEN;
alokp@chromium.org7beea402010-09-15 21:18:34 +0000221 break;
zmo@google.comfd747b82011-04-23 01:30:07 +0000222 case SH_MAPPED_NAME_MAX_LENGTH:
kbr@chromium.org22152112011-10-26 01:18:28 +0000223 // Use longer length than MAX_SHORTENED_IDENTIFIER_SIZE to
224 // handle array and struct dereferences.
225 *params = 1 + MAX_SYMBOL_NAME_LEN;
zmo@google.comfd747b82011-04-23 01:30:07 +0000226 break;
alokp@chromium.org7beea402010-09-15 21:18:34 +0000227 default: UNREACHABLE();
228 }
229}
230
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000231//
alokp@chromium.org774d7062010-07-21 18:55:45 +0000232// Return any compiler log of messages for the application.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000233//
alokp@chromium.org7beea402010-09-15 21:18:34 +0000234void ShGetInfoLog(const ShHandle handle, char* infoLog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000235{
alokp@chromium.org7beea402010-09-15 21:18:34 +0000236 if (!handle || !infoLog)
237 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000238
239 TShHandleBase* base = static_cast<TShHandleBase*>(handle);
alokp@chromium.org7beea402010-09-15 21:18:34 +0000240 TCompiler* compiler = base->getAsCompiler();
241 if (!compiler) return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000242
alokp@chromium.org7beea402010-09-15 21:18:34 +0000243 TInfoSink& infoSink = compiler->getInfoSink();
244 strcpy(infoLog, infoSink.info.c_str());
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000245}
246
247//
alokp@chromium.org774d7062010-07-21 18:55:45 +0000248// Return any object code.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000249//
alokp@chromium.org7beea402010-09-15 21:18:34 +0000250void ShGetObjectCode(const ShHandle handle, char* objCode)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000251{
alokp@chromium.org7beea402010-09-15 21:18:34 +0000252 if (!handle || !objCode)
253 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000254
255 TShHandleBase* base = static_cast<TShHandleBase*>(handle);
alokp@chromium.org7beea402010-09-15 21:18:34 +0000256 TCompiler* compiler = base->getAsCompiler();
257 if (!compiler) return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000258
alokp@chromium.org7beea402010-09-15 21:18:34 +0000259 TInfoSink& infoSink = compiler->getInfoSink();
260 strcpy(objCode, infoSink.obj.c_str());
261}
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000262
alokp@chromium.org7beea402010-09-15 21:18:34 +0000263void ShGetActiveAttrib(const ShHandle handle,
264 int index,
265 int* length,
266 int* size,
alokp@chromium.org4888ceb2010-10-01 21:13:12 +0000267 ShDataType* type,
zmo@google.comfd747b82011-04-23 01:30:07 +0000268 char* name,
269 char* mappedName)
alokp@chromium.org7beea402010-09-15 21:18:34 +0000270{
alokp@chromium.orgee76f6a2010-09-27 19:28:55 +0000271 getVariableInfo(SH_ACTIVE_ATTRIBUTES,
zmo@google.comfd747b82011-04-23 01:30:07 +0000272 handle, index, length, size, type, name, mappedName);
alokp@chromium.org7beea402010-09-15 21:18:34 +0000273}
274
275void ShGetActiveUniform(const ShHandle handle,
276 int index,
277 int* length,
278 int* size,
alokp@chromium.org4888ceb2010-10-01 21:13:12 +0000279 ShDataType* type,
zmo@google.comfd747b82011-04-23 01:30:07 +0000280 char* name,
281 char* mappedName)
alokp@chromium.org7beea402010-09-15 21:18:34 +0000282{
alokp@chromium.orgee76f6a2010-09-27 19:28:55 +0000283 getVariableInfo(SH_ACTIVE_UNIFORMS,
zmo@google.comfd747b82011-04-23 01:30:07 +0000284 handle, index, length, size, type, name, mappedName);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000285}