blob: 94de5135372dea897ed7aabd00dd9ffb4027896e [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
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000011#include "libGLESv2/Shader.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000012#include "libGLESv2/renderer/Renderer.h"
Brandon Jonesf05cdee2014-08-27 15:24:07 -070013#include "libGLESv2/renderer/ShaderImpl.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000014#include "libGLESv2/Constants.h"
15#include "libGLESv2/ResourceManager.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000016
Geoff Lang0b7eef72014-06-12 14:10:47 -040017#include "common/utilities.h"
18
19#include "GLSLANG/ShaderLang.h"
20
21#include <sstream>
22
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000023namespace gl
24{
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000025
Brandon Jonesf05cdee2014-08-27 15:24:07 -070026Shader::Shader(ResourceManager *manager, rx::ShaderImpl *impl, GLenum type, GLuint handle)
27 : mShader(impl),
28 mType(type),
29 mHandle(handle),
30 mResourceManager(manager),
31 mRefCount(0),
32 mDeleteStatus(false),
33 mCompiled(false)
Jamie Madille294bb82014-07-17 14:16:26 -040034{
Jamie Madilld15250e2014-09-03 09:40:44 -040035 ASSERT(impl);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000036}
37
38Shader::~Shader()
39{
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000040}
41
daniel@transgaming.com6c785212010-03-30 03:36:17 +000042GLuint Shader::getHandle() const
43{
44 return mHandle;
45}
46
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +000047void Shader::setSource(GLsizei count, const char *const *string, const GLint *length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000048{
Geoff Lang536d7262013-08-26 17:04:20 -040049 std::ostringstream stream;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000050
51 for (int i = 0; i < count; i++)
52 {
Geoff Lang536d7262013-08-26 17:04:20 -040053 stream << string[i];
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000054 }
55
Geoff Lang536d7262013-08-26 17:04:20 -040056 mSource = stream.str();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000057}
58
daniel@transgaming.comcba50572010-03-28 19:36:09 +000059int Shader::getInfoLogLength() const
60{
Brandon Jonesf05cdee2014-08-27 15:24:07 -070061 return mShader->getInfoLog().empty() ? 0 : (mShader->getInfoLog().length() + 1);
daniel@transgaming.comcba50572010-03-28 19:36:09 +000062}
63
Geoff Lang536d7262013-08-26 17:04:20 -040064void Shader::getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog) const
daniel@transgaming.comcba50572010-03-28 19:36:09 +000065{
66 int index = 0;
67
daniel@transgaming.com807d8c32012-04-04 15:06:04 +000068 if (bufSize > 0)
daniel@transgaming.comcba50572010-03-28 19:36:09 +000069 {
Brandon Jonesf05cdee2014-08-27 15:24:07 -070070 index = std::min(bufSize - 1, static_cast<GLsizei>(mShader->getInfoLog().length()));
71 memcpy(infoLog, mShader->getInfoLog().c_str(), index);
daniel@transgaming.comcba50572010-03-28 19:36:09 +000072
daniel@transgaming.comcba50572010-03-28 19:36:09 +000073 infoLog[index] = '\0';
74 }
75
76 if (length)
77 {
78 *length = index;
79 }
80}
81
82int Shader::getSourceLength() const
83{
Geoff Lang536d7262013-08-26 17:04:20 -040084 return mSource.empty() ? 0 : (mSource.length() + 1);
daniel@transgaming.comcba50572010-03-28 19:36:09 +000085}
86
zmo@google.coma574f782011-10-03 21:45:23 +000087int Shader::getTranslatedSourceLength() const
88{
Brandon Jonesf05cdee2014-08-27 15:24:07 -070089 return mShader->getTranslatedSource().empty() ? 0 : (mShader->getTranslatedSource().length() + 1);
zmo@google.coma574f782011-10-03 21:45:23 +000090}
91
Brandon Jonesf05cdee2014-08-27 15:24:07 -070092void Shader::getSourceImpl(const std::string &source, GLsizei bufSize, GLsizei *length, char *buffer)
daniel@transgaming.comcba50572010-03-28 19:36:09 +000093{
94 int index = 0;
95
daniel@transgaming.com807d8c32012-04-04 15:06:04 +000096 if (bufSize > 0)
daniel@transgaming.comcba50572010-03-28 19:36:09 +000097 {
Geoff Lang536d7262013-08-26 17:04:20 -040098 index = std::min(bufSize - 1, static_cast<GLsizei>(source.length()));
99 memcpy(buffer, source.c_str(), index);
daniel@transgaming.comcba50572010-03-28 19:36:09 +0000100
zmo@google.coma574f782011-10-03 21:45:23 +0000101 buffer[index] = '\0';
daniel@transgaming.comcba50572010-03-28 19:36:09 +0000102 }
103
104 if (length)
105 {
106 *length = index;
107 }
108}
109
Geoff Lang536d7262013-08-26 17:04:20 -0400110void Shader::getSource(GLsizei bufSize, GLsizei *length, char *buffer) const
zmo@google.coma574f782011-10-03 21:45:23 +0000111{
112 getSourceImpl(mSource, bufSize, length, buffer);
113}
114
Geoff Lang536d7262013-08-26 17:04:20 -0400115void Shader::getTranslatedSource(GLsizei bufSize, GLsizei *length, char *buffer) const
zmo@google.coma574f782011-10-03 21:45:23 +0000116{
Brandon Jonesf05cdee2014-08-27 15:24:07 -0700117 getSourceImpl(mShader->getTranslatedSource(), bufSize, length, buffer);
zmo@google.coma574f782011-10-03 21:45:23 +0000118}
119
Tibor den Ouden97049c62014-10-06 21:39:16 +0200120void Shader::getTranslatedSourceWithDebugInfo(GLsizei bufSize, GLsizei *length, char *buffer) const
121{
122 std::string debugInfo(mShader->getDebugInfo());
123 getSourceImpl(debugInfo, bufSize, length, buffer);
124}
125
Brandon Jonesf05cdee2014-08-27 15:24:07 -0700126void Shader::compile()
Jamie Madillbf9cce22014-07-18 10:33:09 -0400127{
Brandon Jonesf05cdee2014-08-27 15:24:07 -0700128 mCompiled = mShader->compile(mSource);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000129}
130
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000131void Shader::addRef()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000132{
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000133 mRefCount++;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000134}
135
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000136void Shader::release()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000137{
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000138 mRefCount--;
daniel@transgaming.com71cd8682010-04-29 03:35:25 +0000139
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000140 if (mRefCount == 0 && mDeleteStatus)
daniel@transgaming.com71cd8682010-04-29 03:35:25 +0000141 {
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000142 mResourceManager->deleteShader(mHandle);
daniel@transgaming.com71cd8682010-04-29 03:35:25 +0000143 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000144}
145
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000146unsigned int Shader::getRefCount() const
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000147{
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000148 return mRefCount;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000149}
150
daniel@transgaming.comcba50572010-03-28 19:36:09 +0000151bool Shader::isFlaggedForDeletion() const
152{
153 return mDeleteStatus;
154}
155
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000156void Shader::flagForDeletion()
157{
158 mDeleteStatus = true;
159}
160
Jamie Madilld15250e2014-09-03 09:40:44 -0400161const std::vector<gl::PackedVarying> &Shader::getVaryings() const
162{
163 return mShader->getVaryings();
164}
165
166const std::vector<sh::Uniform> &Shader::getUniforms() const
167{
168 return mShader->getUniforms();
169}
170
171const std::vector<sh::InterfaceBlock> &Shader::getInterfaceBlocks() const
172{
173 return mShader->getInterfaceBlocks();
174}
175
176const std::vector<sh::Attribute> &Shader::getActiveAttributes() const
177{
178 return mShader->getActiveAttributes();
179}
180
181const std::vector<sh::Attribute> &Shader::getActiveOutputVariables() const
182{
183 return mShader->getActiveOutputVariables();
184}
185
186std::vector<gl::PackedVarying> &Shader::getVaryings()
187{
188 return mShader->getVaryings();
189}
190
191std::vector<sh::Uniform> &Shader::getUniforms()
192{
193 return mShader->getUniforms();
194}
195
196std::vector<sh::InterfaceBlock> &Shader::getInterfaceBlocks()
197{
198 return mShader->getInterfaceBlocks();
199}
200
201std::vector<sh::Attribute> &Shader::getActiveAttributes()
202{
203 return mShader->getActiveAttributes();
204}
205
206std::vector<sh::Attribute> &Shader::getActiveOutputVariables()
207{
208 return mShader->getActiveOutputVariables();
209}
210
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000211}