blob: ab8799c651adfa0671b531332c6d4246134ecfc9 [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,
zmo@google.com5601ea02011-06-10 18:23:25 +0000113 ShShaderOutput output,
alokp@chromium.org4888ceb2010-10-01 21:13:12 +0000114 const ShBuiltInResources* resources)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000115{
116 if (!InitThread())
117 return 0;
118
zmo@google.com5601ea02011-06-10 18:23:25 +0000119 TShHandleBase* base = static_cast<TShHandleBase*>(ConstructCompiler(type, spec, output));
alokp@chromium.orge4249f02010-07-26 18:13:52 +0000120 TCompiler* compiler = base->getAsCompiler();
121 if (compiler == 0)
122 return 0;
123
124 // Generate built-in symbol table.
alokp@chromium.org07620a52010-09-23 17:53:56 +0000125 if (!compiler->Init(*resources)) {
alokp@chromium.orge4249f02010-07-26 18:13:52 +0000126 ShDestruct(base);
127 return 0;
128 }
129
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000130 return reinterpret_cast<void*>(base);
131}
132
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000133void ShDestruct(ShHandle handle)
134{
135 if (handle == 0)
136 return;
137
138 TShHandleBase* base = static_cast<TShHandleBase*>(handle);
139
140 if (base->getAsCompiler())
141 DeleteCompiler(base->getAsCompiler());
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000142}
143
144//
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000145// Do an actual compile on the given strings. The result is left
146// in the given compile object.
147//
148// Return: The return value of ShCompile is really boolean, indicating
149// success or failure.
150//
151int ShCompile(
152 const ShHandle handle,
153 const char* const shaderStrings[],
154 const int numStrings,
alokp@chromium.org7beea402010-09-15 21:18:34 +0000155 int compileOptions)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000156{
157 if (!InitThread())
158 return 0;
159
160 if (handle == 0)
161 return 0;
162
163 TShHandleBase* base = reinterpret_cast<TShHandleBase*>(handle);
164 TCompiler* compiler = base->getAsCompiler();
165 if (compiler == 0)
166 return 0;
alokp@chromium.org07620a52010-09-23 17:53:56 +0000167
alokp@chromium.org07620a52010-09-23 17:53:56 +0000168 bool success = compiler->compile(shaderStrings, numStrings, compileOptions);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000169 return success ? 1 : 0;
170}
171
alokp@chromium.org4888ceb2010-10-01 21:13:12 +0000172void ShGetInfo(const ShHandle handle, ShShaderInfo pname, int* params)
alokp@chromium.org7beea402010-09-15 21:18:34 +0000173{
174 if (!handle || !params)
175 return;
176
177 TShHandleBase* base = static_cast<TShHandleBase*>(handle);
178 TCompiler* compiler = base->getAsCompiler();
179 if (!compiler) return;
180
181 switch(pname)
182 {
183 case SH_INFO_LOG_LENGTH:
184 *params = compiler->getInfoSink().info.size() + 1;
185 break;
186 case SH_OBJECT_CODE_LENGTH:
187 *params = compiler->getInfoSink().obj.size() + 1;
188 break;
189 case SH_ACTIVE_UNIFORMS:
alokp@chromium.orgee76f6a2010-09-27 19:28:55 +0000190 *params = compiler->getUniforms().size();
alokp@chromium.org7beea402010-09-15 21:18:34 +0000191 break;
192 case SH_ACTIVE_UNIFORM_MAX_LENGTH:
alokp@chromium.orgee76f6a2010-09-27 19:28:55 +0000193 *params = getVariableMaxLength(compiler->getUniforms());
alokp@chromium.org7beea402010-09-15 21:18:34 +0000194 break;
195 case SH_ACTIVE_ATTRIBUTES:
alokp@chromium.orgee76f6a2010-09-27 19:28:55 +0000196 *params = compiler->getAttribs().size();
alokp@chromium.org7beea402010-09-15 21:18:34 +0000197 break;
198 case SH_ACTIVE_ATTRIBUTE_MAX_LENGTH:
alokp@chromium.orgee76f6a2010-09-27 19:28:55 +0000199 *params = getVariableMaxLength(compiler->getAttribs());
alokp@chromium.org7beea402010-09-15 21:18:34 +0000200 break;
zmo@google.comfd747b82011-04-23 01:30:07 +0000201 case SH_MAPPED_NAME_MAX_LENGTH:
202 *params = compiler->getMappedNameMaxLength();
203 break;
alokp@chromium.org7beea402010-09-15 21:18:34 +0000204 default: UNREACHABLE();
205 }
206}
207
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000208//
alokp@chromium.org774d7062010-07-21 18:55:45 +0000209// Return any compiler log of messages for the application.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000210//
alokp@chromium.org7beea402010-09-15 21:18:34 +0000211void ShGetInfoLog(const ShHandle handle, char* infoLog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000212{
alokp@chromium.org7beea402010-09-15 21:18:34 +0000213 if (!handle || !infoLog)
214 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000215
216 TShHandleBase* base = static_cast<TShHandleBase*>(handle);
alokp@chromium.org7beea402010-09-15 21:18:34 +0000217 TCompiler* compiler = base->getAsCompiler();
218 if (!compiler) return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000219
alokp@chromium.org7beea402010-09-15 21:18:34 +0000220 TInfoSink& infoSink = compiler->getInfoSink();
221 strcpy(infoLog, infoSink.info.c_str());
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000222}
223
224//
alokp@chromium.org774d7062010-07-21 18:55:45 +0000225// Return any object code.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000226//
alokp@chromium.org7beea402010-09-15 21:18:34 +0000227void ShGetObjectCode(const ShHandle handle, char* objCode)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000228{
alokp@chromium.org7beea402010-09-15 21:18:34 +0000229 if (!handle || !objCode)
230 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000231
232 TShHandleBase* base = static_cast<TShHandleBase*>(handle);
alokp@chromium.org7beea402010-09-15 21:18:34 +0000233 TCompiler* compiler = base->getAsCompiler();
234 if (!compiler) return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000235
alokp@chromium.org7beea402010-09-15 21:18:34 +0000236 TInfoSink& infoSink = compiler->getInfoSink();
237 strcpy(objCode, infoSink.obj.c_str());
238}
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000239
alokp@chromium.org7beea402010-09-15 21:18:34 +0000240void ShGetActiveAttrib(const ShHandle handle,
241 int index,
242 int* length,
243 int* size,
alokp@chromium.org4888ceb2010-10-01 21:13:12 +0000244 ShDataType* type,
zmo@google.comfd747b82011-04-23 01:30:07 +0000245 char* name,
246 char* mappedName)
alokp@chromium.org7beea402010-09-15 21:18:34 +0000247{
alokp@chromium.orgee76f6a2010-09-27 19:28:55 +0000248 getVariableInfo(SH_ACTIVE_ATTRIBUTES,
zmo@google.comfd747b82011-04-23 01:30:07 +0000249 handle, index, length, size, type, name, mappedName);
alokp@chromium.org7beea402010-09-15 21:18:34 +0000250}
251
252void ShGetActiveUniform(const ShHandle handle,
253 int index,
254 int* length,
255 int* size,
alokp@chromium.org4888ceb2010-10-01 21:13:12 +0000256 ShDataType* type,
zmo@google.comfd747b82011-04-23 01:30:07 +0000257 char* name,
258 char* mappedName)
alokp@chromium.org7beea402010-09-15 21:18:34 +0000259{
alokp@chromium.orgee76f6a2010-09-27 19:28:55 +0000260 getVariableInfo(SH_ACTIVE_UNIFORMS,
zmo@google.comfd747b82011-04-23 01:30:07 +0000261 handle, index, length, size, type, name, mappedName);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000262}