blob: c200261b55c43faf300686024fabb65a3c2e46ed [file] [log] [blame]
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001//
2// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// Program.h: Defines the gl::Program class. Implements GL program objects
8// and related functionality. [OpenGL ES 2.0.24] section 2.10.3 page 28.
9
10#ifndef LIBGLESV2_PROGRAM_H_
11#define LIBGLESV2_PROGRAM_H_
12
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000013#include <d3dx9.h>
14#include <string>
15#include <vector>
daniel@transgaming.comb4ff1f82010-04-22 13:35:18 +000016#include <set>
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000017
daniel@transgaming.com85423182010-04-22 13:35:27 +000018#include "libGLESv2/Shader.h"
daniel@transgaming.come6842292010-04-20 18:52:50 +000019#include "libGLESv2/Context.h"
20
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000021namespace gl
22{
23class FragmentShader;
24class VertexShader;
25
daniel@transgaming.com86487c22010-03-11 19:41:43 +000026// Helper struct representing a single shader uniform
27struct Uniform
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000028{
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000029 Uniform(GLenum type, const std::string &name, unsigned int arraySize);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000030
31 ~Uniform();
32
daniel@transgaming.com0361b922010-03-28 19:36:15 +000033 const GLenum type;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000034 const std::string name;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000035 const unsigned int arraySize;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000036 unsigned char *data;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000037};
38
39class Program
40{
41 public:
42 Program();
43
44 ~Program();
45
46 bool attachShader(Shader *shader);
47 bool detachShader(Shader *shader);
daniel@transgaming.comcba50572010-03-28 19:36:09 +000048 int getAttachedShadersCount() const;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000049
50 IDirect3DPixelShader9 *getPixelShader();
51 IDirect3DVertexShader9 *getVertexShader();
52
53 void bindAttributeLocation(GLuint index, const char *name);
54 GLuint getAttributeLocation(const char *name);
daniel@transgaming.comb4ff1f82010-04-22 13:35:18 +000055 int getSemanticIndex(int attributeIndex);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000056
57 GLint getSamplerMapping(unsigned int samplerIndex);
daniel@transgaming.com416485f2010-03-16 06:23:23 +000058 SamplerType getSamplerType(unsigned int samplerIndex);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000059
60 GLint getUniformLocation(const char *name);
61 bool setUniform1fv(GLint location, GLsizei count, const GLfloat *v);
62 bool setUniform2fv(GLint location, GLsizei count, const GLfloat *v);
63 bool setUniform3fv(GLint location, GLsizei count, const GLfloat *v);
64 bool setUniform4fv(GLint location, GLsizei count, const GLfloat *v);
65 bool setUniformMatrix2fv(GLint location, GLsizei count, const GLfloat *value);
66 bool setUniformMatrix3fv(GLint location, GLsizei count, const GLfloat *value);
67 bool setUniformMatrix4fv(GLint location, GLsizei count, const GLfloat *value);
68 bool setUniform1iv(GLint location, GLsizei count, const GLint *v);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +000069 bool setUniform2iv(GLint location, GLsizei count, const GLint *v);
70 bool setUniform3iv(GLint location, GLsizei count, const GLint *v);
71 bool setUniform4iv(GLint location, GLsizei count, const GLint *v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000072
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +000073 bool getUniformfv(GLint location, GLfloat *params);
74 bool getUniformiv(GLint location, GLint *params);
75
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000076 void applyUniforms();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000077
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000078 void link();
79 bool isLinked();
daniel@transgaming.comcba50572010-03-28 19:36:09 +000080 int getInfoLogLength() const;
81 void getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog);
daniel@transgaming.com6c785212010-03-30 03:36:17 +000082 void getAttachedShaders(GLsizei maxCount, GLsizei *count, GLuint *shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000083
daniel@transgaming.com85423182010-04-22 13:35:27 +000084 void getActiveAttribute(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
85 GLint getActiveAttributeCount();
86 GLint getActiveAttributeMaxLength();
87
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +000088 void getActiveUniform(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
89 GLint getActiveUniformCount();
90 GLint getActiveUniformMaxLength();
91
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000092 void flagForDeletion();
93 bool isFlaggedForDeletion() const;
94
95 private:
96 DISALLOW_COPY_AND_ASSIGN(Program);
97
98 ID3DXBuffer *compileToBinary(const char *hlsl, const char *profile, ID3DXConstantTable **constantTable);
99 void unlink(bool destroy = false);
100
daniel@transgaming.com0e3358a2010-04-05 20:32:42 +0000101 struct Varying
102 {
103 Varying(const std::string &name, char *declaration) : name(name), declaration(declaration)
104 {
105 link = -1;
106 }
107
108 int link;
109 std::string name;
110 char *declaration;
111 };
112
113 typedef std::vector<Varying> VaryingArray;
114
115 void parseVaryings(const char *structure, char *hlsl, VaryingArray &varyings);
116 bool linkVaryings();
117
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000118 bool linkAttributes();
daniel@transgaming.com85423182010-04-22 13:35:27 +0000119 int getAttributeBinding(const std::string &name);
daniel@transgaming.com0e3358a2010-04-05 20:32:42 +0000120
daniel@transgaming.com86487c22010-03-11 19:41:43 +0000121 bool linkUniforms(ID3DXConstantTable *constantTable);
122 bool defineUniform(const D3DXHANDLE &constantHandle, const D3DXCONSTANT_DESC &constantDescription, std::string name = "");
123 bool defineUniform(const D3DXCONSTANT_DESC &constantDescription, std::string &name);
124 Uniform *createUniform(const D3DXCONSTANT_DESC &constantDescription, std::string &name);
daniel@transgaming.com72d0b522010-04-13 19:53:44 +0000125 static std::string decorate(const std::string &string); // Prepend an underscore
daniel@transgaming.comf4a0c8e2010-04-13 03:26:01 +0000126 bool applyUniform1bv(GLint location, GLsizei count, const GLboolean *v);
127 bool applyUniform2bv(GLint location, GLsizei count, const GLboolean *v);
128 bool applyUniform3bv(GLint location, GLsizei count, const GLboolean *v);
129 bool applyUniform4bv(GLint location, GLsizei count, const GLboolean *v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000130 bool applyUniform1fv(GLint location, GLsizei count, const GLfloat *v);
131 bool applyUniform2fv(GLint location, GLsizei count, const GLfloat *v);
132 bool applyUniform3fv(GLint location, GLsizei count, const GLfloat *v);
133 bool applyUniform4fv(GLint location, GLsizei count, const GLfloat *v);
134 bool applyUniformMatrix2fv(GLint location, GLsizei count, const GLfloat *value);
135 bool applyUniformMatrix3fv(GLint location, GLsizei count, const GLfloat *value);
136 bool applyUniformMatrix4fv(GLint location, GLsizei count, const GLfloat *value);
137 bool applyUniform1iv(GLint location, GLsizei count, const GLint *v);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +0000138 bool applyUniform2iv(GLint location, GLsizei count, const GLint *v);
139 bool applyUniform3iv(GLint location, GLsizei count, const GLint *v);
140 bool applyUniform4iv(GLint location, GLsizei count, const GLint *v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000141
daniel@transgaming.comb4ff1f82010-04-22 13:35:18 +0000142 void appendToInfoLog(const char *info, ...);
daniel@transgaming.comcba50572010-03-28 19:36:09 +0000143
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000144 FragmentShader *mFragmentShader;
145 VertexShader *mVertexShader;
146
daniel@transgaming.com0e3358a2010-04-05 20:32:42 +0000147 char *mPixelHLSL;
148 char *mVertexHLSL;
149
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000150 IDirect3DPixelShader9 *mPixelExecutable;
151 IDirect3DVertexShader9 *mVertexExecutable;
152 ID3DXConstantTable *mConstantTablePS;
153 ID3DXConstantTable *mConstantTableVS;
154
daniel@transgaming.comb4ff1f82010-04-22 13:35:18 +0000155 std::set<std::string> mAttributeBinding[MAX_VERTEX_ATTRIBS];
daniel@transgaming.com85423182010-04-22 13:35:27 +0000156 Attribute mLinkedAttribute[MAX_VERTEX_ATTRIBS];
daniel@transgaming.comb4ff1f82010-04-22 13:35:18 +0000157 int mSemanticIndex[MAX_VERTEX_ATTRIBS];
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000158
daniel@transgaming.com416485f2010-03-16 06:23:23 +0000159 struct Sampler
160 {
161 bool active;
162 GLint logicalTextureUnit;
163 SamplerType type;
164 };
165
166 Sampler mSamplers[MAX_TEXTURE_IMAGE_UNITS];
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000167
168 typedef std::vector<Uniform*> UniformArray;
169 UniformArray mUniforms;
170
171 bool mLinked;
172 bool mDeleteStatus; // Flag to indicate that the program can be deleted when no longer in use
daniel@transgaming.comcba50572010-03-28 19:36:09 +0000173 char *mInfoLog;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000174};
175}
176
177#endif // LIBGLESV2_PROGRAM_H_