blob: 1cc17a050135839e6696f15524d4ebf4fc339dac [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{
Geoff Langfc532b92014-10-21 10:24:16 -040040 SafeDelete(mShader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000041}
42
daniel@transgaming.com6c785212010-03-30 03:36:17 +000043GLuint Shader::getHandle() const
44{
45 return mHandle;
46}
47
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +000048void Shader::setSource(GLsizei count, const char *const *string, const GLint *length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000049{
Geoff Lang536d7262013-08-26 17:04:20 -040050 std::ostringstream stream;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000051
52 for (int i = 0; i < count; i++)
53 {
Geoff Lang536d7262013-08-26 17:04:20 -040054 stream << string[i];
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000055 }
56
Geoff Lang536d7262013-08-26 17:04:20 -040057 mSource = stream.str();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000058}
59
daniel@transgaming.comcba50572010-03-28 19:36:09 +000060int Shader::getInfoLogLength() const
61{
Brandon Jonesf05cdee2014-08-27 15:24:07 -070062 return mShader->getInfoLog().empty() ? 0 : (mShader->getInfoLog().length() + 1);
daniel@transgaming.comcba50572010-03-28 19:36:09 +000063}
64
Geoff Lang536d7262013-08-26 17:04:20 -040065void Shader::getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog) const
daniel@transgaming.comcba50572010-03-28 19:36:09 +000066{
67 int index = 0;
68
daniel@transgaming.com807d8c32012-04-04 15:06:04 +000069 if (bufSize > 0)
daniel@transgaming.comcba50572010-03-28 19:36:09 +000070 {
Brandon Jonesf05cdee2014-08-27 15:24:07 -070071 index = std::min(bufSize - 1, static_cast<GLsizei>(mShader->getInfoLog().length()));
72 memcpy(infoLog, mShader->getInfoLog().c_str(), index);
daniel@transgaming.comcba50572010-03-28 19:36:09 +000073
daniel@transgaming.comcba50572010-03-28 19:36:09 +000074 infoLog[index] = '\0';
75 }
76
77 if (length)
78 {
79 *length = index;
80 }
81}
82
83int Shader::getSourceLength() const
84{
Geoff Lang536d7262013-08-26 17:04:20 -040085 return mSource.empty() ? 0 : (mSource.length() + 1);
daniel@transgaming.comcba50572010-03-28 19:36:09 +000086}
87
zmo@google.coma574f782011-10-03 21:45:23 +000088int Shader::getTranslatedSourceLength() const
89{
Brandon Jonesf05cdee2014-08-27 15:24:07 -070090 return mShader->getTranslatedSource().empty() ? 0 : (mShader->getTranslatedSource().length() + 1);
zmo@google.coma574f782011-10-03 21:45:23 +000091}
92
Brandon Jonesf05cdee2014-08-27 15:24:07 -070093void Shader::getSourceImpl(const std::string &source, GLsizei bufSize, GLsizei *length, char *buffer)
daniel@transgaming.comcba50572010-03-28 19:36:09 +000094{
95 int index = 0;
96
daniel@transgaming.com807d8c32012-04-04 15:06:04 +000097 if (bufSize > 0)
daniel@transgaming.comcba50572010-03-28 19:36:09 +000098 {
Geoff Lang536d7262013-08-26 17:04:20 -040099 index = std::min(bufSize - 1, static_cast<GLsizei>(source.length()));
100 memcpy(buffer, source.c_str(), index);
daniel@transgaming.comcba50572010-03-28 19:36:09 +0000101
zmo@google.coma574f782011-10-03 21:45:23 +0000102 buffer[index] = '\0';
daniel@transgaming.comcba50572010-03-28 19:36:09 +0000103 }
104
105 if (length)
106 {
107 *length = index;
108 }
109}
110
Geoff Lang536d7262013-08-26 17:04:20 -0400111void Shader::getSource(GLsizei bufSize, GLsizei *length, char *buffer) const
zmo@google.coma574f782011-10-03 21:45:23 +0000112{
113 getSourceImpl(mSource, bufSize, length, buffer);
114}
115
Geoff Lang536d7262013-08-26 17:04:20 -0400116void Shader::getTranslatedSource(GLsizei bufSize, GLsizei *length, char *buffer) const
zmo@google.coma574f782011-10-03 21:45:23 +0000117{
Brandon Jonesf05cdee2014-08-27 15:24:07 -0700118 getSourceImpl(mShader->getTranslatedSource(), bufSize, length, buffer);
zmo@google.coma574f782011-10-03 21:45:23 +0000119}
120
Tibor den Ouden97049c62014-10-06 21:39:16 +0200121void Shader::getTranslatedSourceWithDebugInfo(GLsizei bufSize, GLsizei *length, char *buffer) const
122{
123 std::string debugInfo(mShader->getDebugInfo());
124 getSourceImpl(debugInfo, bufSize, length, buffer);
125}
126
Jamie Madill245d3602014-11-13 10:03:30 -0500127void Shader::compile(const gl::Data &data)
Jamie Madillbf9cce22014-07-18 10:33:09 -0400128{
Jamie Madill245d3602014-11-13 10:03:30 -0500129 mCompiled = mShader->compile(data, mSource);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000130}
131
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000132void Shader::addRef()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000133{
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000134 mRefCount++;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000135}
136
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000137void Shader::release()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000138{
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000139 mRefCount--;
daniel@transgaming.com71cd8682010-04-29 03:35:25 +0000140
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000141 if (mRefCount == 0 && mDeleteStatus)
daniel@transgaming.com71cd8682010-04-29 03:35:25 +0000142 {
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000143 mResourceManager->deleteShader(mHandle);
daniel@transgaming.com71cd8682010-04-29 03:35:25 +0000144 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000145}
146
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000147unsigned int Shader::getRefCount() const
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000148{
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000149 return mRefCount;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000150}
151
daniel@transgaming.comcba50572010-03-28 19:36:09 +0000152bool Shader::isFlaggedForDeletion() const
153{
154 return mDeleteStatus;
155}
156
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000157void Shader::flagForDeletion()
158{
159 mDeleteStatus = true;
160}
161
Jamie Madilld15250e2014-09-03 09:40:44 -0400162const std::vector<gl::PackedVarying> &Shader::getVaryings() const
163{
164 return mShader->getVaryings();
165}
166
167const std::vector<sh::Uniform> &Shader::getUniforms() const
168{
169 return mShader->getUniforms();
170}
171
172const std::vector<sh::InterfaceBlock> &Shader::getInterfaceBlocks() const
173{
174 return mShader->getInterfaceBlocks();
175}
176
177const std::vector<sh::Attribute> &Shader::getActiveAttributes() const
178{
179 return mShader->getActiveAttributes();
180}
181
182const std::vector<sh::Attribute> &Shader::getActiveOutputVariables() const
183{
184 return mShader->getActiveOutputVariables();
185}
186
187std::vector<gl::PackedVarying> &Shader::getVaryings()
188{
189 return mShader->getVaryings();
190}
191
192std::vector<sh::Uniform> &Shader::getUniforms()
193{
194 return mShader->getUniforms();
195}
196
197std::vector<sh::InterfaceBlock> &Shader::getInterfaceBlocks()
198{
199 return mShader->getInterfaceBlocks();
200}
201
202std::vector<sh::Attribute> &Shader::getActiveAttributes()
203{
204 return mShader->getActiveAttributes();
205}
206
207std::vector<sh::Attribute> &Shader::getActiveOutputVariables()
208{
209 return mShader->getActiveOutputVariables();
210}
211
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000212}