1 // SwiftShader Software Renderer
\r
3 // Copyright(c) 2005-2013 TransGaming Inc.
\r
5 // All rights reserved. No part of this software may be copied, distributed, transmitted,
\r
6 // transcribed, stored in a retrieval system, translated into any human or computer
\r
7 // language by any means, or disclosed to third parties without the explicit written
\r
8 // agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express
\r
9 // or implied, including but not limited to any patent rights, are granted to you.
\r
12 // Shader.h: Defines the abstract Shader class and its concrete derived
\r
13 // classes VertexShader and FragmentShader. Implements GL shader objects and
\r
14 // related functionality. [OpenGL ES 2.0.24] section 2.10 page 24 and section
\r
17 #ifndef LIBGLESV2_SHADER_H_
\r
18 #define LIBGLESV2_SHADER_H_
\r
20 #include "ResourceManager.h"
\r
22 #include "compiler/TranslatorASM.h"
\r
25 #include <GLES2/gl2.h>
\r
39 Varying(GLenum type, const std::string &name, int arraySize, int reg = -1, int col = -1)
\r
40 : type(type), name(name), arraySize(arraySize), reg(reg), col(col)
\r
44 bool isArray() const
\r
46 return arraySize >= 1;
\r
49 int size() const // Unify with es2::Uniform?
\r
51 return arraySize > 0 ? arraySize : 1;
\r
58 int reg; // First varying register, assigned during link
\r
59 int col; // First register element, assigned during link
\r
62 typedef std::list<Varying> VaryingList;
\r
66 friend class Program;
\r
67 friend class sh::OutputASM;
\r
70 Shader(ResourceManager *manager, GLuint handle);
\r
74 virtual GLenum getType() = 0;
\r
75 GLuint getHandle() const;
\r
77 void deleteSource();
\r
78 void setSource(GLsizei count, const char *const *string, const GLint *length);
\r
79 int getInfoLogLength() const;
\r
80 void getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog);
\r
81 int getSourceLength() const;
\r
82 void getSource(GLsizei bufSize, GLsizei *length, char *source);
\r
84 virtual void compile() = 0;
\r
87 virtual sw::Shader *getShader() const = 0;
\r
88 virtual sw::PixelShader *getPixelShader() const;
\r
89 virtual sw::VertexShader *getVertexShader() const;
\r
93 unsigned int getRefCount() const;
\r
94 bool isFlaggedForDeletion() const;
\r
95 void flagForDeletion();
\r
97 static void releaseCompiler();
\r
100 static bool compilerInitialized;
\r
101 TranslatorASM *createCompiler(ShShaderType type);
\r
104 static GLenum parseType(const std::string &type);
\r
105 static bool compareVarying(const Varying &x, const Varying &y);
\r
110 VaryingList varyings;
\r
111 sh::ActiveUniforms activeUniforms;
\r
112 sh::ActiveAttributes activeAttributes;
\r
115 const GLuint mHandle;
\r
116 unsigned int mRefCount; // Number of program objects this shader is attached to
\r
117 bool mDeleteStatus; // Flag to indicate that the shader can be deleted when no longer in use
\r
119 ResourceManager *mResourceManager;
\r
122 class VertexShader : public Shader
\r
124 friend class Program;
\r
127 VertexShader(ResourceManager *manager, GLuint handle);
\r
131 virtual GLenum getType();
\r
132 virtual void compile();
\r
133 int getSemanticIndex(const std::string &attributeName);
\r
135 virtual sw::Shader *getShader() const;
\r
136 virtual sw::VertexShader *getVertexShader() const;
\r
139 sw::VertexShader *vertexShader;
\r
142 class FragmentShader : public Shader
\r
145 FragmentShader(ResourceManager *manager, GLuint handle);
\r
149 virtual GLenum getType();
\r
150 virtual void compile();
\r
152 virtual sw::Shader *getShader() const;
\r
153 virtual sw::PixelShader *getPixelShader() const;
\r
156 sw::PixelShader *pixelShader;
\r
160 #endif // LIBGLESV2_SHADER_H_
\r