blob: da121e88d35d976c643e307f9c8ef515319305d9 [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"
Daniel Bratell73941de2015-02-25 14:34:49 +010017#ifdef ANGLE_ENABLE_HLSL
Geoff Lang17732822013-08-29 13:46:49 -040018#include "compiler/translator/TranslatorHLSL.h"
Jamie Madilld7b1ab52016-12-12 14:42:19 -050019#endif // ANGLE_ENABLE_HLSL
Geoff Lang17732822013-08-29 13:46:49 -040020#include "compiler/translator/VariablePacker.h"
Jamie Madilla718c1e2014-07-02 15:31:22 -040021#include "angle_gl.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000022
Jamie Madillacb4b812016-11-07 13:50:29 -050023using namespace sh;
24
Jamie Madille294bb82014-07-17 14:16:26 -040025namespace
26{
27
Jamie Madille294bb82014-07-17 14:16:26 -040028bool isInitialized = false;
Jamie Madillb4d192c2014-02-26 09:54:10 -050029
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000030//
31// This is the platform independent interface between an OGL driver
alokp@chromium.org774d7062010-07-21 18:55:45 +000032// and the shading language compiler.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000033//
34
Jamie Madille294bb82014-07-17 14:16:26 -040035template <typename VarT>
Jamie Madilla0a9e122015-09-02 15:54:30 -040036const std::vector<VarT> *GetVariableList(const TCompiler *compiler);
Jamie Madille294bb82014-07-17 14:16:26 -040037
38template <>
Jamie Madillacb4b812016-11-07 13:50:29 -050039const std::vector<Uniform> *GetVariableList(const TCompiler *compiler)
Jamie Madille294bb82014-07-17 14:16:26 -040040{
41 return &compiler->getUniforms();
42}
43
44template <>
Jamie Madillacb4b812016-11-07 13:50:29 -050045const std::vector<Varying> *GetVariableList(const TCompiler *compiler)
Jamie Madille294bb82014-07-17 14:16:26 -040046{
47 return &compiler->getVaryings();
48}
49
50template <>
Jamie Madillacb4b812016-11-07 13:50:29 -050051const std::vector<Attribute> *GetVariableList(const TCompiler *compiler)
Jamie Madille294bb82014-07-17 14:16:26 -040052{
Jamie Madilla0a9e122015-09-02 15:54:30 -040053 return &compiler->getAttributes();
Jamie Madille294bb82014-07-17 14:16:26 -040054}
55
56template <>
Jamie Madillacb4b812016-11-07 13:50:29 -050057const std::vector<OutputVariable> *GetVariableList(const TCompiler *compiler)
Jamie Madilla0a9e122015-09-02 15:54:30 -040058{
59 return &compiler->getOutputVariables();
60}
61
62template <>
Jamie Madillacb4b812016-11-07 13:50:29 -050063const std::vector<InterfaceBlock> *GetVariableList(const TCompiler *compiler)
Jamie Madille294bb82014-07-17 14:16:26 -040064{
65 return &compiler->getInterfaceBlocks();
66}
67
68template <typename VarT>
Jamie Madilla0a9e122015-09-02 15:54:30 -040069const std::vector<VarT> *GetShaderVariables(const ShHandle handle)
Jamie Madille294bb82014-07-17 14:16:26 -040070{
71 if (!handle)
72 {
73 return NULL;
74 }
75
Jamie Madilld7b1ab52016-12-12 14:42:19 -050076 TShHandleBase *base = static_cast<TShHandleBase *>(handle);
77 TCompiler *compiler = base->getAsCompiler();
Jamie Madille294bb82014-07-17 14:16:26 -040078 if (!compiler)
79 {
80 return NULL;
81 }
82
Jamie Madilla0a9e122015-09-02 15:54:30 -040083 return GetVariableList<VarT>(compiler);
Jamie Madille294bb82014-07-17 14:16:26 -040084}
85
Zhenyao Mo4de44cb2014-10-29 18:03:46 -070086TCompiler *GetCompilerFromHandle(ShHandle handle)
87{
88 if (!handle)
89 return NULL;
90 TShHandleBase *base = static_cast<TShHandleBase *>(handle);
91 return base->getAsCompiler();
Jamie Madille294bb82014-07-17 14:16:26 -040092}
93
Daniel Bratell73941de2015-02-25 14:34:49 +010094#ifdef ANGLE_ENABLE_HLSL
Zhenyao Mo4de44cb2014-10-29 18:03:46 -070095TranslatorHLSL *GetTranslatorHLSLFromHandle(ShHandle handle)
96{
97 if (!handle)
98 return NULL;
99 TShHandleBase *base = static_cast<TShHandleBase *>(handle);
100 return base->getAsTranslatorHLSL();
101}
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500102#endif // ANGLE_ENABLE_HLSL
Zhenyao Mo4de44cb2014-10-29 18:03:46 -0700103
Jamie Madilla0a9e122015-09-02 15:54:30 -0400104} // anonymous namespace
Zhenyao Mo4de44cb2014-10-29 18:03:46 -0700105
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000106//
Alok Priyadarshib11713f2013-08-01 16:02:39 -0700107// Driver must call this first, once, before doing any other compiler operations.
108// Subsequent calls to this function are no-op.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000109//
Zhenyao Mo4de44cb2014-10-29 18:03:46 -0700110bool ShInitialize()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000111{
Jamie Madill477bc782014-02-26 09:54:17 -0500112 if (!isInitialized)
113 {
114 isInitialized = InitProcess();
115 }
Zhenyao Mo4de44cb2014-10-29 18:03:46 -0700116 return isInitialized;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000117}
118
119//
alokp@chromium.org94a86ad2010-08-25 20:02:11 +0000120// Cleanup symbol tables
121//
Zhenyao Mo4de44cb2014-10-29 18:03:46 -0700122bool ShFinalize()
alokp@chromium.org94a86ad2010-08-25 20:02:11 +0000123{
Geoff Langf20f0202014-04-28 11:02:07 -0400124 if (isInitialized)
125 {
126 DetachProcess();
127 isInitialized = false;
128 }
Zhenyao Mo4de44cb2014-10-29 18:03:46 -0700129 return true;
alokp@chromium.org94a86ad2010-08-25 20:02:11 +0000130}
131
132//
133// Initialize built-in resources with minimum expected values.
134//
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500135void ShInitBuiltInResources(ShBuiltInResources *resources)
alokp@chromium.org94a86ad2010-08-25 20:02:11 +0000136{
Kimmo Kinnunen7c1cfd62014-10-15 14:59:57 +0300137 // Make comparable.
138 memset(resources, 0, sizeof(*resources));
139
alokp@chromium.org94a86ad2010-08-25 20:02:11 +0000140 // Constants.
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500141 resources->MaxVertexAttribs = 8;
142 resources->MaxVertexUniformVectors = 128;
143 resources->MaxVaryingVectors = 8;
144 resources->MaxVertexTextureImageUnits = 0;
alokp@chromium.org94a86ad2010-08-25 20:02:11 +0000145 resources->MaxCombinedTextureImageUnits = 8;
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500146 resources->MaxTextureImageUnits = 8;
147 resources->MaxFragmentUniformVectors = 16;
148 resources->MaxDrawBuffers = 1;
alokp@chromium.org94a86ad2010-08-25 20:02:11 +0000149
150 // Extensions.
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500151 resources->OES_standard_derivatives = 0;
152 resources->OES_EGL_image_external = 0;
Geoff Langb66a9092016-05-16 15:59:14 -0400153 resources->OES_EGL_image_external_essl3 = 0;
154 resources->NV_EGL_stream_consumer_external = 0;
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500155 resources->ARB_texture_rectangle = 0;
156 resources->EXT_blend_func_extended = 0;
157 resources->EXT_draw_buffers = 0;
158 resources->EXT_frag_depth = 0;
159 resources->EXT_shader_texture_lod = 0;
160 resources->WEBGL_debug_shader_precision = 0;
161 resources->EXT_shader_framebuffer_fetch = 0;
162 resources->NV_shader_framebuffer_fetch = 0;
163 resources->ARM_shader_framebuffer_fetch = 0;
Olli Etuaho09b04a22016-12-15 13:30:26 +0000164 resources->OVR_multiview = 0;
daniel@transgaming.comc23f4612012-11-28 19:42:57 +0000165
Olli Etuahoe61209a2014-09-26 12:01:17 +0300166 resources->NV_draw_buffers = 0;
167
shannon.woods%transgaming.com@gtempaccount.comcbb6b6a2013-04-13 03:27:47 +0000168 // Disable highp precision in fragment shader by default.
169 resources->FragmentPrecisionHigh = 0;
170
shannonwoods@chromium.org74b86cf2013-05-30 00:02:58 +0000171 // GLSL ES 3.0 constants.
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500172 resources->MaxVertexOutputVectors = 16;
shannonwoods@chromium.org74b86cf2013-05-30 00:02:58 +0000173 resources->MaxFragmentInputVectors = 15;
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500174 resources->MinProgramTexelOffset = -8;
175 resources->MaxProgramTexelOffset = 7;
shannonwoods@chromium.org74b86cf2013-05-30 00:02:58 +0000176
Kimmo Kinnunenb18609b2015-07-16 14:13:11 +0300177 // Extensions constants.
178 resources->MaxDualSourceDrawBuffers = 0;
179
Olli Etuaho09b04a22016-12-15 13:30:26 +0000180 resources->MaxViewsOVR = 2;
181
daniel@transgaming.comc23f4612012-11-28 19:42:57 +0000182 // Disable name hashing by default.
183 resources->HashFunction = NULL;
shannon.woods@transgaming.com1d432bb2013-01-25 21:57:28 +0000184
185 resources->ArrayIndexClampingStrategy = SH_CLAMP_WITH_CLAMP_INTRINSIC;
Nicolas Capens7d649a02014-02-07 11:24:32 -0500186
187 resources->MaxExpressionComplexity = 256;
Olli Etuaho19d1dc92016-03-08 17:18:46 +0200188 resources->MaxCallStackDepth = 256;
189 resources->MaxFunctionParameters = 1024;
Martin Radeve93d24e2016-07-28 12:06:05 +0300190
191 // ES 3.1 Revision 4, 7.2 Built-in Constants
192 resources->MaxImageUnits = 4;
193 resources->MaxVertexImageUniforms = 0;
194 resources->MaxFragmentImageUniforms = 0;
195 resources->MaxComputeImageUniforms = 4;
196 resources->MaxCombinedImageUniforms = 4;
197
198 resources->MaxCombinedShaderOutputResources = 4;
199
200 resources->MaxComputeWorkGroupCount[0] = 65535;
201 resources->MaxComputeWorkGroupCount[1] = 65535;
202 resources->MaxComputeWorkGroupCount[2] = 65535;
203 resources->MaxComputeWorkGroupSize[0] = 128;
204 resources->MaxComputeWorkGroupSize[1] = 128;
205 resources->MaxComputeWorkGroupSize[2] = 64;
206 resources->MaxComputeUniformComponents = 512;
207 resources->MaxComputeTextureImageUnits = 16;
208
209 resources->MaxComputeAtomicCounters = 8;
210 resources->MaxComputeAtomicCounterBuffers = 1;
211
212 resources->MaxVertexAtomicCounters = 0;
213 resources->MaxFragmentAtomicCounters = 0;
214 resources->MaxCombinedAtomicCounters = 8;
215 resources->MaxAtomicCounterBindings = 1;
216
217 resources->MaxVertexAtomicCounterBuffers = 0;
218 resources->MaxFragmentAtomicCounterBuffers = 0;
219 resources->MaxCombinedAtomicCounterBuffers = 1;
220 resources->MaxAtomicCounterBufferSize = 32;
alokp@chromium.org94a86ad2010-08-25 20:02:11 +0000221}
222
223//
alokp@chromium.org774d7062010-07-21 18:55:45 +0000224// Driver calls these to create and destroy compiler objects.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000225//
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500226ShHandle ShConstructCompiler(sh::GLenum type,
227 ShShaderSpec spec,
zmo@google.com5601ea02011-06-10 18:23:25 +0000228 ShShaderOutput output,
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500229 const ShBuiltInResources *resources)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000230{
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500231 TShHandleBase *base = static_cast<TShHandleBase *>(ConstructCompiler(type, spec, output));
Corentin Wallez700ad282015-12-07 15:57:47 -0500232 if (base == nullptr)
233 {
alokp@chromium.orge4249f02010-07-26 18:13:52 +0000234 return 0;
Corentin Wallez700ad282015-12-07 15:57:47 -0500235 }
236
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500237 TCompiler *compiler = base->getAsCompiler();
Corentin Wallez700ad282015-12-07 15:57:47 -0500238 if (compiler == nullptr)
239 {
240 return 0;
241 }
alokp@chromium.orge4249f02010-07-26 18:13:52 +0000242
243 // Generate built-in symbol table.
Jamie Madillacb4b812016-11-07 13:50:29 -0500244 if (!compiler->Init(*resources))
245 {
246 sh::Destruct(base);
alokp@chromium.orge4249f02010-07-26 18:13:52 +0000247 return 0;
248 }
249
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500250 return reinterpret_cast<void *>(base);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000251}
252
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000253void ShDestruct(ShHandle handle)
254{
255 if (handle == 0)
256 return;
257
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500258 TShHandleBase *base = static_cast<TShHandleBase *>(handle);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000259
260 if (base->getAsCompiler())
261 DeleteCompiler(base->getAsCompiler());
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000262}
263
Zhenyao Mo4de44cb2014-10-29 18:03:46 -0700264const std::string &ShGetBuiltInResourcesString(const ShHandle handle)
Shannon Woods2d76e5f2014-05-16 17:46:41 -0400265{
Zhenyao Mo4de44cb2014-10-29 18:03:46 -0700266 TCompiler *compiler = GetCompilerFromHandle(handle);
267 ASSERT(compiler);
268 return compiler->getBuiltInResourcesString();
Shannon Woods2d76e5f2014-05-16 17:46:41 -0400269}
Zhenyao Mo4de44cb2014-10-29 18:03:46 -0700270
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000271//
Shannon Woods2d76e5f2014-05-16 17:46:41 -0400272// Do an actual compile on the given strings. The result is left
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000273// in the given compile object.
274//
275// Return: The return value of ShCompile is really boolean, indicating
276// success or failure.
277//
Qiankun Miao7ebb97f2016-09-08 18:01:50 +0800278bool ShCompile(const ShHandle handle,
279 const char *const shaderStrings[],
280 size_t numStrings,
281 ShCompileOptions compileOptions)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000282{
Zhenyao Mo4de44cb2014-10-29 18:03:46 -0700283 TCompiler *compiler = GetCompilerFromHandle(handle);
284 ASSERT(compiler);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000285
Zhenyao Mo4de44cb2014-10-29 18:03:46 -0700286 return compiler->compile(shaderStrings, numStrings, compileOptions);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000287}
288
Dmitry Skiba2539fff2015-06-16 17:56:09 -0700289void ShClearResults(const ShHandle handle)
290{
291 TCompiler *compiler = GetCompilerFromHandle(handle);
292 ASSERT(compiler);
293 compiler->clearResults();
294}
295
Zhenyao Mo4de44cb2014-10-29 18:03:46 -0700296int ShGetShaderVersion(const ShHandle handle)
alokp@chromium.org7beea402010-09-15 21:18:34 +0000297{
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500298 TCompiler *compiler = GetCompilerFromHandle(handle);
Zhenyao Mo4de44cb2014-10-29 18:03:46 -0700299 ASSERT(compiler);
300 return compiler->getShaderVersion();
301}
alokp@chromium.org7beea402010-09-15 21:18:34 +0000302
Zhenyao Mo4de44cb2014-10-29 18:03:46 -0700303ShShaderOutput ShGetShaderOutputType(const ShHandle handle)
304{
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500305 TCompiler *compiler = GetCompilerFromHandle(handle);
Zhenyao Mo4de44cb2014-10-29 18:03:46 -0700306 ASSERT(compiler);
307 return compiler->getOutputType();
alokp@chromium.org7beea402010-09-15 21:18:34 +0000308}
309
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000310//
alokp@chromium.org774d7062010-07-21 18:55:45 +0000311// Return any compiler log of messages for the application.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000312//
Zhenyao Mo4de44cb2014-10-29 18:03:46 -0700313const std::string &ShGetInfoLog(const ShHandle handle)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000314{
Zhenyao Mo4de44cb2014-10-29 18:03:46 -0700315 TCompiler *compiler = GetCompilerFromHandle(handle);
316 ASSERT(compiler);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000317
Zhenyao Mo4de44cb2014-10-29 18:03:46 -0700318 TInfoSink &infoSink = compiler->getInfoSink();
319 return infoSink.info.str();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000320}
321
322//
alokp@chromium.org774d7062010-07-21 18:55:45 +0000323// Return any object code.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000324//
Zhenyao Mo4de44cb2014-10-29 18:03:46 -0700325const std::string &ShGetObjectCode(const ShHandle handle)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000326{
Zhenyao Mo4de44cb2014-10-29 18:03:46 -0700327 TCompiler *compiler = GetCompilerFromHandle(handle);
328 ASSERT(compiler);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000329
Zhenyao Mo4de44cb2014-10-29 18:03:46 -0700330 TInfoSink &infoSink = compiler->getInfoSink();
331 return infoSink.obj.str();
alokp@chromium.org7beea402010-09-15 21:18:34 +0000332}
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000333
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500334const std::map<std::string, std::string> *ShGetNameHashingMap(const ShHandle handle)
daniel@transgaming.comc23f4612012-11-28 19:42:57 +0000335{
Zhenyao Mo4de44cb2014-10-29 18:03:46 -0700336 TCompiler *compiler = GetCompilerFromHandle(handle);
337 ASSERT(compiler);
338 return &(compiler->getNameMap());
daniel@transgaming.comc23f4612012-11-28 19:42:57 +0000339}
daniel@transgaming.com043da132012-12-20 21:12:22 +0000340
Jamie Madillacb4b812016-11-07 13:50:29 -0500341const std::vector<Uniform> *ShGetUniforms(const ShHandle handle)
daniel@transgaming.com043da132012-12-20 21:12:22 +0000342{
Jamie Madillacb4b812016-11-07 13:50:29 -0500343 return GetShaderVariables<Uniform>(handle);
Jamie Madille294bb82014-07-17 14:16:26 -0400344}
daniel@transgaming.com043da132012-12-20 21:12:22 +0000345
Jamie Madillacb4b812016-11-07 13:50:29 -0500346const std::vector<Varying> *ShGetVaryings(const ShHandle handle)
Jamie Madille294bb82014-07-17 14:16:26 -0400347{
Jamie Madillacb4b812016-11-07 13:50:29 -0500348 return GetShaderVariables<Varying>(handle);
Jamie Madille294bb82014-07-17 14:16:26 -0400349}
daniel@transgaming.com043da132012-12-20 21:12:22 +0000350
Jamie Madillacb4b812016-11-07 13:50:29 -0500351const std::vector<Attribute> *ShGetAttributes(const ShHandle handle)
Jamie Madille294bb82014-07-17 14:16:26 -0400352{
Jamie Madillacb4b812016-11-07 13:50:29 -0500353 return GetShaderVariables<Attribute>(handle);
Jamie Madille294bb82014-07-17 14:16:26 -0400354}
355
Jamie Madillacb4b812016-11-07 13:50:29 -0500356const std::vector<OutputVariable> *ShGetOutputVariables(const ShHandle handle)
Jamie Madille294bb82014-07-17 14:16:26 -0400357{
Jamie Madillacb4b812016-11-07 13:50:29 -0500358 return GetShaderVariables<OutputVariable>(handle);
Jamie Madille294bb82014-07-17 14:16:26 -0400359}
360
Jamie Madillacb4b812016-11-07 13:50:29 -0500361const std::vector<InterfaceBlock> *ShGetInterfaceBlocks(const ShHandle handle)
Jamie Madille294bb82014-07-17 14:16:26 -0400362{
Jamie Madillacb4b812016-11-07 13:50:29 -0500363 return GetShaderVariables<InterfaceBlock>(handle);
shannon.woods@transgaming.com1d432bb2013-01-25 21:57:28 +0000364}
Zhenyao Moa15f3e82013-09-23 14:57:08 -0400365
Jamie Madillacb4b812016-11-07 13:50:29 -0500366WorkGroupSize ShGetComputeShaderLocalGroupSize(const ShHandle handle)
Martin Radev802abe02016-08-04 17:48:32 +0300367{
368 ASSERT(handle);
369
370 TShHandleBase *base = static_cast<TShHandleBase *>(handle);
371 TCompiler *compiler = base->getAsCompiler();
372 ASSERT(compiler);
373
374 return compiler->getComputeShaderLocalSize();
375}
376
Olli Etuaho09b04a22016-12-15 13:30:26 +0000377int ShGetVertexShaderNumViews(const ShHandle handle)
378{
379 ASSERT(handle);
380 TShHandleBase *base = static_cast<TShHandleBase *>(handle);
381 TCompiler *compiler = base->getAsCompiler();
382 ASSERT(compiler);
383
384 return compiler->getNumViews();
385}
386
Corentin Walleze58e1412016-07-18 16:40:46 -0400387bool ShCheckVariablesWithinPackingLimits(int maxVectors,
Jamie Madillacb4b812016-11-07 13:50:29 -0500388 const std::vector<ShaderVariable> &variables)
Corentin Walleze58e1412016-07-18 16:40:46 -0400389{
Zhenyao Moa15f3e82013-09-23 14:57:08 -0400390 VariablePacker packer;
Zhenyao Mo4de44cb2014-10-29 18:03:46 -0700391 return packer.CheckVariablesWithinPackingLimits(maxVectors, variables);
Zhenyao Moa15f3e82013-09-23 14:57:08 -0400392}
Jamie Madill4e1fd412014-07-10 17:50:10 -0400393
394bool ShGetInterfaceBlockRegister(const ShHandle handle,
Zhenyao Mo4de44cb2014-10-29 18:03:46 -0700395 const std::string &interfaceBlockName,
Jamie Madill4e1fd412014-07-10 17:50:10 -0400396 unsigned int *indexOut)
397{
Daniel Bratell73941de2015-02-25 14:34:49 +0100398#ifdef ANGLE_ENABLE_HLSL
Zhenyao Mo4de44cb2014-10-29 18:03:46 -0700399 ASSERT(indexOut);
Jamie Madill4e1fd412014-07-10 17:50:10 -0400400
Zhenyao Mo4de44cb2014-10-29 18:03:46 -0700401 TranslatorHLSL *translator = GetTranslatorHLSLFromHandle(handle);
402 ASSERT(translator);
Jamie Madill4e1fd412014-07-10 17:50:10 -0400403
404 if (!translator->hasInterfaceBlock(interfaceBlockName))
405 {
406 return false;
407 }
408
409 *indexOut = translator->getInterfaceBlockRegister(interfaceBlockName);
410 return true;
Daniel Bratell73941de2015-02-25 14:34:49 +0100411#else
412 return false;
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500413#endif // ANGLE_ENABLE_HLSL
Jamie Madill4e1fd412014-07-10 17:50:10 -0400414}
Jamie Madill9fe25e92014-07-18 10:33:08 -0400415
Olli Etuaho96963162016-03-21 11:54:33 +0200416const std::map<std::string, unsigned int> *ShGetUniformRegisterMap(const ShHandle handle)
Jamie Madill9fe25e92014-07-18 10:33:08 -0400417{
Daniel Bratell73941de2015-02-25 14:34:49 +0100418#ifdef ANGLE_ENABLE_HLSL
Zhenyao Mo4de44cb2014-10-29 18:03:46 -0700419 TranslatorHLSL *translator = GetTranslatorHLSLFromHandle(handle);
420 ASSERT(translator);
Jamie Madill9fe25e92014-07-18 10:33:08 -0400421
Olli Etuaho96963162016-03-21 11:54:33 +0200422 return translator->getUniformRegisterMap();
Daniel Bratell73941de2015-02-25 14:34:49 +0100423#else
Jamie Madill08e229e2016-10-05 17:16:13 -0400424 return nullptr;
Olli Etuaho96963162016-03-21 11:54:33 +0200425#endif // ANGLE_ENABLE_HLSL
Corentin Walleze58e1412016-07-18 16:40:46 -0400426}
Jamie Madillacb4b812016-11-07 13:50:29 -0500427
428namespace sh
429{
430bool Initialize()
431{
432 return ShInitialize();
433}
434
435bool Finalize()
436{
437 return ShFinalize();
438}
439
440void InitBuiltInResources(ShBuiltInResources *resources)
441{
442 ShInitBuiltInResources(resources);
443}
444
445const std::string &GetBuiltInResourcesString(const ShHandle handle)
446{
447 return ShGetBuiltInResourcesString(handle);
448}
449
450ShHandle ConstructCompiler(sh::GLenum type,
451 ShShaderSpec spec,
452 ShShaderOutput output,
453 const ShBuiltInResources *resources)
454{
455 return ShConstructCompiler(type, spec, output, resources);
456}
457
458void Destruct(ShHandle handle)
459{
460 return ShDestruct(handle);
461}
462
463bool Compile(const ShHandle handle,
464 const char *const shaderStrings[],
465 size_t numStrings,
466 ShCompileOptions compileOptions)
467{
468 return ShCompile(handle, shaderStrings, numStrings, compileOptions);
469}
470
471void ClearResults(const ShHandle handle)
472{
473 return ShClearResults(handle);
474}
475
476int GetShaderVersion(const ShHandle handle)
477{
478 return ShGetShaderVersion(handle);
479}
480
481ShShaderOutput GetShaderOutputType(const ShHandle handle)
482{
483 return ShGetShaderOutputType(handle);
484}
485
486const std::string &GetInfoLog(const ShHandle handle)
487{
488 return ShGetInfoLog(handle);
489}
490
491const std::string &GetObjectCode(const ShHandle handle)
492{
493 return ShGetObjectCode(handle);
494}
495
496const std::map<std::string, std::string> *GetNameHashingMap(const ShHandle handle)
497{
498 return ShGetNameHashingMap(handle);
499}
500
501const std::vector<sh::Uniform> *GetUniforms(const ShHandle handle)
502{
503 return ShGetUniforms(handle);
504}
505const std::vector<sh::Varying> *GetVaryings(const ShHandle handle)
506{
507 return ShGetVaryings(handle);
508}
509const std::vector<sh::Attribute> *GetAttributes(const ShHandle handle)
510{
511 return ShGetAttributes(handle);
512}
513
514const std::vector<sh::OutputVariable> *GetOutputVariables(const ShHandle handle)
515{
516 return ShGetOutputVariables(handle);
517}
518const std::vector<sh::InterfaceBlock> *GetInterfaceBlocks(const ShHandle handle)
519{
520 return ShGetInterfaceBlocks(handle);
521}
522
523sh::WorkGroupSize GetComputeShaderLocalGroupSize(const ShHandle handle)
524{
525 return ShGetComputeShaderLocalGroupSize(handle);
526}
527
Olli Etuaho09b04a22016-12-15 13:30:26 +0000528int GetVertexShaderNumViews(const ShHandle handle)
529{
530 return ShGetVertexShaderNumViews(handle);
531}
532
Jamie Madillacb4b812016-11-07 13:50:29 -0500533bool CheckVariablesWithinPackingLimits(int maxVectors,
534 const std::vector<sh::ShaderVariable> &variables)
535{
536 return ShCheckVariablesWithinPackingLimits(maxVectors, variables);
537}
538
539bool GetInterfaceBlockRegister(const ShHandle handle,
540 const std::string &interfaceBlockName,
541 unsigned int *indexOut)
542{
543 return ShGetInterfaceBlockRegister(handle, interfaceBlockName, indexOut);
544}
545
546const std::map<std::string, unsigned int> *GetUniformRegisterMap(const ShHandle handle)
547{
548 return ShGetUniformRegisterMap(handle);
549}
550
551} // namespace sh