1// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15// Shader.h: Defines the abstract Shader class and its concrete derived
16// classes VertexShader and FragmentShader. Implements GL shader objects and
17// related functionality. [OpenGL ES 2.0.24] section 2.10 page 24 and section
18// 3.8 page 84.
19
20#ifndef LIBGLESV2_SHADER_H_
21#define LIBGLESV2_SHADER_H_
22
23#include "ResourceManager.h"
24
25#include "compiler/TranslatorASM.h"
26
27#include <GLES2/gl2.h>
28
29#include <string>
30#include <list>
31#include <mutex>
32#include <vector>
33
34namespace glsl
35{
36 class OutputASM;
37}
38
39namespace es2
40{
41
42class Shader : public glsl::Shader
43{
44 friend class Program;
45
46public:
47 Shader(ResourceManager *manager, GLuint handle);
48
49 virtual ~Shader();
50
51 virtual GLenum getType() const = 0;
52 GLuint getName() const;
53
54 void deleteSource();
55 void setSource(GLsizei count, const char *const *string, const GLint *length);
56 size_t getInfoLogLength() const;
57 void getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog);
58 size_t getSourceLength() const;
59 void getSource(GLsizei bufSize, GLsizei *length, char *source);
60
61 void compile();
62 bool isCompiled();
63
64 void addRef();
65 void release();
66 unsigned int getRefCount() const;
67 bool isFlaggedForDeletion() const;
68 void flagForDeletion();
69
70 static void releaseCompiler();
71
72protected:
73 static std::mutex mutex;
74 static bool compilerInitialized;
75
76 TranslatorASM *createCompiler(GLenum shaderType);
77 void clear();
78
79 static bool compareVarying(const glsl::Varying &x, const glsl::Varying &y);
80
81 char *mSource;
82 std::string infoLog;
83
84private:
85 virtual void createShader() = 0;
86 virtual void deleteShader() = 0;
87
88 const GLuint mHandle;
89 unsigned int mRefCount; // Number of program objects this shader is attached to
90 bool mDeleteStatus; // Flag to indicate that the shader can be deleted when no longer in use
91
92 ResourceManager *mResourceManager;
93};
94
95class VertexShader : public Shader
96{
97 friend class Program;
98
99public:
100 VertexShader(ResourceManager *manager, GLuint handle);
101
102 ~VertexShader();
103
104 virtual GLenum getType() const;
105 int getSemanticIndex(const std::string &attributeName) const;
106
107 virtual sw::Shader *getShader() const;
108 virtual sw::VertexShader *getVertexShader() const;
109
110private:
111 virtual void createShader();
112 virtual void deleteShader();
113
114 sw::VertexShader *vertexShader;
115};
116
117class FragmentShader : public Shader
118{
119public:
120 FragmentShader(ResourceManager *manager, GLuint handle);
121
122 ~FragmentShader();
123
124 virtual GLenum getType() const;
125
126 virtual sw::Shader *getShader() const;
127 virtual sw::PixelShader *getPixelShader() const;
128
129private:
130 virtual void createShader();
131 virtual void deleteShader();
132
133 sw::PixelShader *pixelShader;
134};
135}
136
137#endif // LIBGLESV2_SHADER_H_
138