Copy libGLESv2 to libGL. Bug 18962347 Change-Id: I1864755cac7f009119d0efb5278d7dfe3e669354 Reviewed-on: https://swiftshader-review.googlesource.com/1723 Reviewed-by: Nicolas Capens <capn@google.com> Tested-by: Nicolas Capens <capn@google.com>
diff --git a/src/OpenGL/libGL/Program.h b/src/OpenGL/libGL/Program.h new file mode 100644 index 0000000..dd87fb2 --- /dev/null +++ b/src/OpenGL/libGL/Program.h
@@ -0,0 +1,207 @@ +// SwiftShader Software Renderer +// +// Copyright(c) 2005-2013 TransGaming Inc. +// +// All rights reserved. No part of this software may be copied, distributed, transmitted, +// transcribed, stored in a retrieval system, translated into any human or computer +// language by any means, or disclosed to third parties without the explicit written +// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express +// or implied, including but not limited to any patent rights, are granted to you. +// + +// Program.h: Defines the Program class. Implements GL program objects +// and related functionality. [OpenGL ES 2.0.24] section 2.10.3 page 28. + +#ifndef LIBGLESV2_PROGRAM_H_ +#define LIBGLESV2_PROGRAM_H_ + +#include "Shader.h" +#include "Context.h" +#include "Shader/PixelShader.hpp" +#include "Shader/VertexShader.hpp" + +#include <string> +#include <vector> +#include <set> + +namespace es2 +{ + class Device; + class ResourceManager; + class FragmentShader; + class VertexShader; + + // Helper struct representing a single shader uniform + struct Uniform + { + Uniform(GLenum type, GLenum precision, const std::string &name, unsigned int arraySize); + + ~Uniform(); + + bool isArray() const; + int size() const; + int registerCount() const; + + const GLenum type; + const GLenum precision; + const std::string name; + const unsigned int arraySize; + + unsigned char *data; + bool dirty; + + short psRegisterIndex; + short vsRegisterIndex; + }; + + // Struct used for correlating uniforms/elements of uniform arrays to handles + struct UniformLocation + { + UniformLocation(const std::string &name, unsigned int element, unsigned int index); + + std::string name; + unsigned int element; + unsigned int index; + }; + + class Program + { + public: + Program(ResourceManager *manager, GLuint handle); + + ~Program(); + + bool attachShader(Shader *shader); + bool detachShader(Shader *shader); + int getAttachedShadersCount() const; + + sw::PixelShader *getPixelShader(); + sw::VertexShader *getVertexShader(); + + void bindAttributeLocation(GLuint index, const char *name); + GLuint getAttributeLocation(const char *name); + int getAttributeStream(int attributeIndex); + + GLint getSamplerMapping(sw::SamplerType type, unsigned int samplerIndex); + TextureType getSamplerTextureType(sw::SamplerType type, unsigned int samplerIndex); + + GLint getUniformLocation(std::string name); + bool setUniform1fv(GLint location, GLsizei count, const GLfloat *v); + bool setUniform2fv(GLint location, GLsizei count, const GLfloat *v); + bool setUniform3fv(GLint location, GLsizei count, const GLfloat *v); + bool setUniform4fv(GLint location, GLsizei count, const GLfloat *v); + bool setUniformMatrix2fv(GLint location, GLsizei count, const GLfloat *value); + bool setUniformMatrix3fv(GLint location, GLsizei count, const GLfloat *value); + bool setUniformMatrix4fv(GLint location, GLsizei count, const GLfloat *value); + bool setUniform1iv(GLint location, GLsizei count, const GLint *v); + bool setUniform2iv(GLint location, GLsizei count, const GLint *v); + bool setUniform3iv(GLint location, GLsizei count, const GLint *v); + bool setUniform4iv(GLint location, GLsizei count, const GLint *v); + + bool getUniformfv(GLint location, GLsizei *bufSize, GLfloat *params); + bool getUniformiv(GLint location, GLsizei *bufSize, GLint *params); + + void dirtyAllUniforms(); + void applyUniforms(); + + void link(); + bool isLinked(); + int getInfoLogLength() const; + void getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog); + void getAttachedShaders(GLsizei maxCount, GLsizei *count, GLuint *shaders); + + void getActiveAttribute(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name) const; + GLint getActiveAttributeCount() const; + GLint getActiveAttributeMaxLength() const; + + void getActiveUniform(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name) const; + GLint getActiveUniformCount() const; + GLint getActiveUniformMaxLength() const; + + void addRef(); + void release(); + unsigned int getRefCount() const; + void flagForDeletion(); + bool isFlaggedForDeletion() const; + + void validate(); + bool validateSamplers(bool logErrors); + bool isValidated() const; + + unsigned int getSerial() const; + + private: + void unlink(); + + int packVaryings(const Varying *packing[][4]); + bool linkVaryings(); + + bool linkAttributes(); + int getAttributeBinding(const std::string &name); + + bool linkUniforms(Shader *shader); + bool defineUniform(GLenum shader, GLenum type, GLenum precision, const std::string &_name, unsigned int arraySize, int registerIndex); + bool applyUniform1bv(GLint location, GLsizei count, const GLboolean *v); + bool applyUniform2bv(GLint location, GLsizei count, const GLboolean *v); + bool applyUniform3bv(GLint location, GLsizei count, const GLboolean *v); + bool applyUniform4bv(GLint location, GLsizei count, const GLboolean *v); + bool applyUniform1fv(GLint location, GLsizei count, const GLfloat *v); + bool applyUniform2fv(GLint location, GLsizei count, const GLfloat *v); + bool applyUniform3fv(GLint location, GLsizei count, const GLfloat *v); + bool applyUniform4fv(GLint location, GLsizei count, const GLfloat *v); + bool applyUniformMatrix2fv(GLint location, GLsizei count, const GLfloat *value); + bool applyUniformMatrix3fv(GLint location, GLsizei count, const GLfloat *value); + bool applyUniformMatrix4fv(GLint location, GLsizei count, const GLfloat *value); + bool applyUniform1iv(GLint location, GLsizei count, const GLint *v); + bool applyUniform2iv(GLint location, GLsizei count, const GLint *v); + bool applyUniform3iv(GLint location, GLsizei count, const GLint *v); + bool applyUniform4iv(GLint location, GLsizei count, const GLint *v); + + void appendToInfoLog(const char *info, ...); + void resetInfoLog(); + + static unsigned int issueSerial(); + + private: + es2::Device *device; + FragmentShader *fragmentShader; + VertexShader *vertexShader; + + sw::PixelShader *pixelBinary; + sw::VertexShader *vertexBinary; + + std::set<std::string> attributeBinding[MAX_VERTEX_ATTRIBS]; + sh::Attribute linkedAttribute[MAX_VERTEX_ATTRIBS]; + int attributeStream[MAX_VERTEX_ATTRIBS]; + + struct Sampler + { + bool active; + GLint logicalTextureUnit; + TextureType textureType; + }; + + Sampler samplersPS[MAX_TEXTURE_IMAGE_UNITS]; + Sampler samplersVS[MAX_VERTEX_TEXTURE_IMAGE_UNITS]; + + typedef std::vector<Uniform*> UniformArray; + UniformArray uniforms; + typedef std::vector<UniformLocation> UniformIndex; + UniformIndex uniformIndex; + + bool linked; + bool orphaned; // Flag to indicate that the program can be deleted when no longer in use + char *infoLog; + bool validated; + + unsigned int referenceCount; + const unsigned int serial; + + static unsigned int currentSerial; + + ResourceManager *resourceManager; + const GLuint handle; + }; +} + +#endif // LIBGLESV2_PROGRAM_H_