mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-02-13 00:30:29 +01:00
mesa: Implement _mesa_BindBufferBase for target GL_SHADER_STORAGE_BUFFER
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
This commit is contained in:
parent
7b0d0a2bf2
commit
8a1d58bd61
1 changed files with 56 additions and 0 deletions
|
|
@ -3091,6 +3091,37 @@ bind_uniform_buffer(struct gl_context *ctx,
|
|||
set_ubo_binding(ctx, binding, bufObj, offset, size, autoSize);
|
||||
}
|
||||
|
||||
/**
|
||||
* Binds a buffer object to a shader storage buffer binding point.
|
||||
*
|
||||
* Unlike set_ssbo_binding(), this function also flushes vertices
|
||||
* and updates NewDriverState. It also checks if the binding
|
||||
* has actually changed before updating it.
|
||||
*/
|
||||
static void
|
||||
bind_shader_storage_buffer(struct gl_context *ctx,
|
||||
GLuint index,
|
||||
struct gl_buffer_object *bufObj,
|
||||
GLintptr offset,
|
||||
GLsizeiptr size,
|
||||
GLboolean autoSize)
|
||||
{
|
||||
struct gl_shader_storage_buffer_binding *binding =
|
||||
&ctx->ShaderStorageBufferBindings[index];
|
||||
|
||||
if (binding->BufferObject == bufObj &&
|
||||
binding->Offset == offset &&
|
||||
binding->Size == size &&
|
||||
binding->AutomaticSize == autoSize) {
|
||||
return;
|
||||
}
|
||||
|
||||
FLUSH_VERTICES(ctx, 0);
|
||||
ctx->NewDriverState |= ctx->DriverFlags.NewShaderStorageBuffer;
|
||||
|
||||
set_ssbo_binding(ctx, binding, bufObj, offset, size, autoSize);
|
||||
}
|
||||
|
||||
/**
|
||||
* Bind a region of a buffer object to a uniform block binding point.
|
||||
* \param index the uniform buffer binding point index
|
||||
|
|
@ -3149,6 +3180,28 @@ bind_buffer_base_uniform_buffer(struct gl_context *ctx,
|
|||
bind_uniform_buffer(ctx, index, bufObj, 0, 0, GL_TRUE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Bind a buffer object to a shader storage block binding point.
|
||||
* As above, but offset = 0.
|
||||
*/
|
||||
static void
|
||||
bind_buffer_base_shader_storage_buffer(struct gl_context *ctx,
|
||||
GLuint index,
|
||||
struct gl_buffer_object *bufObj)
|
||||
{
|
||||
if (index >= ctx->Const.MaxShaderStorageBufferBindings) {
|
||||
_mesa_error(ctx, GL_INVALID_VALUE, "glBindBufferBase(index=%d)", index);
|
||||
return;
|
||||
}
|
||||
|
||||
_mesa_reference_buffer_object(ctx, &ctx->ShaderStorageBuffer, bufObj);
|
||||
|
||||
if (bufObj == ctx->Shared->NullBufferObj)
|
||||
bind_shader_storage_buffer(ctx, index, bufObj, -1, -1, GL_TRUE);
|
||||
else
|
||||
bind_shader_storage_buffer(ctx, index, bufObj, 0, 0, GL_TRUE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Binds a buffer object to an atomic buffer binding point.
|
||||
*
|
||||
|
|
@ -4240,6 +4293,9 @@ _mesa_BindBufferBase(GLenum target, GLuint index, GLuint buffer)
|
|||
case GL_UNIFORM_BUFFER:
|
||||
bind_buffer_base_uniform_buffer(ctx, index, bufObj);
|
||||
return;
|
||||
case GL_SHADER_STORAGE_BUFFER:
|
||||
bind_buffer_base_shader_storage_buffer(ctx, index, bufObj);
|
||||
return;
|
||||
case GL_ATOMIC_COUNTER_BUFFER:
|
||||
bind_atomic_buffer(ctx, index, bufObj, 0, 0,
|
||||
"glBindBufferBase");
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue