Program::Program(ResourceManager *manager, GLuint handle) : serial(issueSerial()), resourceManager(manager), handle(handle)
{
- device = getDevice();
-
fragmentShader = 0;
vertexShader = 0;
pixelBinary = 0;
}
// Applies all the uniforms set for this program object to the device
- void Program::applyUniforms()
+ void Program::applyUniforms(Device *device)
{
GLint numUniforms = static_cast<GLint>(uniformIndex.size());
for(GLint location = 0; location < numUniforms; location++)
switch(targetUniform->type)
{
- case GL_BOOL: applyUniform1bv(location, size, b); break;
- case GL_BOOL_VEC2: applyUniform2bv(location, size, b); break;
- case GL_BOOL_VEC3: applyUniform3bv(location, size, b); break;
- case GL_BOOL_VEC4: applyUniform4bv(location, size, b); break;
- case GL_FLOAT: applyUniform1fv(location, size, f); break;
- case GL_FLOAT_VEC2: applyUniform2fv(location, size, f); break;
- case GL_FLOAT_VEC3: applyUniform3fv(location, size, f); break;
- case GL_FLOAT_VEC4: applyUniform4fv(location, size, f); break;
- case GL_FLOAT_MAT2: applyUniformMatrix2fv(location, size, f); break;
- case GL_FLOAT_MAT2x3: applyUniformMatrix2x3fv(location, size, f); break;
- case GL_FLOAT_MAT2x4: applyUniformMatrix2x4fv(location, size, f); break;
- case GL_FLOAT_MAT3x2: applyUniformMatrix3x2fv(location, size, f); break;
- case GL_FLOAT_MAT3: applyUniformMatrix3fv(location, size, f); break;
- case GL_FLOAT_MAT3x4: applyUniformMatrix3x4fv(location, size, f); break;
- case GL_FLOAT_MAT4x2: applyUniformMatrix4x2fv(location, size, f); break;
- case GL_FLOAT_MAT4x3: applyUniformMatrix4x3fv(location, size, f); break;
- case GL_FLOAT_MAT4: applyUniformMatrix4fv(location, size, f); break;
+ case GL_BOOL: applyUniform1bv(device, location, size, b); break;
+ case GL_BOOL_VEC2: applyUniform2bv(device, location, size, b); break;
+ case GL_BOOL_VEC3: applyUniform3bv(device, location, size, b); break;
+ case GL_BOOL_VEC4: applyUniform4bv(device, location, size, b); break;
+ case GL_FLOAT: applyUniform1fv(device, location, size, f); break;
+ case GL_FLOAT_VEC2: applyUniform2fv(device, location, size, f); break;
+ case GL_FLOAT_VEC3: applyUniform3fv(device, location, size, f); break;
+ case GL_FLOAT_VEC4: applyUniform4fv(device, location, size, f); break;
+ case GL_FLOAT_MAT2: applyUniformMatrix2fv(device, location, size, f); break;
+ case GL_FLOAT_MAT2x3: applyUniformMatrix2x3fv(device, location, size, f); break;
+ case GL_FLOAT_MAT2x4: applyUniformMatrix2x4fv(device, location, size, f); break;
+ case GL_FLOAT_MAT3x2: applyUniformMatrix3x2fv(device, location, size, f); break;
+ case GL_FLOAT_MAT3: applyUniformMatrix3fv(device, location, size, f); break;
+ case GL_FLOAT_MAT3x4: applyUniformMatrix3x4fv(device, location, size, f); break;
+ case GL_FLOAT_MAT4x2: applyUniformMatrix4x2fv(device, location, size, f); break;
+ case GL_FLOAT_MAT4x3: applyUniformMatrix4x3fv(device, location, size, f); break;
+ case GL_FLOAT_MAT4: applyUniformMatrix4fv(device, location, size, f); break;
case GL_SAMPLER_2D:
case GL_SAMPLER_CUBE:
case GL_SAMPLER_EXTERNAL_OES:
case GL_UNSIGNED_INT_SAMPLER_3D:
case GL_INT_SAMPLER_2D_ARRAY:
case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
- case GL_INT: applyUniform1iv(location, size, i); break;
- case GL_INT_VEC2: applyUniform2iv(location, size, i); break;
- case GL_INT_VEC3: applyUniform3iv(location, size, i); break;
- case GL_INT_VEC4: applyUniform4iv(location, size, i); break;
- case GL_UNSIGNED_INT: applyUniform1uiv(location, size, ui); break;
- case GL_UNSIGNED_INT_VEC2: applyUniform2uiv(location, size, ui); break;
- case GL_UNSIGNED_INT_VEC3: applyUniform3uiv(location, size, ui); break;
- case GL_UNSIGNED_INT_VEC4: applyUniform4uiv(location, size, ui); break;
+ case GL_INT: applyUniform1iv(device, location, size, i); break;
+ case GL_INT_VEC2: applyUniform2iv(device, location, size, i); break;
+ case GL_INT_VEC3: applyUniform3iv(device, location, size, i); break;
+ case GL_INT_VEC4: applyUniform4iv(device, location, size, i); break;
+ case GL_UNSIGNED_INT: applyUniform1uiv(device, location, size, ui); break;
+ case GL_UNSIGNED_INT_VEC2: applyUniform2uiv(device, location, size, ui); break;
+ case GL_UNSIGNED_INT_VEC3: applyUniform3uiv(device, location, size, ui); break;
+ case GL_UNSIGNED_INT_VEC4: applyUniform4uiv(device, location, size, ui); break;
default:
UNREACHABLE(targetUniform->type);
}
}
}
- void Program::applyUniformBuffers(BufferBinding* uniformBuffers)
+ void Program::applyUniformBuffers(Device *device, BufferBinding* uniformBuffers)
{
GLint vertexUniformBuffers[MAX_UNIFORM_BUFFER_BINDINGS];
GLint fragmentUniformBuffers[MAX_UNIFORM_BUFFER_BINDINGS];
}
}
- void Program::applyTransformFeedback(TransformFeedback* transformFeedback)
+ void Program::applyTransformFeedback(Device *device, TransformFeedback* transformFeedback)
{
// Make sure the flags will fit in a 64 bit unsigned int variable
ASSERT(sw::max<int>(MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS, sw::MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS) <= 64);
return true;
}
- bool Program::applyUniform(GLint location, float* data)
+ bool Program::applyUniform(Device *device, GLint location, float* data)
{
Uniform *targetUniform = uniforms[uniformIndex[location].index];
return true;
}
- bool Program::applyUniform1bv(GLint location, GLsizei count, const GLboolean *v)
+ bool Program::applyUniform1bv(Device *device, GLint location, GLsizei count, const GLboolean *v)
{
int vector[MAX_UNIFORM_VECTORS][4];
v += 1;
}
- return applyUniform(location, (float*)vector);
+ return applyUniform(device, location, (float*)vector);
}
- bool Program::applyUniform2bv(GLint location, GLsizei count, const GLboolean *v)
+ bool Program::applyUniform2bv(Device *device, GLint location, GLsizei count, const GLboolean *v)
{
int vector[MAX_UNIFORM_VECTORS][4];
v += 2;
}
- return applyUniform(location, (float*)vector);
+ return applyUniform(device, location, (float*)vector);
}
- bool Program::applyUniform3bv(GLint location, GLsizei count, const GLboolean *v)
+ bool Program::applyUniform3bv(Device *device, GLint location, GLsizei count, const GLboolean *v)
{
int vector[MAX_UNIFORM_VECTORS][4];
v += 3;
}
- return applyUniform(location, (float*)vector);
+ return applyUniform(device, location, (float*)vector);
}
- bool Program::applyUniform4bv(GLint location, GLsizei count, const GLboolean *v)
+ bool Program::applyUniform4bv(Device *device, GLint location, GLsizei count, const GLboolean *v)
{
int vector[MAX_UNIFORM_VECTORS][4];
v += 4;
}
- return applyUniform(location, (float*)vector);
+ return applyUniform(device, location, (float*)vector);
}
- bool Program::applyUniform1fv(GLint location, GLsizei count, const GLfloat *v)
+ bool Program::applyUniform1fv(Device *device, GLint location, GLsizei count, const GLfloat *v)
{
float vector[MAX_UNIFORM_VECTORS][4];
v += 1;
}
- return applyUniform(location, (float*)vector);
+ return applyUniform(device, location, (float*)vector);
}
- bool Program::applyUniform2fv(GLint location, GLsizei count, const GLfloat *v)
+ bool Program::applyUniform2fv(Device *device, GLint location, GLsizei count, const GLfloat *v)
{
float vector[MAX_UNIFORM_VECTORS][4];
v += 2;
}
- return applyUniform(location, (float*)vector);
+ return applyUniform(device, location, (float*)vector);
}
- bool Program::applyUniform3fv(GLint location, GLsizei count, const GLfloat *v)
+ bool Program::applyUniform3fv(Device *device, GLint location, GLsizei count, const GLfloat *v)
{
float vector[MAX_UNIFORM_VECTORS][4];
v += 3;
}
- return applyUniform(location, (float*)vector);
+ return applyUniform(device, location, (float*)vector);
}
- bool Program::applyUniform4fv(GLint location, GLsizei count, const GLfloat *v)
+ bool Program::applyUniform4fv(Device *device, GLint location, GLsizei count, const GLfloat *v)
{
- return applyUniform(location, (float*)v);
+ return applyUniform(device, location, (float*)v);
}
- bool Program::applyUniformMatrix2fv(GLint location, GLsizei count, const GLfloat *value)
+ bool Program::applyUniformMatrix2fv(Device *device, GLint location, GLsizei count, const GLfloat *value)
{
float matrix[(MAX_UNIFORM_VECTORS + 1) / 2][2][4];
value += 4;
}
- return applyUniform(location, (float*)matrix);
+ return applyUniform(device, location, (float*)matrix);
}
- bool Program::applyUniformMatrix2x3fv(GLint location, GLsizei count, const GLfloat *value)
+ bool Program::applyUniformMatrix2x3fv(Device *device, GLint location, GLsizei count, const GLfloat *value)
{
float matrix[(MAX_UNIFORM_VECTORS + 1) / 2][2][4];
value += 6;
}
- return applyUniform(location, (float*)matrix);
+ return applyUniform(device, location, (float*)matrix);
}
- bool Program::applyUniformMatrix2x4fv(GLint location, GLsizei count, const GLfloat *value)
+ bool Program::applyUniformMatrix2x4fv(Device *device, GLint location, GLsizei count, const GLfloat *value)
{
float matrix[(MAX_UNIFORM_VECTORS + 1) / 2][2][4];
value += 8;
}
- return applyUniform(location, (float*)matrix);
+ return applyUniform(device, location, (float*)matrix);
}
- bool Program::applyUniformMatrix3fv(GLint location, GLsizei count, const GLfloat *value)
+ bool Program::applyUniformMatrix3fv(Device *device, GLint location, GLsizei count, const GLfloat *value)
{
float matrix[(MAX_UNIFORM_VECTORS + 2) / 3][3][4];
value += 9;
}
- return applyUniform(location, (float*)matrix);
+ return applyUniform(device, location, (float*)matrix);
}
- bool Program::applyUniformMatrix3x2fv(GLint location, GLsizei count, const GLfloat *value)
+ bool Program::applyUniformMatrix3x2fv(Device *device, GLint location, GLsizei count, const GLfloat *value)
{
float matrix[(MAX_UNIFORM_VECTORS + 2) / 3][3][4];
value += 6;
}
- return applyUniform(location, (float*)matrix);
+ return applyUniform(device, location, (float*)matrix);
}
- bool Program::applyUniformMatrix3x4fv(GLint location, GLsizei count, const GLfloat *value)
+ bool Program::applyUniformMatrix3x4fv(Device *device, GLint location, GLsizei count, const GLfloat *value)
{
float matrix[(MAX_UNIFORM_VECTORS + 2) / 3][3][4];
value += 12;
}
- return applyUniform(location, (float*)matrix);
+ return applyUniform(device, location, (float*)matrix);
}
- bool Program::applyUniformMatrix4fv(GLint location, GLsizei count, const GLfloat *value)
+ bool Program::applyUniformMatrix4fv(Device *device, GLint location, GLsizei count, const GLfloat *value)
{
- return applyUniform(location, (float*)value);
+ return applyUniform(device, location, (float*)value);
}
- bool Program::applyUniformMatrix4x2fv(GLint location, GLsizei count, const GLfloat *value)
+ bool Program::applyUniformMatrix4x2fv(Device *device, GLint location, GLsizei count, const GLfloat *value)
{
float matrix[(MAX_UNIFORM_VECTORS + 3) / 4][4][4];
value += 8;
}
- return applyUniform(location, (float*)matrix);
+ return applyUniform(device, location, (float*)matrix);
}
- bool Program::applyUniformMatrix4x3fv(GLint location, GLsizei count, const GLfloat *value)
+ bool Program::applyUniformMatrix4x3fv(Device *device, GLint location, GLsizei count, const GLfloat *value)
{
float matrix[(MAX_UNIFORM_VECTORS + 3) / 4][4][4];
value += 12;
}
- return applyUniform(location, (float*)matrix);
+ return applyUniform(device, location, (float*)matrix);
}
- bool Program::applyUniform1iv(GLint location, GLsizei count, const GLint *v)
+ bool Program::applyUniform1iv(Device *device, GLint location, GLsizei count, const GLint *v)
{
GLint vector[MAX_UNIFORM_VECTORS][4];
}
else
{
- return applyUniform(location, (float*)vector);
+ return applyUniform(device, location, (float*)vector);
}
return true;
}
- bool Program::applyUniform2iv(GLint location, GLsizei count, const GLint *v)
+ bool Program::applyUniform2iv(Device *device, GLint location, GLsizei count, const GLint *v)
{
GLint vector[MAX_UNIFORM_VECTORS][4];
v += 2;
}
- return applyUniform(location, (float*)vector);
+ return applyUniform(device, location, (float*)vector);
}
- bool Program::applyUniform3iv(GLint location, GLsizei count, const GLint *v)
+ bool Program::applyUniform3iv(Device *device, GLint location, GLsizei count, const GLint *v)
{
GLint vector[MAX_UNIFORM_VECTORS][4];
v += 3;
}
- return applyUniform(location, (float*)vector);
+ return applyUniform(device, location, (float*)vector);
}
- bool Program::applyUniform4iv(GLint location, GLsizei count, const GLint *v)
+ bool Program::applyUniform4iv(Device *device, GLint location, GLsizei count, const GLint *v)
{
GLint vector[MAX_UNIFORM_VECTORS][4];
v += 4;
}
- return applyUniform(location, (float*)vector);
+ return applyUniform(device, location, (float*)vector);
}
- bool Program::applyUniform1uiv(GLint location, GLsizei count, const GLuint *v)
+ bool Program::applyUniform1uiv(Device *device, GLint location, GLsizei count, const GLuint *v)
{
GLuint vector[MAX_UNIFORM_VECTORS][4];
}
else
{
- return applyUniform(location, (float*)vector);
+ return applyUniform(device, location, (float*)vector);
}
return true;
}
- bool Program::applyUniform2uiv(GLint location, GLsizei count, const GLuint *v)
+ bool Program::applyUniform2uiv(Device *device, GLint location, GLsizei count, const GLuint *v)
{
GLuint vector[MAX_UNIFORM_VECTORS][4];
v += 2;
}
- return applyUniform(location, (float*)vector);
+ return applyUniform(device, location, (float*)vector);
}
- bool Program::applyUniform3uiv(GLint location, GLsizei count, const GLuint *v)
+ bool Program::applyUniform3uiv(Device *device, GLint location, GLsizei count, const GLuint *v)
{
GLuint vector[MAX_UNIFORM_VECTORS][4];
v += 3;
}
- return applyUniform(location, (float*)vector);
+ return applyUniform(device, location, (float*)vector);
}
- bool Program::applyUniform4uiv(GLint location, GLsizei count, const GLuint *v)
+ bool Program::applyUniform4uiv(Device *device, GLint location, GLsizei count, const GLuint *v)
{
GLuint vector[MAX_UNIFORM_VECTORS][4];
v += 4;
}
- return applyUniform(location, (float*)vector);
+ return applyUniform(device, location, (float*)vector);
}
void Program::appendToInfoLog(const char *format, ...)
return orphaned;
}
- void Program::validate()
+ void Program::validate(Device* device)
{
resetInfoLog();
}
else
{
- applyUniforms();
+ applyUniforms(device);
if(!validateSamplers(true))
{
validated = false;
bool getUniformuiv(GLint location, GLsizei *bufSize, GLuint *params);
void dirtyAllUniforms();
- void applyUniforms();
- void applyUniformBuffers(BufferBinding* uniformBuffers);
- void applyTransformFeedback(TransformFeedback* transformFeedback);
+ void applyUniforms(Device *device);
+ void applyUniformBuffers(Device *device, BufferBinding* uniformBuffers);
+ void applyTransformFeedback(Device *device, TransformFeedback* transformFeedback);
void link();
bool isLinked() const;
void flagForDeletion();
bool isFlaggedForDeletion() const;
- void validate();
+ void validate(Device* device);
bool validateSamplers(bool logErrors);
bool isValidated() const;
bool areMatchingUniformBlocks(const glsl::UniformBlock &block1, const glsl::UniformBlock &block2, const Shader *shader1, const Shader *shader2);
bool defineUniform(GLenum shader, GLenum type, GLenum precision, const std::string &_name, unsigned int arraySize, int registerIndex, const Uniform::BlockInfo& blockInfo);
bool defineUniformBlock(const Shader *shader, const glsl::UniformBlock &block);
- bool applyUniform(GLint location, float* data);
- 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 applyUniformMatrix2x3fv(GLint location, GLsizei count, const GLfloat *value);
- bool applyUniformMatrix2x4fv(GLint location, GLsizei count, const GLfloat *value);
- bool applyUniformMatrix3fv(GLint location, GLsizei count, const GLfloat *value);
- bool applyUniformMatrix3x2fv(GLint location, GLsizei count, const GLfloat *value);
- bool applyUniformMatrix3x4fv(GLint location, GLsizei count, const GLfloat *value);
- bool applyUniformMatrix4fv(GLint location, GLsizei count, const GLfloat *value);
- bool applyUniformMatrix4x2fv(GLint location, GLsizei count, const GLfloat *value);
- bool applyUniformMatrix4x3fv(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);
- bool applyUniform1uiv(GLint location, GLsizei count, const GLuint *v);
- bool applyUniform2uiv(GLint location, GLsizei count, const GLuint *v);
- bool applyUniform3uiv(GLint location, GLsizei count, const GLuint *v);
- bool applyUniform4uiv(GLint location, GLsizei count, const GLuint *v);
+ bool applyUniform(Device *device, GLint location, float* data);
+ bool applyUniform1bv(Device *device, GLint location, GLsizei count, const GLboolean *v);
+ bool applyUniform2bv(Device *device, GLint location, GLsizei count, const GLboolean *v);
+ bool applyUniform3bv(Device *device, GLint location, GLsizei count, const GLboolean *v);
+ bool applyUniform4bv(Device *device, GLint location, GLsizei count, const GLboolean *v);
+ bool applyUniform1fv(Device *device, GLint location, GLsizei count, const GLfloat *v);
+ bool applyUniform2fv(Device *device, GLint location, GLsizei count, const GLfloat *v);
+ bool applyUniform3fv(Device *device, GLint location, GLsizei count, const GLfloat *v);
+ bool applyUniform4fv(Device *device, GLint location, GLsizei count, const GLfloat *v);
+ bool applyUniformMatrix2fv(Device *device, GLint location, GLsizei count, const GLfloat *value);
+ bool applyUniformMatrix2x3fv(Device *device, GLint location, GLsizei count, const GLfloat *value);
+ bool applyUniformMatrix2x4fv(Device *device, GLint location, GLsizei count, const GLfloat *value);
+ bool applyUniformMatrix3fv(Device *device, GLint location, GLsizei count, const GLfloat *value);
+ bool applyUniformMatrix3x2fv(Device *device, GLint location, GLsizei count, const GLfloat *value);
+ bool applyUniformMatrix3x4fv(Device *device, GLint location, GLsizei count, const GLfloat *value);
+ bool applyUniformMatrix4fv(Device *device, GLint location, GLsizei count, const GLfloat *value);
+ bool applyUniformMatrix4x2fv(Device *device, GLint location, GLsizei count, const GLfloat *value);
+ bool applyUniformMatrix4x3fv(Device *device, GLint location, GLsizei count, const GLfloat *value);
+ bool applyUniform1iv(Device *device, GLint location, GLsizei count, const GLint *v);
+ bool applyUniform2iv(Device *device, GLint location, GLsizei count, const GLint *v);
+ bool applyUniform3iv(Device *device, GLint location, GLsizei count, const GLint *v);
+ bool applyUniform4iv(Device *device, GLint location, GLsizei count, const GLint *v);
+ bool applyUniform1uiv(Device *device, GLint location, GLsizei count, const GLuint *v);
+ bool applyUniform2uiv(Device *device, GLint location, GLsizei count, const GLuint *v);
+ bool applyUniform3uiv(Device *device, GLint location, GLsizei count, const GLuint *v);
+ bool applyUniform4uiv(Device *device, GLint location, GLsizei count, const GLuint *v);
bool setUniformfv(GLint location, GLsizei count, const GLfloat *v, int numElements);
bool setUniformMatrixfv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value, GLenum type);
static unsigned int issueSerial();
private:
- es2::Device *device;
FragmentShader *fragmentShader;
VertexShader *vertexShader;