blob: 9992a5c5cb42566d7a38c1a27c72d41b3c81d517 [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.com0361b922010-03-28 19:36:15 +000029 Uniform(GLenum type, const std::string &name, unsigned int bytes);
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;
35 const unsigned int bytes;
36 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.com4f39fd92010-03-08 20:26:45 +000088 void flagForDeletion();
89 bool isFlaggedForDeletion() const;
90
91 private:
92 DISALLOW_COPY_AND_ASSIGN(Program);
93
94 ID3DXBuffer *compileToBinary(const char *hlsl, const char *profile, ID3DXConstantTable **constantTable);
95 void unlink(bool destroy = false);
96
daniel@transgaming.com0e3358a2010-04-05 20:32:42 +000097 struct Varying
98 {
99 Varying(const std::string &name, char *declaration) : name(name), declaration(declaration)
100 {
101 link = -1;
102 }
103
104 int link;
105 std::string name;
106 char *declaration;
107 };
108
109 typedef std::vector<Varying> VaryingArray;
110
111 void parseVaryings(const char *structure, char *hlsl, VaryingArray &varyings);
112 bool linkVaryings();
113
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000114 bool linkAttributes();
daniel@transgaming.com85423182010-04-22 13:35:27 +0000115 int getAttributeBinding(const std::string &name);
daniel@transgaming.com0e3358a2010-04-05 20:32:42 +0000116
daniel@transgaming.com86487c22010-03-11 19:41:43 +0000117 bool linkUniforms(ID3DXConstantTable *constantTable);
118 bool defineUniform(const D3DXHANDLE &constantHandle, const D3DXCONSTANT_DESC &constantDescription, std::string name = "");
119 bool defineUniform(const D3DXCONSTANT_DESC &constantDescription, std::string &name);
120 Uniform *createUniform(const D3DXCONSTANT_DESC &constantDescription, std::string &name);
daniel@transgaming.com72d0b522010-04-13 19:53:44 +0000121 static std::string decorate(const std::string &string); // Prepend an underscore
daniel@transgaming.comf4a0c8e2010-04-13 03:26:01 +0000122 bool applyUniform1bv(GLint location, GLsizei count, const GLboolean *v);
123 bool applyUniform2bv(GLint location, GLsizei count, const GLboolean *v);
124 bool applyUniform3bv(GLint location, GLsizei count, const GLboolean *v);
125 bool applyUniform4bv(GLint location, GLsizei count, const GLboolean *v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000126 bool applyUniform1fv(GLint location, GLsizei count, const GLfloat *v);
127 bool applyUniform2fv(GLint location, GLsizei count, const GLfloat *v);
128 bool applyUniform3fv(GLint location, GLsizei count, const GLfloat *v);
129 bool applyUniform4fv(GLint location, GLsizei count, const GLfloat *v);
130 bool applyUniformMatrix2fv(GLint location, GLsizei count, const GLfloat *value);
131 bool applyUniformMatrix3fv(GLint location, GLsizei count, const GLfloat *value);
132 bool applyUniformMatrix4fv(GLint location, GLsizei count, const GLfloat *value);
133 bool applyUniform1iv(GLint location, GLsizei count, const GLint *v);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +0000134 bool applyUniform2iv(GLint location, GLsizei count, const GLint *v);
135 bool applyUniform3iv(GLint location, GLsizei count, const GLint *v);
136 bool applyUniform4iv(GLint location, GLsizei count, const GLint *v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000137
daniel@transgaming.com85423182010-04-22 13:35:27 +0000138 GLenum parseAttributeType(const std::string &type);
daniel@transgaming.comb4ff1f82010-04-22 13:35:18 +0000139 void appendToInfoLog(const char *info, ...);
daniel@transgaming.comcba50572010-03-28 19:36:09 +0000140
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000141 FragmentShader *mFragmentShader;
142 VertexShader *mVertexShader;
143
daniel@transgaming.com0e3358a2010-04-05 20:32:42 +0000144 char *mPixelHLSL;
145 char *mVertexHLSL;
146
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000147 IDirect3DPixelShader9 *mPixelExecutable;
148 IDirect3DVertexShader9 *mVertexExecutable;
149 ID3DXConstantTable *mConstantTablePS;
150 ID3DXConstantTable *mConstantTableVS;
151
daniel@transgaming.comb4ff1f82010-04-22 13:35:18 +0000152 std::set<std::string> mAttributeBinding[MAX_VERTEX_ATTRIBS];
daniel@transgaming.com85423182010-04-22 13:35:27 +0000153 Attribute mLinkedAttribute[MAX_VERTEX_ATTRIBS];
daniel@transgaming.comb4ff1f82010-04-22 13:35:18 +0000154 int mSemanticIndex[MAX_VERTEX_ATTRIBS];
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000155
daniel@transgaming.com416485f2010-03-16 06:23:23 +0000156 struct Sampler
157 {
158 bool active;
159 GLint logicalTextureUnit;
160 SamplerType type;
161 };
162
163 Sampler mSamplers[MAX_TEXTURE_IMAGE_UNITS];
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000164
165 typedef std::vector<Uniform*> UniformArray;
166 UniformArray mUniforms;
167
168 bool mLinked;
169 bool mDeleteStatus; // Flag to indicate that the program can be deleted when no longer in use
daniel@transgaming.comcba50572010-03-28 19:36:09 +0000170 char *mInfoLog;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000171};
172}
173
174#endif // LIBGLESV2_PROGRAM_H_