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