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