Shader.h revision 08ca3c6e18275ed9db5515e470692e700e1a3e12
1// SwiftShader Software Renderer
2//
3// Copyright(c) 2005-2013 TransGaming Inc.
4//
5// All rights reserved. No part of this software may be copied, distributed, transmitted,
6// transcribed, stored in a retrieval system, translated into any human or computer
7// language by any means, or disclosed to third parties without the explicit written
8// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express
9// or implied, including but not limited to any patent rights, are granted to you.
10//
11
12// Shader.h: Defines the abstract Shader class and its concrete derived
13// classes VertexShader and FragmentShader. Implements GL shader objects and
14// related functionality. [OpenGL ES 2.0.24] section 2.10 page 24 and section
15// 3.8 page 84.
16
17#ifndef LIBGLESV2_SHADER_H_
18#define LIBGLESV2_SHADER_H_
19
20#include "ResourceManager.h"
21
22#include "compiler/TranslatorASM.h"
23
24#define GL_APICALL
25#include <GLES2/gl2.h>
26
27#include <list>
28#include <vector>
29
30namespace glsl
31{
32	class OutputASM;
33}
34
35namespace es2
36{
37
38class Shader : public glsl::Shader
39{
40    friend class Program;
41
42public:
43    Shader(ResourceManager *manager, GLuint handle);
44
45    virtual ~Shader();
46
47    virtual GLenum getType() = 0;
48    GLuint getName() const;
49
50    void deleteSource();
51    void setSource(GLsizei count, const char *const *string, const GLint *length);
52    int getInfoLogLength() const;
53    void getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog);
54    int getSourceLength() const;
55    void getSource(GLsizei bufSize, GLsizei *length, char *source);
56
57    virtual void compile() = 0;
58    bool isCompiled();
59
60    void addRef();
61    void release();
62    unsigned int getRefCount() const;
63    bool isFlaggedForDeletion() const;
64    void flagForDeletion();
65
66    static void releaseCompiler();
67
68protected:
69	static bool compilerInitialized;
70	TranslatorASM *createCompiler(GLenum shaderType);
71	void clear();
72
73    static GLenum parseType(const std::string &type);
74    static bool compareVarying(const glsl::Varying &x, const glsl::Varying &y);
75
76	char *mSource;
77	char *mInfoLog;
78
79private:
80	const GLuint mHandle;
81    unsigned int mRefCount;     // Number of program objects this shader is attached to
82    bool mDeleteStatus;         // Flag to indicate that the shader can be deleted when no longer in use
83
84	ResourceManager *mResourceManager;
85};
86
87class VertexShader : public Shader
88{
89    friend class Program;
90
91public:
92    VertexShader(ResourceManager *manager, GLuint handle);
93
94    ~VertexShader();
95
96    virtual GLenum getType();
97    virtual void compile();
98    int getSemanticIndex(const std::string &attributeName);
99
100	virtual sw::Shader *getShader() const;
101	virtual sw::VertexShader *getVertexShader() const;
102
103private:
104	sw::VertexShader *vertexShader;
105};
106
107class FragmentShader : public Shader
108{
109public:
110    FragmentShader(ResourceManager *manager, GLuint handle);
111
112    ~FragmentShader();
113
114    virtual GLenum getType();
115    virtual void compile();
116
117	virtual sw::Shader *getShader() const;
118	virtual sw::PixelShader *getPixelShader() const;
119
120private:
121	sw::PixelShader *pixelShader;
122};
123}
124
125#endif   // LIBGLESV2_SHADER_H_
126