blob: ea9616a6b42dc9ae31e55b4c09e264e085652130 [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.come6842292010-04-20 18:52:50 +000018#include "libGLESv2/Context.h"
19
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000020namespace gl
21{
22class FragmentShader;
23class VertexShader;
24
daniel@transgaming.com86487c22010-03-11 19:41:43 +000025// Helper struct representing a single shader uniform
26struct Uniform
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000027{
daniel@transgaming.com0361b922010-03-28 19:36:15 +000028 Uniform(GLenum type, const std::string &name, unsigned int bytes);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000029
30 ~Uniform();
31
daniel@transgaming.com0361b922010-03-28 19:36:15 +000032 const GLenum type;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000033 const std::string name;
34 const unsigned int bytes;
35 unsigned char *data;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000036};
37
38class Program
39{
40 public:
41 Program();
42
43 ~Program();
44
45 bool attachShader(Shader *shader);
46 bool detachShader(Shader *shader);
daniel@transgaming.comcba50572010-03-28 19:36:09 +000047 int getAttachedShadersCount() const;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000048
49 IDirect3DPixelShader9 *getPixelShader();
50 IDirect3DVertexShader9 *getVertexShader();
51
52 void bindAttributeLocation(GLuint index, const char *name);
53 GLuint getAttributeLocation(const char *name);
daniel@transgaming.comb4ff1f82010-04-22 13:35:18 +000054 int getSemanticIndex(int attributeIndex);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000055
56 GLint getSamplerMapping(unsigned int samplerIndex);
daniel@transgaming.com416485f2010-03-16 06:23:23 +000057 SamplerType getSamplerType(unsigned int samplerIndex);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000058
59 GLint getUniformLocation(const char *name);
60 bool setUniform1fv(GLint location, GLsizei count, const GLfloat *v);
61 bool setUniform2fv(GLint location, GLsizei count, const GLfloat *v);
62 bool setUniform3fv(GLint location, GLsizei count, const GLfloat *v);
63 bool setUniform4fv(GLint location, GLsizei count, const GLfloat *v);
64 bool setUniformMatrix2fv(GLint location, GLsizei count, const GLfloat *value);
65 bool setUniformMatrix3fv(GLint location, GLsizei count, const GLfloat *value);
66 bool setUniformMatrix4fv(GLint location, GLsizei count, const GLfloat *value);
67 bool setUniform1iv(GLint location, GLsizei count, const GLint *v);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +000068 bool setUniform2iv(GLint location, GLsizei count, const GLint *v);
69 bool setUniform3iv(GLint location, GLsizei count, const GLint *v);
70 bool setUniform4iv(GLint location, GLsizei count, const GLint *v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000071
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +000072 bool getUniformfv(GLint location, GLfloat *params);
73 bool getUniformiv(GLint location, GLint *params);
74
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000075 void applyUniforms();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000076
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000077 void link();
78 bool isLinked();
daniel@transgaming.comcba50572010-03-28 19:36:09 +000079 int getInfoLogLength() const;
80 void getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog);
daniel@transgaming.com6c785212010-03-30 03:36:17 +000081 void getAttachedShaders(GLsizei maxCount, GLsizei *count, GLuint *shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000082
83 void flagForDeletion();
84 bool isFlaggedForDeletion() const;
85
86 private:
87 DISALLOW_COPY_AND_ASSIGN(Program);
88
89 ID3DXBuffer *compileToBinary(const char *hlsl, const char *profile, ID3DXConstantTable **constantTable);
90 void unlink(bool destroy = false);
91
daniel@transgaming.com0e3358a2010-04-05 20:32:42 +000092 struct Varying
93 {
94 Varying(const std::string &name, char *declaration) : name(name), declaration(declaration)
95 {
96 link = -1;
97 }
98
99 int link;
100 std::string name;
101 char *declaration;
102 };
103
104 typedef std::vector<Varying> VaryingArray;
105
106 void parseVaryings(const char *structure, char *hlsl, VaryingArray &varyings);
107 bool linkVaryings();
108
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000109 bool linkAttributes();
daniel@transgaming.comb4ff1f82010-04-22 13:35:18 +0000110 int getAttributeBinding(const char *name);
daniel@transgaming.com0e3358a2010-04-05 20:32:42 +0000111
daniel@transgaming.com86487c22010-03-11 19:41:43 +0000112 bool linkUniforms(ID3DXConstantTable *constantTable);
113 bool defineUniform(const D3DXHANDLE &constantHandle, const D3DXCONSTANT_DESC &constantDescription, std::string name = "");
114 bool defineUniform(const D3DXCONSTANT_DESC &constantDescription, std::string &name);
115 Uniform *createUniform(const D3DXCONSTANT_DESC &constantDescription, std::string &name);
daniel@transgaming.com72d0b522010-04-13 19:53:44 +0000116 static std::string decorate(const std::string &string); // Prepend an underscore
daniel@transgaming.comf4a0c8e2010-04-13 03:26:01 +0000117 bool applyUniform1bv(GLint location, GLsizei count, const GLboolean *v);
118 bool applyUniform2bv(GLint location, GLsizei count, const GLboolean *v);
119 bool applyUniform3bv(GLint location, GLsizei count, const GLboolean *v);
120 bool applyUniform4bv(GLint location, GLsizei count, const GLboolean *v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000121 bool applyUniform1fv(GLint location, GLsizei count, const GLfloat *v);
122 bool applyUniform2fv(GLint location, GLsizei count, const GLfloat *v);
123 bool applyUniform3fv(GLint location, GLsizei count, const GLfloat *v);
124 bool applyUniform4fv(GLint location, GLsizei count, const GLfloat *v);
125 bool applyUniformMatrix2fv(GLint location, GLsizei count, const GLfloat *value);
126 bool applyUniformMatrix3fv(GLint location, GLsizei count, const GLfloat *value);
127 bool applyUniformMatrix4fv(GLint location, GLsizei count, const GLfloat *value);
128 bool applyUniform1iv(GLint location, GLsizei count, const GLint *v);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +0000129 bool applyUniform2iv(GLint location, GLsizei count, const GLint *v);
130 bool applyUniform3iv(GLint location, GLsizei count, const GLint *v);
131 bool applyUniform4iv(GLint location, GLsizei count, const GLint *v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000132
daniel@transgaming.comb4ff1f82010-04-22 13:35:18 +0000133 void appendToInfoLog(const char *info, ...);
daniel@transgaming.comcba50572010-03-28 19:36:09 +0000134
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000135 FragmentShader *mFragmentShader;
136 VertexShader *mVertexShader;
137
daniel@transgaming.com0e3358a2010-04-05 20:32:42 +0000138 char *mPixelHLSL;
139 char *mVertexHLSL;
140
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000141 IDirect3DPixelShader9 *mPixelExecutable;
142 IDirect3DVertexShader9 *mVertexExecutable;
143 ID3DXConstantTable *mConstantTablePS;
144 ID3DXConstantTable *mConstantTableVS;
145
daniel@transgaming.comb4ff1f82010-04-22 13:35:18 +0000146 std::set<std::string> mAttributeBinding[MAX_VERTEX_ATTRIBS];
147 std::string mLinkedAttribute[MAX_VERTEX_ATTRIBS];
148 int mSemanticIndex[MAX_VERTEX_ATTRIBS];
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000149
daniel@transgaming.com416485f2010-03-16 06:23:23 +0000150 struct Sampler
151 {
152 bool active;
153 GLint logicalTextureUnit;
154 SamplerType type;
155 };
156
157 Sampler mSamplers[MAX_TEXTURE_IMAGE_UNITS];
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000158
159 typedef std::vector<Uniform*> UniformArray;
160 UniformArray mUniforms;
161
162 bool mLinked;
163 bool mDeleteStatus; // Flag to indicate that the program can be deleted when no longer in use
daniel@transgaming.comcba50572010-03-28 19:36:09 +0000164 char *mInfoLog;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000165};
166}
167
168#endif // LIBGLESV2_PROGRAM_H_