diff options
author | Samuel Iglesias Gonsalvez <[email protected]> | 2015-04-21 16:58:29 +0200 |
---|---|---|
committer | Samuel Iglesias Gonsalvez <[email protected]> | 2015-09-25 08:39:23 +0200 |
commit | 4b7b1cf3c0b1682d5ae8983df2bbf5dea50081cd (patch) | |
tree | f61e2dd1df4fbc181ab717b4362461a02b0da6ca /src | |
parent | a07d0c26574203415da343718d906375accf95b3 (diff) |
mesa: add glShaderStorageBlockBinding()
Defined in ARB_shader_storage_buffer_object extension.
Signed-off-by: Samuel Iglesias Gonsalvez <[email protected]>
Reviewed-by: Kristian Høgsberg <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/mesa/main/uniforms.c | 52 | ||||
-rw-r--r-- | src/mesa/main/uniforms.h | 4 |
2 files changed, 56 insertions, 0 deletions
diff --git a/src/mesa/main/uniforms.c b/src/mesa/main/uniforms.c index 973b877befb..c491707e937 100644 --- a/src/mesa/main/uniforms.c +++ b/src/mesa/main/uniforms.c @@ -1036,6 +1036,58 @@ _mesa_UniformBlockBinding(GLuint program, } } +void GLAPIENTRY +_mesa_ShaderStorageBlockBinding(GLuint program, + GLuint shaderStorageBlockIndex, + GLuint shaderStorageBlockBinding) +{ + GET_CURRENT_CONTEXT(ctx); + struct gl_shader_program *shProg; + + if (!ctx->Extensions.ARB_shader_storage_buffer_object) { + _mesa_error(ctx, GL_INVALID_OPERATION, "glShaderStorageBlockBinding"); + return; + } + + shProg = _mesa_lookup_shader_program_err(ctx, program, + "glShaderStorageBlockBinding"); + if (!shProg) + return; + + if (shaderStorageBlockIndex >= shProg->NumUniformBlocks) { + _mesa_error(ctx, GL_INVALID_VALUE, + "glShaderStorageBlockBinding(block index %u >= %u)", + shaderStorageBlockIndex, shProg->NumUniformBlocks); + return; + } + + if (shaderStorageBlockBinding >= ctx->Const.MaxShaderStorageBufferBindings) { + _mesa_error(ctx, GL_INVALID_VALUE, + "glShaderStorageBlockBinding(block binding %u >= %u)", + shaderStorageBlockBinding, + ctx->Const.MaxShaderStorageBufferBindings); + return; + } + + if (shProg->UniformBlocks[shaderStorageBlockIndex].Binding != + shaderStorageBlockBinding) { + int i; + + FLUSH_VERTICES(ctx, 0); + ctx->NewDriverState |= ctx->DriverFlags.NewShaderStorageBuffer; + + shProg->UniformBlocks[shaderStorageBlockIndex].Binding = shaderStorageBlockBinding; + + for (i = 0; i < MESA_SHADER_STAGES; i++) { + int stage_index = shProg->UniformBlockStageIndex[i][shaderStorageBlockIndex]; + + if (stage_index != -1) { + struct gl_shader *sh = shProg->_LinkedShaders[i]; + sh->UniformBlocks[stage_index].Binding = shaderStorageBlockBinding; + } + } + } +} /** * Generic program resource property query. diff --git a/src/mesa/main/uniforms.h b/src/mesa/main/uniforms.h index c3c9c1e7dd8..96172b72aa1 100644 --- a/src/mesa/main/uniforms.h +++ b/src/mesa/main/uniforms.h @@ -225,6 +225,10 @@ _mesa_UniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); void GLAPIENTRY +_mesa_ShaderStorageBlockBinding(GLuint program, + GLuint shaderStorageBlockIndex, + GLuint shaderStorageBlockBinding); +void GLAPIENTRY _mesa_GetActiveAtomicCounterBufferiv(GLuint program, GLuint bufferIndex, GLenum pname, GLint *params); void GLAPIENTRY |