blob: b44339c3061858e5e388e64e27182cfcc8840ebd [file] [log] [blame]
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001//
Geoff Langcec35902014-04-16 10:52:36 -04002// Copyright (c) 2002-2014 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// Shader.cpp: Implements the gl::Shader class and its derived classes
8// VertexShader and FragmentShader. Implements GL shader objects and related
9// functionality. [OpenGL ES 2.0.24] section 2.10 page 24 and section 3.8 page 84.
10
Geoff Lang2b5420c2014-11-19 14:20:15 -050011#include "libANGLE/Shader.h"
Geoff Lang0b7eef72014-06-12 14:10:47 -040012
13#include <sstream>
14
Jamie Madill91445bc2015-09-23 16:47:53 -040015#include "common/utilities.h"
16#include "GLSLANG/ShaderLang.h"
Jamie Madill53ea9cc2016-05-17 10:12:52 -040017#include "libANGLE/Caps.h"
Jamie Madill006cbc52015-09-23 16:47:54 -040018#include "libANGLE/Compiler.h"
Jamie Madill91445bc2015-09-23 16:47:53 -040019#include "libANGLE/Constants.h"
Jamie Madill53ea9cc2016-05-17 10:12:52 -040020#include "libANGLE/renderer/GLImplFactory.h"
Jamie Madill91445bc2015-09-23 16:47:53 -040021#include "libANGLE/renderer/ShaderImpl.h"
22#include "libANGLE/ResourceManager.h"
Bryan Bernhart619c8332016-11-09 11:11:41 -080023#include "libANGLE/Context.h"
Jamie Madill91445bc2015-09-23 16:47:53 -040024
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000025namespace gl
26{
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000027
Jamie Madill006cbc52015-09-23 16:47:54 -040028namespace
29{
30template <typename VarT>
31std::vector<VarT> GetActiveShaderVariables(const std::vector<VarT> *variableList)
32{
33 ASSERT(variableList);
34 std::vector<VarT> result;
35 for (size_t varIndex = 0; varIndex < variableList->size(); varIndex++)
36 {
37 const VarT &var = variableList->at(varIndex);
38 if (var.staticUse)
39 {
40 result.push_back(var);
41 }
42 }
43 return result;
44}
45
46template <typename VarT>
47const std::vector<VarT> &GetShaderVariables(const std::vector<VarT> *variableList)
48{
49 ASSERT(variableList);
50 return *variableList;
51}
52
Jamie Madill9fc36822015-11-18 13:08:07 -050053} // anonymous namespace
54
Jamie Madill006cbc52015-09-23 16:47:54 -040055// true if varying x has a higher priority in packing than y
Jamie Madill55c25d02015-11-18 13:08:08 -050056bool CompareShaderVar(const sh::ShaderVariable &x, const sh::ShaderVariable &y)
Jamie Madill006cbc52015-09-23 16:47:54 -040057{
58 if (x.type == y.type)
59 {
60 return x.arraySize > y.arraySize;
61 }
62
63 // Special case for handling structs: we sort these to the end of the list
64 if (x.type == GL_STRUCT_ANGLEX)
65 {
66 return false;
67 }
68
69 if (y.type == GL_STRUCT_ANGLEX)
70 {
71 return true;
72 }
73
74 return gl::VariableSortOrder(x.type) < gl::VariableSortOrder(y.type);
75}
76
Jamie Madill34ca4f52017-06-13 11:49:39 -040077ShaderState::ShaderState(GLenum shaderType)
78 : mLabel(),
79 mShaderType(shaderType),
80 mShaderVersion(100),
81 mCompileStatus(CompileStatus::NOT_COMPILED)
Jamie Madill91445bc2015-09-23 16:47:53 -040082{
Martin Radev4c4c8e72016-08-04 12:25:34 +030083 mLocalSize.fill(-1);
Jamie Madill91445bc2015-09-23 16:47:53 -040084}
85
Jamie Madill15243d92016-04-26 13:41:35 -040086ShaderState::~ShaderState()
Jamie Madill91445bc2015-09-23 16:47:53 -040087{
88}
89
Geoff Lang4ddf5af2016-12-01 14:30:44 -050090Shader::Shader(ShaderProgramManager *manager,
Jamie Madill7aea7e02016-05-10 10:39:45 -040091 rx::GLImplFactory *implFactory,
Jamie Madill006cbc52015-09-23 16:47:54 -040092 const gl::Limitations &rendererLimitations,
93 GLenum type,
94 GLuint handle)
Jamie Madill15243d92016-04-26 13:41:35 -040095 : mState(type),
96 mImplementation(implFactory->createShader(mState)),
Jamie Madill006cbc52015-09-23 16:47:54 -040097 mRendererLimitations(rendererLimitations),
Brandon Jonesf05cdee2014-08-27 15:24:07 -070098 mHandle(handle),
Corentin Wallezbc99bb62015-05-14 17:42:20 -040099 mType(type),
Brandon Jonesf05cdee2014-08-27 15:24:07 -0700100 mRefCount(0),
101 mDeleteStatus(false),
Corentin Wallezbc99bb62015-05-14 17:42:20 -0400102 mResourceManager(manager)
Jamie Madille294bb82014-07-17 14:16:26 -0400103{
Jamie Madill91445bc2015-09-23 16:47:53 -0400104 ASSERT(mImplementation);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000105}
106
Jamie Madill4928b7c2017-06-20 12:57:39 -0400107void Shader::onDestroy(const gl::Context *context)
108{
109 mBoundCompiler.set(context, nullptr);
110 mImplementation.reset(nullptr);
111 delete this;
112}
113
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000114Shader::~Shader()
115{
Jamie Madill4928b7c2017-06-20 12:57:39 -0400116 ASSERT(!mImplementation);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000117}
118
Geoff Lang70d0f492015-12-10 17:45:46 -0500119void Shader::setLabel(const std::string &label)
120{
Jamie Madill15243d92016-04-26 13:41:35 -0400121 mState.mLabel = label;
Geoff Lang70d0f492015-12-10 17:45:46 -0500122}
123
124const std::string &Shader::getLabel() const
125{
Jamie Madill15243d92016-04-26 13:41:35 -0400126 return mState.mLabel;
Geoff Lang70d0f492015-12-10 17:45:46 -0500127}
128
daniel@transgaming.com6c785212010-03-30 03:36:17 +0000129GLuint Shader::getHandle() const
130{
131 return mHandle;
132}
133
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +0000134void Shader::setSource(GLsizei count, const char *const *string, const GLint *length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000135{
Geoff Lang536d7262013-08-26 17:04:20 -0400136 std::ostringstream stream;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000137
138 for (int i = 0; i < count; i++)
139 {
Geoff Langf60fab62014-11-24 11:21:20 -0500140 if (length == nullptr || length[i] < 0)
141 {
Jamie Madille7cfb3d2014-12-03 10:58:56 -0500142 stream.write(string[i], strlen(string[i]));
Geoff Langf60fab62014-11-24 11:21:20 -0500143 }
144 else
145 {
146 stream.write(string[i], length[i]);
147 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000148 }
149
Jamie Madill15243d92016-04-26 13:41:35 -0400150 mState.mSource = stream.str();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000151}
152
Jamie Madillbd044ed2017-06-05 12:59:21 -0400153int Shader::getInfoLogLength(const Context *context)
daniel@transgaming.comcba50572010-03-28 19:36:09 +0000154{
Jamie Madillbd044ed2017-06-05 12:59:21 -0400155 resolveCompile(context);
Jamie Madill006cbc52015-09-23 16:47:54 -0400156 if (mInfoLog.empty())
Jamie Madill91445bc2015-09-23 16:47:53 -0400157 {
158 return 0;
159 }
160
Jamie Madill006cbc52015-09-23 16:47:54 -0400161 return (static_cast<int>(mInfoLog.length()) + 1);
daniel@transgaming.comcba50572010-03-28 19:36:09 +0000162}
163
Jamie Madillbd044ed2017-06-05 12:59:21 -0400164void Shader::getInfoLog(const Context *context, GLsizei bufSize, GLsizei *length, char *infoLog)
daniel@transgaming.comcba50572010-03-28 19:36:09 +0000165{
Jamie Madillbd044ed2017-06-05 12:59:21 -0400166 resolveCompile(context);
167
daniel@transgaming.comcba50572010-03-28 19:36:09 +0000168 int index = 0;
169
daniel@transgaming.com807d8c32012-04-04 15:06:04 +0000170 if (bufSize > 0)
daniel@transgaming.comcba50572010-03-28 19:36:09 +0000171 {
Jamie Madill006cbc52015-09-23 16:47:54 -0400172 index = std::min(bufSize - 1, static_cast<GLsizei>(mInfoLog.length()));
173 memcpy(infoLog, mInfoLog.c_str(), index);
daniel@transgaming.comcba50572010-03-28 19:36:09 +0000174
daniel@transgaming.comcba50572010-03-28 19:36:09 +0000175 infoLog[index] = '\0';
176 }
177
178 if (length)
179 {
180 *length = index;
181 }
182}
183
184int Shader::getSourceLength() const
185{
Jamie Madill15243d92016-04-26 13:41:35 -0400186 return mState.mSource.empty() ? 0 : (static_cast<int>(mState.mSource.length()) + 1);
daniel@transgaming.comcba50572010-03-28 19:36:09 +0000187}
188
Jamie Madillbd044ed2017-06-05 12:59:21 -0400189int Shader::getTranslatedSourceLength(const Context *context)
zmo@google.coma574f782011-10-03 21:45:23 +0000190{
Jamie Madillbd044ed2017-06-05 12:59:21 -0400191 resolveCompile(context);
192
Jamie Madill15243d92016-04-26 13:41:35 -0400193 if (mState.mTranslatedSource.empty())
Jamie Madill91445bc2015-09-23 16:47:53 -0400194 {
195 return 0;
196 }
197
Jamie Madill15243d92016-04-26 13:41:35 -0400198 return (static_cast<int>(mState.mTranslatedSource.length()) + 1);
zmo@google.coma574f782011-10-03 21:45:23 +0000199}
200
Jamie Madillbd044ed2017-06-05 12:59:21 -0400201int Shader::getTranslatedSourceWithDebugInfoLength(const Context *context)
Jamie Madill847638a2015-11-20 13:01:41 -0500202{
Jamie Madillbd044ed2017-06-05 12:59:21 -0400203 resolveCompile(context);
204
Jamie Madill847638a2015-11-20 13:01:41 -0500205 const std::string &debugInfo = mImplementation->getDebugInfo();
206 if (debugInfo.empty())
207 {
208 return 0;
209 }
210
211 return (static_cast<int>(debugInfo.length()) + 1);
212}
213
Jamie Madillbd044ed2017-06-05 12:59:21 -0400214// static
215void Shader::GetSourceImpl(const std::string &source,
216 GLsizei bufSize,
217 GLsizei *length,
218 char *buffer)
daniel@transgaming.comcba50572010-03-28 19:36:09 +0000219{
220 int index = 0;
221
daniel@transgaming.com807d8c32012-04-04 15:06:04 +0000222 if (bufSize > 0)
daniel@transgaming.comcba50572010-03-28 19:36:09 +0000223 {
Geoff Lang536d7262013-08-26 17:04:20 -0400224 index = std::min(bufSize - 1, static_cast<GLsizei>(source.length()));
225 memcpy(buffer, source.c_str(), index);
daniel@transgaming.comcba50572010-03-28 19:36:09 +0000226
zmo@google.coma574f782011-10-03 21:45:23 +0000227 buffer[index] = '\0';
daniel@transgaming.comcba50572010-03-28 19:36:09 +0000228 }
229
230 if (length)
231 {
232 *length = index;
233 }
234}
235
Geoff Lang536d7262013-08-26 17:04:20 -0400236void Shader::getSource(GLsizei bufSize, GLsizei *length, char *buffer) const
zmo@google.coma574f782011-10-03 21:45:23 +0000237{
Jamie Madillbd044ed2017-06-05 12:59:21 -0400238 GetSourceImpl(mState.mSource, bufSize, length, buffer);
zmo@google.coma574f782011-10-03 21:45:23 +0000239}
240
Jamie Madillbd044ed2017-06-05 12:59:21 -0400241void Shader::getTranslatedSource(const Context *context,
242 GLsizei bufSize,
243 GLsizei *length,
244 char *buffer)
zmo@google.coma574f782011-10-03 21:45:23 +0000245{
Jamie Madillbd044ed2017-06-05 12:59:21 -0400246 GetSourceImpl(getTranslatedSource(context), bufSize, length, buffer);
zmo@google.coma574f782011-10-03 21:45:23 +0000247}
248
Jamie Madillbd044ed2017-06-05 12:59:21 -0400249const std::string &Shader::getTranslatedSource(const Context *context)
Tibor den Ouden97049c62014-10-06 21:39:16 +0200250{
Jamie Madillbd044ed2017-06-05 12:59:21 -0400251 resolveCompile(context);
252 return mState.mTranslatedSource;
253}
254
255void Shader::getTranslatedSourceWithDebugInfo(const Context *context,
256 GLsizei bufSize,
257 GLsizei *length,
258 char *buffer)
259{
260 resolveCompile(context);
Jamie Madill847638a2015-11-20 13:01:41 -0500261 const std::string &debugInfo = mImplementation->getDebugInfo();
Jamie Madillbd044ed2017-06-05 12:59:21 -0400262 GetSourceImpl(debugInfo, bufSize, length, buffer);
Tibor den Ouden97049c62014-10-06 21:39:16 +0200263}
264
Bryan Bernhart619c8332016-11-09 11:11:41 -0800265void Shader::compile(const Context *context)
Jamie Madillbf9cce22014-07-18 10:33:09 -0400266{
Jamie Madill15243d92016-04-26 13:41:35 -0400267 mState.mTranslatedSource.clear();
Jamie Madill006cbc52015-09-23 16:47:54 -0400268 mInfoLog.clear();
Jamie Madill15243d92016-04-26 13:41:35 -0400269 mState.mShaderVersion = 100;
270 mState.mVaryings.clear();
271 mState.mUniforms.clear();
272 mState.mInterfaceBlocks.clear();
273 mState.mActiveAttributes.clear();
274 mState.mActiveOutputVariables.clear();
Jamie Madill91445bc2015-09-23 16:47:53 -0400275
Jamie Madill34ca4f52017-06-13 11:49:39 -0400276 mState.mCompileStatus = CompileStatus::COMPILE_REQUESTED;
Jamie Madill4928b7c2017-06-20 12:57:39 -0400277 mBoundCompiler.set(context, context->getCompiler());
Jamie Madillbd044ed2017-06-05 12:59:21 -0400278
279 // Cache the compile source and options for compilation. Must be done now, since the source
280 // can change before the link call or another call that resolves the compile.
Jamie Madill006cbc52015-09-23 16:47:54 -0400281
282 std::stringstream sourceStream;
283
Jamie Madillbd044ed2017-06-05 12:59:21 -0400284 mLastCompileOptions =
285 mImplementation->prepareSourceAndReturnOptions(&sourceStream, &mLastCompiledSourcePath);
286 mLastCompileOptions |= (SH_OBJECT_CODE | SH_VARIABLES);
287 mLastCompiledSource = sourceStream.str();
Jamie Madill006cbc52015-09-23 16:47:54 -0400288
Bryan Bernhart619c8332016-11-09 11:11:41 -0800289 // Add default options to WebGL shaders to prevent unexpected behavior during compilation.
290 if (context->getExtensions().webglCompatibility)
291 {
Jamie Madillbd044ed2017-06-05 12:59:21 -0400292 mLastCompileOptions |= SH_INIT_GL_POSITION;
293 mLastCompileOptions |= SH_LIMIT_CALL_STACK_DEPTH;
294 mLastCompileOptions |= SH_LIMIT_EXPRESSION_COMPLEXITY;
295 mLastCompileOptions |= SH_ENFORCE_PACKING_RESTRICTIONS;
Bryan Bernhart619c8332016-11-09 11:11:41 -0800296 }
297
Jamie Madill006cbc52015-09-23 16:47:54 -0400298 // Some targets (eg D3D11 Feature Level 9_3 and below) do not support non-constant loop indexes
299 // in fragment shaders. Shader compilation will fail. To provide a better error message we can
300 // instruct the compiler to pre-validate.
301 if (mRendererLimitations.shadersRequireIndexedLoopValidation)
302 {
Jamie Madillbd044ed2017-06-05 12:59:21 -0400303 mLastCompileOptions |= SH_VALIDATE_LOOP_INDEXING;
Jamie Madill006cbc52015-09-23 16:47:54 -0400304 }
Jamie Madillbd044ed2017-06-05 12:59:21 -0400305}
Jamie Madill006cbc52015-09-23 16:47:54 -0400306
Jamie Madillbd044ed2017-06-05 12:59:21 -0400307void Shader::resolveCompile(const Context *context)
308{
Jamie Madill34ca4f52017-06-13 11:49:39 -0400309 if (!mState.compilePending())
Jamie Madilld2c52e32015-10-14 17:07:05 -0400310 {
Jamie Madillbd044ed2017-06-05 12:59:21 -0400311 return;
Jamie Madilld2c52e32015-10-14 17:07:05 -0400312 }
313
Jamie Madillbd044ed2017-06-05 12:59:21 -0400314 ASSERT(mBoundCompiler.get());
315 ShHandle compilerHandle = mBoundCompiler->getCompilerHandle(mState.mShaderType);
Jamie Madilld2c52e32015-10-14 17:07:05 -0400316
Jamie Madillbd044ed2017-06-05 12:59:21 -0400317 std::vector<const char *> srcStrings;
Jamie Madill006cbc52015-09-23 16:47:54 -0400318
Jamie Madillbd044ed2017-06-05 12:59:21 -0400319 if (!mLastCompiledSourcePath.empty())
320 {
321 srcStrings.push_back(mLastCompiledSourcePath.c_str());
322 }
323
324 srcStrings.push_back(mLastCompiledSource.c_str());
325
326 if (!sh::Compile(compilerHandle, &srcStrings[0], srcStrings.size(), mLastCompileOptions))
Jamie Madill006cbc52015-09-23 16:47:54 -0400327 {
Jamie Madillacb4b812016-11-07 13:50:29 -0500328 mInfoLog = sh::GetInfoLog(compilerHandle);
Yuly Novikovd73f8522017-01-13 17:48:57 -0500329 WARN() << std::endl << mInfoLog;
Jamie Madill34ca4f52017-06-13 11:49:39 -0400330 mState.mCompileStatus = CompileStatus::NOT_COMPILED;
Jamie Madill006cbc52015-09-23 16:47:54 -0400331 return;
332 }
333
Jamie Madillacb4b812016-11-07 13:50:29 -0500334 mState.mTranslatedSource = sh::GetObjectCode(compilerHandle);
Jamie Madill006cbc52015-09-23 16:47:54 -0400335
Jamie Madillbd044ed2017-06-05 12:59:21 -0400336#if !defined(NDEBUG)
Jamie Madill006cbc52015-09-23 16:47:54 -0400337 // Prefix translated shader with commented out un-translated shader.
338 // Useful in diagnostics tools which capture the shader source.
339 std::ostringstream shaderStream;
340 shaderStream << "// GLSL\n";
341 shaderStream << "//\n";
342
Geoff Lang9e1bf102017-03-28 15:10:48 -0400343 std::istringstream inputSourceStream(mState.mSource);
344 std::string line;
345 while (std::getline(inputSourceStream, line))
Jamie Madill006cbc52015-09-23 16:47:54 -0400346 {
Geoff Lang9e1bf102017-03-28 15:10:48 -0400347 // Remove null characters from the source line
348 line.erase(std::remove(line.begin(), line.end(), '\0'), line.end());
Jamie Madill006cbc52015-09-23 16:47:54 -0400349
Geoff Lang9e1bf102017-03-28 15:10:48 -0400350 shaderStream << "// " << line;
Jamie Madill006cbc52015-09-23 16:47:54 -0400351 }
352 shaderStream << "\n\n";
Jamie Madill15243d92016-04-26 13:41:35 -0400353 shaderStream << mState.mTranslatedSource;
354 mState.mTranslatedSource = shaderStream.str();
Jamie Madillbd044ed2017-06-05 12:59:21 -0400355#endif // !defined(NDEBUG)
Jamie Madill006cbc52015-09-23 16:47:54 -0400356
357 // Gather the shader information
Jamie Madillacb4b812016-11-07 13:50:29 -0500358 mState.mShaderVersion = sh::GetShaderVersion(compilerHandle);
Jamie Madill006cbc52015-09-23 16:47:54 -0400359
Jamie Madillacb4b812016-11-07 13:50:29 -0500360 mState.mVaryings = GetShaderVariables(sh::GetVaryings(compilerHandle));
361 mState.mUniforms = GetShaderVariables(sh::GetUniforms(compilerHandle));
362 mState.mInterfaceBlocks = GetShaderVariables(sh::GetInterfaceBlocks(compilerHandle));
Jamie Madill006cbc52015-09-23 16:47:54 -0400363
Martin Radev4c4c8e72016-08-04 12:25:34 +0300364 switch (mState.mShaderType)
Jamie Madill006cbc52015-09-23 16:47:54 -0400365 {
Martin Radev4c4c8e72016-08-04 12:25:34 +0300366 case GL_COMPUTE_SHADER:
367 {
Jamie Madillacb4b812016-11-07 13:50:29 -0500368 mState.mLocalSize = sh::GetComputeShaderLocalGroupSize(compilerHandle);
Martin Radev4c4c8e72016-08-04 12:25:34 +0300369 break;
370 }
371 case GL_VERTEX_SHADER:
372 {
Jamie Madillacb4b812016-11-07 13:50:29 -0500373 mState.mActiveAttributes = GetActiveShaderVariables(sh::GetAttributes(compilerHandle));
Martin Radev4c4c8e72016-08-04 12:25:34 +0300374 break;
375 }
376 case GL_FRAGMENT_SHADER:
377 {
378 // TODO(jmadill): Figure out why we only sort in the FS, and if we need to.
379 std::sort(mState.mVaryings.begin(), mState.mVaryings.end(), CompareShaderVar);
380 mState.mActiveOutputVariables =
Jamie Madillacb4b812016-11-07 13:50:29 -0500381 GetActiveShaderVariables(sh::GetOutputVariables(compilerHandle));
Martin Radev4c4c8e72016-08-04 12:25:34 +0300382 break;
383 }
384 default:
385 UNREACHABLE();
Jamie Madill006cbc52015-09-23 16:47:54 -0400386 }
387
Jamie Madill15243d92016-04-26 13:41:35 -0400388 ASSERT(!mState.mTranslatedSource.empty());
Jamie Madill006cbc52015-09-23 16:47:54 -0400389
Jamie Madillbd044ed2017-06-05 12:59:21 -0400390 bool success = mImplementation->postTranslateCompile(mBoundCompiler.get(), &mInfoLog);
Jamie Madill34ca4f52017-06-13 11:49:39 -0400391 mState.mCompileStatus = success ? CompileStatus::COMPILED : CompileStatus::NOT_COMPILED;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000392}
393
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000394void Shader::addRef()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000395{
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000396 mRefCount++;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000397}
398
Jamie Madill6c1f6712017-02-14 19:08:04 -0500399void Shader::release(const Context *context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000400{
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000401 mRefCount--;
daniel@transgaming.com71cd8682010-04-29 03:35:25 +0000402
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000403 if (mRefCount == 0 && mDeleteStatus)
daniel@transgaming.com71cd8682010-04-29 03:35:25 +0000404 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500405 mResourceManager->deleteShader(context, mHandle);
daniel@transgaming.com71cd8682010-04-29 03:35:25 +0000406 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000407}
408
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000409unsigned int Shader::getRefCount() const
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000410{
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000411 return mRefCount;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000412}
413
daniel@transgaming.comcba50572010-03-28 19:36:09 +0000414bool Shader::isFlaggedForDeletion() const
415{
416 return mDeleteStatus;
417}
418
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000419void Shader::flagForDeletion()
420{
421 mDeleteStatus = true;
422}
423
Jamie Madillbd044ed2017-06-05 12:59:21 -0400424bool Shader::isCompiled(const Context *context)
Jamie Madill80a6fc02015-08-21 16:53:16 -0400425{
Jamie Madillbd044ed2017-06-05 12:59:21 -0400426 resolveCompile(context);
Jamie Madill34ca4f52017-06-13 11:49:39 -0400427 return mState.mCompileStatus == CompileStatus::COMPILED;
Jamie Madillbd044ed2017-06-05 12:59:21 -0400428}
429
430int Shader::getShaderVersion(const Context *context)
431{
432 resolveCompile(context);
Jamie Madill15243d92016-04-26 13:41:35 -0400433 return mState.mShaderVersion;
Jamie Madill80a6fc02015-08-21 16:53:16 -0400434}
435
Jamie Madillbd044ed2017-06-05 12:59:21 -0400436const std::vector<sh::Varying> &Shader::getVaryings(const Context *context)
Jamie Madilld15250e2014-09-03 09:40:44 -0400437{
Jamie Madillbd044ed2017-06-05 12:59:21 -0400438 resolveCompile(context);
Jamie Madill15243d92016-04-26 13:41:35 -0400439 return mState.getVaryings();
Jamie Madilld15250e2014-09-03 09:40:44 -0400440}
441
Jamie Madillbd044ed2017-06-05 12:59:21 -0400442const std::vector<sh::Uniform> &Shader::getUniforms(const Context *context)
Jamie Madilld15250e2014-09-03 09:40:44 -0400443{
Jamie Madillbd044ed2017-06-05 12:59:21 -0400444 resolveCompile(context);
Jamie Madill15243d92016-04-26 13:41:35 -0400445 return mState.getUniforms();
Jamie Madilld15250e2014-09-03 09:40:44 -0400446}
447
Jamie Madillbd044ed2017-06-05 12:59:21 -0400448const std::vector<sh::InterfaceBlock> &Shader::getInterfaceBlocks(const Context *context)
Jamie Madilld15250e2014-09-03 09:40:44 -0400449{
Jamie Madillbd044ed2017-06-05 12:59:21 -0400450 resolveCompile(context);
Jamie Madill15243d92016-04-26 13:41:35 -0400451 return mState.getInterfaceBlocks();
Jamie Madilld15250e2014-09-03 09:40:44 -0400452}
453
Jamie Madillbd044ed2017-06-05 12:59:21 -0400454const std::vector<sh::Attribute> &Shader::getActiveAttributes(const Context *context)
Jamie Madilld15250e2014-09-03 09:40:44 -0400455{
Jamie Madillbd044ed2017-06-05 12:59:21 -0400456 resolveCompile(context);
Jamie Madill15243d92016-04-26 13:41:35 -0400457 return mState.getActiveAttributes();
Jamie Madilld15250e2014-09-03 09:40:44 -0400458}
459
Jamie Madillbd044ed2017-06-05 12:59:21 -0400460const std::vector<sh::OutputVariable> &Shader::getActiveOutputVariables(const Context *context)
Jamie Madilld15250e2014-09-03 09:40:44 -0400461{
Jamie Madillbd044ed2017-06-05 12:59:21 -0400462 resolveCompile(context);
Jamie Madill15243d92016-04-26 13:41:35 -0400463 return mState.getActiveOutputVariables();
Jamie Madilld15250e2014-09-03 09:40:44 -0400464}
465
Jamie Madillbd044ed2017-06-05 12:59:21 -0400466const sh::WorkGroupSize &Shader::getWorkGroupSize(const Context *context)
467{
468 resolveCompile(context);
469 return mState.mLocalSize;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000470}
Jamie Madillbd044ed2017-06-05 12:59:21 -0400471
472} // namespace gl