Fix buffer mapping validation and refactor entry points
Checks for extension support are added to GetBufferPointervOES,
mapBufferOES, unmapBufferOES, mapBufferRangeEXT and
flushMappedBufferRangeEXT.
The GetBufferPointerv function now checks if state is queried from
buffer object zero.
The code is also refactored so that validation happens in separate
validation functions and the implementations are in Context functions.
BUG=angleproject:1101
TEST=dEQP-GLES3.functional.negative_api.state.get_buffer_pointerv
dEQP-GLES3.functional.*buffer*map* (no regression)
Change-Id: I0f439abd12c92c51324f2e5a31bf621f61534306
Reviewed-on: https://chromium-review.googlesource.com/336164
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
diff --git a/src/libANGLE/Context.cpp b/src/libANGLE/Context.cpp
index d0a1bdb..24548dc 100644
--- a/src/libANGLE/Context.cpp
+++ b/src/libANGLE/Context.cpp
@@ -2684,6 +2684,75 @@
}
}
+void Context::getBufferPointerv(GLenum target, GLenum /*pname*/, void **params)
+{
+ Buffer *buffer = getState().getTargetBuffer(target);
+ ASSERT(buffer);
+
+ if (!buffer->isMapped())
+ {
+ *params = nullptr;
+ }
+ else
+ {
+ *params = buffer->getMapPointer();
+ }
+}
+
+GLvoid *Context::mapBuffer(GLenum target, GLenum access)
+{
+ Buffer *buffer = getState().getTargetBuffer(target);
+ ASSERT(buffer);
+
+ Error error = buffer->map(access);
+ if (error.isError())
+ {
+ recordError(error);
+ return nullptr;
+ }
+
+ return buffer->getMapPointer();
+}
+
+GLboolean Context::unmapBuffer(GLenum target)
+{
+ Buffer *buffer = getState().getTargetBuffer(target);
+ ASSERT(buffer);
+
+ GLboolean result;
+ Error error = buffer->unmap(&result);
+ if (error.isError())
+ {
+ recordError(error);
+ return GL_FALSE;
+ }
+
+ return result;
+}
+
+GLvoid *Context::mapBufferRange(GLenum target,
+ GLintptr offset,
+ GLsizeiptr length,
+ GLbitfield access)
+{
+ Buffer *buffer = getState().getTargetBuffer(target);
+ ASSERT(buffer);
+
+ Error error = buffer->mapRange(offset, length, access);
+ if (error.isError())
+ {
+ recordError(error);
+ return nullptr;
+ }
+
+ return buffer->getMapPointer();
+}
+
+void Context::flushMappedBufferRange(GLenum /*target*/, GLintptr /*offset*/, GLsizeiptr /*length*/)
+{
+ // We do not currently support a non-trivial implementation of FlushMappedBufferRange
+}
+
void Context::syncStateForReadPixels()
{
syncRendererState(mReadPixelsDirtyBits, mReadPixelsDirtyObjects);