1ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org//
2ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
3ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org// Use of this source code is governed by a BSD-style license that can be
4ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org// found in the LICENSE file.
5ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org//
6ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
7ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org// Program.h: Defines the gl::Program class. Implements GL program objects
8ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org// and related functionality. [OpenGL ES 2.0.24] section 2.10.3 page 28.
9ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
10ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org#ifndef LIBGLESV2_PROGRAM_BINARY_H_
11ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org#define LIBGLESV2_PROGRAM_BINARY_H_
12ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
1390080e3b703883b871f862d5ceafa44d2d815b6aapatrick@chromium.org#define GL_APICALL
1429ab9525407b2e830341a36a28c6074c94cedce5daniel@transgaming.com#include <GLES2/gl2.h>
1529ab9525407b2e830341a36a28c6074c94cedce5daniel@transgaming.com#include <GLES2/gl2ext.h>
1690080e3b703883b871f862d5ceafa44d2d815b6aapatrick@chromium.org
17ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org#include <string>
18ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org#include <vector>
19ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
20d2811d688721a729f514bd78f7fd12a43beeb0a6shannon.woods@transgaming.com#include "common/RefCountObject.h"
21d2811d688721a729f514bd78f7fd12a43beeb0a6shannon.woods@transgaming.com#include "angletypes.h"
2260dafe8f061e921a2b22fde9f2eb0e1264048121apatrick@chromium.org#include "libGLESv2/mathutil.h"
2315186aa7049f5b39916f93631a2de3f1c2e7545ddaniel@transgaming.com#include "libGLESv2/Uniform.h"
24d2811d688721a729f514bd78f7fd12a43beeb0a6shannon.woods@transgaming.com#include "libGLESv2/Shader.h"
25486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.com#include "libGLESv2/Constants.h"
26ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
27d2811d688721a729f514bd78f7fd12a43beeb0a6shannon.woods@transgaming.comnamespace rx
28d2811d688721a729f514bd78f7fd12a43beeb0a6shannon.woods@transgaming.com{
29d2811d688721a729f514bd78f7fd12a43beeb0a6shannon.woods@transgaming.comclass ShaderExecutable;
30d2811d688721a729f514bd78f7fd12a43beeb0a6shannon.woods@transgaming.comclass Renderer;
310b60014ba3b6688614cdc8b7396b7d0a3db68db2shannon.woods@transgaming.comstruct TranslatedAttribute;
32d2811d688721a729f514bd78f7fd12a43beeb0a6shannon.woods@transgaming.com}
33a9c7142435f100d43684a0efe8894cbe42ee8fccdaniel@transgaming.com
34ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.orgnamespace gl
35ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org{
36ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.orgclass FragmentShader;
37ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.orgclass VertexShader;
38d2811d688721a729f514bd78f7fd12a43beeb0a6shannon.woods@transgaming.comclass InfoLog;
39d2811d688721a729f514bd78f7fd12a43beeb0a6shannon.woods@transgaming.comclass AttributeBindings;
40d2811d688721a729f514bd78f7fd12a43beeb0a6shannon.woods@transgaming.comstruct Varying;
41ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
42ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org// Struct used for correlating uniforms/elements of uniform arrays to handles
43ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.orgstruct UniformLocation
44ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org{
4590080e3b703883b871f862d5ceafa44d2d815b6aapatrick@chromium.org    UniformLocation()
4690080e3b703883b871f862d5ceafa44d2d815b6aapatrick@chromium.org    {
4790080e3b703883b871f862d5ceafa44d2d815b6aapatrick@chromium.org    }
4890080e3b703883b871f862d5ceafa44d2d815b6aapatrick@chromium.org
49db019952466bf83aafd333554dc550fdb6a1c2dfdaniel@transgaming.com    UniformLocation(const std::string &name, unsigned int element, unsigned int index);
50ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
51ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    std::string name;
52ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    unsigned int element;
53ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    unsigned int index;
54ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org};
55ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
56ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org// This is the result of linking a program. It is the state that would be passed to ProgramBinary.
57989c1c85b82277de2b080c0ce2174a668e1b96badaniel@transgaming.comclass ProgramBinary : public RefCountObject
58ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org{
59ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org  public:
6070062c98f7c62744f398dc0ba7a87c76e723cc48daniel@transgaming.com    explicit ProgramBinary(rx::Renderer *renderer);
61ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    ~ProgramBinary();
62ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
6395892416b19510e9981737d526ecd06a735f6777daniel@transgaming.com    rx::ShaderExecutable *getPixelExecutable();
6495892416b19510e9981737d526ecd06a735f6777daniel@transgaming.com    rx::ShaderExecutable *getVertexExecutable();
653e773bb4f1a2202d02a546d18ca6e8d9d2440006shannon.woods@transgaming.com    rx::ShaderExecutable *getGeometryExecutable();
66ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
67ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    GLuint getAttributeLocation(const char *name);
68ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    int getSemanticIndex(int attributeIndex);
69ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
70ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    GLint getSamplerMapping(SamplerType type, unsigned int samplerIndex);
71ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    TextureType getSamplerTextureType(SamplerType type, unsigned int samplerIndex);
72ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    GLint getUsedSamplerRange(SamplerType type);
73087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.com    bool usesPointSize() const;
743e773bb4f1a2202d02a546d18ca6e8d9d2440006shannon.woods@transgaming.com    bool usesPointSpriteEmulation() const;
753e773bb4f1a2202d02a546d18ca6e8d9d2440006shannon.woods@transgaming.com    bool usesGeometryShader() const;
76ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
77ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    GLint getUniformLocation(std::string name);
78ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    bool setUniform1fv(GLint location, GLsizei count, const GLfloat *v);
79ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    bool setUniform2fv(GLint location, GLsizei count, const GLfloat *v);
80ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    bool setUniform3fv(GLint location, GLsizei count, const GLfloat *v);
81ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    bool setUniform4fv(GLint location, GLsizei count, const GLfloat *v);
82ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    bool setUniformMatrix2fv(GLint location, GLsizei count, const GLfloat *value);
83ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    bool setUniformMatrix3fv(GLint location, GLsizei count, const GLfloat *value);
84ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    bool setUniformMatrix4fv(GLint location, GLsizei count, const GLfloat *value);
85ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    bool setUniform1iv(GLint location, GLsizei count, const GLint *v);
86ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    bool setUniform2iv(GLint location, GLsizei count, const GLint *v);
87ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    bool setUniform3iv(GLint location, GLsizei count, const GLint *v);
88ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    bool setUniform4iv(GLint location, GLsizei count, const GLint *v);
89ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
90ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    bool getUniformfv(GLint location, GLsizei *bufSize, GLfloat *params);
91ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    bool getUniformiv(GLint location, GLsizei *bufSize, GLint *params);
92ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
93ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    void dirtyAllUniforms();
94ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    void applyUniforms();
95ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
9690080e3b703883b871f862d5ceafa44d2d815b6aapatrick@chromium.org    bool load(InfoLog &infoLog, const void *binary, GLsizei length);
9790080e3b703883b871f862d5ceafa44d2d815b6aapatrick@chromium.org    bool save(void* binary, GLsizei bufSize, GLsizei *length);
9890080e3b703883b871f862d5ceafa44d2d815b6aapatrick@chromium.org    GLint getLength();
9990080e3b703883b871f862d5ceafa44d2d815b6aapatrick@chromium.org
100253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org    bool link(InfoLog &infoLog, const AttributeBindings &attributeBindings, FragmentShader *fragmentShader, VertexShader *vertexShader);
101ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    void getAttachedShaders(GLsizei maxCount, GLsizei *count, GLuint *shaders);
102ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
1034f4215f7d79cc4db6beecd49995ffbd6e9dd490ashannon.woods@transgaming.com    void getActiveAttribute(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name) const;
1044f4215f7d79cc4db6beecd49995ffbd6e9dd490ashannon.woods@transgaming.com    GLint getActiveAttributeCount() const;
1054f4215f7d79cc4db6beecd49995ffbd6e9dd490ashannon.woods@transgaming.com    GLint getActiveAttributeMaxLength() const;
106ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
1074f4215f7d79cc4db6beecd49995ffbd6e9dd490ashannon.woods@transgaming.com    void getActiveUniform(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name) const;
1084f4215f7d79cc4db6beecd49995ffbd6e9dd490ashannon.woods@transgaming.com    GLint getActiveUniformCount() const;
1094f4215f7d79cc4db6beecd49995ffbd6e9dd490ashannon.woods@transgaming.com    GLint getActiveUniformMaxLength() const;
110ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
111253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org    void validate(InfoLog &infoLog);
112253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org    bool validateSamplers(InfoLog *infoLog);
113ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    bool isValidated() const;
114ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
115e87ca0000e1ef1068db2a972f81f55579705f162daniel@transgaming.com    unsigned int getSerial() const;
116e87ca0000e1ef1068db2a972f81f55579705f162daniel@transgaming.com
1170b60014ba3b6688614cdc8b7396b7d0a3db68db2shannon.woods@transgaming.com    void sortAttributesByLayout(rx::TranslatedAttribute attributes[gl::MAX_VERTEX_ATTRIBS], int sortedSemanticIndices[MAX_VERTEX_ATTRIBS]) const;
1180b60014ba3b6688614cdc8b7396b7d0a3db68db2shannon.woods@transgaming.com
119ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    static std::string decorateAttribute(const std::string &name);    // Prepend an underscore
120ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
121ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org  private:
122ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    DISALLOW_COPY_AND_ASSIGN(ProgramBinary);
123ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
124253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org    int packVaryings(InfoLog &infoLog, const Varying *packing[][4], FragmentShader *fragmentShader);
1255bcf7dfb0afcfe62597912a94ce64a88930f419cshannon.woods@transgaming.com    bool linkVaryings(InfoLog &infoLog, int registers, const Varying *packing[][4],
1265bcf7dfb0afcfe62597912a94ce64a88930f419cshannon.woods@transgaming.com                      std::string& pixelHLSL, std::string& vertexHLSL,
1275bcf7dfb0afcfe62597912a94ce64a88930f419cshannon.woods@transgaming.com                      FragmentShader *fragmentShader, VertexShader *vertexShader);
128ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
129253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org    bool linkAttributes(InfoLog &infoLog, const AttributeBindings &attributeBindings, FragmentShader *fragmentShader, VertexShader *vertexShader);
130ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
13168aaf936b06b796db456373e38c1914bee2e15f5daniel@transgaming.com    bool linkUniforms(InfoLog &infoLog, const sh::ActiveUniforms &vertexUniforms, const sh::ActiveUniforms &fragmentUniforms);
132da8d38015a6b80501f6f4b8912105e626e88086fdaniel@transgaming.com    bool defineUniform(GLenum shader, const sh::Uniform &constant, InfoLog &infoLog);
133b6e55102440fb32157ee2cbc2d35aa21d46454f7daniel@transgaming.com
1343e773bb4f1a2202d02a546d18ca6e8d9d2440006shannon.woods@transgaming.com    std::string generateGeometryShaderHLSL(int registers, const Varying *packing[][4], FragmentShader *fragmentShader, VertexShader *vertexShader) const;
1353e773bb4f1a2202d02a546d18ca6e8d9d2440006shannon.woods@transgaming.com    std::string generatePointSpriteHLSL(int registers, const Varying *packing[][4], FragmentShader *fragmentShader, VertexShader *vertexShader) const;
1363e773bb4f1a2202d02a546d18ca6e8d9d2440006shannon.woods@transgaming.com
13777fbf973b3da9d411e6e1bba47d7f2ebd5aa6c11daniel@transgaming.com    rx::Renderer *const mRenderer;
138ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
1394f0f65ee128e5628a07ac9eefdc7afd83856dc79daniel@transgaming.com    rx::ShaderExecutable *mPixelExecutable;
1404f0f65ee128e5628a07ac9eefdc7afd83856dc79daniel@transgaming.com    rx::ShaderExecutable *mVertexExecutable;
1413e773bb4f1a2202d02a546d18ca6e8d9d2440006shannon.woods@transgaming.com    rx::ShaderExecutable *mGeometryExecutable;
142ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
143ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    Attribute mLinkedAttribute[MAX_VERTEX_ATTRIBS];
144ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    int mSemanticIndex[MAX_VERTEX_ATTRIBS];
145ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
146ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    struct Sampler
147ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    {
14890080e3b703883b871f862d5ceafa44d2d815b6aapatrick@chromium.org        Sampler();
14990080e3b703883b871f862d5ceafa44d2d815b6aapatrick@chromium.org
150ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org        bool active;
151ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org        GLint logicalTextureUnit;
152ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org        TextureType textureType;
153ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    };
154ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
155ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    Sampler mSamplersPS[MAX_TEXTURE_IMAGE_UNITS];
156233fe9548a2b166d3ccb09a4a7af273fab6dbf2cshannon.woods@transgaming.com    Sampler mSamplersVS[IMPLEMENTATION_MAX_VERTEX_TEXTURE_IMAGE_UNITS];
157ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    GLuint mUsedVertexSamplerRange;
158ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    GLuint mUsedPixelSamplerRange;
159087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.com    bool mUsesPointSize;
160ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
161ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    UniformArray mUniforms;
162ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    typedef std::vector<UniformLocation> UniformIndex;
163ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    UniformIndex mUniformIndex;
164ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
165ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    bool mValidated;
166e87ca0000e1ef1068db2a972f81f55579705f162daniel@transgaming.com
167e87ca0000e1ef1068db2a972f81f55579705f162daniel@transgaming.com    const unsigned int mSerial;
168e87ca0000e1ef1068db2a972f81f55579705f162daniel@transgaming.com
169e87ca0000e1ef1068db2a972f81f55579705f162daniel@transgaming.com    static unsigned int issueSerial();
170e87ca0000e1ef1068db2a972f81f55579705f162daniel@transgaming.com    static unsigned int mCurrentSerial;
171ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org};
172ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org}
173ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
174ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org#endif   // LIBGLESV2_PROGRAM_BINARY_H_
175