1// Copyright 2016 The SwiftShader Authors. All Rights Reserved. 2// 3// Licensed under the Apache License, Version 2.0 (the "License"); 4// you may not use this file except in compliance with the License. 5// You may obtain a copy of the License at 6// 7// http://www.apache.org/licenses/LICENSE-2.0 8// 9// Unless required by applicable law or agreed to in writing, software 10// distributed under the License is distributed on an "AS IS" BASIS, 11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12// See the License for the specific language governing permissions and 13// limitations under the License. 14 15// Shader.h: Defines the abstract Shader class and its concrete derived 16// classes VertexShader and FragmentShader. Implements GL shader objects and 17// related functionality. [OpenGL ES 2.0.24] section 2.10 page 24 and section 18// 3.8 page 84. 19 20#ifndef LIBGLESV2_SHADER_H_ 21#define LIBGLESV2_SHADER_H_ 22 23#include "ResourceManager.h" 24 25#include "compiler/TranslatorASM.h" 26 27#include <GLES2/gl2.h> 28 29#include <string> 30#include <list> 31#include <vector> 32 33namespace glsl 34{ 35 class OutputASM; 36} 37 38namespace es2 39{ 40 41class Shader : public glsl::Shader 42{ 43 friend class Program; 44 45public: 46 Shader(ResourceManager *manager, GLuint handle); 47 48 virtual ~Shader(); 49 50 virtual GLenum getType() const = 0; 51 GLuint getName() const; 52 53 void deleteSource(); 54 void setSource(GLsizei count, const char *const *string, const GLint *length); 55 size_t getInfoLogLength() const; 56 void getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog); 57 size_t getSourceLength() const; 58 void getSource(GLsizei bufSize, GLsizei *length, char *source); 59 60 void compile(); 61 bool isCompiled(); 62 63 void addRef(); 64 void release(); 65 unsigned int getRefCount() const; 66 bool isFlaggedForDeletion() const; 67 void flagForDeletion(); 68 69 static void releaseCompiler(); 70 71protected: 72 static bool compilerInitialized; 73 TranslatorASM *createCompiler(GLenum shaderType); 74 void clear(); 75 76 static bool compareVarying(const glsl::Varying &x, const glsl::Varying &y); 77 78 char *mSource; 79 std::string infoLog; 80 81private: 82 virtual void createShader() = 0; 83 virtual void deleteShader() = 0; 84 85 const GLuint mHandle; 86 unsigned int mRefCount; // Number of program objects this shader is attached to 87 bool mDeleteStatus; // Flag to indicate that the shader can be deleted when no longer in use 88 89 ResourceManager *mResourceManager; 90}; 91 92class VertexShader : public Shader 93{ 94 friend class Program; 95 96public: 97 VertexShader(ResourceManager *manager, GLuint handle); 98 99 ~VertexShader(); 100 101 virtual GLenum getType() const; 102 int getSemanticIndex(const std::string &attributeName) const; 103 104 virtual sw::Shader *getShader() const; 105 virtual sw::VertexShader *getVertexShader() const; 106 107private: 108 virtual void createShader(); 109 virtual void deleteShader(); 110 111 sw::VertexShader *vertexShader; 112}; 113 114class FragmentShader : public Shader 115{ 116public: 117 FragmentShader(ResourceManager *manager, GLuint handle); 118 119 ~FragmentShader(); 120 121 virtual GLenum getType() const; 122 123 virtual sw::Shader *getShader() const; 124 virtual sw::PixelShader *getPixelShader() const; 125 126private: 127 virtual void createShader(); 128 virtual void deleteShader(); 129 130 sw::PixelShader *pixelShader; 131}; 132} 133 134#endif // LIBGLESV2_SHADER_H_ 135