• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.
18 
19 
20 #ifndef LIBGL_SHADER_H_
21 #define LIBGL_SHADER_H_
22 
23 #include "ResourceManager.h"
24 
25 #include "compiler/TranslatorASM.h"
26 
27 #define _GDI32_
28 #include <windows.h>
29 #include <GL/GL.h>
30 #include <GL/glext.h>
31 
32 #include <string>
33 #include <list>
34 #include <vector>
35 
36 namespace glsl
37 {
38 	class OutputASM;
39 }
40 
41 namespace gl
42 {
43 
44 class Shader : public glsl::Shader
45 {
46 	friend class Program;
47 
48 public:
49 	Shader(ResourceManager *manager, GLuint handle);
50 
51 	virtual ~Shader();
52 
53 	virtual GLenum getType() = 0;
54 	GLuint getName() const;
55 
56 	void deleteSource();
57 	void setSource(GLsizei count, const char *const *string, const GLint *length);
58 	int getInfoLogLength() const;
59 	void getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog);
60 	int getSourceLength() const;
61 	void getSource(GLsizei bufSize, GLsizei *length, char *source);
62 
63 	void compile();
64 	bool isCompiled();
65 
66 	void addRef();
67 	void release();
68 	unsigned int getRefCount() const;
69 	bool isFlaggedForDeletion() const;
70 	void flagForDeletion();
71 
72 	static void releaseCompiler();
73 
74 protected:
75 	static bool compilerInitialized;
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 
84 private:
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 
95 class VertexShader : public Shader
96 {
97 	friend class Program;
98 
99 public:
100 	VertexShader(ResourceManager *manager, GLuint handle);
101 
102 	~VertexShader();
103 
104 	virtual GLenum getType();
105 	int getSemanticIndex(const std::string &attributeName);
106 
107 	virtual sw::Shader *getShader() const;
108 	virtual sw::VertexShader *getVertexShader() const;
109 
110 private:
111 	virtual void createShader();
112 	virtual void deleteShader();
113 
114 	sw::VertexShader *vertexShader;
115 };
116 
117 class FragmentShader : public Shader
118 {
119 public:
120 	FragmentShader(ResourceManager *manager, GLuint handle);
121 
122 	~FragmentShader();
123 
124 	virtual GLenum getType();
125 
126 	virtual sw::Shader *getShader() const;
127 	virtual sw::PixelShader *getPixelShader() const;
128 
129 private:
130 	virtual void createShader();
131 	virtual void deleteShader();
132 
133 	sw::PixelShader *pixelShader;
134 };
135 }
136 
137 #endif   // LIBGL_SHADER_H_
138