blob: 051e4ec92c78a2a12ab3998490440f59a7aae693 [file] [log] [blame]
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001//
2// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
3// 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"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000015#include "compiler/ShHandle.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000016
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000017//
18// This is the platform independent interface between an OGL driver
alokp@chromium.org774d7062010-07-21 18:55:45 +000019// and the shading language compiler.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000020//
21
alokp@chromium.orgee76f6a2010-09-27 19:28:55 +000022static int getVariableMaxLength(const TVariableInfoList& varList)
23{
24 TString::size_type maxLen = 0;
25 for (TVariableInfoList::const_iterator i = varList.begin();
26 i != varList.end(); ++i)
27 {
28 maxLen = std::max(maxLen, i->name.size());
29 }
30 // Add 1 to include null-termination character.
31 return static_cast<int>(maxLen) + 1;
32}
33
alokp@chromium.org4888ceb2010-10-01 21:13:12 +000034static void getVariableInfo(ShShaderInfo varType,
alokp@chromium.orgee76f6a2010-09-27 19:28:55 +000035 const ShHandle handle,
36 int index,
37 int* length,
38 int* size,
alokp@chromium.org4888ceb2010-10-01 21:13:12 +000039 ShDataType* type,
zmo@google.comfd747b82011-04-23 01:30:07 +000040 char* name,
41 char* mappedName)
alokp@chromium.orgee76f6a2010-09-27 19:28:55 +000042{
43 if (!handle || !size || !type || !name)
44 return;
45 ASSERT((varType == SH_ACTIVE_ATTRIBUTES) ||
46 (varType == SH_ACTIVE_UNIFORMS));
47
48 TShHandleBase* base = reinterpret_cast<TShHandleBase*>(handle);
49 TCompiler* compiler = base->getAsCompiler();
50 if (compiler == 0)
51 return;
52
53 const TVariableInfoList& varList = varType == SH_ACTIVE_ATTRIBUTES ?
54 compiler->getAttribs() : compiler->getUniforms();
55 if (index < 0 || index >= static_cast<int>(varList.size()))
56 return;
57
58 const TVariableInfo& varInfo = varList[index];
59 if (length) *length = varInfo.name.size();
60 *size = varInfo.size;
61 *type = varInfo.type;
62 strcpy(name, varInfo.name.c_str());
zmo@google.comfd747b82011-04-23 01:30:07 +000063 if (mappedName)
64 strcpy(mappedName, varInfo.mappedName.c_str());
alokp@chromium.orgee76f6a2010-09-27 19:28:55 +000065}
66
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000067//
68// Driver must call this first, once, before doing any other
alokp@chromium.org774d7062010-07-21 18:55:45 +000069// compiler operations.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000070//
71int ShInitialize()
72{
alokp@chromium.org34b99cd2010-07-27 18:37:55 +000073 if (!InitProcess())
74 return 0;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000075
alokp@chromium.org34b99cd2010-07-27 18:37:55 +000076 return 1;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000077}
78
79//
alokp@chromium.org94a86ad2010-08-25 20:02:11 +000080// Cleanup symbol tables
81//
82int ShFinalize()
83{
84 if (!DetachProcess())
85 return 0;
86
87 return 1;
88}
89
90//
91// Initialize built-in resources with minimum expected values.
92//
alokp@chromium.org4888ceb2010-10-01 21:13:12 +000093void ShInitBuiltInResources(ShBuiltInResources* resources)
alokp@chromium.org94a86ad2010-08-25 20:02:11 +000094{
95 // Constants.
96 resources->MaxVertexAttribs = 8;
97 resources->MaxVertexUniformVectors = 128;
98 resources->MaxVaryingVectors = 8;
99 resources->MaxVertexTextureImageUnits = 0;
100 resources->MaxCombinedTextureImageUnits = 8;
101 resources->MaxTextureImageUnits = 8;
102 resources->MaxFragmentUniformVectors = 16;
103 resources->MaxDrawBuffers = 1;
104
105 // Extensions.
106 resources->OES_standard_derivatives = 0;
107}
108
109//
alokp@chromium.org774d7062010-07-21 18:55:45 +0000110// Driver calls these to create and destroy compiler objects.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000111//
alokp@chromium.org4888ceb2010-10-01 21:13:12 +0000112ShHandle ShConstructCompiler(ShShaderType type, ShShaderSpec spec,
113 const ShBuiltInResources* resources)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000114{
115 if (!InitThread())
116 return 0;
117
alokp@chromium.org4888ceb2010-10-01 21:13:12 +0000118 TShHandleBase* base = static_cast<TShHandleBase*>(ConstructCompiler(type, spec));
alokp@chromium.orge4249f02010-07-26 18:13:52 +0000119 TCompiler* compiler = base->getAsCompiler();
120 if (compiler == 0)
121 return 0;
122
123 // Generate built-in symbol table.
alokp@chromium.org07620a52010-09-23 17:53:56 +0000124 if (!compiler->Init(*resources)) {
alokp@chromium.orge4249f02010-07-26 18:13:52 +0000125 ShDestruct(base);
126 return 0;
127 }
128
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000129 return reinterpret_cast<void*>(base);
130}
131
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000132void ShDestruct(ShHandle handle)
133{
134 if (handle == 0)
135 return;
136
137 TShHandleBase* base = static_cast<TShHandleBase*>(handle);
138
139 if (base->getAsCompiler())
140 DeleteCompiler(base->getAsCompiler());
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000141}
142
143//
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000144// Do an actual compile on the given strings. The result is left
145// in the given compile object.
146//
147// Return: The return value of ShCompile is really boolean, indicating
148// success or failure.
149//
150int ShCompile(
151 const ShHandle handle,
152 const char* const shaderStrings[],
153 const int numStrings,
alokp@chromium.org7beea402010-09-15 21:18:34 +0000154 int compileOptions)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000155{
156 if (!InitThread())
157 return 0;
158
159 if (handle == 0)
160 return 0;
161
162 TShHandleBase* base = reinterpret_cast<TShHandleBase*>(handle);
163 TCompiler* compiler = base->getAsCompiler();
164 if (compiler == 0)
165 return 0;
alokp@chromium.org07620a52010-09-23 17:53:56 +0000166
alokp@chromium.org07620a52010-09-23 17:53:56 +0000167 bool success = compiler->compile(shaderStrings, numStrings, compileOptions);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000168 return success ? 1 : 0;
169}
170
alokp@chromium.org4888ceb2010-10-01 21:13:12 +0000171void ShGetInfo(const ShHandle handle, ShShaderInfo pname, int* params)
alokp@chromium.org7beea402010-09-15 21:18:34 +0000172{
173 if (!handle || !params)
174 return;
175
176 TShHandleBase* base = static_cast<TShHandleBase*>(handle);
177 TCompiler* compiler = base->getAsCompiler();
178 if (!compiler) return;
179
180 switch(pname)
181 {
182 case SH_INFO_LOG_LENGTH:
183 *params = compiler->getInfoSink().info.size() + 1;
184 break;
185 case SH_OBJECT_CODE_LENGTH:
186 *params = compiler->getInfoSink().obj.size() + 1;
187 break;
188 case SH_ACTIVE_UNIFORMS:
alokp@chromium.orgee76f6a2010-09-27 19:28:55 +0000189 *params = compiler->getUniforms().size();
alokp@chromium.org7beea402010-09-15 21:18:34 +0000190 break;
191 case SH_ACTIVE_UNIFORM_MAX_LENGTH:
alokp@chromium.orgee76f6a2010-09-27 19:28:55 +0000192 *params = getVariableMaxLength(compiler->getUniforms());
alokp@chromium.org7beea402010-09-15 21:18:34 +0000193 break;
194 case SH_ACTIVE_ATTRIBUTES:
alokp@chromium.orgee76f6a2010-09-27 19:28:55 +0000195 *params = compiler->getAttribs().size();
alokp@chromium.org7beea402010-09-15 21:18:34 +0000196 break;
197 case SH_ACTIVE_ATTRIBUTE_MAX_LENGTH:
alokp@chromium.orgee76f6a2010-09-27 19:28:55 +0000198 *params = getVariableMaxLength(compiler->getAttribs());
alokp@chromium.org7beea402010-09-15 21:18:34 +0000199 break;
zmo@google.comfd747b82011-04-23 01:30:07 +0000200 case SH_MAPPED_NAME_MAX_LENGTH:
201 *params = compiler->getMappedNameMaxLength();
202 break;
alokp@chromium.org7beea402010-09-15 21:18:34 +0000203 default: UNREACHABLE();
204 }
205}
206
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000207//
alokp@chromium.org774d7062010-07-21 18:55:45 +0000208// Return any compiler log of messages for the application.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000209//
alokp@chromium.org7beea402010-09-15 21:18:34 +0000210void ShGetInfoLog(const ShHandle handle, char* infoLog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000211{
alokp@chromium.org7beea402010-09-15 21:18:34 +0000212 if (!handle || !infoLog)
213 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000214
215 TShHandleBase* base = static_cast<TShHandleBase*>(handle);
alokp@chromium.org7beea402010-09-15 21:18:34 +0000216 TCompiler* compiler = base->getAsCompiler();
217 if (!compiler) return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000218
alokp@chromium.org7beea402010-09-15 21:18:34 +0000219 TInfoSink& infoSink = compiler->getInfoSink();
220 strcpy(infoLog, infoSink.info.c_str());
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000221}
222
223//
alokp@chromium.org774d7062010-07-21 18:55:45 +0000224// Return any object code.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000225//
alokp@chromium.org7beea402010-09-15 21:18:34 +0000226void ShGetObjectCode(const ShHandle handle, char* objCode)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000227{
alokp@chromium.org7beea402010-09-15 21:18:34 +0000228 if (!handle || !objCode)
229 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000230
231 TShHandleBase* base = static_cast<TShHandleBase*>(handle);
alokp@chromium.org7beea402010-09-15 21:18:34 +0000232 TCompiler* compiler = base->getAsCompiler();
233 if (!compiler) return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000234
alokp@chromium.org7beea402010-09-15 21:18:34 +0000235 TInfoSink& infoSink = compiler->getInfoSink();
236 strcpy(objCode, infoSink.obj.c_str());
237}
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000238
alokp@chromium.org7beea402010-09-15 21:18:34 +0000239void ShGetActiveAttrib(const ShHandle handle,
240 int index,
241 int* length,
242 int* size,
alokp@chromium.org4888ceb2010-10-01 21:13:12 +0000243 ShDataType* type,
zmo@google.comfd747b82011-04-23 01:30:07 +0000244 char* name,
245 char* mappedName)
alokp@chromium.org7beea402010-09-15 21:18:34 +0000246{
alokp@chromium.orgee76f6a2010-09-27 19:28:55 +0000247 getVariableInfo(SH_ACTIVE_ATTRIBUTES,
zmo@google.comfd747b82011-04-23 01:30:07 +0000248 handle, index, length, size, type, name, mappedName);
alokp@chromium.org7beea402010-09-15 21:18:34 +0000249}
250
251void ShGetActiveUniform(const ShHandle handle,
252 int index,
253 int* length,
254 int* size,
alokp@chromium.org4888ceb2010-10-01 21:13:12 +0000255 ShDataType* type,
zmo@google.comfd747b82011-04-23 01:30:07 +0000256 char* name,
257 char* mappedName)
alokp@chromium.org7beea402010-09-15 21:18:34 +0000258{
alokp@chromium.orgee76f6a2010-09-27 19:28:55 +0000259 getVariableInfo(SH_ACTIVE_UNIFORMS,
zmo@google.comfd747b82011-04-23 01:30:07 +0000260 handle, index, length, size, type, name, mappedName);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000261}