blob: 1b4b09c1d75afd302439ee4554238a8fe720dd4c [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{
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000035}
36
37Shader::~Shader()
38{
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000039}
40
daniel@transgaming.com6c785212010-03-30 03:36:17 +000041GLuint Shader::getHandle() const
42{
43 return mHandle;
44}
45
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +000046void Shader::setSource(GLsizei count, const char *const *string, const GLint *length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000047{
Geoff Lang536d7262013-08-26 17:04:20 -040048 std::ostringstream stream;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000049
50 for (int i = 0; i < count; i++)
51 {
Geoff Lang536d7262013-08-26 17:04:20 -040052 stream << string[i];
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000053 }
54
Geoff Lang536d7262013-08-26 17:04:20 -040055 mSource = stream.str();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000056}
57
daniel@transgaming.comcba50572010-03-28 19:36:09 +000058int Shader::getInfoLogLength() const
59{
Brandon Jonesf05cdee2014-08-27 15:24:07 -070060 return mShader->getInfoLog().empty() ? 0 : (mShader->getInfoLog().length() + 1);
daniel@transgaming.comcba50572010-03-28 19:36:09 +000061}
62
Geoff Lang536d7262013-08-26 17:04:20 -040063void Shader::getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog) const
daniel@transgaming.comcba50572010-03-28 19:36:09 +000064{
65 int index = 0;
66
daniel@transgaming.com807d8c32012-04-04 15:06:04 +000067 if (bufSize > 0)
daniel@transgaming.comcba50572010-03-28 19:36:09 +000068 {
Brandon Jonesf05cdee2014-08-27 15:24:07 -070069 index = std::min(bufSize - 1, static_cast<GLsizei>(mShader->getInfoLog().length()));
70 memcpy(infoLog, mShader->getInfoLog().c_str(), index);
daniel@transgaming.comcba50572010-03-28 19:36:09 +000071
daniel@transgaming.comcba50572010-03-28 19:36:09 +000072 infoLog[index] = '\0';
73 }
74
75 if (length)
76 {
77 *length = index;
78 }
79}
80
81int Shader::getSourceLength() const
82{
Geoff Lang536d7262013-08-26 17:04:20 -040083 return mSource.empty() ? 0 : (mSource.length() + 1);
daniel@transgaming.comcba50572010-03-28 19:36:09 +000084}
85
zmo@google.coma574f782011-10-03 21:45:23 +000086int Shader::getTranslatedSourceLength() const
87{
Brandon Jonesf05cdee2014-08-27 15:24:07 -070088 return mShader->getTranslatedSource().empty() ? 0 : (mShader->getTranslatedSource().length() + 1);
zmo@google.coma574f782011-10-03 21:45:23 +000089}
90
Brandon Jonesf05cdee2014-08-27 15:24:07 -070091void Shader::getSourceImpl(const std::string &source, GLsizei bufSize, GLsizei *length, char *buffer)
daniel@transgaming.comcba50572010-03-28 19:36:09 +000092{
93 int index = 0;
94
daniel@transgaming.com807d8c32012-04-04 15:06:04 +000095 if (bufSize > 0)
daniel@transgaming.comcba50572010-03-28 19:36:09 +000096 {
Geoff Lang536d7262013-08-26 17:04:20 -040097 index = std::min(bufSize - 1, static_cast<GLsizei>(source.length()));
98 memcpy(buffer, source.c_str(), index);
daniel@transgaming.comcba50572010-03-28 19:36:09 +000099
zmo@google.coma574f782011-10-03 21:45:23 +0000100 buffer[index] = '\0';
daniel@transgaming.comcba50572010-03-28 19:36:09 +0000101 }
102
103 if (length)
104 {
105 *length = index;
106 }
107}
108
Geoff Lang536d7262013-08-26 17:04:20 -0400109void Shader::getSource(GLsizei bufSize, GLsizei *length, char *buffer) const
zmo@google.coma574f782011-10-03 21:45:23 +0000110{
111 getSourceImpl(mSource, bufSize, length, buffer);
112}
113
Geoff Lang536d7262013-08-26 17:04:20 -0400114void Shader::getTranslatedSource(GLsizei bufSize, GLsizei *length, char *buffer) const
zmo@google.coma574f782011-10-03 21:45:23 +0000115{
Brandon Jonesf05cdee2014-08-27 15:24:07 -0700116 getSourceImpl(mShader->getTranslatedSource(), bufSize, length, buffer);
zmo@google.coma574f782011-10-03 21:45:23 +0000117}
118
Brandon Jonesf05cdee2014-08-27 15:24:07 -0700119void Shader::compile()
Jamie Madillbf9cce22014-07-18 10:33:09 -0400120{
Brandon Jonesf05cdee2014-08-27 15:24:07 -0700121 mCompiled = mShader->compile(mSource);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000122}
123
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000124void Shader::addRef()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000125{
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000126 mRefCount++;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000127}
128
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000129void Shader::release()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000130{
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000131 mRefCount--;
daniel@transgaming.com71cd8682010-04-29 03:35:25 +0000132
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000133 if (mRefCount == 0 && mDeleteStatus)
daniel@transgaming.com71cd8682010-04-29 03:35:25 +0000134 {
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000135 mResourceManager->deleteShader(mHandle);
daniel@transgaming.com71cd8682010-04-29 03:35:25 +0000136 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000137}
138
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000139unsigned int Shader::getRefCount() const
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000140{
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000141 return mRefCount;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000142}
143
daniel@transgaming.comcba50572010-03-28 19:36:09 +0000144bool Shader::isFlaggedForDeletion() const
145{
146 return mDeleteStatus;
147}
148
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000149void Shader::flagForDeletion()
150{
151 mDeleteStatus = true;
152}
153
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000154}