1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/angle/src/libGLESv2/Shader.h Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,184 @@ 1.4 +// 1.5 +// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved. 1.6 +// Use of this source code is governed by a BSD-style license that can be 1.7 +// found in the LICENSE file. 1.8 +// 1.9 + 1.10 +// Shader.h: Defines the abstract gl::Shader class and its concrete derived 1.11 +// classes VertexShader and FragmentShader. Implements GL shader objects and 1.12 +// related functionality. [OpenGL ES 2.0.24] section 2.10 page 24 and section 1.13 +// 3.8 page 84. 1.14 + 1.15 +#ifndef LIBGLESV2_SHADER_H_ 1.16 +#define LIBGLESV2_SHADER_H_ 1.17 + 1.18 +#define GL_APICALL 1.19 +#include <GLES2/gl2.h> 1.20 +#include <string> 1.21 +#include <list> 1.22 +#include <vector> 1.23 + 1.24 +#include "compiler/CompilerUniform.h" 1.25 +#include "common/angleutils.h" 1.26 + 1.27 +namespace rx 1.28 +{ 1.29 +class Renderer; 1.30 +} 1.31 + 1.32 +namespace gl 1.33 +{ 1.34 +class ResourceManager; 1.35 + 1.36 +struct Varying 1.37 +{ 1.38 + Varying(GLenum type, const std::string &name, int size, bool array) 1.39 + : type(type), name(name), size(size), array(array), reg(-1), col(-1) 1.40 + { 1.41 + } 1.42 + 1.43 + GLenum type; 1.44 + std::string name; 1.45 + int size; // Number of 'type' elements 1.46 + bool array; 1.47 + 1.48 + int reg; // First varying register, assigned during link 1.49 + int col; // First register element, assigned during link 1.50 +}; 1.51 + 1.52 +typedef std::list<Varying> VaryingList; 1.53 + 1.54 +class Shader 1.55 +{ 1.56 + friend class ProgramBinary; 1.57 + 1.58 + public: 1.59 + Shader(ResourceManager *manager, const rx::Renderer *renderer, GLuint handle); 1.60 + 1.61 + virtual ~Shader(); 1.62 + 1.63 + virtual GLenum getType() = 0; 1.64 + GLuint getHandle() const; 1.65 + 1.66 + void deleteSource(); 1.67 + void setSource(GLsizei count, const char **string, const GLint *length); 1.68 + int getInfoLogLength() const; 1.69 + void getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog); 1.70 + int getSourceLength() const; 1.71 + void getSource(GLsizei bufSize, GLsizei *length, char *buffer); 1.72 + int getTranslatedSourceLength() const; 1.73 + void getTranslatedSource(GLsizei bufSize, GLsizei *length, char *buffer); 1.74 + const sh::ActiveUniforms &getUniforms(); 1.75 + 1.76 + virtual void compile() = 0; 1.77 + virtual void uncompile(); 1.78 + bool isCompiled(); 1.79 + const char *getHLSL(); 1.80 + 1.81 + void addRef(); 1.82 + void release(); 1.83 + unsigned int getRefCount() const; 1.84 + bool isFlaggedForDeletion() const; 1.85 + void flagForDeletion(); 1.86 + 1.87 + static void releaseCompiler(); 1.88 + 1.89 + protected: 1.90 + void parseVaryings(); 1.91 + void resetVaryingsRegisterAssignment(); 1.92 + 1.93 + void compileToHLSL(void *compiler); 1.94 + 1.95 + void getSourceImpl(char *source, GLsizei bufSize, GLsizei *length, char *buffer); 1.96 + 1.97 + static GLenum parseType(const std::string &type); 1.98 + static bool compareVarying(const Varying &x, const Varying &y); 1.99 + 1.100 + const rx::Renderer *const mRenderer; 1.101 + 1.102 + VaryingList mVaryings; 1.103 + 1.104 + bool mUsesMultipleRenderTargets; 1.105 + bool mUsesFragColor; 1.106 + bool mUsesFragData; 1.107 + bool mUsesFragCoord; 1.108 + bool mUsesFrontFacing; 1.109 + bool mUsesPointSize; 1.110 + bool mUsesPointCoord; 1.111 + bool mUsesDepthRange; 1.112 + bool mUsesFragDepth; 1.113 + 1.114 + static void *mFragmentCompiler; 1.115 + static void *mVertexCompiler; 1.116 + 1.117 + private: 1.118 + DISALLOW_COPY_AND_ASSIGN(Shader); 1.119 + 1.120 + void initializeCompiler(); 1.121 + 1.122 + const GLuint mHandle; 1.123 + unsigned int mRefCount; // Number of program objects this shader is attached to 1.124 + bool mDeleteStatus; // Flag to indicate that the shader can be deleted when no longer in use 1.125 + 1.126 + char *mSource; 1.127 + char *mHlsl; 1.128 + char *mInfoLog; 1.129 + sh::ActiveUniforms mActiveUniforms; 1.130 + 1.131 + ResourceManager *mResourceManager; 1.132 +}; 1.133 + 1.134 +struct Attribute 1.135 +{ 1.136 + Attribute() : type(GL_NONE), name("") 1.137 + { 1.138 + } 1.139 + 1.140 + Attribute(GLenum type, const std::string &name) : type(type), name(name) 1.141 + { 1.142 + } 1.143 + 1.144 + GLenum type; 1.145 + std::string name; 1.146 +}; 1.147 + 1.148 +typedef std::vector<Attribute> AttributeArray; 1.149 + 1.150 +class VertexShader : public Shader 1.151 +{ 1.152 + friend class ProgramBinary; 1.153 + 1.154 + public: 1.155 + VertexShader(ResourceManager *manager, const rx::Renderer *renderer, GLuint handle); 1.156 + 1.157 + ~VertexShader(); 1.158 + 1.159 + virtual GLenum getType(); 1.160 + virtual void compile(); 1.161 + virtual void uncompile(); 1.162 + int getSemanticIndex(const std::string &attributeName); 1.163 + 1.164 + private: 1.165 + DISALLOW_COPY_AND_ASSIGN(VertexShader); 1.166 + 1.167 + void parseAttributes(); 1.168 + 1.169 + AttributeArray mAttributes; 1.170 +}; 1.171 + 1.172 +class FragmentShader : public Shader 1.173 +{ 1.174 + public: 1.175 + FragmentShader(ResourceManager *manager,const rx::Renderer *renderer, GLuint handle); 1.176 + 1.177 + ~FragmentShader(); 1.178 + 1.179 + virtual GLenum getType(); 1.180 + virtual void compile(); 1.181 + 1.182 + private: 1.183 + DISALLOW_COPY_AND_ASSIGN(FragmentShader); 1.184 +}; 1.185 +} 1.186 + 1.187 +#endif // LIBGLESV2_SHADER_H_