1a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block//
2a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
3a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// Use of this source code is governed by a BSD-style license that can be
4a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// found in the LICENSE file.
5a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block//
6a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
7a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// Shader.h: Defines the abstract gl::Shader class and its concrete derived
8a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// classes VertexShader and FragmentShader. Implements GL shader objects and
9a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// related functionality. [OpenGL ES 2.0.24] section 2.10 page 24 and section
10a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// 3.8 page 84.
11a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
12a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#ifndef LIBGLESV2_SHADER_H_
13a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#define LIBGLESV2_SHADER_H_
14a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
15a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#define GL_APICALL
16a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#include <GLES2/gl2.h>
17a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#include <d3dx9.h>
18a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#include <list>
19a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#include <vector>
20a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
215abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#include "libGLESv2/ResourceManager.h"
22a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
23a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blocknamespace gl
24a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
25a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockstruct Varying
26a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
27a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    Varying(GLenum type, const std::string &name, int size, bool array)
28a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        : type(type), name(name), size(size), array(array), reg(-1), col(-1)
29a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
30a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
31a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
32a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    GLenum type;
33a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    std::string name;
34a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    int size;   // Number of 'type' elements
35a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    bool array;
36a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
37a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    int reg;    // First varying register, assigned during link
38a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    int col;    // First register element, assigned during link
39a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block};
40a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
41a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blocktypedef std::list<Varying> VaryingList;
42a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
43a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockclass Shader
44a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
45a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    friend Program;
46a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
47a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block  public:
485abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    Shader(ResourceManager *manager, GLuint handle);
49a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
50a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    virtual ~Shader();
51a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
52a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    virtual GLenum getType() = 0;
53a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    GLuint getHandle() const;
54a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
55a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    void deleteSource();
56a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    void setSource(GLsizei count, const char **string, const GLint *length);
57a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    int getInfoLogLength() const;
58a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    void getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog);
59a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    int getSourceLength() const;
60a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    void getSource(GLsizei bufSize, GLsizei *length, char *source);
61a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
62a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    virtual void compile() = 0;
63a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    bool isCompiled();
64a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    const char *getHLSL();
65a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
665abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    void addRef();
675abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    void release();
685abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    unsigned int getRefCount() const;
69a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    bool isFlaggedForDeletion() const;
70a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    void flagForDeletion();
71a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
72a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    static void releaseCompiler();
73a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
74a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block  protected:
75a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    DISALLOW_COPY_AND_ASSIGN(Shader);
76a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
77a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    void parseVaryings();
78a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
79a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    void compileToHLSL(void *compiler);
80a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
81a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    static GLenum parseType(const std::string &type);
82a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    static bool compareVarying(const Varying &x, const Varying &y);
83a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
84a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    const GLuint mHandle;
855abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    unsigned int mRefCount;     // Number of program objects this shader is attached to
865abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    bool mDeleteStatus;         // Flag to indicate that the shader can be deleted when no longer in use
87a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
88a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    char *mSource;
89a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    char *mHlsl;
90a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    char *mInfoLog;
91a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
92a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    VaryingList varyings;
93a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
94a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    bool mUsesFragCoord;
95a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    bool mUsesFrontFacing;
965abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    bool mUsesPointSize;
975abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    bool mUsesPointCoord;
98a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
995abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    ResourceManager *mResourceManager;
100a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
101a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    static void *mFragmentCompiler;
102a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    static void *mVertexCompiler;
103a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block};
104a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
105a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockstruct Attribute
106a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
107a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    Attribute() : type(GL_NONE), name("")
108a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
109a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
110a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
111a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    Attribute(GLenum type, const std::string &name) : type(type), name(name)
112a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
113a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
114a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
115a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    GLenum type;
116a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    std::string name;
117a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block};
118a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
119a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blocktypedef std::vector<Attribute> AttributeArray;
120a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
121a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockclass VertexShader : public Shader
122a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
123a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    friend Program;
124a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
125a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block  public:
1265abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    VertexShader(ResourceManager *manager, GLuint handle);
127a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
128a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    ~VertexShader();
129a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
130a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    GLenum getType();
131a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    void compile();
132a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    int getSemanticIndex(const std::string &attributeName);
133a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
134a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block  private:
135a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    DISALLOW_COPY_AND_ASSIGN(VertexShader);
136a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
137a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    void parseAttributes();
138a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
139a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    AttributeArray mAttributes;
140a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block};
141a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
142a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockclass FragmentShader : public Shader
143a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
144a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block  public:
1455abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    FragmentShader(ResourceManager *manager, GLuint handle);
146a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
147a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    ~FragmentShader();
148a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
149a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    GLenum getType();
150a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    void compile();
151a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
152a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block  private:
153a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    DISALLOW_COPY_AND_ASSIGN(FragmentShader);
154a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block};
155a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
156a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
157a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#endif   // LIBGLESV2_SHADER_H_
158