Commit ed87c16a by Mohan Maiya Committed by Commit Bot

Vulkan: Add GL_EXT_separate_shader_objects support

All the functionality needed for this extension has already been implemented as part of core GLES31. Hook into that along with changes to validation layer to allow non-GLES31 contexts to call into these APIs as long as the extension is exposed. Bug: angleproject:3570 Test: ProgramPipelineTest.GenerateProgramPipelineObjectEXT* Change-Id: I92a61a47517c5cb9573874b2add6a744c9edb755 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2539121 Commit-Queue: Mohan Maiya <m.maiya@samsung.com> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarShahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: 's avatarTim Van Patten <timvp@google.com>
parent cc4ae6da
...@@ -345,6 +345,9 @@ void RendererVk::ensureCapsInitialized() const ...@@ -345,6 +345,9 @@ void RendererVk::ensureCapsInitialized() const
// Implemented in the translator // Implemented in the translator
mNativeExtensions.shaderNonConstGlobalInitializersEXT = true; mNativeExtensions.shaderNonConstGlobalInitializersEXT = true;
// Implemented in the front end
mNativeExtensions.separateShaderObjects = true;
// Vulkan has no restrictions of the format of cubemaps, so if the proper formats are supported, // Vulkan has no restrictions of the format of cubemaps, so if the proper formats are supported,
// creating a cube of any of these formats should be implicitly supported. // creating a cube of any of these formats should be implicitly supported.
mNativeExtensions.depthTextureCubeMapOES = mNativeExtensions.depthTextureCubeMapOES =
......
...@@ -2014,17 +2014,11 @@ bool ValidateGetProgramBinary(const Context *context, ...@@ -2014,17 +2014,11 @@ bool ValidateGetProgramBinary(const Context *context,
return ValidateGetProgramBinaryBase(context, program, bufSize, length, binaryFormat, binary); return ValidateGetProgramBinaryBase(context, program, bufSize, length, binaryFormat, binary);
} }
bool ValidateProgramParameteri(const Context *context, bool ValidateProgramParameteriBase(const Context *context,
ShaderProgramID program, ShaderProgramID program,
GLenum pname, GLenum pname,
GLint value) GLint value)
{ {
if (context->getClientMajorVersion() < 3)
{
context->validationError(GL_INVALID_OPERATION, kES3Required);
return false;
}
if (GetValidProgram(context, program) == nullptr) if (GetValidProgram(context, program) == nullptr)
{ {
return false; return false;
...@@ -2062,6 +2056,20 @@ bool ValidateProgramParameteri(const Context *context, ...@@ -2062,6 +2056,20 @@ bool ValidateProgramParameteri(const Context *context,
return true; return true;
} }
bool ValidateProgramParameteri(const Context *context,
ShaderProgramID program,
GLenum pname,
GLint value)
{
if (context->getClientMajorVersion() < 3)
{
context->validationError(GL_INVALID_OPERATION, kES3Required);
return false;
}
return ValidateProgramParameteriBase(context, program, pname, value);
}
bool ValidateBlitFramebuffer(const Context *context, bool ValidateBlitFramebuffer(const Context *context,
GLint srcX0, GLint srcX0,
GLint srcY0, GLint srcY0,
......
...@@ -31,6 +31,11 @@ bool ValidateES3TexImageParametersBase(const Context *context, ...@@ -31,6 +31,11 @@ bool ValidateES3TexImageParametersBase(const Context *context,
GLenum type, GLenum type,
GLsizei imageSize, GLsizei imageSize,
const void *pixels); const void *pixels);
bool ValidateProgramParameteriBase(const Context *context,
ShaderProgramID program,
GLenum pname,
GLint value);
} // namespace gl } // namespace gl
#endif // LIBANGLE_VALIDATION_ES3_H_ #endif // LIBANGLE_VALIDATION_ES3_H_
...@@ -299,39 +299,25 @@ bool ValidateProgramResourceIndex(const Program *programObject, ...@@ -299,39 +299,25 @@ bool ValidateProgramResourceIndex(const Program *programObject,
} }
} }
bool ValidateProgramUniform(const Context *context, bool ValidateProgramUniformBase(const Context *context,
GLenum valueType, GLenum valueType,
ShaderProgramID program, ShaderProgramID program,
UniformLocation location, UniformLocation location,
GLsizei count) GLsizei count)
{ {
// Check for ES31 program uniform entry points
if (context->getClientVersion() < Version(3, 1))
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
const LinkedUniform *uniform = nullptr; const LinkedUniform *uniform = nullptr;
Program *programObject = GetValidProgram(context, program); Program *programObject = GetValidProgram(context, program);
return ValidateUniformCommonBase(context, programObject, location, count, &uniform) && return ValidateUniformCommonBase(context, programObject, location, count, &uniform) &&
ValidateUniformValue(context, valueType, uniform->type); ValidateUniformValue(context, valueType, uniform->type);
} }
bool ValidateProgramUniformMatrix(const Context *context, bool ValidateProgramUniformMatrixBase(const Context *context,
GLenum valueType, GLenum valueType,
ShaderProgramID program, ShaderProgramID program,
UniformLocation location, UniformLocation location,
GLsizei count, GLsizei count,
GLboolean transpose) GLboolean transpose)
{ {
// Check for ES31 program uniform entry points
if (context->getClientVersion() < Version(3, 1))
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
const LinkedUniform *uniform = nullptr; const LinkedUniform *uniform = nullptr;
Program *programObject = GetValidProgram(context, program); Program *programObject = GetValidProgram(context, program);
return ValidateUniformCommonBase(context, programObject, location, count, &uniform) && return ValidateUniformCommonBase(context, programObject, location, count, &uniform) &&
...@@ -553,344 +539,337 @@ bool ValidateDrawElementsIndirect(const Context *context, ...@@ -553,344 +539,337 @@ bool ValidateDrawElementsIndirect(const Context *context,
return true; return true;
} }
bool ValidateProgramUniform1i(const Context *context, bool ValidateProgramUniform1iBase(const Context *context,
ShaderProgramID program, ShaderProgramID program,
UniformLocation location, UniformLocation location,
GLint v0) GLint v0)
{ {
return ValidateProgramUniform1iv(context, program, location, 1, &v0); return ValidateProgramUniform1ivBase(context, program, location, 1, &v0);
} }
bool ValidateProgramUniform2i(const Context *context, bool ValidateProgramUniform2iBase(const Context *context,
ShaderProgramID program, ShaderProgramID program,
UniformLocation location, UniformLocation location,
GLint v0, GLint v0,
GLint v1) GLint v1)
{ {
GLint xy[2] = {v0, v1}; GLint xy[2] = {v0, v1};
return ValidateProgramUniform2iv(context, program, location, 1, xy); return ValidateProgramUniform2ivBase(context, program, location, 1, xy);
} }
bool ValidateProgramUniform3i(const Context *context, bool ValidateProgramUniform3iBase(const Context *context,
ShaderProgramID program, ShaderProgramID program,
UniformLocation location, UniformLocation location,
GLint v0, GLint v0,
GLint v1, GLint v1,
GLint v2) GLint v2)
{ {
GLint xyz[3] = {v0, v1, v2}; GLint xyz[3] = {v0, v1, v2};
return ValidateProgramUniform3iv(context, program, location, 1, xyz); return ValidateProgramUniform3ivBase(context, program, location, 1, xyz);
} }
bool ValidateProgramUniform4i(const Context *context, bool ValidateProgramUniform4iBase(const Context *context,
ShaderProgramID program, ShaderProgramID program,
UniformLocation location, UniformLocation location,
GLint v0, GLint v0,
GLint v1, GLint v1,
GLint v2, GLint v2,
GLint v3) GLint v3)
{ {
GLint xyzw[4] = {v0, v1, v2, v3}; GLint xyzw[4] = {v0, v1, v2, v3};
return ValidateProgramUniform4iv(context, program, location, 1, xyzw); return ValidateProgramUniform4ivBase(context, program, location, 1, xyzw);
} }
bool ValidateProgramUniform1ui(const Context *context, bool ValidateProgramUniform1uiBase(const Context *context,
ShaderProgramID program, ShaderProgramID program,
UniformLocation location, UniformLocation location,
GLuint v0) GLuint v0)
{ {
return ValidateProgramUniform1uiv(context, program, location, 1, &v0); return ValidateProgramUniform1uivBase(context, program, location, 1, &v0);
} }
bool ValidateProgramUniform2ui(const Context *context, bool ValidateProgramUniform2uiBase(const Context *context,
ShaderProgramID program, ShaderProgramID program,
UniformLocation location, UniformLocation location,
GLuint v0, GLuint v0,
GLuint v1) GLuint v1)
{ {
GLuint xy[2] = {v0, v1}; GLuint xy[2] = {v0, v1};
return ValidateProgramUniform2uiv(context, program, location, 1, xy); return ValidateProgramUniform2uivBase(context, program, location, 1, xy);
} }
bool ValidateProgramUniform3ui(const Context *context, bool ValidateProgramUniform3uiBase(const Context *context,
ShaderProgramID program, ShaderProgramID program,
UniformLocation location, UniformLocation location,
GLuint v0, GLuint v0,
GLuint v1, GLuint v1,
GLuint v2) GLuint v2)
{ {
GLuint xyz[3] = {v0, v1, v2}; GLuint xyz[3] = {v0, v1, v2};
return ValidateProgramUniform3uiv(context, program, location, 1, xyz); return ValidateProgramUniform3uivBase(context, program, location, 1, xyz);
} }
bool ValidateProgramUniform4ui(const Context *context, bool ValidateProgramUniform4uiBase(const Context *context,
ShaderProgramID program, ShaderProgramID program,
UniformLocation location, UniformLocation location,
GLuint v0, GLuint v0,
GLuint v1, GLuint v1,
GLuint v2, GLuint v2,
GLuint v3) GLuint v3)
{ {
GLuint xyzw[4] = {v0, v1, v2, v3}; GLuint xyzw[4] = {v0, v1, v2, v3};
return ValidateProgramUniform4uiv(context, program, location, 1, xyzw); return ValidateProgramUniform4uivBase(context, program, location, 1, xyzw);
} }
bool ValidateProgramUniform1f(const Context *context, bool ValidateProgramUniform1fBase(const Context *context,
ShaderProgramID program, ShaderProgramID program,
UniformLocation location, UniformLocation location,
GLfloat v0) GLfloat v0)
{ {
return ValidateProgramUniform1fv(context, program, location, 1, &v0); return ValidateProgramUniform1fvBase(context, program, location, 1, &v0);
} }
bool ValidateProgramUniform2f(const Context *context, bool ValidateProgramUniform2fBase(const Context *context,
ShaderProgramID program, ShaderProgramID program,
UniformLocation location, UniformLocation location,
GLfloat v0, GLfloat v0,
GLfloat v1) GLfloat v1)
{ {
GLfloat xy[2] = {v0, v1}; GLfloat xy[2] = {v0, v1};
return ValidateProgramUniform2fv(context, program, location, 1, xy); return ValidateProgramUniform2fvBase(context, program, location, 1, xy);
} }
bool ValidateProgramUniform3f(const Context *context, bool ValidateProgramUniform3fBase(const Context *context,
ShaderProgramID program, ShaderProgramID program,
UniformLocation location, UniformLocation location,
GLfloat v0, GLfloat v0,
GLfloat v1, GLfloat v1,
GLfloat v2) GLfloat v2)
{ {
GLfloat xyz[3] = {v0, v1, v2}; GLfloat xyz[3] = {v0, v1, v2};
return ValidateProgramUniform3fv(context, program, location, 1, xyz); return ValidateProgramUniform3fvBase(context, program, location, 1, xyz);
} }
bool ValidateProgramUniform4f(const Context *context, bool ValidateProgramUniform4fBase(const Context *context,
ShaderProgramID program, ShaderProgramID program,
UniformLocation location, UniformLocation location,
GLfloat v0, GLfloat v0,
GLfloat v1, GLfloat v1,
GLfloat v2, GLfloat v2,
GLfloat v3) GLfloat v3)
{ {
GLfloat xyzw[4] = {v0, v1, v2, v3}; GLfloat xyzw[4] = {v0, v1, v2, v3};
return ValidateProgramUniform4fv(context, program, location, 1, xyzw); return ValidateProgramUniform4fvBase(context, program, location, 1, xyzw);
} }
bool ValidateProgramUniform1iv(const Context *context, bool ValidateProgramUniform1ivBase(const Context *context,
ShaderProgramID program, ShaderProgramID program,
UniformLocation location, UniformLocation location,
GLsizei count, GLsizei count,
const GLint *value) const GLint *value)
{ {
// Check for ES31 program uniform entry points
if (context->getClientVersion() < Version(3, 1))
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
const LinkedUniform *uniform = nullptr; const LinkedUniform *uniform = nullptr;
Program *programObject = GetValidProgram(context, program); Program *programObject = GetValidProgram(context, program);
return ValidateUniformCommonBase(context, programObject, location, count, &uniform) && return ValidateUniformCommonBase(context, programObject, location, count, &uniform) &&
ValidateUniform1ivValue(context, uniform->type, count, value); ValidateUniform1ivValue(context, uniform->type, count, value);
} }
bool ValidateProgramUniform2iv(const Context *context, bool ValidateProgramUniform2ivBase(const Context *context,
ShaderProgramID program, ShaderProgramID program,
UniformLocation location, UniformLocation location,
GLsizei count, GLsizei count,
const GLint *value) const GLint *value)
{ {
return ValidateProgramUniform(context, GL_INT_VEC2, program, location, count); return ValidateProgramUniformBase(context, GL_INT_VEC2, program, location, count);
} }
bool ValidateProgramUniform3iv(const Context *context, bool ValidateProgramUniform3ivBase(const Context *context,
ShaderProgramID program, ShaderProgramID program,
UniformLocation location, UniformLocation location,
GLsizei count, GLsizei count,
const GLint *value) const GLint *value)
{ {
return ValidateProgramUniform(context, GL_INT_VEC3, program, location, count); return ValidateProgramUniformBase(context, GL_INT_VEC3, program, location, count);
} }
bool ValidateProgramUniform4iv(const Context *context, bool ValidateProgramUniform4ivBase(const Context *context,
ShaderProgramID program, ShaderProgramID program,
UniformLocation location, UniformLocation location,
GLsizei count, GLsizei count,
const GLint *value) const GLint *value)
{ {
return ValidateProgramUniform(context, GL_INT_VEC4, program, location, count); return ValidateProgramUniformBase(context, GL_INT_VEC4, program, location, count);
} }
bool ValidateProgramUniform1uiv(const Context *context, bool ValidateProgramUniform1uivBase(const Context *context,
ShaderProgramID program, ShaderProgramID program,
UniformLocation location, UniformLocation location,
GLsizei count, GLsizei count,
const GLuint *value) const GLuint *value)
{ {
return ValidateProgramUniform(context, GL_UNSIGNED_INT, program, location, count); return ValidateProgramUniformBase(context, GL_UNSIGNED_INT, program, location, count);
} }
bool ValidateProgramUniform2uiv(const Context *context, bool ValidateProgramUniform2uivBase(const Context *context,
ShaderProgramID program, ShaderProgramID program,
UniformLocation location, UniformLocation location,
GLsizei count, GLsizei count,
const GLuint *value) const GLuint *value)
{ {
return ValidateProgramUniform(context, GL_UNSIGNED_INT_VEC2, program, location, count); return ValidateProgramUniformBase(context, GL_UNSIGNED_INT_VEC2, program, location, count);
} }
bool ValidateProgramUniform3uiv(const Context *context, bool ValidateProgramUniform3uivBase(const Context *context,
ShaderProgramID program, ShaderProgramID program,
UniformLocation location, UniformLocation location,
GLsizei count, GLsizei count,
const GLuint *value) const GLuint *value)
{ {
return ValidateProgramUniform(context, GL_UNSIGNED_INT_VEC3, program, location, count); return ValidateProgramUniformBase(context, GL_UNSIGNED_INT_VEC3, program, location, count);
} }
bool ValidateProgramUniform4uiv(const Context *context, bool ValidateProgramUniform4uivBase(const Context *context,
ShaderProgramID program, ShaderProgramID program,
UniformLocation location, UniformLocation location,
GLsizei count, GLsizei count,
const GLuint *value) const GLuint *value)
{ {
return ValidateProgramUniform(context, GL_UNSIGNED_INT_VEC4, program, location, count); return ValidateProgramUniformBase(context, GL_UNSIGNED_INT_VEC4, program, location, count);
} }
bool ValidateProgramUniform1fv(const Context *context, bool ValidateProgramUniform1fvBase(const Context *context,
ShaderProgramID program, ShaderProgramID program,
UniformLocation location, UniformLocation location,
GLsizei count, GLsizei count,
const GLfloat *value) const GLfloat *value)
{ {
return ValidateProgramUniform(context, GL_FLOAT, program, location, count); return ValidateProgramUniformBase(context, GL_FLOAT, program, location, count);
} }
bool ValidateProgramUniform2fv(const Context *context, bool ValidateProgramUniform2fvBase(const Context *context,
ShaderProgramID program, ShaderProgramID program,
UniformLocation location, UniformLocation location,
GLsizei count, GLsizei count,
const GLfloat *value) const GLfloat *value)
{ {
return ValidateProgramUniform(context, GL_FLOAT_VEC2, program, location, count); return ValidateProgramUniformBase(context, GL_FLOAT_VEC2, program, location, count);
} }
bool ValidateProgramUniform3fv(const Context *context, bool ValidateProgramUniform3fvBase(const Context *context,
ShaderProgramID program, ShaderProgramID program,
UniformLocation location, UniformLocation location,
GLsizei count, GLsizei count,
const GLfloat *value) const GLfloat *value)
{ {
return ValidateProgramUniform(context, GL_FLOAT_VEC3, program, location, count); return ValidateProgramUniformBase(context, GL_FLOAT_VEC3, program, location, count);
} }
bool ValidateProgramUniform4fv(const Context *context, bool ValidateProgramUniform4fvBase(const Context *context,
ShaderProgramID program, ShaderProgramID program,
UniformLocation location, UniformLocation location,
GLsizei count, GLsizei count,
const GLfloat *value) const GLfloat *value)
{ {
return ValidateProgramUniform(context, GL_FLOAT_VEC4, program, location, count); return ValidateProgramUniformBase(context, GL_FLOAT_VEC4, program, location, count);
} }
bool ValidateProgramUniformMatrix2fv(const Context *context, bool ValidateProgramUniformMatrix2fvBase(const Context *context,
ShaderProgramID program, ShaderProgramID program,
UniformLocation location, UniformLocation location,
GLsizei count, GLsizei count,
GLboolean transpose, GLboolean transpose,
const GLfloat *value) const GLfloat *value)
{ {
return ValidateProgramUniformMatrix(context, GL_FLOAT_MAT2, program, location, count, return ValidateProgramUniformMatrixBase(context, GL_FLOAT_MAT2, program, location, count,
transpose); transpose);
} }
bool ValidateProgramUniformMatrix3fv(const Context *context, bool ValidateProgramUniformMatrix3fvBase(const Context *context,
ShaderProgramID program, ShaderProgramID program,
UniformLocation location, UniformLocation location,
GLsizei count, GLsizei count,
GLboolean transpose, GLboolean transpose,
const GLfloat *value) const GLfloat *value)
{ {
return ValidateProgramUniformMatrix(context, GL_FLOAT_MAT3, program, location, count, return ValidateProgramUniformMatrixBase(context, GL_FLOAT_MAT3, program, location, count,
transpose); transpose);
} }
bool ValidateProgramUniformMatrix4fv(const Context *context, bool ValidateProgramUniformMatrix4fvBase(const Context *context,
ShaderProgramID program, ShaderProgramID program,
UniformLocation location, UniformLocation location,
GLsizei count, GLsizei count,
GLboolean transpose, GLboolean transpose,
const GLfloat *value) const GLfloat *value)
{ {
return ValidateProgramUniformMatrix(context, GL_FLOAT_MAT4, program, location, count, return ValidateProgramUniformMatrixBase(context, GL_FLOAT_MAT4, program, location, count,
transpose); transpose);
} }
bool ValidateProgramUniformMatrix2x3fv(const Context *context, bool ValidateProgramUniformMatrix2x3fvBase(const Context *context,
ShaderProgramID program, ShaderProgramID program,
UniformLocation location, UniformLocation location,
GLsizei count, GLsizei count,
GLboolean transpose, GLboolean transpose,
const GLfloat *value) const GLfloat *value)
{ {
return ValidateProgramUniformMatrix(context, GL_FLOAT_MAT2x3, program, location, count, return ValidateProgramUniformMatrixBase(context, GL_FLOAT_MAT2x3, program, location, count,
transpose); transpose);
} }
bool ValidateProgramUniformMatrix3x2fv(const Context *context, bool ValidateProgramUniformMatrix3x2fvBase(const Context *context,
ShaderProgramID program, ShaderProgramID program,
UniformLocation location, UniformLocation location,
GLsizei count, GLsizei count,
GLboolean transpose, GLboolean transpose,
const GLfloat *value) const GLfloat *value)
{ {
return ValidateProgramUniformMatrix(context, GL_FLOAT_MAT3x2, program, location, count, return ValidateProgramUniformMatrixBase(context, GL_FLOAT_MAT3x2, program, location, count,
transpose); transpose);
} }
bool ValidateProgramUniformMatrix2x4fv(const Context *context, bool ValidateProgramUniformMatrix2x4fvBase(const Context *context,
ShaderProgramID program, ShaderProgramID program,
UniformLocation location, UniformLocation location,
GLsizei count, GLsizei count,
GLboolean transpose, GLboolean transpose,
const GLfloat *value) const GLfloat *value)
{ {
return ValidateProgramUniformMatrix(context, GL_FLOAT_MAT2x4, program, location, count, return ValidateProgramUniformMatrixBase(context, GL_FLOAT_MAT2x4, program, location, count,
transpose); transpose);
} }
bool ValidateProgramUniformMatrix4x2fv(const Context *context, bool ValidateProgramUniformMatrix4x2fvBase(const Context *context,
ShaderProgramID program, ShaderProgramID program,
UniformLocation location, UniformLocation location,
GLsizei count, GLsizei count,
GLboolean transpose, GLboolean transpose,
const GLfloat *value) const GLfloat *value)
{ {
return ValidateProgramUniformMatrix(context, GL_FLOAT_MAT4x2, program, location, count, return ValidateProgramUniformMatrixBase(context, GL_FLOAT_MAT4x2, program, location, count,
transpose); transpose);
} }
bool ValidateProgramUniformMatrix3x4fv(const Context *context, bool ValidateProgramUniformMatrix3x4fvBase(const Context *context,
ShaderProgramID program, ShaderProgramID program,
UniformLocation location, UniformLocation location,
GLsizei count, GLsizei count,
GLboolean transpose, GLboolean transpose,
const GLfloat *value) const GLfloat *value)
{ {
return ValidateProgramUniformMatrix(context, GL_FLOAT_MAT3x4, program, location, count, return ValidateProgramUniformMatrixBase(context, GL_FLOAT_MAT3x4, program, location, count,
transpose); transpose);
} }
bool ValidateProgramUniformMatrix4x3fv(const Context *context, bool ValidateProgramUniformMatrix4x3fvBase(const Context *context,
ShaderProgramID program, ShaderProgramID program,
UniformLocation location, UniformLocation location,
GLsizei count, GLsizei count,
GLboolean transpose, GLboolean transpose,
const GLfloat *value) const GLfloat *value)
{ {
return ValidateProgramUniformMatrix(context, GL_FLOAT_MAT4x3, program, location, count, return ValidateProgramUniformMatrixBase(context, GL_FLOAT_MAT4x3, program, location, count,
transpose); transpose);
} }
bool ValidateGetTexLevelParameterfv(const Context *context, bool ValidateGetTexLevelParameterfv(const Context *context,
...@@ -1681,39 +1660,22 @@ bool ValidateGetProgramInterfaceivRobustANGLE(const Context *context, ...@@ -1681,39 +1660,22 @@ bool ValidateGetProgramInterfaceivRobustANGLE(const Context *context,
return false; return false;
} }
static bool ValidateGenOrDeleteES31(const Context *context, GLint n) bool ValidateGenProgramPipelinesBase(const Context *context,
GLsizei n,
const ProgramPipelineID *pipelines)
{ {
if (context->getClientVersion() < ES_3_1)
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
return ValidateGenOrDelete(context, n); return ValidateGenOrDelete(context, n);
} }
bool ValidateGenProgramPipelines(const Context *context, bool ValidateDeleteProgramPipelinesBase(const Context *context,
GLsizei n, GLsizei n,
const ProgramPipelineID *pipelines) const ProgramPipelineID *pipelines)
{
return ValidateGenOrDeleteES31(context, n);
}
bool ValidateDeleteProgramPipelines(const Context *context,
GLsizei n,
const ProgramPipelineID *pipelines)
{ {
return ValidateGenOrDeleteES31(context, n); return ValidateGenOrDelete(context, n);
} }
bool ValidateBindProgramPipeline(const Context *context, ProgramPipelineID pipeline) bool ValidateBindProgramPipelineBase(const Context *context, ProgramPipelineID pipeline)
{ {
if (context->getClientVersion() < ES_3_1)
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
if (!context->isProgramPipelineGenerated({pipeline})) if (!context->isProgramPipelineGenerated({pipeline}))
{ {
context->validationError(GL_INVALID_OPERATION, kObjectNotGenerated); context->validationError(GL_INVALID_OPERATION, kObjectNotGenerated);
...@@ -1723,28 +1685,16 @@ bool ValidateBindProgramPipeline(const Context *context, ProgramPipelineID pipel ...@@ -1723,28 +1685,16 @@ bool ValidateBindProgramPipeline(const Context *context, ProgramPipelineID pipel
return true; return true;
} }
bool ValidateIsProgramPipeline(const Context *context, ProgramPipelineID pipeline) bool ValidateIsProgramPipelineBase(const Context *context, ProgramPipelineID pipeline)
{ {
if (context->getClientVersion() < ES_3_1)
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
return true; return true;
} }
bool ValidateUseProgramStages(const Context *context, bool ValidateUseProgramStagesBase(const Context *context,
ProgramPipelineID pipeline, ProgramPipelineID pipeline,
GLbitfield stages, GLbitfield stages,
ShaderProgramID programId) ShaderProgramID programId)
{ {
if (context->getClientVersion() < ES_3_1)
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
// GL_INVALID_VALUE is generated if shaders contains set bits that are not recognized, and is // GL_INVALID_VALUE is generated if shaders contains set bits that are not recognized, and is
// not the reserved value GL_ALL_SHADER_BITS. // not the reserved value GL_ALL_SHADER_BITS.
const GLbitfield knownShaderBits = const GLbitfield knownShaderBits =
...@@ -1801,9 +1751,9 @@ bool ValidateUseProgramStages(const Context *context, ...@@ -1801,9 +1751,9 @@ bool ValidateUseProgramStages(const Context *context,
return true; return true;
} }
bool ValidateActiveShaderProgram(const Context *context, bool ValidateActiveShaderProgramBase(const Context *context,
ProgramPipelineID pipeline, ProgramPipelineID pipeline,
ShaderProgramID programId) ShaderProgramID programId)
{ {
// An INVALID_OPERATION error is generated if pipeline is not a name returned from a previous // An INVALID_OPERATION error is generated if pipeline is not a name returned from a previous
// call to GenProgramPipelines or if such a name has since been deleted by // call to GenProgramPipelines or if such a name has since been deleted by
...@@ -1841,17 +1791,11 @@ bool ValidateActiveShaderProgram(const Context *context, ...@@ -1841,17 +1791,11 @@ bool ValidateActiveShaderProgram(const Context *context,
return true; return true;
} }
bool ValidateCreateShaderProgramv(const Context *context, bool ValidateCreateShaderProgramvBase(const Context *context,
ShaderType type, ShaderType type,
GLsizei count, GLsizei count,
const GLchar *const *strings) const GLchar *const *strings)
{ {
if (context->getClientVersion() < ES_3_1)
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
// GL_INVALID_ENUM is generated if type is not an accepted shader type. // GL_INVALID_ENUM is generated if type is not an accepted shader type.
if ((type != ShaderType::Vertex) && (type != ShaderType::Fragment) && if ((type != ShaderType::Vertex) && (type != ShaderType::Fragment) &&
(type != ShaderType::Compute)) (type != ShaderType::Compute))
...@@ -1870,10 +1814,19 @@ bool ValidateCreateShaderProgramv(const Context *context, ...@@ -1870,10 +1814,19 @@ bool ValidateCreateShaderProgramv(const Context *context,
return true; return true;
} }
bool ValidateGetProgramPipelineiv(const Context *context, bool ValidateCreateShaderProgramvBase(const Context *context,
ProgramPipelineID pipeline, ShaderType type,
GLenum pname, GLsizei count,
const GLint *params) const GLchar **strings)
{
const GLchar *const *tmpStrings = strings;
return ValidateCreateShaderProgramvBase(context, type, count, tmpStrings);
}
bool ValidateGetProgramPipelineivBase(const Context *context,
ProgramPipelineID pipeline,
GLenum pname,
const GLint *params)
{ {
// An INVALID_OPERATION error is generated if pipeline is not a name returned from a previous // An INVALID_OPERATION error is generated if pipeline is not a name returned from a previous
// call to GenProgramPipelines or if such a name has since been deleted by // call to GenProgramPipelines or if such a name has since been deleted by
...@@ -1905,7 +1858,7 @@ bool ValidateGetProgramPipelineiv(const Context *context, ...@@ -1905,7 +1858,7 @@ bool ValidateGetProgramPipelineiv(const Context *context,
return true; return true;
} }
bool ValidateValidateProgramPipeline(const Context *context, ProgramPipelineID pipeline) bool ValidateValidateProgramPipelineBase(const Context *context, ProgramPipelineID pipeline)
{ {
if (pipeline.value == 0) if (pipeline.value == 0)
{ {
...@@ -1921,11 +1874,11 @@ bool ValidateValidateProgramPipeline(const Context *context, ProgramPipelineID p ...@@ -1921,11 +1874,11 @@ bool ValidateValidateProgramPipeline(const Context *context, ProgramPipelineID p
return true; return true;
} }
bool ValidateGetProgramPipelineInfoLog(const Context *context, bool ValidateGetProgramPipelineInfoLogBase(const Context *context,
ProgramPipelineID pipeline, ProgramPipelineID pipeline,
GLsizei bufSize, GLsizei bufSize,
const GLsizei *length, const GLsizei *length,
const GLchar *infoLog) const GLchar *infoLog)
{ {
if (bufSize < 0) if (bufSize < 0)
{ {
...@@ -1942,6 +1895,654 @@ bool ValidateGetProgramPipelineInfoLog(const Context *context, ...@@ -1942,6 +1895,654 @@ bool ValidateGetProgramPipelineInfoLog(const Context *context,
return true; return true;
} }
bool ValidateActiveShaderProgram(const Context *context,
ProgramPipelineID pipelinePacked,
ShaderProgramID programPacked)
{
if (context->getClientVersion() < ES_3_1)
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
return ValidateActiveShaderProgramBase(context, pipelinePacked, programPacked);
}
bool ValidateBindProgramPipeline(const Context *context, ProgramPipelineID pipelinePacked)
{
if (context->getClientVersion() < ES_3_1)
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
return ValidateBindProgramPipelineBase(context, pipelinePacked);
}
bool ValidateCreateShaderProgramv(const Context *context,
ShaderType typePacked,
GLsizei count,
const GLchar *const *strings)
{
if (context->getClientVersion() < ES_3_1)
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
return ValidateCreateShaderProgramvBase(context, typePacked, count, strings);
}
bool ValidateDeleteProgramPipelines(const Context *context,
GLsizei n,
const ProgramPipelineID *pipelinesPacked)
{
if (context->getClientVersion() < ES_3_1)
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
return ValidateDeleteProgramPipelinesBase(context, n, pipelinesPacked);
}
bool ValidateGenProgramPipelines(const Context *context,
GLsizei n,
const ProgramPipelineID *pipelinesPacked)
{
if (context->getClientVersion() < ES_3_1)
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
return ValidateGenProgramPipelinesBase(context, n, pipelinesPacked);
}
bool ValidateGetProgramPipelineInfoLog(const Context *context,
ProgramPipelineID pipelinePacked,
GLsizei bufSize,
const GLsizei *length,
const GLchar *infoLog)
{
if (context->getClientVersion() < ES_3_1)
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
return ValidateGetProgramPipelineInfoLogBase(context, pipelinePacked, bufSize, length, infoLog);
}
bool ValidateGetProgramPipelineiv(const Context *context,
ProgramPipelineID pipelinePacked,
GLenum pname,
const GLint *params)
{
if (context->getClientVersion() < ES_3_1)
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
return ValidateGetProgramPipelineivBase(context, pipelinePacked, pname, params);
}
bool ValidateIsProgramPipeline(const Context *context, ProgramPipelineID pipelinePacked)
{
if (context->getClientVersion() < ES_3_1)
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
return ValidateIsProgramPipelineBase(context, pipelinePacked);
}
bool ValidateProgramUniform1f(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLfloat v0)
{
if (context->getClientVersion() < ES_3_1)
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
return ValidateProgramUniform1fBase(context, programPacked, locationPacked, v0);
}
bool ValidateProgramUniform1fv(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLsizei count,
const GLfloat *value)
{
if (context->getClientVersion() < ES_3_1)
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
return ValidateProgramUniform1fvBase(context, programPacked, locationPacked, count, value);
}
bool ValidateProgramUniform1i(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLint v0)
{
if (context->getClientVersion() < ES_3_1)
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
return ValidateProgramUniform1iBase(context, programPacked, locationPacked, v0);
}
bool ValidateProgramUniform1iv(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLsizei count,
const GLint *value)
{
if (context->getClientVersion() < ES_3_1)
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
return ValidateProgramUniform1ivBase(context, programPacked, locationPacked, count, value);
}
bool ValidateProgramUniform1ui(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLuint v0)
{
if (context->getClientVersion() < ES_3_1)
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
return ValidateProgramUniform1uiBase(context, programPacked, locationPacked, v0);
}
bool ValidateProgramUniform1uiv(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLsizei count,
const GLuint *value)
{
if (context->getClientVersion() < ES_3_1)
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
return ValidateProgramUniform1uivBase(context, programPacked, locationPacked, count, value);
}
bool ValidateProgramUniform2f(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLfloat v0,
GLfloat v1)
{
if (context->getClientVersion() < ES_3_1)
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
return ValidateProgramUniform2fBase(context, programPacked, locationPacked, v0, v1);
}
bool ValidateProgramUniform2fv(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLsizei count,
const GLfloat *value)
{
if (context->getClientVersion() < ES_3_1)
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
return ValidateProgramUniform2fvBase(context, programPacked, locationPacked, count, value);
}
bool ValidateProgramUniform2i(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLint v0,
GLint v1)
{
if (context->getClientVersion() < ES_3_1)
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
return ValidateProgramUniform2iBase(context, programPacked, locationPacked, v0, v1);
}
bool ValidateProgramUniform2iv(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLsizei count,
const GLint *value)
{
if (context->getClientVersion() < ES_3_1)
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
return ValidateProgramUniform2ivBase(context, programPacked, locationPacked, count, value);
}
bool ValidateProgramUniform2ui(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLuint v0,
GLuint v1)
{
if (context->getClientVersion() < ES_3_1)
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
return ValidateProgramUniform2uiBase(context, programPacked, locationPacked, v0, v1);
}
bool ValidateProgramUniform2uiv(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLsizei count,
const GLuint *value)
{
if (context->getClientVersion() < ES_3_1)
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
return ValidateProgramUniform2uivBase(context, programPacked, locationPacked, count, value);
}
bool ValidateProgramUniform3f(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLfloat v0,
GLfloat v1,
GLfloat v2)
{
if (context->getClientVersion() < ES_3_1)
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
return ValidateProgramUniform3fBase(context, programPacked, locationPacked, v0, v1, v2);
}
bool ValidateProgramUniform3fv(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLsizei count,
const GLfloat *value)
{
if (context->getClientVersion() < ES_3_1)
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
return ValidateProgramUniform3fvBase(context, programPacked, locationPacked, count, value);
}
bool ValidateProgramUniform3i(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLint v0,
GLint v1,
GLint v2)
{
if (context->getClientVersion() < ES_3_1)
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
return ValidateProgramUniform3iBase(context, programPacked, locationPacked, v0, v1, v2);
}
bool ValidateProgramUniform3iv(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLsizei count,
const GLint *value)
{
if (context->getClientVersion() < ES_3_1)
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
return ValidateProgramUniform3ivBase(context, programPacked, locationPacked, count, value);
}
bool ValidateProgramUniform3ui(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLuint v0,
GLuint v1,
GLuint v2)
{
if (context->getClientVersion() < ES_3_1)
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
return ValidateProgramUniform3uiBase(context, programPacked, locationPacked, v0, v1, v2);
}
bool ValidateProgramUniform3uiv(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLsizei count,
const GLuint *value)
{
if (context->getClientVersion() < ES_3_1)
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
return ValidateProgramUniform3uivBase(context, programPacked, locationPacked, count, value);
}
bool ValidateProgramUniform4f(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLfloat v0,
GLfloat v1,
GLfloat v2,
GLfloat v3)
{
if (context->getClientVersion() < ES_3_1)
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
return ValidateProgramUniform4fBase(context, programPacked, locationPacked, v0, v1, v2, v3);
}
bool ValidateProgramUniform4fv(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLsizei count,
const GLfloat *value)
{
if (context->getClientVersion() < ES_3_1)
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
return ValidateProgramUniform4fvBase(context, programPacked, locationPacked, count, value);
}
bool ValidateProgramUniform4i(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLint v0,
GLint v1,
GLint v2,
GLint v3)
{
if (context->getClientVersion() < ES_3_1)
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
return ValidateProgramUniform4iBase(context, programPacked, locationPacked, v0, v1, v2, v3);
}
bool ValidateProgramUniform4iv(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLsizei count,
const GLint *value)
{
if (context->getClientVersion() < ES_3_1)
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
return ValidateProgramUniform4ivBase(context, programPacked, locationPacked, count, value);
}
bool ValidateProgramUniform4ui(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLuint v0,
GLuint v1,
GLuint v2,
GLuint v3)
{
if (context->getClientVersion() < ES_3_1)
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
return ValidateProgramUniform4uiBase(context, programPacked, locationPacked, v0, v1, v2, v3);
}
bool ValidateProgramUniform4uiv(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLsizei count,
const GLuint *value)
{
if (context->getClientVersion() < ES_3_1)
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
return ValidateProgramUniform4uivBase(context, programPacked, locationPacked, count, value);
}
bool ValidateProgramUniformMatrix2fv(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLsizei count,
GLboolean transpose,
const GLfloat *value)
{
if (context->getClientVersion() < ES_3_1)
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
return ValidateProgramUniformMatrix2fvBase(context, programPacked, locationPacked, count,
transpose, value);
}
bool ValidateProgramUniformMatrix2x3fv(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLsizei count,
GLboolean transpose,
const GLfloat *value)
{
if (context->getClientVersion() < ES_3_1)
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
return ValidateProgramUniformMatrix2x3fvBase(context, programPacked, locationPacked, count,
transpose, value);
}
bool ValidateProgramUniformMatrix2x4fv(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLsizei count,
GLboolean transpose,
const GLfloat *value)
{
if (context->getClientVersion() < ES_3_1)
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
return ValidateProgramUniformMatrix2x4fvBase(context, programPacked, locationPacked, count,
transpose, value);
}
bool ValidateProgramUniformMatrix3fv(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLsizei count,
GLboolean transpose,
const GLfloat *value)
{
if (context->getClientVersion() < ES_3_1)
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
return ValidateProgramUniformMatrix3fvBase(context, programPacked, locationPacked, count,
transpose, value);
}
bool ValidateProgramUniformMatrix3x2fv(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLsizei count,
GLboolean transpose,
const GLfloat *value)
{
if (context->getClientVersion() < ES_3_1)
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
return ValidateProgramUniformMatrix3x2fvBase(context, programPacked, locationPacked, count,
transpose, value);
}
bool ValidateProgramUniformMatrix3x4fv(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLsizei count,
GLboolean transpose,
const GLfloat *value)
{
if (context->getClientVersion() < ES_3_1)
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
return ValidateProgramUniformMatrix3x4fvBase(context, programPacked, locationPacked, count,
transpose, value);
}
bool ValidateProgramUniformMatrix4fv(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLsizei count,
GLboolean transpose,
const GLfloat *value)
{
if (context->getClientVersion() < ES_3_1)
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
return ValidateProgramUniformMatrix4fvBase(context, programPacked, locationPacked, count,
transpose, value);
}
bool ValidateProgramUniformMatrix4x2fv(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLsizei count,
GLboolean transpose,
const GLfloat *value)
{
if (context->getClientVersion() < ES_3_1)
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
return ValidateProgramUniformMatrix4x2fvBase(context, programPacked, locationPacked, count,
transpose, value);
}
bool ValidateProgramUniformMatrix4x3fv(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLsizei count,
GLboolean transpose,
const GLfloat *value)
{
if (context->getClientVersion() < ES_3_1)
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
return ValidateProgramUniformMatrix4x3fvBase(context, programPacked, locationPacked, count,
transpose, value);
}
bool ValidateUseProgramStages(const Context *context,
ProgramPipelineID pipelinePacked,
GLbitfield stages,
ShaderProgramID programPacked)
{
if (context->getClientVersion() < ES_3_1)
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
return ValidateUseProgramStagesBase(context, pipelinePacked, stages, programPacked);
}
bool ValidateValidateProgramPipeline(const Context *context, ProgramPipelineID pipelinePacked)
{
if (context->getClientVersion() < ES_3_1)
{
context->validationError(GL_INVALID_OPERATION, kES31Required);
return false;
}
return ValidateValidateProgramPipelineBase(context, pipelinePacked);
}
bool ValidateMemoryBarrier(const Context *context, GLbitfield barriers) bool ValidateMemoryBarrier(const Context *context, GLbitfield barriers)
{ {
if (context->getClientVersion() < ES_3_1) if (context->getClientVersion() < ES_3_1)
......
...@@ -26,6 +26,220 @@ bool ValidateTexBufferRangeBase(const Context *context, ...@@ -26,6 +26,220 @@ bool ValidateTexBufferRangeBase(const Context *context,
GLintptr offset, GLintptr offset,
GLsizeiptr size); GLsizeiptr size);
// GL_EXT_separate_shader_objects
bool ValidateActiveShaderProgramBase(const Context *context,
ProgramPipelineID pipelinePacked,
ShaderProgramID programPacked);
bool ValidateBindProgramPipelineBase(const Context *context, ProgramPipelineID pipelinePacked);
bool ValidateCreateShaderProgramvBase(const Context *context,
ShaderType typePacked,
GLsizei count,
const GLchar **strings);
bool ValidateDeleteProgramPipelinesBase(const Context *context,
GLsizei n,
const ProgramPipelineID *pipelinesPacked);
bool ValidateGenProgramPipelinesBase(const Context *context,
GLsizei n,
const ProgramPipelineID *pipelinesPacked);
bool ValidateGetProgramPipelineInfoLogBase(const Context *context,
ProgramPipelineID pipelinePacked,
GLsizei bufSize,
const GLsizei *length,
const GLchar *infoLog);
bool ValidateGetProgramPipelineivBase(const Context *context,
ProgramPipelineID pipelinePacked,
GLenum pname,
const GLint *params);
bool ValidateIsProgramPipelineBase(const Context *context, ProgramPipelineID pipelinePacked);
bool ValidateProgramParameteriBase(const Context *context,
ShaderProgramID programPacked,
GLenum pname,
GLint value);
bool ValidateProgramUniform1fBase(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLfloat v0);
bool ValidateProgramUniform1fvBase(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLsizei count,
const GLfloat *value);
bool ValidateProgramUniform1iBase(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLint v0);
bool ValidateProgramUniform1ivBase(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLsizei count,
const GLint *value);
bool ValidateProgramUniform1uiBase(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLuint v0);
bool ValidateProgramUniform1uivBase(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLsizei count,
const GLuint *value);
bool ValidateProgramUniform2fBase(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLfloat v0,
GLfloat v1);
bool ValidateProgramUniform2fvBase(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLsizei count,
const GLfloat *value);
bool ValidateProgramUniform2iBase(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLint v0,
GLint v1);
bool ValidateProgramUniform2ivBase(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLsizei count,
const GLint *value);
bool ValidateProgramUniform2uiBase(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLuint v0,
GLuint v1);
bool ValidateProgramUniform2uivBase(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLsizei count,
const GLuint *value);
bool ValidateProgramUniform3fBase(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLfloat v0,
GLfloat v1,
GLfloat v2);
bool ValidateProgramUniform3fvBase(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLsizei count,
const GLfloat *value);
bool ValidateProgramUniform3iBase(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLint v0,
GLint v1,
GLint v2);
bool ValidateProgramUniform3ivBase(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLsizei count,
const GLint *value);
bool ValidateProgramUniform3uiBase(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLuint v0,
GLuint v1,
GLuint v2);
bool ValidateProgramUniform3uivBase(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLsizei count,
const GLuint *value);
bool ValidateProgramUniform4fBase(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLfloat v0,
GLfloat v1,
GLfloat v2,
GLfloat v3);
bool ValidateProgramUniform4fvBase(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLsizei count,
const GLfloat *value);
bool ValidateProgramUniform4iBase(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLint v0,
GLint v1,
GLint v2,
GLint v3);
bool ValidateProgramUniform4ivBase(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLsizei count,
const GLint *value);
bool ValidateProgramUniform4uiBase(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLuint v0,
GLuint v1,
GLuint v2,
GLuint v3);
bool ValidateProgramUniform4uivBase(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLsizei count,
const GLuint *value);
bool ValidateProgramUniformMatrix2fvBase(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLsizei count,
GLboolean transpose,
const GLfloat *value);
bool ValidateProgramUniformMatrix2x3fvBase(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLsizei count,
GLboolean transpose,
const GLfloat *value);
bool ValidateProgramUniformMatrix2x4fvBase(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLsizei count,
GLboolean transpose,
const GLfloat *value);
bool ValidateProgramUniformMatrix3fvBase(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLsizei count,
GLboolean transpose,
const GLfloat *value);
bool ValidateProgramUniformMatrix3x2fvBase(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLsizei count,
GLboolean transpose,
const GLfloat *value);
bool ValidateProgramUniformMatrix3x4fvBase(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLsizei count,
GLboolean transpose,
const GLfloat *value);
bool ValidateProgramUniformMatrix4fvBase(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLsizei count,
GLboolean transpose,
const GLfloat *value);
bool ValidateProgramUniformMatrix4x2fvBase(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLsizei count,
GLboolean transpose,
const GLfloat *value);
bool ValidateProgramUniformMatrix4x3fvBase(const Context *context,
ShaderProgramID programPacked,
UniformLocation locationPacked,
GLsizei count,
GLboolean transpose,
const GLfloat *value);
bool ValidateUseProgramStagesBase(const Context *context,
ProgramPipelineID pipelinePacked,
GLbitfield stages,
ShaderProgramID programPacked);
bool ValidateValidateProgramPipelineBase(const Context *context, ProgramPipelineID pipelinePacked);
} // namespace gl } // namespace gl
#endif // LIBANGLE_VALIDATION_ES31_H_ #endif // LIBANGLE_VALIDATION_ES31_H_
...@@ -12,6 +12,8 @@ ...@@ -12,6 +12,8 @@
#include "libANGLE/MemoryObject.h" #include "libANGLE/MemoryObject.h"
#include "libANGLE/validationES.h" #include "libANGLE/validationES.h"
#include "libANGLE/validationES2.h" #include "libANGLE/validationES2.h"
#include "libANGLE/validationES3.h"
#include "libANGLE/validationES31.h"
#include "libANGLE/validationES32.h" #include "libANGLE/validationES32.h"
namespace gl namespace gl
...@@ -1192,14 +1194,24 @@ bool ValidateActiveShaderProgramEXT(const Context *context, ...@@ -1192,14 +1194,24 @@ bool ValidateActiveShaderProgramEXT(const Context *context,
ProgramPipelineID pipelinePacked, ProgramPipelineID pipelinePacked,
ShaderProgramID programPacked) ShaderProgramID programPacked)
{ {
UNIMPLEMENTED(); if (!context->getExtensions().separateShaderObjects)
return false; {
context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
return false;
}
return ValidateActiveShaderProgramBase(context, pipelinePacked, programPacked);
} }
bool ValidateBindProgramPipelineEXT(const Context *context, ProgramPipelineID pipelinePacked) bool ValidateBindProgramPipelineEXT(const Context *context, ProgramPipelineID pipelinePacked)
{ {
UNIMPLEMENTED(); if (!context->getExtensions().separateShaderObjects)
return false; {
context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
return false;
}
return ValidateBindProgramPipelineBase(context, pipelinePacked);
} }
bool ValidateCreateShaderProgramvEXT(const Context *context, bool ValidateCreateShaderProgramvEXT(const Context *context,
...@@ -1207,24 +1219,39 @@ bool ValidateCreateShaderProgramvEXT(const Context *context, ...@@ -1207,24 +1219,39 @@ bool ValidateCreateShaderProgramvEXT(const Context *context,
GLsizei count, GLsizei count,
const GLchar **strings) const GLchar **strings)
{ {
UNIMPLEMENTED(); if (!context->getExtensions().separateShaderObjects)
return false; {
context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
return false;
}
return ValidateCreateShaderProgramvBase(context, typePacked, count, strings);
} }
bool ValidateDeleteProgramPipelinesEXT(const Context *context, bool ValidateDeleteProgramPipelinesEXT(const Context *context,
GLsizei n, GLsizei n,
const ProgramPipelineID *pipelinesPacked) const ProgramPipelineID *pipelinesPacked)
{ {
UNIMPLEMENTED(); if (!context->getExtensions().separateShaderObjects)
return false; {
context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
return false;
}
return ValidateDeleteProgramPipelinesBase(context, n, pipelinesPacked);
} }
bool ValidateGenProgramPipelinesEXT(const Context *context, bool ValidateGenProgramPipelinesEXT(const Context *context,
GLsizei n, GLsizei n,
const ProgramPipelineID *pipelinesPacked) const ProgramPipelineID *pipelinesPacked)
{ {
UNIMPLEMENTED(); if (!context->getExtensions().separateShaderObjects)
return false; {
context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
return false;
}
return ValidateGenProgramPipelinesBase(context, n, pipelinesPacked);
} }
bool ValidateGetProgramPipelineInfoLogEXT(const Context *context, bool ValidateGetProgramPipelineInfoLogEXT(const Context *context,
...@@ -1233,8 +1260,13 @@ bool ValidateGetProgramPipelineInfoLogEXT(const Context *context, ...@@ -1233,8 +1260,13 @@ bool ValidateGetProgramPipelineInfoLogEXT(const Context *context,
const GLsizei *length, const GLsizei *length,
const GLchar *infoLog) const GLchar *infoLog)
{ {
UNIMPLEMENTED(); if (!context->getExtensions().separateShaderObjects)
return false; {
context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
return false;
}
return ValidateGetProgramPipelineInfoLogBase(context, pipelinePacked, bufSize, length, infoLog);
} }
bool ValidateGetProgramPipelineivEXT(const Context *context, bool ValidateGetProgramPipelineivEXT(const Context *context,
...@@ -1242,14 +1274,24 @@ bool ValidateGetProgramPipelineivEXT(const Context *context, ...@@ -1242,14 +1274,24 @@ bool ValidateGetProgramPipelineivEXT(const Context *context,
GLenum pname, GLenum pname,
const GLint *params) const GLint *params)
{ {
UNIMPLEMENTED(); if (!context->getExtensions().separateShaderObjects)
return false; {
context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
return false;
}
return ValidateGetProgramPipelineivBase(context, pipelinePacked, pname, params);
} }
bool ValidateIsProgramPipelineEXT(const Context *context, ProgramPipelineID pipelinePacked) bool ValidateIsProgramPipelineEXT(const Context *context, ProgramPipelineID pipelinePacked)
{ {
UNIMPLEMENTED(); if (!context->getExtensions().separateShaderObjects)
return false; {
context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
return false;
}
return ValidateIsProgramPipelineBase(context, pipelinePacked);
} }
bool ValidateProgramParameteriEXT(const Context *context, bool ValidateProgramParameteriEXT(const Context *context,
...@@ -1257,8 +1299,13 @@ bool ValidateProgramParameteriEXT(const Context *context, ...@@ -1257,8 +1299,13 @@ bool ValidateProgramParameteriEXT(const Context *context,
GLenum pname, GLenum pname,
GLint value) GLint value)
{ {
UNIMPLEMENTED(); if (!context->getExtensions().separateShaderObjects)
return false; {
context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
return false;
}
return ValidateProgramParameteriBase(context, programPacked, pname, value);
} }
bool ValidateProgramUniform1fEXT(const Context *context, bool ValidateProgramUniform1fEXT(const Context *context,
...@@ -1266,8 +1313,13 @@ bool ValidateProgramUniform1fEXT(const Context *context, ...@@ -1266,8 +1313,13 @@ bool ValidateProgramUniform1fEXT(const Context *context,
UniformLocation locationPacked, UniformLocation locationPacked,
GLfloat v0) GLfloat v0)
{ {
UNIMPLEMENTED(); if (!context->getExtensions().separateShaderObjects)
return false; {
context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
return false;
}
return ValidateProgramUniform1fBase(context, programPacked, locationPacked, v0);
} }
bool ValidateProgramUniform1fvEXT(const Context *context, bool ValidateProgramUniform1fvEXT(const Context *context,
...@@ -1276,8 +1328,13 @@ bool ValidateProgramUniform1fvEXT(const Context *context, ...@@ -1276,8 +1328,13 @@ bool ValidateProgramUniform1fvEXT(const Context *context,
GLsizei count, GLsizei count,
const GLfloat *value) const GLfloat *value)
{ {
UNIMPLEMENTED(); if (!context->getExtensions().separateShaderObjects)
return false; {
context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
return false;
}
return ValidateProgramUniform1fvBase(context, programPacked, locationPacked, count, value);
} }
bool ValidateProgramUniform1iEXT(const Context *context, bool ValidateProgramUniform1iEXT(const Context *context,
...@@ -1285,8 +1342,13 @@ bool ValidateProgramUniform1iEXT(const Context *context, ...@@ -1285,8 +1342,13 @@ bool ValidateProgramUniform1iEXT(const Context *context,
UniformLocation locationPacked, UniformLocation locationPacked,
GLint v0) GLint v0)
{ {
UNIMPLEMENTED(); if (!context->getExtensions().separateShaderObjects)
return false; {
context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
return false;
}
return ValidateProgramUniform1iBase(context, programPacked, locationPacked, v0);
} }
bool ValidateProgramUniform1ivEXT(const Context *context, bool ValidateProgramUniform1ivEXT(const Context *context,
...@@ -1295,8 +1357,13 @@ bool ValidateProgramUniform1ivEXT(const Context *context, ...@@ -1295,8 +1357,13 @@ bool ValidateProgramUniform1ivEXT(const Context *context,
GLsizei count, GLsizei count,
const GLint *value) const GLint *value)
{ {
UNIMPLEMENTED(); if (!context->getExtensions().separateShaderObjects)
return false; {
context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
return false;
}
return ValidateProgramUniform1ivBase(context, programPacked, locationPacked, count, value);
} }
bool ValidateProgramUniform1uiEXT(const Context *context, bool ValidateProgramUniform1uiEXT(const Context *context,
...@@ -1304,8 +1371,13 @@ bool ValidateProgramUniform1uiEXT(const Context *context, ...@@ -1304,8 +1371,13 @@ bool ValidateProgramUniform1uiEXT(const Context *context,
UniformLocation locationPacked, UniformLocation locationPacked,
GLuint v0) GLuint v0)
{ {
UNIMPLEMENTED(); if (!context->getExtensions().separateShaderObjects)
return false; {
context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
return false;
}
return ValidateProgramUniform1uiBase(context, programPacked, locationPacked, v0);
} }
bool ValidateProgramUniform1uivEXT(const Context *context, bool ValidateProgramUniform1uivEXT(const Context *context,
...@@ -1314,8 +1386,13 @@ bool ValidateProgramUniform1uivEXT(const Context *context, ...@@ -1314,8 +1386,13 @@ bool ValidateProgramUniform1uivEXT(const Context *context,
GLsizei count, GLsizei count,
const GLuint *value) const GLuint *value)
{ {
UNIMPLEMENTED(); if (!context->getExtensions().separateShaderObjects)
return false; {
context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
return false;
}
return ValidateProgramUniform1uivBase(context, programPacked, locationPacked, count, value);
} }
bool ValidateProgramUniform2fEXT(const Context *context, bool ValidateProgramUniform2fEXT(const Context *context,
...@@ -1324,8 +1401,13 @@ bool ValidateProgramUniform2fEXT(const Context *context, ...@@ -1324,8 +1401,13 @@ bool ValidateProgramUniform2fEXT(const Context *context,
GLfloat v0, GLfloat v0,
GLfloat v1) GLfloat v1)
{ {
UNIMPLEMENTED(); if (!context->getExtensions().separateShaderObjects)
return false; {
context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
return false;
}
return ValidateProgramUniform2fBase(context, programPacked, locationPacked, v0, v1);
} }
bool ValidateProgramUniform2fvEXT(const Context *context, bool ValidateProgramUniform2fvEXT(const Context *context,
...@@ -1334,8 +1416,13 @@ bool ValidateProgramUniform2fvEXT(const Context *context, ...@@ -1334,8 +1416,13 @@ bool ValidateProgramUniform2fvEXT(const Context *context,
GLsizei count, GLsizei count,
const GLfloat *value) const GLfloat *value)
{ {
UNIMPLEMENTED(); if (!context->getExtensions().separateShaderObjects)
return false; {
context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
return false;
}
return ValidateProgramUniform2fvBase(context, programPacked, locationPacked, count, value);
} }
bool ValidateProgramUniform2iEXT(const Context *context, bool ValidateProgramUniform2iEXT(const Context *context,
...@@ -1344,8 +1431,13 @@ bool ValidateProgramUniform2iEXT(const Context *context, ...@@ -1344,8 +1431,13 @@ bool ValidateProgramUniform2iEXT(const Context *context,
GLint v0, GLint v0,
GLint v1) GLint v1)
{ {
UNIMPLEMENTED(); if (!context->getExtensions().separateShaderObjects)
return false; {
context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
return false;
}
return ValidateProgramUniform2iBase(context, programPacked, locationPacked, v0, v1);
} }
bool ValidateProgramUniform2ivEXT(const Context *context, bool ValidateProgramUniform2ivEXT(const Context *context,
...@@ -1354,8 +1446,13 @@ bool ValidateProgramUniform2ivEXT(const Context *context, ...@@ -1354,8 +1446,13 @@ bool ValidateProgramUniform2ivEXT(const Context *context,
GLsizei count, GLsizei count,
const GLint *value) const GLint *value)
{ {
UNIMPLEMENTED(); if (!context->getExtensions().separateShaderObjects)
return false; {
context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
return false;
}
return ValidateProgramUniform2ivBase(context, programPacked, locationPacked, count, value);
} }
bool ValidateProgramUniform2uiEXT(const Context *context, bool ValidateProgramUniform2uiEXT(const Context *context,
...@@ -1364,8 +1461,13 @@ bool ValidateProgramUniform2uiEXT(const Context *context, ...@@ -1364,8 +1461,13 @@ bool ValidateProgramUniform2uiEXT(const Context *context,
GLuint v0, GLuint v0,
GLuint v1) GLuint v1)
{ {
UNIMPLEMENTED(); if (!context->getExtensions().separateShaderObjects)
return false; {
context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
return false;
}
return ValidateProgramUniform2uiBase(context, programPacked, locationPacked, v0, v1);
} }
bool ValidateProgramUniform2uivEXT(const Context *context, bool ValidateProgramUniform2uivEXT(const Context *context,
...@@ -1374,8 +1476,13 @@ bool ValidateProgramUniform2uivEXT(const Context *context, ...@@ -1374,8 +1476,13 @@ bool ValidateProgramUniform2uivEXT(const Context *context,
GLsizei count, GLsizei count,
const GLuint *value) const GLuint *value)
{ {
UNIMPLEMENTED(); if (!context->getExtensions().separateShaderObjects)
return false; {
context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
return false;
}
return ValidateProgramUniform2uivBase(context, programPacked, locationPacked, count, value);
} }
bool ValidateProgramUniform3fEXT(const Context *context, bool ValidateProgramUniform3fEXT(const Context *context,
...@@ -1385,8 +1492,13 @@ bool ValidateProgramUniform3fEXT(const Context *context, ...@@ -1385,8 +1492,13 @@ bool ValidateProgramUniform3fEXT(const Context *context,
GLfloat v1, GLfloat v1,
GLfloat v2) GLfloat v2)
{ {
UNIMPLEMENTED(); if (!context->getExtensions().separateShaderObjects)
return false; {
context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
return false;
}
return ValidateProgramUniform3fBase(context, programPacked, locationPacked, v0, v1, v2);
} }
bool ValidateProgramUniform3fvEXT(const Context *context, bool ValidateProgramUniform3fvEXT(const Context *context,
...@@ -1395,8 +1507,13 @@ bool ValidateProgramUniform3fvEXT(const Context *context, ...@@ -1395,8 +1507,13 @@ bool ValidateProgramUniform3fvEXT(const Context *context,
GLsizei count, GLsizei count,
const GLfloat *value) const GLfloat *value)
{ {
UNIMPLEMENTED(); if (!context->getExtensions().separateShaderObjects)
return false; {
context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
return false;
}
return ValidateProgramUniform3fvBase(context, programPacked, locationPacked, count, value);
} }
bool ValidateProgramUniform3iEXT(const Context *context, bool ValidateProgramUniform3iEXT(const Context *context,
...@@ -1406,8 +1523,13 @@ bool ValidateProgramUniform3iEXT(const Context *context, ...@@ -1406,8 +1523,13 @@ bool ValidateProgramUniform3iEXT(const Context *context,
GLint v1, GLint v1,
GLint v2) GLint v2)
{ {
UNIMPLEMENTED(); if (!context->getExtensions().separateShaderObjects)
return false; {
context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
return false;
}
return ValidateProgramUniform3iBase(context, programPacked, locationPacked, v0, v1, v2);
} }
bool ValidateProgramUniform3ivEXT(const Context *context, bool ValidateProgramUniform3ivEXT(const Context *context,
...@@ -1416,8 +1538,13 @@ bool ValidateProgramUniform3ivEXT(const Context *context, ...@@ -1416,8 +1538,13 @@ bool ValidateProgramUniform3ivEXT(const Context *context,
GLsizei count, GLsizei count,
const GLint *value) const GLint *value)
{ {
UNIMPLEMENTED(); if (!context->getExtensions().separateShaderObjects)
return false; {
context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
return false;
}
return ValidateProgramUniform3ivBase(context, programPacked, locationPacked, count, value);
} }
bool ValidateProgramUniform3uiEXT(const Context *context, bool ValidateProgramUniform3uiEXT(const Context *context,
...@@ -1427,8 +1554,13 @@ bool ValidateProgramUniform3uiEXT(const Context *context, ...@@ -1427,8 +1554,13 @@ bool ValidateProgramUniform3uiEXT(const Context *context,
GLuint v1, GLuint v1,
GLuint v2) GLuint v2)
{ {
UNIMPLEMENTED(); if (!context->getExtensions().separateShaderObjects)
return false; {
context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
return false;
}
return ValidateProgramUniform3uiBase(context, programPacked, locationPacked, v0, v1, v2);
} }
bool ValidateProgramUniform3uivEXT(const Context *context, bool ValidateProgramUniform3uivEXT(const Context *context,
...@@ -1437,8 +1569,13 @@ bool ValidateProgramUniform3uivEXT(const Context *context, ...@@ -1437,8 +1569,13 @@ bool ValidateProgramUniform3uivEXT(const Context *context,
GLsizei count, GLsizei count,
const GLuint *value) const GLuint *value)
{ {
UNIMPLEMENTED(); if (!context->getExtensions().separateShaderObjects)
return false; {
context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
return false;
}
return ValidateProgramUniform3uivBase(context, programPacked, locationPacked, count, value);
} }
bool ValidateProgramUniform4fEXT(const Context *context, bool ValidateProgramUniform4fEXT(const Context *context,
...@@ -1449,8 +1586,13 @@ bool ValidateProgramUniform4fEXT(const Context *context, ...@@ -1449,8 +1586,13 @@ bool ValidateProgramUniform4fEXT(const Context *context,
GLfloat v2, GLfloat v2,
GLfloat v3) GLfloat v3)
{ {
UNIMPLEMENTED(); if (!context->getExtensions().separateShaderObjects)
return false; {
context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
return false;
}
return ValidateProgramUniform4fBase(context, programPacked, locationPacked, v0, v1, v2, v3);
} }
bool ValidateProgramUniform4fvEXT(const Context *context, bool ValidateProgramUniform4fvEXT(const Context *context,
...@@ -1459,8 +1601,13 @@ bool ValidateProgramUniform4fvEXT(const Context *context, ...@@ -1459,8 +1601,13 @@ bool ValidateProgramUniform4fvEXT(const Context *context,
GLsizei count, GLsizei count,
const GLfloat *value) const GLfloat *value)
{ {
UNIMPLEMENTED(); if (!context->getExtensions().separateShaderObjects)
return false; {
context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
return false;
}
return ValidateProgramUniform4fvBase(context, programPacked, locationPacked, count, value);
} }
bool ValidateProgramUniform4iEXT(const Context *context, bool ValidateProgramUniform4iEXT(const Context *context,
...@@ -1471,8 +1618,13 @@ bool ValidateProgramUniform4iEXT(const Context *context, ...@@ -1471,8 +1618,13 @@ bool ValidateProgramUniform4iEXT(const Context *context,
GLint v2, GLint v2,
GLint v3) GLint v3)
{ {
UNIMPLEMENTED(); if (!context->getExtensions().separateShaderObjects)
return false; {
context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
return false;
}
return ValidateProgramUniform4iBase(context, programPacked, locationPacked, v0, v1, v2, v3);
} }
bool ValidateProgramUniform4ivEXT(const Context *context, bool ValidateProgramUniform4ivEXT(const Context *context,
...@@ -1481,8 +1633,7 @@ bool ValidateProgramUniform4ivEXT(const Context *context, ...@@ -1481,8 +1633,7 @@ bool ValidateProgramUniform4ivEXT(const Context *context,
GLsizei count, GLsizei count,
const GLint *value) const GLint *value)
{ {
UNIMPLEMENTED(); return ValidateProgramUniform4ivBase(context, programPacked, locationPacked, count, value);
return false;
} }
bool ValidateProgramUniform4uiEXT(const Context *context, bool ValidateProgramUniform4uiEXT(const Context *context,
...@@ -1493,8 +1644,13 @@ bool ValidateProgramUniform4uiEXT(const Context *context, ...@@ -1493,8 +1644,13 @@ bool ValidateProgramUniform4uiEXT(const Context *context,
GLuint v2, GLuint v2,
GLuint v3) GLuint v3)
{ {
UNIMPLEMENTED(); if (!context->getExtensions().separateShaderObjects)
return false; {
context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
return false;
}
return ValidateProgramUniform4uiBase(context, programPacked, locationPacked, v0, v1, v2, v3);
} }
bool ValidateProgramUniform4uivEXT(const Context *context, bool ValidateProgramUniform4uivEXT(const Context *context,
...@@ -1503,8 +1659,7 @@ bool ValidateProgramUniform4uivEXT(const Context *context, ...@@ -1503,8 +1659,7 @@ bool ValidateProgramUniform4uivEXT(const Context *context,
GLsizei count, GLsizei count,
const GLuint *value) const GLuint *value)
{ {
UNIMPLEMENTED(); return ValidateProgramUniform4uivBase(context, programPacked, locationPacked, count, value);
return false;
} }
bool ValidateProgramUniformMatrix2fvEXT(const Context *context, bool ValidateProgramUniformMatrix2fvEXT(const Context *context,
...@@ -1514,8 +1669,14 @@ bool ValidateProgramUniformMatrix2fvEXT(const Context *context, ...@@ -1514,8 +1669,14 @@ bool ValidateProgramUniformMatrix2fvEXT(const Context *context,
GLboolean transpose, GLboolean transpose,
const GLfloat *value) const GLfloat *value)
{ {
UNIMPLEMENTED(); if (!context->getExtensions().separateShaderObjects)
return false; {
context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
return false;
}
return ValidateProgramUniformMatrix2fvBase(context, programPacked, locationPacked, count,
transpose, value);
} }
bool ValidateProgramUniformMatrix2x3fvEXT(const Context *context, bool ValidateProgramUniformMatrix2x3fvEXT(const Context *context,
...@@ -1525,8 +1686,14 @@ bool ValidateProgramUniformMatrix2x3fvEXT(const Context *context, ...@@ -1525,8 +1686,14 @@ bool ValidateProgramUniformMatrix2x3fvEXT(const Context *context,
GLboolean transpose, GLboolean transpose,
const GLfloat *value) const GLfloat *value)
{ {
UNIMPLEMENTED(); if (!context->getExtensions().separateShaderObjects)
return false; {
context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
return false;
}
return ValidateProgramUniformMatrix2x3fvBase(context, programPacked, locationPacked, count,
transpose, value);
} }
bool ValidateProgramUniformMatrix2x4fvEXT(const Context *context, bool ValidateProgramUniformMatrix2x4fvEXT(const Context *context,
...@@ -1536,8 +1703,14 @@ bool ValidateProgramUniformMatrix2x4fvEXT(const Context *context, ...@@ -1536,8 +1703,14 @@ bool ValidateProgramUniformMatrix2x4fvEXT(const Context *context,
GLboolean transpose, GLboolean transpose,
const GLfloat *value) const GLfloat *value)
{ {
UNIMPLEMENTED(); if (!context->getExtensions().separateShaderObjects)
return false; {
context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
return false;
}
return ValidateProgramUniformMatrix2x4fvBase(context, programPacked, locationPacked, count,
transpose, value);
} }
bool ValidateProgramUniformMatrix3fvEXT(const Context *context, bool ValidateProgramUniformMatrix3fvEXT(const Context *context,
...@@ -1547,8 +1720,14 @@ bool ValidateProgramUniformMatrix3fvEXT(const Context *context, ...@@ -1547,8 +1720,14 @@ bool ValidateProgramUniformMatrix3fvEXT(const Context *context,
GLboolean transpose, GLboolean transpose,
const GLfloat *value) const GLfloat *value)
{ {
UNIMPLEMENTED(); if (!context->getExtensions().separateShaderObjects)
return false; {
context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
return false;
}
return ValidateProgramUniformMatrix3fvBase(context, programPacked, locationPacked, count,
transpose, value);
} }
bool ValidateProgramUniformMatrix3x2fvEXT(const Context *context, bool ValidateProgramUniformMatrix3x2fvEXT(const Context *context,
...@@ -1558,8 +1737,14 @@ bool ValidateProgramUniformMatrix3x2fvEXT(const Context *context, ...@@ -1558,8 +1737,14 @@ bool ValidateProgramUniformMatrix3x2fvEXT(const Context *context,
GLboolean transpose, GLboolean transpose,
const GLfloat *value) const GLfloat *value)
{ {
UNIMPLEMENTED(); if (!context->getExtensions().separateShaderObjects)
return false; {
context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
return false;
}
return ValidateProgramUniformMatrix3x2fvBase(context, programPacked, locationPacked, count,
transpose, value);
} }
bool ValidateProgramUniformMatrix3x4fvEXT(const Context *context, bool ValidateProgramUniformMatrix3x4fvEXT(const Context *context,
...@@ -1569,8 +1754,14 @@ bool ValidateProgramUniformMatrix3x4fvEXT(const Context *context, ...@@ -1569,8 +1754,14 @@ bool ValidateProgramUniformMatrix3x4fvEXT(const Context *context,
GLboolean transpose, GLboolean transpose,
const GLfloat *value) const GLfloat *value)
{ {
UNIMPLEMENTED(); if (!context->getExtensions().separateShaderObjects)
return false; {
context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
return false;
}
return ValidateProgramUniformMatrix3x4fvBase(context, programPacked, locationPacked, count,
transpose, value);
} }
bool ValidateProgramUniformMatrix4fvEXT(const Context *context, bool ValidateProgramUniformMatrix4fvEXT(const Context *context,
...@@ -1580,8 +1771,14 @@ bool ValidateProgramUniformMatrix4fvEXT(const Context *context, ...@@ -1580,8 +1771,14 @@ bool ValidateProgramUniformMatrix4fvEXT(const Context *context,
GLboolean transpose, GLboolean transpose,
const GLfloat *value) const GLfloat *value)
{ {
UNIMPLEMENTED(); if (!context->getExtensions().separateShaderObjects)
return false; {
context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
return false;
}
return ValidateProgramUniformMatrix4fvBase(context, programPacked, locationPacked, count,
transpose, value);
} }
bool ValidateProgramUniformMatrix4x2fvEXT(const Context *context, bool ValidateProgramUniformMatrix4x2fvEXT(const Context *context,
...@@ -1591,8 +1788,14 @@ bool ValidateProgramUniformMatrix4x2fvEXT(const Context *context, ...@@ -1591,8 +1788,14 @@ bool ValidateProgramUniformMatrix4x2fvEXT(const Context *context,
GLboolean transpose, GLboolean transpose,
const GLfloat *value) const GLfloat *value)
{ {
UNIMPLEMENTED(); if (!context->getExtensions().separateShaderObjects)
return false; {
context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
return false;
}
return ValidateProgramUniformMatrix4x2fvBase(context, programPacked, locationPacked, count,
transpose, value);
} }
bool ValidateProgramUniformMatrix4x3fvEXT(const Context *context, bool ValidateProgramUniformMatrix4x3fvEXT(const Context *context,
...@@ -1602,8 +1805,14 @@ bool ValidateProgramUniformMatrix4x3fvEXT(const Context *context, ...@@ -1602,8 +1805,14 @@ bool ValidateProgramUniformMatrix4x3fvEXT(const Context *context,
GLboolean transpose, GLboolean transpose,
const GLfloat *value) const GLfloat *value)
{ {
UNIMPLEMENTED(); if (!context->getExtensions().separateShaderObjects)
return false; {
context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
return false;
}
return ValidateProgramUniformMatrix4x3fvBase(context, programPacked, locationPacked, count,
transpose, value);
} }
bool ValidateUseProgramStagesEXT(const Context *context, bool ValidateUseProgramStagesEXT(const Context *context,
...@@ -1611,13 +1820,23 @@ bool ValidateUseProgramStagesEXT(const Context *context, ...@@ -1611,13 +1820,23 @@ bool ValidateUseProgramStagesEXT(const Context *context,
GLbitfield stages, GLbitfield stages,
ShaderProgramID programPacked) ShaderProgramID programPacked)
{ {
UNIMPLEMENTED(); if (!context->getExtensions().separateShaderObjects)
return false; {
context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
return false;
}
return ValidateUseProgramStagesBase(context, pipelinePacked, stages, programPacked);
} }
bool ValidateValidateProgramPipelineEXT(const Context *context, ProgramPipelineID pipelinePacked) bool ValidateValidateProgramPipelineEXT(const Context *context, ProgramPipelineID pipelinePacked)
{ {
UNIMPLEMENTED(); if (!context->getExtensions().separateShaderObjects)
return false; {
context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
return false;
}
return ValidateValidateProgramPipelineBase(context, pipelinePacked);
} }
} // namespace gl } // namespace gl
...@@ -49,6 +49,24 @@ TEST_P(ProgramPipelineTest, GenerateProgramPipelineObject) ...@@ -49,6 +49,24 @@ TEST_P(ProgramPipelineTest, GenerateProgramPipelineObject)
} }
} }
// Verify that program pipeline errors out without GL_EXT_separate_shader_objects extension.
TEST_P(ProgramPipelineTest, GenerateProgramPipelineObjectEXT)
{
GLuint pipeline;
glGenProgramPipelinesEXT(1, &pipeline);
if (!IsGLExtensionEnabled("GL_EXT_separate_shader_objects"))
{
EXPECT_GL_ERROR(GL_INVALID_OPERATION);
}
else
{
EXPECT_GL_NO_ERROR();
glDeleteProgramPipelinesEXT(1, &pipeline);
EXPECT_GL_NO_ERROR();
}
}
class ProgramPipelineTest31 : public ProgramPipelineTest class ProgramPipelineTest31 : public ProgramPipelineTest
{ {
protected: protected:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment