ES31: Add GL_ATOMIC_COUNTER_BUFFER_BINDING binding point
BUG=angleproject:1729
TEST=dEQP-GLES31.functional.state_query.integer.atomic_counter*
dEQP-GLES31.functional.state_query.indexed.atomic_counter*
angle_end2end_tests:AtomicCounterBufferTest
Change-Id: I059c4e22e04cedec9134ec9f631de33f77b1fbe2
Reviewed-on: https://chromium-review.googlesource.com/430959
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libANGLE/Context.cpp b/src/libANGLE/Context.cpp
index eb33586..89e0b04 100644
--- a/src/libANGLE/Context.cpp
+++ b/src/libANGLE/Context.cpp
@@ -308,6 +308,12 @@
Texture *zeroTexture2DMultisample =
new Texture(mImplementation.get(), 0, GL_TEXTURE_2D_MULTISAMPLE);
mZeroTextures[GL_TEXTURE_2D_MULTISAMPLE].set(zeroTexture2DMultisample);
+
+ bindGenericAtomicCounterBuffer(0);
+ for (unsigned int i = 0; i < mCaps.maxAtomicCounterBufferBindings; i++)
+ {
+ bindIndexedAtomicCounterBuffer(0, i, 0, 0);
+ }
}
if (mExtensions.eglImageExternal || mExtensions.eglStreamConsumerExternal)
@@ -1059,6 +1065,21 @@
mGLState.getCurrentTransformFeedback()->bindIndexedBuffer(index, buffer, offset, size);
}
+void Context::bindGenericAtomicCounterBuffer(GLuint bufferHandle)
+{
+ Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
+ mGLState.setGenericAtomicCounterBufferBinding(buffer);
+}
+
+void Context::bindIndexedAtomicCounterBuffer(GLuint bufferHandle,
+ GLuint index,
+ GLintptr offset,
+ GLsizeiptr size)
+{
+ Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
+ mGLState.setIndexedAtomicCounterBufferBinding(index, buffer, offset, size);
+}
+
void Context::bindCopyReadBuffer(GLuint bufferHandle)
{
Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
@@ -3703,11 +3724,7 @@
bindGenericTransformFeedbackBuffer(buffer);
break;
case GL_ATOMIC_COUNTER_BUFFER:
- if (buffer != 0)
- {
- // Binding buffers to this binding point is not implemented yet.
- UNIMPLEMENTED();
- }
+ bindGenericAtomicCounterBuffer(buffer);
break;
case GL_SHADER_STORAGE_BUFFER:
if (buffer != 0)
@@ -3733,6 +3750,44 @@
}
}
+void Context::bindBufferBase(GLenum target, GLuint index, GLuint buffer)
+{
+ bindBufferRange(target, index, buffer, 0, 0);
+}
+
+void Context::bindBufferRange(GLenum target,
+ GLuint index,
+ GLuint buffer,
+ GLintptr offset,
+ GLsizeiptr size)
+{
+ switch (target)
+ {
+ case GL_TRANSFORM_FEEDBACK_BUFFER:
+ bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
+ bindGenericTransformFeedbackBuffer(buffer);
+ break;
+ case GL_UNIFORM_BUFFER:
+ bindIndexedUniformBuffer(buffer, index, offset, size);
+ bindGenericUniformBuffer(buffer);
+ break;
+ case GL_ATOMIC_COUNTER_BUFFER:
+ bindIndexedAtomicCounterBuffer(buffer, index, offset, size);
+ bindGenericAtomicCounterBuffer(buffer);
+ break;
+ case GL_SHADER_STORAGE_BUFFER:
+ if (buffer != 0)
+ {
+ // Binding buffers to this binding point is not implemented yet.
+ UNIMPLEMENTED();
+ }
+ break;
+ default:
+ UNREACHABLE();
+ break;
+ }
+}
+
void Context::bindFramebuffer(GLenum target, GLuint framebuffer)
{
if (target == GL_READ_FRAMEBUFFER || target == GL_FRAMEBUFFER)