Shader.h revision 08ca3c6e18275ed9db5515e470692e700e1a3e12
1// SwiftShader Software Renderer 2// 3// Copyright(c) 2005-2013 TransGaming Inc. 4// 5// All rights reserved. No part of this software may be copied, distributed, transmitted, 6// transcribed, stored in a retrieval system, translated into any human or computer 7// language by any means, or disclosed to third parties without the explicit written 8// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express 9// or implied, including but not limited to any patent rights, are granted to you. 10// 11 12// Shader.h: Defines the abstract Shader class and its concrete derived 13// classes VertexShader and FragmentShader. Implements GL shader objects and 14// related functionality. [OpenGL ES 2.0.24] section 2.10 page 24 and section 15// 3.8 page 84. 16 17#ifndef LIBGLESV2_SHADER_H_ 18#define LIBGLESV2_SHADER_H_ 19 20#include "ResourceManager.h" 21 22#include "compiler/TranslatorASM.h" 23 24#define GL_APICALL 25#include <GLES2/gl2.h> 26 27#include <list> 28#include <vector> 29 30namespace glsl 31{ 32 class OutputASM; 33} 34 35namespace es2 36{ 37 38class Shader : public glsl::Shader 39{ 40 friend class Program; 41 42public: 43 Shader(ResourceManager *manager, GLuint handle); 44 45 virtual ~Shader(); 46 47 virtual GLenum getType() = 0; 48 GLuint getName() const; 49 50 void deleteSource(); 51 void setSource(GLsizei count, const char *const *string, const GLint *length); 52 int getInfoLogLength() const; 53 void getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog); 54 int getSourceLength() const; 55 void getSource(GLsizei bufSize, GLsizei *length, char *source); 56 57 virtual void compile() = 0; 58 bool isCompiled(); 59 60 void addRef(); 61 void release(); 62 unsigned int getRefCount() const; 63 bool isFlaggedForDeletion() const; 64 void flagForDeletion(); 65 66 static void releaseCompiler(); 67 68protected: 69 static bool compilerInitialized; 70 TranslatorASM *createCompiler(GLenum shaderType); 71 void clear(); 72 73 static GLenum parseType(const std::string &type); 74 static bool compareVarying(const glsl::Varying &x, const glsl::Varying &y); 75 76 char *mSource; 77 char *mInfoLog; 78 79private: 80 const GLuint mHandle; 81 unsigned int mRefCount; // Number of program objects this shader is attached to 82 bool mDeleteStatus; // Flag to indicate that the shader can be deleted when no longer in use 83 84 ResourceManager *mResourceManager; 85}; 86 87class VertexShader : public Shader 88{ 89 friend class Program; 90 91public: 92 VertexShader(ResourceManager *manager, GLuint handle); 93 94 ~VertexShader(); 95 96 virtual GLenum getType(); 97 virtual void compile(); 98 int getSemanticIndex(const std::string &attributeName); 99 100 virtual sw::Shader *getShader() const; 101 virtual sw::VertexShader *getVertexShader() const; 102 103private: 104 sw::VertexShader *vertexShader; 105}; 106 107class FragmentShader : public Shader 108{ 109public: 110 FragmentShader(ResourceManager *manager, GLuint handle); 111 112 ~FragmentShader(); 113 114 virtual GLenum getType(); 115 virtual void compile(); 116 117 virtual sw::Shader *getShader() const; 118 virtual sw::PixelShader *getPixelShader() const; 119 120private: 121 sw::PixelShader *pixelShader; 122}; 123} 124 125#endif // LIBGLESV2_SHADER_H_ 126