blob: e3da2b1a9e77198d2e9629e0f96bf117e8891c92 [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
Brandon Jonesf05cdee2014-08-27 15:24:07 -0700120void Shader::compile()
Jamie Madillbf9cce22014-07-18 10:33:09 -0400121{
Brandon Jonesf05cdee2014-08-27 15:24:07 -0700122 mCompiled = mShader->compile(mSource);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000123}
124
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000125void Shader::addRef()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000126{
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000127 mRefCount++;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000128}
129
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000130void Shader::release()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000131{
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000132 mRefCount--;
daniel@transgaming.com71cd8682010-04-29 03:35:25 +0000133
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000134 if (mRefCount == 0 && mDeleteStatus)
daniel@transgaming.com71cd8682010-04-29 03:35:25 +0000135 {
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000136 mResourceManager->deleteShader(mHandle);
daniel@transgaming.com71cd8682010-04-29 03:35:25 +0000137 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000138}
139
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000140unsigned int Shader::getRefCount() const
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000141{
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000142 return mRefCount;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000143}
144
daniel@transgaming.comcba50572010-03-28 19:36:09 +0000145bool Shader::isFlaggedForDeletion() const
146{
147 return mDeleteStatus;
148}
149
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000150void Shader::flagForDeletion()
151{
152 mDeleteStatus = true;
153}
154
Jamie Madilld15250e2014-09-03 09:40:44 -0400155const std::vector<gl::PackedVarying> &Shader::getVaryings() const
156{
157 return mShader->getVaryings();
158}
159
160const std::vector<sh::Uniform> &Shader::getUniforms() const
161{
162 return mShader->getUniforms();
163}
164
165const std::vector<sh::InterfaceBlock> &Shader::getInterfaceBlocks() const
166{
167 return mShader->getInterfaceBlocks();
168}
169
170const std::vector<sh::Attribute> &Shader::getActiveAttributes() const
171{
172 return mShader->getActiveAttributes();
173}
174
175const std::vector<sh::Attribute> &Shader::getActiveOutputVariables() const
176{
177 return mShader->getActiveOutputVariables();
178}
179
180std::vector<gl::PackedVarying> &Shader::getVaryings()
181{
182 return mShader->getVaryings();
183}
184
185std::vector<sh::Uniform> &Shader::getUniforms()
186{
187 return mShader->getUniforms();
188}
189
190std::vector<sh::InterfaceBlock> &Shader::getInterfaceBlocks()
191{
192 return mShader->getInterfaceBlocks();
193}
194
195std::vector<sh::Attribute> &Shader::getActiveAttributes()
196{
197 return mShader->getActiveAttributes();
198}
199
200std::vector<sh::Attribute> &Shader::getActiveOutputVariables()
201{
202 return mShader->getActiveOutputVariables();
203}
204
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000205}