daniel@transgaming.com | 4f39fd9 | 2010-03-08 20:26:45 +0000 | [diff] [blame] | 1 | // |
shannon.woods@transgaming.com | b73964e | 2013-01-25 21:49:14 +0000 | [diff] [blame] | 2 | // Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved. |
daniel@transgaming.com | 4f39fd9 | 2010-03-08 20:26:45 +0000 | [diff] [blame] | 3 | // Use of this source code is governed by a BSD-style license that can be |
| 4 | // found in the LICENSE file. |
| 5 | // |
| 6 | |
| 7 | // Shader.h: Defines the abstract gl::Shader class and its concrete derived |
| 8 | // classes VertexShader and FragmentShader. Implements GL shader objects and |
| 9 | // related functionality. [OpenGL ES 2.0.24] section 2.10 page 24 and section |
| 10 | // 3.8 page 84. |
| 11 | |
| 12 | #ifndef LIBGLESV2_SHADER_H_ |
| 13 | #define LIBGLESV2_SHADER_H_ |
| 14 | |
Jamie Madill | 13cfd27 | 2014-07-17 14:16:28 -0400 | [diff] [blame] | 15 | |
daniel@transgaming.com | 29ab952 | 2012-08-27 16:25:37 +0000 | [diff] [blame] | 16 | #include <string> |
daniel@transgaming.com | 4af7acc | 2010-05-14 17:30:53 +0000 | [diff] [blame] | 17 | #include <list> |
| 18 | #include <vector> |
daniel@transgaming.com | 4f39fd9 | 2010-03-08 20:26:45 +0000 | [diff] [blame] | 19 | |
Jamie Madill | 13cfd27 | 2014-07-17 14:16:28 -0400 | [diff] [blame] | 20 | #include "angle_gl.h" |
Jamie Madill | e294bb8 | 2014-07-17 14:16:26 -0400 | [diff] [blame] | 21 | #include <GLSLANG/ShaderLang.h> |
Jamie Madill | 13cfd27 | 2014-07-17 14:16:28 -0400 | [diff] [blame] | 22 | |
shannon.woods@transgaming.com | 486d9e9 | 2013-02-28 23:15:41 +0000 | [diff] [blame] | 23 | #include "common/angleutils.h" |
Jamie Madill | 5f56273 | 2014-02-14 16:41:24 -0500 | [diff] [blame] | 24 | #include "libGLESv2/angletypes.h" |
daniel@transgaming.com | e684229 | 2010-04-20 18:52:50 +0000 | [diff] [blame] | 25 | |
shannon.woods@transgaming.com | b73964e | 2013-01-25 21:49:14 +0000 | [diff] [blame] | 26 | namespace rx |
| 27 | { |
Brandon Jones | f05cdee | 2014-08-27 15:24:07 -0700 | [diff] [blame] | 28 | class ShaderImpl; |
shannon.woods@transgaming.com | b73964e | 2013-01-25 21:49:14 +0000 | [diff] [blame] | 29 | } |
| 30 | |
daniel@transgaming.com | 4f39fd9 | 2010-03-08 20:26:45 +0000 | [diff] [blame] | 31 | namespace gl |
| 32 | { |
shannon.woods@transgaming.com | 486d9e9 | 2013-02-28 23:15:41 +0000 | [diff] [blame] | 33 | class ResourceManager; |
| 34 | |
Jamie Madill | f257598 | 2014-06-25 16:04:54 -0400 | [diff] [blame] | 35 | struct PackedVarying : public sh::Varying |
Jamie Madill | ff0d2ba | 2014-05-14 13:49:10 -0400 | [diff] [blame] | 36 | { |
| 37 | unsigned int registerIndex; // Assigned during link |
Austin Kinross | af87552 | 2014-08-25 21:06:07 -0700 | [diff] [blame] | 38 | unsigned int columnIndex; // Assigned during link, defaults to 0 |
Jamie Madill | ff0d2ba | 2014-05-14 13:49:10 -0400 | [diff] [blame] | 39 | |
Jamie Madill | f257598 | 2014-06-25 16:04:54 -0400 | [diff] [blame] | 40 | PackedVarying(const sh::Varying &varying) |
| 41 | : sh::Varying(varying), |
Austin Kinross | af87552 | 2014-08-25 21:06:07 -0700 | [diff] [blame] | 42 | registerIndex(GL_INVALID_INDEX), |
| 43 | columnIndex(0) |
Jamie Madill | ff0d2ba | 2014-05-14 13:49:10 -0400 | [diff] [blame] | 44 | {} |
| 45 | |
| 46 | bool registerAssigned() const { return registerIndex != GL_INVALID_INDEX; } |
Jamie Madill | 54ad4f8 | 2014-09-03 09:40:46 -0400 | [diff] [blame] | 47 | bool isBuiltIn() const { return name.compare(0, 3, "gl_") == 0; } |
Jamie Madill | ff0d2ba | 2014-05-14 13:49:10 -0400 | [diff] [blame] | 48 | |
| 49 | void resetRegisterAssignment() |
| 50 | { |
| 51 | registerIndex = GL_INVALID_INDEX; |
| 52 | } |
| 53 | }; |
| 54 | |
daniel@transgaming.com | 4f39fd9 | 2010-03-08 20:26:45 +0000 | [diff] [blame] | 55 | class Shader |
| 56 | { |
| 57 | public: |
Brandon Jones | f05cdee | 2014-08-27 15:24:07 -0700 | [diff] [blame] | 58 | Shader(ResourceManager *manager, rx::ShaderImpl *impl, GLenum type, GLuint handle); |
daniel@transgaming.com | 4f39fd9 | 2010-03-08 20:26:45 +0000 | [diff] [blame] | 59 | |
| 60 | virtual ~Shader(); |
| 61 | |
Brandon Jones | f05cdee | 2014-08-27 15:24:07 -0700 | [diff] [blame] | 62 | GLenum getType() const { return mType; } |
daniel@transgaming.com | 6c78521 | 2010-03-30 03:36:17 +0000 | [diff] [blame] | 63 | GLuint getHandle() const; |
daniel@transgaming.com | 4f39fd9 | 2010-03-08 20:26:45 +0000 | [diff] [blame] | 64 | |
Brandon Jones | f05cdee | 2014-08-27 15:24:07 -0700 | [diff] [blame] | 65 | rx::ShaderImpl *getImplementation() { return mShader; } |
| 66 | const rx::ShaderImpl *getImplementation() const { return mShader; } |
| 67 | |
daniel@transgaming.com | 4f39fd9 | 2010-03-08 20:26:45 +0000 | [diff] [blame] | 68 | void deleteSource(); |
shannon.woods%transgaming.com@gtempaccount.com | 5f33933 | 2013-04-13 03:29:02 +0000 | [diff] [blame] | 69 | void setSource(GLsizei count, const char *const *string, const GLint *length); |
daniel@transgaming.com | cba5057 | 2010-03-28 19:36:09 +0000 | [diff] [blame] | 70 | int getInfoLogLength() const; |
Geoff Lang | 536d726 | 2013-08-26 17:04:20 -0400 | [diff] [blame] | 71 | void getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog) const; |
daniel@transgaming.com | cba5057 | 2010-03-28 19:36:09 +0000 | [diff] [blame] | 72 | int getSourceLength() const; |
Geoff Lang | 536d726 | 2013-08-26 17:04:20 -0400 | [diff] [blame] | 73 | void getSource(GLsizei bufSize, GLsizei *length, char *buffer) const; |
zmo@google.com | a574f78 | 2011-10-03 21:45:23 +0000 | [diff] [blame] | 74 | int getTranslatedSourceLength() const; |
Geoff Lang | 536d726 | 2013-08-26 17:04:20 -0400 | [diff] [blame] | 75 | void getTranslatedSource(GLsizei bufSize, GLsizei *length, char *buffer) const; |
daniel@transgaming.com | 4f39fd9 | 2010-03-08 20:26:45 +0000 | [diff] [blame] | 76 | |
Brandon Jones | f05cdee | 2014-08-27 15:24:07 -0700 | [diff] [blame] | 77 | void compile(); |
| 78 | bool isCompiled() const { return mCompiled; } |
daniel@transgaming.com | 4f39fd9 | 2010-03-08 20:26:45 +0000 | [diff] [blame] | 79 | |
daniel@transgaming.com | da13f3e | 2010-07-28 19:20:56 +0000 | [diff] [blame] | 80 | void addRef(); |
| 81 | void release(); |
| 82 | unsigned int getRefCount() const; |
daniel@transgaming.com | cba5057 | 2010-03-28 19:36:09 +0000 | [diff] [blame] | 83 | bool isFlaggedForDeletion() const; |
daniel@transgaming.com | 4f39fd9 | 2010-03-08 20:26:45 +0000 | [diff] [blame] | 84 | void flagForDeletion(); |
daniel@transgaming.com | 2cdf833 | 2012-02-17 18:00:50 +0000 | [diff] [blame] | 85 | |
Jamie Madill | d15250e | 2014-09-03 09:40:44 -0400 | [diff] [blame] | 86 | const std::vector<gl::PackedVarying> &getVaryings() const; |
| 87 | const std::vector<sh::Uniform> &getUniforms() const; |
| 88 | const std::vector<sh::InterfaceBlock> &getInterfaceBlocks() const; |
| 89 | const std::vector<sh::Attribute> &getActiveAttributes() const; |
| 90 | const std::vector<sh::Attribute> &getActiveOutputVariables() const; |
| 91 | |
| 92 | std::vector<gl::PackedVarying> &getVaryings(); |
| 93 | std::vector<sh::Uniform> &getUniforms(); |
| 94 | std::vector<sh::InterfaceBlock> &getInterfaceBlocks(); |
| 95 | std::vector<sh::Attribute> &getActiveAttributes(); |
| 96 | std::vector<sh::Attribute> &getActiveOutputVariables(); |
| 97 | |
daniel@transgaming.com | 2cdf833 | 2012-02-17 18:00:50 +0000 | [diff] [blame] | 98 | private: |
| 99 | DISALLOW_COPY_AND_ASSIGN(Shader); |
| 100 | |
Brandon Jones | f05cdee | 2014-08-27 15:24:07 -0700 | [diff] [blame] | 101 | static void getSourceImpl(const std::string &source, GLsizei bufSize, GLsizei *length, char *buffer); |
daniel@transgaming.com | 0725e7d | 2012-02-17 18:02:20 +0000 | [diff] [blame] | 102 | |
Brandon Jones | f05cdee | 2014-08-27 15:24:07 -0700 | [diff] [blame] | 103 | rx::ShaderImpl *mShader; |
daniel@transgaming.com | 6c78521 | 2010-03-30 03:36:17 +0000 | [diff] [blame] | 104 | const GLuint mHandle; |
Brandon Jones | f05cdee | 2014-08-27 15:24:07 -0700 | [diff] [blame] | 105 | const GLenum mType; |
| 106 | std::string mSource; |
daniel@transgaming.com | da13f3e | 2010-07-28 19:20:56 +0000 | [diff] [blame] | 107 | unsigned int mRefCount; // Number of program objects this shader is attached to |
| 108 | bool mDeleteStatus; // Flag to indicate that the shader can be deleted when no longer in use |
Brandon Jones | f05cdee | 2014-08-27 15:24:07 -0700 | [diff] [blame] | 109 | bool mCompiled; // Indicates if this shader has been successfully compiled |
daniel@transgaming.com | 4f39fd9 | 2010-03-08 20:26:45 +0000 | [diff] [blame] | 110 | |
daniel@transgaming.com | da13f3e | 2010-07-28 19:20:56 +0000 | [diff] [blame] | 111 | ResourceManager *mResourceManager; |
daniel@transgaming.com | 4f39fd9 | 2010-03-08 20:26:45 +0000 | [diff] [blame] | 112 | }; |
| 113 | |
daniel@transgaming.com | 4f39fd9 | 2010-03-08 20:26:45 +0000 | [diff] [blame] | 114 | } |
| 115 | |
| 116 | #endif // LIBGLESV2_SHADER_H_ |