ES31: Implement Vertex Attrib Binding entry points
This patch intends to implement all entry points related to Vertex
Attrib Binding.
(1) Add entry points and validation code on following APIs:
- VertexAttribFormat
- VertexAttribIFormat
- VertexAttribBinding
- BindVertexBuffer
- VertexBindingDivisor
(2) Add queries on following parameters:
- VERTEX_ATTRIB_BINDING
- VERTEX_ATTRIB_RELATIVE_OFFSET
- VERTEX_BINDING_DIVISOR
- VERTEX_BINDING_OFFSET
- VERTEX_BINDING_STRIDE
- VERTEX_BINDING_BUFFER
BUG=angleproject:1593
TEST=angle_end2end_tests
TEST=angle_unittests
TEST=dEQP-GLES31.functional.state_query.integer.max_vertex_attrib_relative_offset_*
TEST=dEQP-GLES31.functional.state_query.integer.max_vertex_attrib_bindings_*
TEST=dEQP-GLES31.functional.state_query.integer.max_vertex_attrib_stride_*
TEST=dEQP-GLES31.functional.state_query.vertex_attribute_binding.*
TEST=dEQP-GLES31.functional.debug.negative_coverage.log.vertex_array.vertex_attrib_pointer
TEST=dEQP-GLES31.functional.debug.negative_coverage.get_error.vertex_array.vertex_attrib_format
TEST=dEQP-GLES31.functional.debug.negative_coverage.get_error.vertex_array.vertex_attrib_i_format
Change-Id: I4b477a82df6aad89b89b088580a06d66963e6666
Reviewed-on: https://chromium-review.googlesource.com/446124
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
diff --git a/src/libANGLE/validationES.cpp b/src/libANGLE/validationES.cpp
index 705e170..be6c72a 100644
--- a/src/libANGLE/validationES.cpp
+++ b/src/libANGLE/validationES.cpp
@@ -1111,7 +1111,18 @@
case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
if (context->getClientMajorVersion() < 3)
{
- context->handleError(Error(GL_INVALID_ENUM, "pname requires OpenGL ES 3.0."));
+ context->handleError(Error(
+ GL_INVALID_ENUM, "GL_VERTEX_ATTRIB_ARRAY_INTEGER requires OpenGL ES 3.0."));
+ return false;
+ }
+ break;
+
+ case GL_VERTEX_ATTRIB_BINDING:
+ case GL_VERTEX_ATTRIB_RELATIVE_OFFSET:
+ if (context->getClientVersion() < ES_3_1)
+ {
+ context->handleError(
+ Error(GL_INVALID_ENUM, "Vertex Attrib Bindings require OpenGL ES 3.1."));
return false;
}
break;
@@ -5735,4 +5746,94 @@
return true;
}
+bool ValidateVertexFormatBase(ValidationContext *context,
+ GLuint attribIndex,
+ GLint size,
+ GLenum type,
+ GLboolean pureInteger)
+{
+ const Caps &caps = context->getCaps();
+ if (attribIndex >= caps.maxVertexAttributes)
+ {
+ context->handleError(
+ Error(GL_INVALID_VALUE, "attribindex must be smaller than MAX_VERTEX_ATTRIBS."));
+ return false;
+ }
+
+ if (size < 1 || size > 4)
+ {
+ context->handleError(Error(GL_INVALID_VALUE, "size must be between one and four."));
+ }
+
+ switch (type)
+ {
+ case GL_BYTE:
+ case GL_UNSIGNED_BYTE:
+ case GL_SHORT:
+ case GL_UNSIGNED_SHORT:
+ break;
+
+ case GL_INT:
+ case GL_UNSIGNED_INT:
+ if (context->getClientMajorVersion() < 3)
+ {
+ context->handleError(
+ Error(GL_INVALID_ENUM, "Vertex type not supported before OpenGL ES 3.0."));
+ return false;
+ }
+ break;
+
+ case GL_FIXED:
+ case GL_FLOAT:
+ if (pureInteger)
+ {
+ context->handleError(Error(GL_INVALID_ENUM, "Type is not integer."));
+ return false;
+ }
+ break;
+
+ case GL_HALF_FLOAT:
+ if (context->getClientMajorVersion() < 3)
+ {
+ context->handleError(
+ Error(GL_INVALID_ENUM, "Vertex type not supported before OpenGL ES 3.0."));
+ return false;
+ }
+ if (pureInteger)
+ {
+ context->handleError(Error(GL_INVALID_ENUM, "Type is not integer."));
+ return false;
+ }
+ break;
+
+ case GL_INT_2_10_10_10_REV:
+ case GL_UNSIGNED_INT_2_10_10_10_REV:
+ if (context->getClientMajorVersion() < 3)
+ {
+ context->handleError(
+ Error(GL_INVALID_ENUM, "Vertex type not supported before OpenGL ES 3.0."));
+ return false;
+ }
+ if (pureInteger)
+ {
+ context->handleError(Error(GL_INVALID_ENUM, "Type is not integer."));
+ return false;
+ }
+ if (size != 4)
+ {
+ context->handleError(Error(GL_INVALID_OPERATION,
+ "Type is INT_2_10_10_10_REV or "
+ "UNSIGNED_INT_2_10_10_10_REV and size is not 4."));
+ return false;
+ }
+ break;
+
+ default:
+ context->handleError(Error(GL_INVALID_ENUM, "Invalid vertex type."));
+ return false;
+ }
+
+ return true;
+}
+
} // namespace gl