1a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// 2a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved. 3a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// Use of this source code is governed by a BSD-style license that can be 4a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// found in the LICENSE file. 5a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// 6a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 7a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// Shader.h: Defines the abstract gl::Shader class and its concrete derived 8a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// classes VertexShader and FragmentShader. Implements GL shader objects and 9a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// related functionality. [OpenGL ES 2.0.24] section 2.10 page 24 and section 10a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// 3.8 page 84. 11a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 12a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#ifndef LIBGLESV2_SHADER_H_ 13a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#define LIBGLESV2_SHADER_H_ 14a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 15a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#define GL_APICALL 16a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#include <GLES2/gl2.h> 17a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#include <d3dx9.h> 18a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#include <list> 19a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#include <vector> 20a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 215abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#include "libGLESv2/ResourceManager.h" 22a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 23a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blocknamespace gl 24a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{ 25a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockstruct Varying 26a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{ 27a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block Varying(GLenum type, const std::string &name, int size, bool array) 28a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block : type(type), name(name), size(size), array(array), reg(-1), col(-1) 29a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block { 30a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block } 31a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 32a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block GLenum type; 33a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block std::string name; 34a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block int size; // Number of 'type' elements 35a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block bool array; 36a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 37a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block int reg; // First varying register, assigned during link 38a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block int col; // First register element, assigned during link 39a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}; 40a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 41a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blocktypedef std::list<Varying> VaryingList; 42a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 43a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockclass Shader 44a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{ 45a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block friend Program; 46a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 47a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block public: 485abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick Shader(ResourceManager *manager, GLuint handle); 49a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 50a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block virtual ~Shader(); 51a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 52a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block virtual GLenum getType() = 0; 53a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block GLuint getHandle() const; 54a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 55a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block void deleteSource(); 56a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block void setSource(GLsizei count, const char **string, const GLint *length); 57a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block int getInfoLogLength() const; 58a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block void getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog); 59a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block int getSourceLength() const; 60a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block void getSource(GLsizei bufSize, GLsizei *length, char *source); 61a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 62a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block virtual void compile() = 0; 63a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block bool isCompiled(); 64a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block const char *getHLSL(); 65a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 665abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick void addRef(); 675abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick void release(); 685abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick unsigned int getRefCount() const; 69a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block bool isFlaggedForDeletion() const; 70a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block void flagForDeletion(); 71a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 72a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block static void releaseCompiler(); 73a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 74a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block protected: 75a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block DISALLOW_COPY_AND_ASSIGN(Shader); 76a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 77a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block void parseVaryings(); 78a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 79a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block void compileToHLSL(void *compiler); 80a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 81a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block static GLenum parseType(const std::string &type); 82a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block static bool compareVarying(const Varying &x, const Varying &y); 83a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 84a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block const GLuint mHandle; 855abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick unsigned int mRefCount; // Number of program objects this shader is attached to 865abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick bool mDeleteStatus; // Flag to indicate that the shader can be deleted when no longer in use 87a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 88a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block char *mSource; 89a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block char *mHlsl; 90a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block char *mInfoLog; 91a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 92a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block VaryingList varyings; 93a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 94a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block bool mUsesFragCoord; 95a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block bool mUsesFrontFacing; 965abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick bool mUsesPointSize; 975abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick bool mUsesPointCoord; 98a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 995abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick ResourceManager *mResourceManager; 100a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 101a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block static void *mFragmentCompiler; 102a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block static void *mVertexCompiler; 103a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}; 104a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 105a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockstruct Attribute 106a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{ 107a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block Attribute() : type(GL_NONE), name("") 108a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block { 109a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block } 110a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 111a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block Attribute(GLenum type, const std::string &name) : type(type), name(name) 112a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block { 113a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block } 114a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 115a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block GLenum type; 116a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block std::string name; 117a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}; 118a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 119a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blocktypedef std::vector<Attribute> AttributeArray; 120a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 121a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockclass VertexShader : public Shader 122a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{ 123a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block friend Program; 124a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 125a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block public: 1265abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick VertexShader(ResourceManager *manager, GLuint handle); 127a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 128a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block ~VertexShader(); 129a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 130a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block GLenum getType(); 131a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block void compile(); 132a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block int getSemanticIndex(const std::string &attributeName); 133a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 134a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block private: 135a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block DISALLOW_COPY_AND_ASSIGN(VertexShader); 136a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 137a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block void parseAttributes(); 138a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 139a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block AttributeArray mAttributes; 140a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}; 141a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 142a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockclass FragmentShader : public Shader 143a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{ 144a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block public: 1455abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick FragmentShader(ResourceManager *manager, GLuint handle); 146a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 147a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block ~FragmentShader(); 148a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 149a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block GLenum getType(); 150a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block void compile(); 151a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 152a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block private: 153a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block DISALLOW_COPY_AND_ASSIGN(FragmentShader); 154a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}; 155a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block} 156a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 157a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#endif // LIBGLESV2_SHADER_H_ 158