blob: 7ba3bd165c3900fa59bb456eb3518d0d933a6f41 [file] [log] [blame]
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001//
shannon.woods@transgaming.comb73964e2013-01-25 21:49:14 +00002// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003// 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 Madill13cfd272014-07-17 14:16:28 -040015
daniel@transgaming.com29ab9522012-08-27 16:25:37 +000016#include <string>
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +000017#include <list>
18#include <vector>
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000019
Jamie Madill13cfd272014-07-17 14:16:28 -040020#include "angle_gl.h"
Jamie Madille294bb82014-07-17 14:16:26 -040021#include <GLSLANG/ShaderLang.h>
Jamie Madill13cfd272014-07-17 14:16:28 -040022
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000023#include "common/angleutils.h"
Jamie Madill5f562732014-02-14 16:41:24 -050024#include "libGLESv2/angletypes.h"
daniel@transgaming.come6842292010-04-20 18:52:50 +000025
shannon.woods@transgaming.comb73964e2013-01-25 21:49:14 +000026namespace rx
27{
Brandon Jonesf05cdee2014-08-27 15:24:07 -070028class ShaderImpl;
shannon.woods@transgaming.comb73964e2013-01-25 21:49:14 +000029}
30
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000031namespace gl
32{
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000033class ResourceManager;
34
Jamie Madillf2575982014-06-25 16:04:54 -040035struct PackedVarying : public sh::Varying
Jamie Madillff0d2ba2014-05-14 13:49:10 -040036{
37 unsigned int registerIndex; // Assigned during link
Austin Kinrossaf875522014-08-25 21:06:07 -070038 unsigned int columnIndex; // Assigned during link, defaults to 0
Jamie Madillff0d2ba2014-05-14 13:49:10 -040039
Jamie Madillf2575982014-06-25 16:04:54 -040040 PackedVarying(const sh::Varying &varying)
41 : sh::Varying(varying),
Austin Kinrossaf875522014-08-25 21:06:07 -070042 registerIndex(GL_INVALID_INDEX),
43 columnIndex(0)
Jamie Madillff0d2ba2014-05-14 13:49:10 -040044 {}
45
46 bool registerAssigned() const { return registerIndex != GL_INVALID_INDEX; }
Jamie Madill54ad4f82014-09-03 09:40:46 -040047 bool isBuiltIn() const { return name.compare(0, 3, "gl_") == 0; }
Jamie Madillff0d2ba2014-05-14 13:49:10 -040048
49 void resetRegisterAssignment()
50 {
51 registerIndex = GL_INVALID_INDEX;
52 }
53};
54
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000055class Shader
56{
57 public:
Brandon Jonesf05cdee2014-08-27 15:24:07 -070058 Shader(ResourceManager *manager, rx::ShaderImpl *impl, GLenum type, GLuint handle);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000059
60 virtual ~Shader();
61
Brandon Jonesf05cdee2014-08-27 15:24:07 -070062 GLenum getType() const { return mType; }
daniel@transgaming.com6c785212010-03-30 03:36:17 +000063 GLuint getHandle() const;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000064
Brandon Jonesf05cdee2014-08-27 15:24:07 -070065 rx::ShaderImpl *getImplementation() { return mShader; }
66 const rx::ShaderImpl *getImplementation() const { return mShader; }
67
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000068 void deleteSource();
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +000069 void setSource(GLsizei count, const char *const *string, const GLint *length);
daniel@transgaming.comcba50572010-03-28 19:36:09 +000070 int getInfoLogLength() const;
Geoff Lang536d7262013-08-26 17:04:20 -040071 void getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog) const;
daniel@transgaming.comcba50572010-03-28 19:36:09 +000072 int getSourceLength() const;
Geoff Lang536d7262013-08-26 17:04:20 -040073 void getSource(GLsizei bufSize, GLsizei *length, char *buffer) const;
zmo@google.coma574f782011-10-03 21:45:23 +000074 int getTranslatedSourceLength() const;
Geoff Lang536d7262013-08-26 17:04:20 -040075 void getTranslatedSource(GLsizei bufSize, GLsizei *length, char *buffer) const;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000076
Brandon Jonesf05cdee2014-08-27 15:24:07 -070077 void compile();
78 bool isCompiled() const { return mCompiled; }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000079
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +000080 void addRef();
81 void release();
82 unsigned int getRefCount() const;
daniel@transgaming.comcba50572010-03-28 19:36:09 +000083 bool isFlaggedForDeletion() const;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000084 void flagForDeletion();
daniel@transgaming.com2cdf8332012-02-17 18:00:50 +000085
Jamie Madilld15250e2014-09-03 09:40:44 -040086 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.com2cdf8332012-02-17 18:00:50 +000098 private:
99 DISALLOW_COPY_AND_ASSIGN(Shader);
100
Brandon Jonesf05cdee2014-08-27 15:24:07 -0700101 static void getSourceImpl(const std::string &source, GLsizei bufSize, GLsizei *length, char *buffer);
daniel@transgaming.com0725e7d2012-02-17 18:02:20 +0000102
Brandon Jonesf05cdee2014-08-27 15:24:07 -0700103 rx::ShaderImpl *mShader;
daniel@transgaming.com6c785212010-03-30 03:36:17 +0000104 const GLuint mHandle;
Brandon Jonesf05cdee2014-08-27 15:24:07 -0700105 const GLenum mType;
106 std::string mSource;
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000107 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 Jonesf05cdee2014-08-27 15:24:07 -0700109 bool mCompiled; // Indicates if this shader has been successfully compiled
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000110
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000111 ResourceManager *mResourceManager;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000112};
113
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000114}
115
116#endif // LIBGLESV2_SHADER_H_