blob: 05e11adf5c6070795953302b07403fdc2dcc4060 [file] [log] [blame]
shannon.woods@transgaming.combdf2d802013-02-28 23:16:20 +00001#include "precompiled.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002//
Geoff Langcec35902014-04-16 10:52:36 -04003// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004// Use of this source code is governed by a BSD-style license that can be
5// found in the LICENSE file.
6//
7
8// Shader.cpp: Implements the gl::Shader class and its derived classes
9// VertexShader and FragmentShader. Implements GL shader objects and related
10// functionality. [OpenGL ES 2.0.24] section 2.10 page 24 and section 3.8 page 84.
11
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000012#include "libGLESv2/Shader.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000013
daniel@transgaming.com29ab9522012-08-27 16:25:37 +000014#include "GLSLANG/ShaderLang.h"
shannonwoods@chromium.orga2ecfcc2013-05-30 00:11:59 +000015#include "common/utilities.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000016#include "libGLESv2/renderer/Renderer.h"
Brandon Jonesf05cdee2014-08-27 15:24:07 -070017#include "libGLESv2/renderer/ShaderImpl.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000018#include "libGLESv2/Constants.h"
19#include "libGLESv2/ResourceManager.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000020
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000021namespace gl
22{
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000023
Brandon Jonesf05cdee2014-08-27 15:24:07 -070024Shader::Shader(ResourceManager *manager, rx::ShaderImpl *impl, GLenum type, GLuint handle)
25 : mShader(impl),
26 mType(type),
27 mHandle(handle),
28 mResourceManager(manager),
29 mRefCount(0),
30 mDeleteStatus(false),
31 mCompiled(false)
Jamie Madille294bb82014-07-17 14:16:26 -040032{
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000033}
34
35Shader::~Shader()
36{
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000037}
38
daniel@transgaming.com6c785212010-03-30 03:36:17 +000039GLuint Shader::getHandle() const
40{
41 return mHandle;
42}
43
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +000044void Shader::setSource(GLsizei count, const char *const *string, const GLint *length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000045{
Geoff Lang536d7262013-08-26 17:04:20 -040046 std::ostringstream stream;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000047
48 for (int i = 0; i < count; i++)
49 {
Geoff Lang536d7262013-08-26 17:04:20 -040050 stream << string[i];
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000051 }
52
Geoff Lang536d7262013-08-26 17:04:20 -040053 mSource = stream.str();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000054}
55
daniel@transgaming.comcba50572010-03-28 19:36:09 +000056int Shader::getInfoLogLength() const
57{
Brandon Jonesf05cdee2014-08-27 15:24:07 -070058 return mShader->getInfoLog().empty() ? 0 : (mShader->getInfoLog().length() + 1);
daniel@transgaming.comcba50572010-03-28 19:36:09 +000059}
60
Geoff Lang536d7262013-08-26 17:04:20 -040061void Shader::getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog) const
daniel@transgaming.comcba50572010-03-28 19:36:09 +000062{
63 int index = 0;
64
daniel@transgaming.com807d8c32012-04-04 15:06:04 +000065 if (bufSize > 0)
daniel@transgaming.comcba50572010-03-28 19:36:09 +000066 {
Brandon Jonesf05cdee2014-08-27 15:24:07 -070067 index = std::min(bufSize - 1, static_cast<GLsizei>(mShader->getInfoLog().length()));
68 memcpy(infoLog, mShader->getInfoLog().c_str(), index);
daniel@transgaming.comcba50572010-03-28 19:36:09 +000069
daniel@transgaming.comcba50572010-03-28 19:36:09 +000070 infoLog[index] = '\0';
71 }
72
73 if (length)
74 {
75 *length = index;
76 }
77}
78
79int Shader::getSourceLength() const
80{
Geoff Lang536d7262013-08-26 17:04:20 -040081 return mSource.empty() ? 0 : (mSource.length() + 1);
daniel@transgaming.comcba50572010-03-28 19:36:09 +000082}
83
zmo@google.coma574f782011-10-03 21:45:23 +000084int Shader::getTranslatedSourceLength() const
85{
Brandon Jonesf05cdee2014-08-27 15:24:07 -070086 return mShader->getTranslatedSource().empty() ? 0 : (mShader->getTranslatedSource().length() + 1);
zmo@google.coma574f782011-10-03 21:45:23 +000087}
88
Brandon Jonesf05cdee2014-08-27 15:24:07 -070089void Shader::getSourceImpl(const std::string &source, GLsizei bufSize, GLsizei *length, char *buffer)
daniel@transgaming.comcba50572010-03-28 19:36:09 +000090{
91 int index = 0;
92
daniel@transgaming.com807d8c32012-04-04 15:06:04 +000093 if (bufSize > 0)
daniel@transgaming.comcba50572010-03-28 19:36:09 +000094 {
Geoff Lang536d7262013-08-26 17:04:20 -040095 index = std::min(bufSize - 1, static_cast<GLsizei>(source.length()));
96 memcpy(buffer, source.c_str(), index);
daniel@transgaming.comcba50572010-03-28 19:36:09 +000097
zmo@google.coma574f782011-10-03 21:45:23 +000098 buffer[index] = '\0';
daniel@transgaming.comcba50572010-03-28 19:36:09 +000099 }
100
101 if (length)
102 {
103 *length = index;
104 }
105}
106
Geoff Lang536d7262013-08-26 17:04:20 -0400107void Shader::getSource(GLsizei bufSize, GLsizei *length, char *buffer) const
zmo@google.coma574f782011-10-03 21:45:23 +0000108{
109 getSourceImpl(mSource, bufSize, length, buffer);
110}
111
Geoff Lang536d7262013-08-26 17:04:20 -0400112void Shader::getTranslatedSource(GLsizei bufSize, GLsizei *length, char *buffer) const
zmo@google.coma574f782011-10-03 21:45:23 +0000113{
Brandon Jonesf05cdee2014-08-27 15:24:07 -0700114 getSourceImpl(mShader->getTranslatedSource(), bufSize, length, buffer);
zmo@google.coma574f782011-10-03 21:45:23 +0000115}
116
Brandon Jonesf05cdee2014-08-27 15:24:07 -0700117void Shader::compile()
Jamie Madillbf9cce22014-07-18 10:33:09 -0400118{
Brandon Jonesf05cdee2014-08-27 15:24:07 -0700119 mCompiled = mShader->compile(mSource);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000120}
121
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000122void Shader::addRef()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000123{
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000124 mRefCount++;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000125}
126
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000127void Shader::release()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000128{
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000129 mRefCount--;
daniel@transgaming.com71cd8682010-04-29 03:35:25 +0000130
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000131 if (mRefCount == 0 && mDeleteStatus)
daniel@transgaming.com71cd8682010-04-29 03:35:25 +0000132 {
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000133 mResourceManager->deleteShader(mHandle);
daniel@transgaming.com71cd8682010-04-29 03:35:25 +0000134 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000135}
136
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000137unsigned int Shader::getRefCount() const
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000138{
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000139 return mRefCount;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000140}
141
daniel@transgaming.comcba50572010-03-28 19:36:09 +0000142bool Shader::isFlaggedForDeletion() const
143{
144 return mDeleteStatus;
145}
146
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000147void Shader::flagForDeletion()
148{
149 mDeleteStatus = true;
150}
151
Brandon Jonesf05cdee2014-08-27 15:24:07 -0700152VertexShader::VertexShader(ResourceManager *manager, rx::ShaderImpl *impl, GLuint handle)
153 : Shader(manager, impl, GL_VERTEX_SHADER, handle)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000154{
155}
156
157VertexShader::~VertexShader()
158{
159}
160
Brandon Jonesf05cdee2014-08-27 15:24:07 -0700161FragmentShader::FragmentShader(ResourceManager *manager, rx::ShaderImpl *impl, GLuint handle)
162 : Shader(manager, impl, GL_FRAGMENT_SHADER, handle)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000163{
164}
165
166FragmentShader::~FragmentShader()
167{
168}
169
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000170}