blob: 781f712d51be177ce9633a486843f76f6edb7a34 [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
13#include "Context.h"
14
15#include <d3dx9.h>
16#include <string>
17#include <vector>
18
19namespace gl
20{
21class FragmentShader;
22class VertexShader;
23
daniel@transgaming.com86487c22010-03-11 19:41:43 +000024// Helper struct representing a single shader uniform
25struct Uniform
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000026{
daniel@transgaming.com0361b922010-03-28 19:36:15 +000027 Uniform(GLenum type, const std::string &name, unsigned int bytes);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000028
29 ~Uniform();
30
daniel@transgaming.com0361b922010-03-28 19:36:15 +000031 const GLenum type;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000032 const std::string name;
33 const unsigned int bytes;
34 unsigned char *data;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000035};
36
37class Program
38{
39 public:
40 Program();
41
42 ~Program();
43
44 bool attachShader(Shader *shader);
45 bool detachShader(Shader *shader);
daniel@transgaming.comcba50572010-03-28 19:36:09 +000046 int getAttachedShadersCount() const;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000047
48 IDirect3DPixelShader9 *getPixelShader();
49 IDirect3DVertexShader9 *getVertexShader();
50
51 void bindAttributeLocation(GLuint index, const char *name);
52 GLuint getAttributeLocation(const char *name);
53 bool isActiveAttribute(int attributeIndex);
54 int getInputMapping(int attributeIndex);
55
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
72 void applyUniforms();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000073
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000074 void link();
75 bool isLinked();
daniel@transgaming.comcba50572010-03-28 19:36:09 +000076 int getInfoLogLength() const;
77 void getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog);
daniel@transgaming.com6c785212010-03-30 03:36:17 +000078 void getAttachedShaders(GLsizei maxCount, GLsizei *count, GLuint *shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000079
80 void flagForDeletion();
81 bool isFlaggedForDeletion() const;
82
83 private:
84 DISALLOW_COPY_AND_ASSIGN(Program);
85
86 ID3DXBuffer *compileToBinary(const char *hlsl, const char *profile, ID3DXConstantTable **constantTable);
87 void unlink(bool destroy = false);
88
daniel@transgaming.com0e3358a2010-04-05 20:32:42 +000089 struct Varying
90 {
91 Varying(const std::string &name, char *declaration) : name(name), declaration(declaration)
92 {
93 link = -1;
94 }
95
96 int link;
97 std::string name;
98 char *declaration;
99 };
100
101 typedef std::vector<Varying> VaryingArray;
102
103 void parseVaryings(const char *structure, char *hlsl, VaryingArray &varyings);
104 bool linkVaryings();
105
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000106 bool linkAttributes();
daniel@transgaming.com0e3358a2010-04-05 20:32:42 +0000107
daniel@transgaming.com86487c22010-03-11 19:41:43 +0000108 bool linkUniforms(ID3DXConstantTable *constantTable);
109 bool defineUniform(const D3DXHANDLE &constantHandle, const D3DXCONSTANT_DESC &constantDescription, std::string name = "");
110 bool defineUniform(const D3DXCONSTANT_DESC &constantDescription, std::string &name);
111 Uniform *createUniform(const D3DXCONSTANT_DESC &constantDescription, std::string &name);
daniel@transgaming.comf4a0c8e2010-04-13 03:26:01 +0000112 bool applyUniform1bv(GLint location, GLsizei count, const GLboolean *v);
113 bool applyUniform2bv(GLint location, GLsizei count, const GLboolean *v);
114 bool applyUniform3bv(GLint location, GLsizei count, const GLboolean *v);
115 bool applyUniform4bv(GLint location, GLsizei count, const GLboolean *v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000116 bool applyUniform1fv(GLint location, GLsizei count, const GLfloat *v);
117 bool applyUniform2fv(GLint location, GLsizei count, const GLfloat *v);
118 bool applyUniform3fv(GLint location, GLsizei count, const GLfloat *v);
119 bool applyUniform4fv(GLint location, GLsizei count, const GLfloat *v);
120 bool applyUniformMatrix2fv(GLint location, GLsizei count, const GLfloat *value);
121 bool applyUniformMatrix3fv(GLint location, GLsizei count, const GLfloat *value);
122 bool applyUniformMatrix4fv(GLint location, GLsizei count, const GLfloat *value);
123 bool applyUniform1iv(GLint location, GLsizei count, const GLint *v);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +0000124 bool applyUniform2iv(GLint location, GLsizei count, const GLint *v);
125 bool applyUniform3iv(GLint location, GLsizei count, const GLint *v);
126 bool applyUniform4iv(GLint location, GLsizei count, const GLint *v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000127
daniel@transgaming.comcba50572010-03-28 19:36:09 +0000128 void appendToInfoLog(const char *info);
129
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000130 FragmentShader *mFragmentShader;
131 VertexShader *mVertexShader;
132
daniel@transgaming.com0e3358a2010-04-05 20:32:42 +0000133 char *mPixelHLSL;
134 char *mVertexHLSL;
135
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000136 IDirect3DPixelShader9 *mPixelExecutable;
137 IDirect3DVertexShader9 *mVertexExecutable;
138 ID3DXConstantTable *mConstantTablePS;
139 ID3DXConstantTable *mConstantTableVS;
140
141 char *mAttributeName[MAX_VERTEX_ATTRIBS];
142 int mInputMapping[MAX_VERTEX_ATTRIBS];
143
daniel@transgaming.com416485f2010-03-16 06:23:23 +0000144 struct Sampler
145 {
146 bool active;
147 GLint logicalTextureUnit;
148 SamplerType type;
149 };
150
151 Sampler mSamplers[MAX_TEXTURE_IMAGE_UNITS];
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000152
153 typedef std::vector<Uniform*> UniformArray;
154 UniformArray mUniforms;
155
156 bool mLinked;
157 bool mDeleteStatus; // Flag to indicate that the program can be deleted when no longer in use
daniel@transgaming.comcba50572010-03-28 19:36:09 +0000158 char *mInfoLog;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000159};
160}
161
162#endif // LIBGLESV2_PROGRAM_H_