ES31: Add GL_SHADER_STORAGE_BUFFER_BINDING binding point
The affected APIs are below:
getIntegeri_v getInteger64i_v BindBuffer BindBufferBase BindBufferRange
BUG=angleproject:1951
TEST=dEQP-GLES31.functional.state_query.integer.shader_storage_buffer_binding_*
dEQP-GLES31.functional.state_query.indexed.shader_storage_buffer_*
Change-Id: Ief7186b2ebe305f14e620c31841bc244f84429a5
Reviewed-on: https://chromium-review.googlesource.com/459093
Reviewed-by: Yunchao He <yunchao.he@intel.com>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
diff --git a/src/libANGLE/Context.cpp b/src/libANGLE/Context.cpp
index 72ace5e..b5d1716 100644
--- a/src/libANGLE/Context.cpp
+++ b/src/libANGLE/Context.cpp
@@ -321,6 +321,12 @@
{
bindIndexedAtomicCounterBuffer(0, i, 0, 0);
}
+
+ bindGenericShaderStorageBuffer(0);
+ for (unsigned int i = 0; i < mCaps.maxShaderStorageBufferBindings; i++)
+ {
+ bindIndexedShaderStorageBuffer(0, i, 0, 0);
+ }
}
if (mExtensions.eglImageExternal || mExtensions.eglStreamConsumerExternal)
@@ -1096,6 +1102,21 @@
mGLState.setIndexedAtomicCounterBufferBinding(index, buffer, offset, size);
}
+void Context::bindGenericShaderStorageBuffer(GLuint bufferHandle)
+{
+ Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
+ mGLState.setGenericShaderStorageBufferBinding(buffer);
+}
+
+void Context::bindIndexedShaderStorageBuffer(GLuint bufferHandle,
+ GLuint index,
+ GLintptr offset,
+ GLsizeiptr size)
+{
+ Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
+ mGLState.setIndexedShaderStorageBufferBinding(index, buffer, offset, size);
+}
+
void Context::bindCopyReadBuffer(GLuint bufferHandle)
{
Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
@@ -3851,11 +3872,7 @@
bindGenericAtomicCounterBuffer(buffer);
break;
case GL_SHADER_STORAGE_BUFFER:
- if (buffer != 0)
- {
- // Binding buffers to this binding point is not implemented yet.
- UNIMPLEMENTED();
- }
+ bindGenericShaderStorageBuffer(buffer);
break;
case GL_DRAW_INDIRECT_BUFFER:
bindDrawIndirectBuffer(buffer);
@@ -3900,11 +3917,8 @@
bindGenericAtomicCounterBuffer(buffer);
break;
case GL_SHADER_STORAGE_BUFFER:
- if (buffer != 0)
- {
- // Binding buffers to this binding point is not implemented yet.
- UNIMPLEMENTED();
- }
+ bindIndexedShaderStorageBuffer(buffer, index, offset, size);
+ bindGenericShaderStorageBuffer(buffer);
break;
default:
UNREACHABLE();