1ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org//
248dcae7b217420a7387c84a76651989e6f5f3576Geoff Lang// Copyright (c) 2002-2014 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
13d2811d688721a729f514bd78f7fd12a43beeb0a6shannon.woods@transgaming.com#include "common/RefCountObject.h"
14d2811d688721a729f514bd78f7fd12a43beeb0a6shannon.woods@transgaming.com#include "angletypes.h"
15a2ecfcccf1d1a85e6054a7314ce1f9de0648ac7fshannonwoods@chromium.org#include "common/mathutil.h"
1615186aa7049f5b39916f93631a2de3f1c2e7545ddaniel@transgaming.com#include "libGLESv2/Uniform.h"
17d2811d688721a729f514bd78f7fd12a43beeb0a6shannon.woods@transgaming.com#include "libGLESv2/Shader.h"
18486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.com#include "libGLESv2/Constants.h"
19c7a4104957aa1f6fa36e4e9cf65d36b699eb05bdBrandon Jones#include "libGLESv2/renderer/d3d/VertexDataManager.h"
20d8d72434e51896c79b117229624ffed341da89a6Brandon Jones#include "libGLESv2/renderer/d3d/DynamicHLSL.h"
21ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
220b7eef7c469bf717f7e1b57c6273f00d88e8b1d9Geoff Lang#include "angle_gl.h"
230b7eef7c469bf717f7e1b57c6273f00d88e8b1d9Geoff Lang
240b7eef7c469bf717f7e1b57c6273f00d88e8b1d9Geoff Lang#include <string>
250b7eef7c469bf717f7e1b57c6273f00d88e8b1d9Geoff Lang#include <vector>
260b7eef7c469bf717f7e1b57c6273f00d88e8b1d9Geoff Lang
273f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill// TODO(jmadill): place this in workarounds library
283f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill#define ANGLE_WORKAROUND_ENABLED 1
293f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill#define ANGLE_WORKAROUND_DISABLED 2
303f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill#define ANGLE_MRT_PERF_WORKAROUND ANGLE_WORKAROUND_ENABLED
313f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill
32bf9cce2e2bc354c07eed0f768e1f3e03278e5da4Jamie Madillnamespace sh
33bf9cce2e2bc354c07eed0f768e1f3e03278e5da4Jamie Madill{
34bf9cce2e2bc354c07eed0f768e1f3e03278e5da4Jamie Madillclass HLSLBlockEncoder;
35bf9cce2e2bc354c07eed0f768e1f3e03278e5da4Jamie Madill}
36bf9cce2e2bc354c07eed0f768e1f3e03278e5da4Jamie Madill
370b7eef7c469bf717f7e1b57c6273f00d88e8b1d9Geoff Lang#include <GLES3/gl3.h>
380b7eef7c469bf717f7e1b57c6273f00d88e8b1d9Geoff Lang#include <GLES2/gl2.h>
390b7eef7c469bf717f7e1b57c6273f00d88e8b1d9Geoff Lang#include <GLES2/gl2ext.h>
400b7eef7c469bf717f7e1b57c6273f00d88e8b1d9Geoff Lang
410b7eef7c469bf717f7e1b57c6273f00d88e8b1d9Geoff Lang#include <string>
420b7eef7c469bf717f7e1b57c6273f00d88e8b1d9Geoff Lang#include <vector>
430b7eef7c469bf717f7e1b57c6273f00d88e8b1d9Geoff Lang
44d2811d688721a729f514bd78f7fd12a43beeb0a6shannon.woods@transgaming.comnamespace rx
45d2811d688721a729f514bd78f7fd12a43beeb0a6shannon.woods@transgaming.com{
46d2811d688721a729f514bd78f7fd12a43beeb0a6shannon.woods@transgaming.comclass ShaderExecutable;
47d2811d688721a729f514bd78f7fd12a43beeb0a6shannon.woods@transgaming.comclass Renderer;
480b60014ba3b6688614cdc8b7396b7d0a3db68db2shannon.woods@transgaming.comstruct TranslatedAttribute;
498ff21aeaabebd0877c1cc48fdac718509f23617aJamie Madillclass UniformStorage;
50c9610c51e9c02ba67c735ff449a70164cda12a60Brandon Jonesclass ProgramImpl;
51d2811d688721a729f514bd78f7fd12a43beeb0a6shannon.woods@transgaming.com}
52a9c7142435f100d43684a0efe8894cbe42ee8fccdaniel@transgaming.com
53ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.orgnamespace gl
54ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org{
5543a53e2434f4fe042bee061fc369a93314b710deBrandon Jonesstruct Caps;
567162096ee6cfcb0fa797eb3503154f39ec53ef09Brandon Jonesclass Shader;
57d2811d688721a729f514bd78f7fd12a43beeb0a6shannon.woods@transgaming.comclass InfoLog;
58d2811d688721a729f514bd78f7fd12a43beeb0a6shannon.woods@transgaming.comclass AttributeBindings;
591bddfb984b4ce6f8422a877097e60aca956f5661shannonwoods@chromium.orgclass Buffer;
6004fb89ad059cba1fbd14507fe58c9a700fe0de08Geoff Langclass Framebuffer;
61ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
62ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org// Struct used for correlating uniforms/elements of uniform arrays to handles
6363491eae7cce075afbbea3caed173bd234fa4cd9Jamie Madillstruct VariableLocation
64ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org{
6563491eae7cce075afbbea3caed173bd234fa4cd9Jamie Madill    VariableLocation()
6690080e3b703883b871f862d5ceafa44d2d815b6aapatrick@chromium.org    {
6790080e3b703883b871f862d5ceafa44d2d815b6aapatrick@chromium.org    }
6890080e3b703883b871f862d5ceafa44d2d815b6aapatrick@chromium.org
6963491eae7cce075afbbea3caed173bd234fa4cd9Jamie Madill    VariableLocation(const std::string &name, unsigned int element, unsigned int index);
70ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
71ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    std::string name;
72ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    unsigned int element;
73ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    unsigned int index;
74ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org};
75ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
7648dcae7b217420a7387c84a76651989e6f5f3576Geoff Langstruct LinkedVarying
7748dcae7b217420a7387c84a76651989e6f5f3576Geoff Lang{
7848dcae7b217420a7387c84a76651989e6f5f3576Geoff Lang    LinkedVarying();
7948dcae7b217420a7387c84a76651989e6f5f3576Geoff Lang    LinkedVarying(const std::string &name, GLenum type, GLsizei size, const std::string &semanticName,
8048dcae7b217420a7387c84a76651989e6f5f3576Geoff Lang                  unsigned int semanticIndex, unsigned int semanticIndexCount);
8148dcae7b217420a7387c84a76651989e6f5f3576Geoff Lang
8248dcae7b217420a7387c84a76651989e6f5f3576Geoff Lang    // Original GL name
8348dcae7b217420a7387c84a76651989e6f5f3576Geoff Lang    std::string name;
8448dcae7b217420a7387c84a76651989e6f5f3576Geoff Lang
8548dcae7b217420a7387c84a76651989e6f5f3576Geoff Lang    GLenum type;
8648dcae7b217420a7387c84a76651989e6f5f3576Geoff Lang    GLsizei size;
8748dcae7b217420a7387c84a76651989e6f5f3576Geoff Lang
8848dcae7b217420a7387c84a76651989e6f5f3576Geoff Lang    // DirectX semantic information
8948dcae7b217420a7387c84a76651989e6f5f3576Geoff Lang    std::string semanticName;
9048dcae7b217420a7387c84a76651989e6f5f3576Geoff Lang    unsigned int semanticIndex;
9148dcae7b217420a7387c84a76651989e6f5f3576Geoff Lang    unsigned int semanticIndexCount;
9248dcae7b217420a7387c84a76651989e6f5f3576Geoff Lang};
9348dcae7b217420a7387c84a76651989e6f5f3576Geoff Lang
94ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org// This is the result of linking a program. It is the state that would be passed to ProgramBinary.
95989c1c85b82277de2b080c0ce2174a668e1b96badaniel@transgaming.comclass ProgramBinary : public RefCountObject
96ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org{
97ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org  public:
98c9610c51e9c02ba67c735ff449a70164cda12a60Brandon Jones    explicit ProgramBinary(rx::ProgramImpl *impl);
99ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    ~ProgramBinary();
100ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
101c9610c51e9c02ba67c735ff449a70164cda12a60Brandon Jones    rx::ProgramImpl *getImplementation() { return mProgram; }
102c9610c51e9c02ba67c735ff449a70164cda12a60Brandon Jones    const rx::ProgramImpl *getImplementation() const { return mProgram; }
103c9610c51e9c02ba67c735ff449a70164cda12a60Brandon Jones
10404fb89ad059cba1fbd14507fe58c9a700fe0de08Geoff Lang    rx::ShaderExecutable *getPixelExecutableForFramebuffer(const Framebuffer *fbo);
10504fb89ad059cba1fbd14507fe58c9a700fe0de08Geoff Lang    rx::ShaderExecutable *getPixelExecutableForOutputLayout(const std::vector<GLenum> &outputLayout);
106834e8b7715c25e299c07c9d63f5be0a0ee6c5856Jamie Madill    rx::ShaderExecutable *getVertexExecutableForInputLayout(const VertexFormat inputLayout[MAX_VERTEX_ATTRIBS]);
1078ff21aeaabebd0877c1cc48fdac718509f23617aJamie Madill    rx::ShaderExecutable *getGeometryExecutable() const;
108ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
109ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    GLuint getAttributeLocation(const char *name);
110ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    int getSemanticIndex(int attributeIndex);
111ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
11243a53e2434f4fe042bee061fc369a93314b710deBrandon Jones    GLint getSamplerMapping(SamplerType type, unsigned int samplerIndex, const Caps &caps);
11376b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang    GLenum getSamplerTextureType(SamplerType type, unsigned int samplerIndex);
114ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    GLint getUsedSamplerRange(SamplerType type);
115087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.com    bool usesPointSize() const;
1163e773bb4f1a2202d02a546d18ca6e8d9d2440006shannon.woods@transgaming.com    bool usesPointSpriteEmulation() const;
1173e773bb4f1a2202d02a546d18ca6e8d9d2440006shannon.woods@transgaming.com    bool usesGeometryShader() const;
118ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
119ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    GLint getUniformLocation(std::string name);
120c2ed991c7d844ff347ab4ce5945843a39f3bea47shannonwoods@chromium.org    GLuint getUniformIndex(std::string name);
1214276625286ffa9f4f481e721e8df51844036ea76shannonwoods@chromium.org    GLuint getUniformBlockIndex(std::string name);
1223639892dee8ec8cecf4bae4b0585a7cefde98d80Jamie Madill    void setUniform1fv(GLint location, GLsizei count, const GLfloat *v);
1233639892dee8ec8cecf4bae4b0585a7cefde98d80Jamie Madill    void setUniform2fv(GLint location, GLsizei count, const GLfloat *v);
1243639892dee8ec8cecf4bae4b0585a7cefde98d80Jamie Madill    void setUniform3fv(GLint location, GLsizei count, const GLfloat *v);
1253639892dee8ec8cecf4bae4b0585a7cefde98d80Jamie Madill    void setUniform4fv(GLint location, GLsizei count, const GLfloat *v);
1263639892dee8ec8cecf4bae4b0585a7cefde98d80Jamie Madill    void setUniform1iv(GLint location, GLsizei count, const GLint *v);
1273639892dee8ec8cecf4bae4b0585a7cefde98d80Jamie Madill    void setUniform2iv(GLint location, GLsizei count, const GLint *v);
1283639892dee8ec8cecf4bae4b0585a7cefde98d80Jamie Madill    void setUniform3iv(GLint location, GLsizei count, const GLint *v);
1293639892dee8ec8cecf4bae4b0585a7cefde98d80Jamie Madill    void setUniform4iv(GLint location, GLsizei count, const GLint *v);
1303639892dee8ec8cecf4bae4b0585a7cefde98d80Jamie Madill    void setUniform1uiv(GLint location, GLsizei count, const GLuint *v);
1313639892dee8ec8cecf4bae4b0585a7cefde98d80Jamie Madill    void setUniform2uiv(GLint location, GLsizei count, const GLuint *v);
1323639892dee8ec8cecf4bae4b0585a7cefde98d80Jamie Madill    void setUniform3uiv(GLint location, GLsizei count, const GLuint *v);
1333639892dee8ec8cecf4bae4b0585a7cefde98d80Jamie Madill    void setUniform4uiv(GLint location, GLsizei count, const GLuint *v);
1343639892dee8ec8cecf4bae4b0585a7cefde98d80Jamie Madill    void setUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
1353639892dee8ec8cecf4bae4b0585a7cefde98d80Jamie Madill    void setUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
1363639892dee8ec8cecf4bae4b0585a7cefde98d80Jamie Madill    void setUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
1373639892dee8ec8cecf4bae4b0585a7cefde98d80Jamie Madill    void setUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
1383639892dee8ec8cecf4bae4b0585a7cefde98d80Jamie Madill    void setUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
1393639892dee8ec8cecf4bae4b0585a7cefde98d80Jamie Madill    void setUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
1403639892dee8ec8cecf4bae4b0585a7cefde98d80Jamie Madill    void setUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
1413639892dee8ec8cecf4bae4b0585a7cefde98d80Jamie Madill    void setUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
1423639892dee8ec8cecf4bae4b0585a7cefde98d80Jamie Madill    void setUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
143ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
14499a1e985196cab0ab309209fe8319f6bdbe1dd20Jamie Madill    void getUniformfv(GLint location, GLfloat *params);
14599a1e985196cab0ab309209fe8319f6bdbe1dd20Jamie Madill    void getUniformiv(GLint location, GLint *params);
14699a1e985196cab0ab309209fe8319f6bdbe1dd20Jamie Madill    void getUniformuiv(GLint location, GLuint *params);
147ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
148ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    void dirtyAllUniforms();
149ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    void applyUniforms();
15043a53e2434f4fe042bee061fc369a93314b710deBrandon Jones    bool applyUniformBuffers(const std::vector<Buffer*> boundBuffers, const Caps &caps);
151ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
152900013cd6b1d0ed2cdc5ee5ca0f4210624b0d8efGeoff Lang    bool load(InfoLog &infoLog, GLenum binaryFormat, const void *binary, GLsizei length);
153900013cd6b1d0ed2cdc5ee5ca0f4210624b0d8efGeoff Lang    bool save(GLenum *binaryFormat, void *binary, GLsizei bufSize, GLsizei *length);
15490080e3b703883b871f862d5ceafa44d2d815b6aapatrick@chromium.org    GLint getLength();
15590080e3b703883b871f862d5ceafa44d2d815b6aapatrick@chromium.org
1567162096ee6cfcb0fa797eb3503154f39ec53ef09Brandon Jones    bool link(InfoLog &infoLog, const AttributeBindings &attributeBindings, Shader *fragmentShader, Shader *vertexShader,
15743a53e2434f4fe042bee061fc369a93314b710deBrandon Jones              const std::vector<std::string>& transformFeedbackVaryings, GLenum transformFeedbackBufferMode, const Caps &caps);
158ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    void getAttachedShaders(GLsizei maxCount, GLsizei *count, GLuint *shaders);
159ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
1604f4215f7d79cc4db6beecd49995ffbd6e9dd490ashannon.woods@transgaming.com    void getActiveAttribute(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name) const;
1614f4215f7d79cc4db6beecd49995ffbd6e9dd490ashannon.woods@transgaming.com    GLint getActiveAttributeCount() const;
1624f4215f7d79cc4db6beecd49995ffbd6e9dd490ashannon.woods@transgaming.com    GLint getActiveAttributeMaxLength() const;
163ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
1644f4215f7d79cc4db6beecd49995ffbd6e9dd490ashannon.woods@transgaming.com    void getActiveUniform(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name) const;
1654f4215f7d79cc4db6beecd49995ffbd6e9dd490ashannon.woods@transgaming.com    GLint getActiveUniformCount() const;
1664f4215f7d79cc4db6beecd49995ffbd6e9dd490ashannon.woods@transgaming.com    GLint getActiveUniformMaxLength() const;
1672a9a9d232cee3c1d75384de834c0508c9cf2ab99shannonwoods@chromium.org    GLint getActiveUniformi(GLuint index, GLenum pname) const;
1683639892dee8ec8cecf4bae4b0585a7cefde98d80Jamie Madill    bool isValidUniformLocation(GLint location) const;
1693639892dee8ec8cecf4bae4b0585a7cefde98d80Jamie Madill    LinkedUniform *getUniformByLocation(GLint location) const;
17066d43d24c7560d5812e1adc3491578a783379c9fJamie Madill    LinkedUniform *getUniformByName(const std::string &name) const;
171ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
172beb027831595253a2eeadebb3e577f10e62f73f7shannonwoods@chromium.org    void getActiveUniformBlockName(GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName) const;
173e7317ca8472c363510025c4c8c57682fcbc7f7d6shannonwoods@chromium.org    void getActiveUniformBlockiv(GLuint uniformBlockIndex, GLenum pname, GLint *params) const;
17470eb1ea25dbb03783fcee104314df6f2ba6a2dccshannonwoods@chromium.org    GLuint getActiveUniformBlockCount() const;
175e684b58a3d326fceb649ef5304a293dbfd643dbashannonwoods@chromium.org    GLuint getActiveUniformBlockMaxLength() const;
1761bddfb984b4ce6f8422a877097e60aca956f5661shannonwoods@chromium.org    UniformBlock *getUniformBlockByIndex(GLuint blockIndex);
17770eb1ea25dbb03783fcee104314df6f2ba6a2dccshannonwoods@chromium.org
178d1e78c9cf69e98abdf4b8bbc385b951ab3b99d4bJamie Madill    GLint getFragDataLocation(const char *name) const;
179d1e78c9cf69e98abdf4b8bbc385b951ab3b99d4bJamie Madill
18048dcae7b217420a7387c84a76651989e6f5f3576Geoff Lang    size_t getTransformFeedbackVaryingCount() const;
18148dcae7b217420a7387c84a76651989e6f5f3576Geoff Lang    const LinkedVarying &getTransformFeedbackVarying(size_t idx) const;
18248dcae7b217420a7387c84a76651989e6f5f3576Geoff Lang    GLenum getTransformFeedbackBufferMode() const;
18348dcae7b217420a7387c84a76651989e6f5f3576Geoff Lang
18443a53e2434f4fe042bee061fc369a93314b710deBrandon Jones    void validate(InfoLog &infoLog, const Caps &caps);
18543a53e2434f4fe042bee061fc369a93314b710deBrandon Jones    bool validateSamplers(InfoLog *infoLog, const Caps &caps);
186ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    bool isValidated() const;
187d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill    void updateSamplerMapping();
188ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
189e87ca0000e1ef1068db2a972f81f55579705f162daniel@transgaming.com    unsigned int getSerial() const;
19083ac5e827a3c0ff305dea7ecd37d065ed420c93cshannonwoods@chromium.org    int getShaderVersion() const;
191e87ca0000e1ef1068db2a972f81f55579705f162daniel@transgaming.com
1923f2daa89f20362549ebd2d85ceb513e20503bcd9Al Patrick    void initAttributesByLayout();
193834e8b7715c25e299c07c9d63f5be0a0ee6c5856Jamie Madill    void sortAttributesByLayout(rx::TranslatedAttribute attributes[MAX_VERTEX_ATTRIBS], int sortedSemanticIndices[MAX_VERTEX_ATTRIBS]) const;
1940b60014ba3b6688614cdc8b7396b7d0a3db68db2shannon.woods@transgaming.com
195834e8b7715c25e299c07c9d63f5be0a0ee6c5856Jamie Madill    const std::vector<LinkedUniform*> &getUniforms() const { return mUniforms; }
1968ff21aeaabebd0877c1cc48fdac718509f23617aJamie Madill
19722502d52956364879e2bd2feb8516a983714eb45Brandon Jones    static bool linkVaryings(InfoLog &infoLog, Shader *fragmentShader, Shader *vertexShader);
19822502d52956364879e2bd2feb8516a983714eb45Brandon Jones
199ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org  private:
200ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    DISALLOW_COPY_AND_ASSIGN(ProgramBinary);
201ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
20266d43d24c7560d5812e1adc3491578a783379c9fJamie Madill    struct Sampler
20366d43d24c7560d5812e1adc3491578a783379c9fJamie Madill    {
20466d43d24c7560d5812e1adc3491578a783379c9fJamie Madill        Sampler();
20566d43d24c7560d5812e1adc3491578a783379c9fJamie Madill
20666d43d24c7560d5812e1adc3491578a783379c9fJamie Madill        bool active;
20766d43d24c7560d5812e1adc3491578a783379c9fJamie Madill        GLint logicalTextureUnit;
20876b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang        GLenum textureType;
20966d43d24c7560d5812e1adc3491578a783379c9fJamie Madill    };
21066d43d24c7560d5812e1adc3491578a783379c9fJamie Madill
21104fb89ad059cba1fbd14507fe58c9a700fe0de08Geoff Lang    void reset();
21204fb89ad059cba1fbd14507fe58c9a700fe0de08Geoff Lang
213d15250e62703537195df41ea6c2412d92aee120aJamie Madill    bool linkAttributes(InfoLog &infoLog, const AttributeBindings &attributeBindings, const Shader *vertexShader);
214ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
21522502d52956364879e2bd2feb8516a983714eb45Brandon Jones    static bool linkValidateVariablesBase(InfoLog &infoLog,
21622502d52956364879e2bd2feb8516a983714eb45Brandon Jones                                          const std::string &variableName,
21722502d52956364879e2bd2feb8516a983714eb45Brandon Jones                                          const sh::ShaderVariable &vertexVariable,
21822502d52956364879e2bd2feb8516a983714eb45Brandon Jones                                          const sh::ShaderVariable &fragmentVariable,
21922502d52956364879e2bd2feb8516a983714eb45Brandon Jones                                          bool validatePrecision);
22042bcf32e9d61f877b8e6bd089ab86382a3b7c9fdJamie Madill
22122502d52956364879e2bd2feb8516a983714eb45Brandon Jones    static bool linkValidateUniforms(InfoLog &infoLog, const std::string &uniformName, const sh::Uniform &vertexUniform, const sh::Uniform &fragmentUniform);
22222502d52956364879e2bd2feb8516a983714eb45Brandon Jones    static bool linkValidateVaryings(InfoLog &infoLog, const std::string &varyingName, const sh::Varying &vertexVarying, const sh::Varying &fragmentVarying);
22322502d52956364879e2bd2feb8516a983714eb45Brandon Jones    static bool linkValidateInterfaceBlockFields(InfoLog &infoLog, const std::string &uniformName, const sh::InterfaceBlockField &vertexUniform, const sh::InterfaceBlockField &fragmentUniform);
22443a53e2434f4fe042bee061fc369a93314b710deBrandon Jones    bool linkUniforms(InfoLog &infoLog, const Shader &vertexShader, const Shader &fragmentShader, const Caps &caps);
225bf9cce2e2bc354c07eed0f768e1f3e03278e5da4Jamie Madill    void defineUniformBase(GLenum shader, const sh::Uniform &uniform, unsigned int uniformRegister);
22642bcf32e9d61f877b8e6bd089ab86382a3b7c9fdJamie Madill    void defineUniform(GLenum shader, const sh::ShaderVariable &uniform, const std::string &fullName, sh::HLSLBlockEncoder *encoder);
22743a53e2434f4fe042bee061fc369a93314b710deBrandon Jones    bool indexSamplerUniform(const LinkedUniform &uniform, InfoLog &infoLog, const Caps &caps);
22843a53e2434f4fe042bee061fc369a93314b710deBrandon Jones    bool indexUniforms(InfoLog &infoLog, const Caps &caps);
22966d43d24c7560d5812e1adc3491578a783379c9fJamie Madill    static bool assignSamplers(unsigned int startSamplerIndex, GLenum samplerType, unsigned int samplerCount,
23076b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang                               std::vector<Sampler> &outSamplers, GLuint *outUsedRange);
231f257598999faf907a50d8a9f9eff28dad0ff2628Jamie Madill    bool areMatchingInterfaceBlocks(InfoLog &infoLog, const sh::InterfaceBlock &vertexInterfaceBlock, const sh::InterfaceBlock &fragmentInterfaceBlock);
23243a53e2434f4fe042bee061fc369a93314b710deBrandon Jones    bool linkUniformBlocks(InfoLog &infoLog, const Shader &vertexShader, const Shader &fragmentShader, const Caps &caps);
23348dcae7b217420a7387c84a76651989e6f5f3576Geoff Lang    bool gatherTransformFeedbackLinkedVaryings(InfoLog &infoLog, const std::vector<LinkedVarying> &linkedVaryings,
23448dcae7b217420a7387c84a76651989e6f5f3576Geoff Lang                                               const std::vector<std::string> &transformFeedbackVaryingNames,
23548dcae7b217420a7387c84a76651989e6f5f3576Geoff Lang                                               GLenum transformFeedbackBufferMode,
23643a53e2434f4fe042bee061fc369a93314b710deBrandon Jones                                               std::vector<LinkedVarying> *outTransformFeedbackLinkedVaryings,
23743a53e2434f4fe042bee061fc369a93314b710deBrandon Jones                                               const Caps &caps) const;
23842bcf32e9d61f877b8e6bd089ab86382a3b7c9fdJamie Madill    template <typename VarT>
23942bcf32e9d61f877b8e6bd089ab86382a3b7c9fdJamie Madill    void defineUniformBlockMembers(const std::vector<VarT> &fields, const std::string &prefix, int blockIndex,
240a6f267f99e5c49e136511d787e69dd9dcc492be7Jamie Madill                                   sh::BlockLayoutEncoder *encoder, std::vector<unsigned int> *blockUniformIndexes,
241a6f267f99e5c49e136511d787e69dd9dcc492be7Jamie Madill                                   bool inRowMajorLayout);
24243a53e2434f4fe042bee061fc369a93314b710deBrandon Jones    bool defineUniformBlock(InfoLog &infoLog, const Shader &shader, const sh::InterfaceBlock &interfaceBlock, const Caps &caps);
24343a53e2434f4fe042bee061fc369a93314b710deBrandon Jones    bool assignUniformBlockRegister(InfoLog &infoLog, UniformBlock *uniformBlock, GLenum shader, unsigned int registerIndex, const Caps &caps);
2447162096ee6cfcb0fa797eb3503154f39ec53ef09Brandon Jones    void defineOutputVariables(Shader *fragmentShader);
24546131a3832c3478c1e0b48dbf6284799f3f86f04Jamie Madill
2468a19eed917b5f0354937567ca15fa755e0116ffashannon.woods%transgaming.com@gtempaccount.com    template <typename T>
2473639892dee8ec8cecf4bae4b0585a7cefde98d80Jamie Madill    void setUniform(GLint location, GLsizei count, const T* v, GLenum targetUniformType);
2488a19eed917b5f0354937567ca15fa755e0116ffashannon.woods%transgaming.com@gtempaccount.com
24936c76a9156161c560cb923a4041416a230baafd6shannon.woods%transgaming.com@gtempaccount.com    template <int cols, int rows>
2503639892dee8ec8cecf4bae4b0585a7cefde98d80Jamie Madill    void setUniformMatrixfv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value, GLenum targetUniformType);
25136c76a9156161c560cb923a4041416a230baafd6shannon.woods%transgaming.com@gtempaccount.com
2524590d89dd7903aa9e809bdca8bcbe5af422c8710shannon.woods%transgaming.com@gtempaccount.com    template <typename T>
25399a1e985196cab0ab309209fe8319f6bdbe1dd20Jamie Madill    void getUniformv(GLint location, T *params, GLenum uniformType);
2544590d89dd7903aa9e809bdca8bcbe5af422c8710shannon.woods%transgaming.com@gtempaccount.com
255c5a8300026be5bd38ca022211ce7e078e92b9377Jamie Madill    class VertexExecutable
256c5a8300026be5bd38ca022211ce7e078e92b9377Jamie Madill    {
257c5a8300026be5bd38ca022211ce7e078e92b9377Jamie Madill      public:
25804fb89ad059cba1fbd14507fe58c9a700fe0de08Geoff Lang        VertexExecutable(const VertexFormat inputLayout[MAX_VERTEX_ATTRIBS],
2597a29e4ae3d067afce9779eefc9a67a180da82129Jamie Madill                         const GLenum signature[MAX_VERTEX_ATTRIBS],
260c5a8300026be5bd38ca022211ce7e078e92b9377Jamie Madill                         rx::ShaderExecutable *shaderExecutable);
2618b4f8f8450e0ff89efaca4758406acd06dbd30feJamie Madill        ~VertexExecutable();
2628b4f8f8450e0ff89efaca4758406acd06dbd30feJamie Madill
2637a29e4ae3d067afce9779eefc9a67a180da82129Jamie Madill        bool matchesSignature(const GLenum convertedLayout[MAX_VERTEX_ATTRIBS]) const;
264c5a8300026be5bd38ca022211ce7e078e92b9377Jamie Madill
265c5a8300026be5bd38ca022211ce7e078e92b9377Jamie Madill        const VertexFormat *inputs() const { return mInputs; }
2667a29e4ae3d067afce9779eefc9a67a180da82129Jamie Madill        const GLenum *signature() const { return mSignature; }
267c5a8300026be5bd38ca022211ce7e078e92b9377Jamie Madill        rx::ShaderExecutable *shaderExecutable() const { return mShaderExecutable; }
268c5a8300026be5bd38ca022211ce7e078e92b9377Jamie Madill
269c5a8300026be5bd38ca022211ce7e078e92b9377Jamie Madill      private:
270834e8b7715c25e299c07c9d63f5be0a0ee6c5856Jamie Madill        VertexFormat mInputs[MAX_VERTEX_ATTRIBS];
2717a29e4ae3d067afce9779eefc9a67a180da82129Jamie Madill        GLenum mSignature[MAX_VERTEX_ATTRIBS];
272c5a8300026be5bd38ca022211ce7e078e92b9377Jamie Madill        rx::ShaderExecutable *mShaderExecutable;
273c5a8300026be5bd38ca022211ce7e078e92b9377Jamie Madill    };
274c5a8300026be5bd38ca022211ce7e078e92b9377Jamie Madill
27504fb89ad059cba1fbd14507fe58c9a700fe0de08Geoff Lang    class PixelExecutable
27604fb89ad059cba1fbd14507fe58c9a700fe0de08Geoff Lang    {
27704fb89ad059cba1fbd14507fe58c9a700fe0de08Geoff Lang      public:
27804fb89ad059cba1fbd14507fe58c9a700fe0de08Geoff Lang        PixelExecutable(const std::vector<GLenum> &outputSignature, rx::ShaderExecutable *shaderExecutable);
27904fb89ad059cba1fbd14507fe58c9a700fe0de08Geoff Lang        ~PixelExecutable();
28004fb89ad059cba1fbd14507fe58c9a700fe0de08Geoff Lang
2813f2e61dea6c447ed7b98483fa0ce9ccc3cb5cc3cJamie Madill        bool matchesSignature(const std::vector<GLenum> &signature) const { return mOutputSignature == signature; }
2824ace423c2c848790e906bc0b4bbc595c436203ebGeoff Lang
28304fb89ad059cba1fbd14507fe58c9a700fe0de08Geoff Lang        const std::vector<GLenum> &outputSignature() const { return mOutputSignature; }
28404fb89ad059cba1fbd14507fe58c9a700fe0de08Geoff Lang        rx::ShaderExecutable *shaderExecutable() const { return mShaderExecutable; }
28504fb89ad059cba1fbd14507fe58c9a700fe0de08Geoff Lang
28604fb89ad059cba1fbd14507fe58c9a700fe0de08Geoff Lang      private:
28704fb89ad059cba1fbd14507fe58c9a700fe0de08Geoff Lang        std::vector<GLenum> mOutputSignature;
28804fb89ad059cba1fbd14507fe58c9a700fe0de08Geoff Lang        rx::ShaderExecutable *mShaderExecutable;
28904fb89ad059cba1fbd14507fe58c9a700fe0de08Geoff Lang    };
29004fb89ad059cba1fbd14507fe58c9a700fe0de08Geoff Lang
291c9610c51e9c02ba67c735ff449a70164cda12a60Brandon Jones    rx::ProgramImpl *mProgram;
292ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
293c5a8300026be5bd38ca022211ce7e078e92b9377Jamie Madill    std::vector<VertexExecutable *> mVertexExecutables;
29404fb89ad059cba1fbd14507fe58c9a700fe0de08Geoff Lang    std::vector<PixelExecutable *> mPixelExecutables;
29504fb89ad059cba1fbd14507fe58c9a700fe0de08Geoff Lang
2963e773bb4f1a2202d02a546d18ca6e8d9d2440006shannon.woods@transgaming.com    rx::ShaderExecutable *mGeometryExecutable;
297ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
298f257598999faf907a50d8a9f9eff28dad0ff2628Jamie Madill    sh::Attribute mLinkedAttribute[MAX_VERTEX_ATTRIBS];
299f257598999faf907a50d8a9f9eff28dad0ff2628Jamie Madill    sh::Attribute mShaderAttributes[MAX_VERTEX_ATTRIBS];
300ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    int mSemanticIndex[MAX_VERTEX_ATTRIBS];
3013f2daa89f20362549ebd2d85ceb513e20503bcd9Al Patrick    int mAttributesByLayout[MAX_VERTEX_ATTRIBS];
302ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
30348dcae7b217420a7387c84a76651989e6f5f3576Geoff Lang    GLenum mTransformFeedbackBufferMode;
30448dcae7b217420a7387c84a76651989e6f5f3576Geoff Lang    std::vector<LinkedVarying> mTransformFeedbackLinkedVaryings;
30548dcae7b217420a7387c84a76651989e6f5f3576Geoff Lang
30676b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang    std::vector<Sampler> mSamplersPS;
30776b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang    std::vector<Sampler> mSamplersVS;
308ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    GLuint mUsedVertexSamplerRange;
309ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    GLuint mUsedPixelSamplerRange;
310087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.com    bool mUsesPointSize;
31183ac5e827a3c0ff305dea7ecd37d065ed420c93cshannonwoods@chromium.org    int mShaderVersion;
312d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill    bool mDirtySamplerMapping;
313ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
314834e8b7715c25e299c07c9d63f5be0a0ee6c5856Jamie Madill    std::vector<LinkedUniform*> mUniforms;
315834e8b7715c25e299c07c9d63f5be0a0ee6c5856Jamie Madill    std::vector<UniformBlock*> mUniformBlocks;
3165f562735860c4415b09db11c27070d3503d687aaJamie Madill    std::vector<VariableLocation> mUniformIndex;
3175f562735860c4415b09db11c27070d3503d687aaJamie Madill    std::map<int, VariableLocation> mOutputVariables;
318ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
319ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org    bool mValidated;
320e87ca0000e1ef1068db2a972f81f55579705f162daniel@transgaming.com
321e87ca0000e1ef1068db2a972f81f55579705f162daniel@transgaming.com    const unsigned int mSerial;
322e87ca0000e1ef1068db2a972f81f55579705f162daniel@transgaming.com
323e87ca0000e1ef1068db2a972f81f55579705f162daniel@transgaming.com    static unsigned int issueSerial();
324e87ca0000e1ef1068db2a972f81f55579705f162daniel@transgaming.com    static unsigned int mCurrentSerial;
325ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org};
3265f562735860c4415b09db11c27070d3503d687aaJamie Madill
327ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org}
328ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org
329ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org#endif   // LIBGLESV2_PROGRAM_BINARY_H_
330