X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fstate_tracker%2Fst_atom_storagebuf.c;h=60028365bc4b41c532a8417d0e8274219b63dd1b;hb=6aea39641a6c32f780c40e3344096d3e0eccb590;hp=d01688cd64998f40f8f2d03eb9a7965b31bc37b6;hpb=f62eb6c7eb22cd97c691ebdb5f25eb5fe8e9ed11;p=mesa.git diff --git a/src/mesa/state_tracker/st_atom_storagebuf.c b/src/mesa/state_tracker/st_atom_storagebuf.c index d01688cd649..60028365bc4 100644 --- a/src/mesa/state_tracker/st_atom_storagebuf.c +++ b/src/mesa/state_tracker/st_atom_storagebuf.c @@ -24,7 +24,7 @@ * **************************************************************************/ -#include "main/imports.h" + #include "program/prog_parameter.h" #include "program/prog_print.h" #include "compiler/glsl/ir_uniform.h" @@ -41,28 +41,24 @@ #include "st_program.h" static void -st_bind_ssbos(struct st_context *st, struct gl_linked_shader *shader, +st_bind_ssbos(struct st_context *st, struct gl_program *prog, enum pipe_shader_type shader_type) { unsigned i; struct pipe_shader_buffer buffers[MAX_SHADER_STORAGE_BUFFERS]; - struct gl_program_constants *c; - - if (!shader || !st->pipe->set_shader_buffers) + if (!prog || !st->pipe->set_shader_buffers) return; - c = &st->ctx->Const.Program[shader->Stage]; - - for (i = 0; i < shader->Program->info.num_ssbos; i++) { - struct gl_shader_storage_buffer_binding *binding; + for (i = 0; i < prog->info.num_ssbos; i++) { + struct gl_buffer_binding *binding; struct st_buffer_object *st_obj; struct pipe_shader_buffer *sb = &buffers[i]; binding = &st->ctx->ShaderStorageBufferBindings[ - shader->ShaderStorageBlocks[i]->Binding]; + prog->sh.ShaderStorageBlocks[i]->Binding]; st_obj = st_buffer_object(binding->BufferObject); - sb->buffer = st_obj->buffer; + sb->buffer = st_obj ? st_obj->buffer : NULL; if (sb->buffer) { sb->buffer_offset = binding->Offset; @@ -79,109 +75,68 @@ st_bind_ssbos(struct st_context *st, struct gl_linked_shader *shader, sb->buffer_size = 0; } } - st->pipe->set_shader_buffers(st->pipe, shader_type, c->MaxAtomicBuffers, - shader->Program->info.num_ssbos, buffers); - /* clear out any stale shader buffers */ - if (shader->Program->info.num_ssbos < c->MaxShaderStorageBlocks) + st->pipe->set_shader_buffers(st->pipe, shader_type, 0, + prog->info.num_ssbos, buffers, + prog->sh.ShaderStorageBlocksWriteAccess); + + /* Clear out any stale shader buffers (or lowered atomic counters). */ + int num_ssbos = prog->info.num_ssbos; + if (!st->has_hw_atomics) + num_ssbos += st->last_used_atomic_bindings[shader_type]; + if (st->last_num_ssbos[shader_type] > num_ssbos) { st->pipe->set_shader_buffers( st->pipe, shader_type, - c->MaxAtomicBuffers + shader->Program->info.num_ssbos, - c->MaxShaderStorageBlocks - shader->Program->info.num_ssbos, - NULL); + num_ssbos, + st->last_num_ssbos[shader_type] - num_ssbos, + NULL, 0); + st->last_num_ssbos[shader_type] = num_ssbos; + } } -static void bind_vs_ssbos(struct st_context *st) +void st_bind_vs_ssbos(struct st_context *st) { - struct gl_shader_program *prog = + struct gl_program *prog = st->ctx->_Shader->CurrentProgram[MESA_SHADER_VERTEX]; - if (!prog) - return; - - st_bind_ssbos(st, prog->_LinkedShaders[MESA_SHADER_VERTEX], - PIPE_SHADER_VERTEX); + st_bind_ssbos(st, prog, PIPE_SHADER_VERTEX); } -const struct st_tracked_state st_bind_vs_ssbos = { - bind_vs_ssbos -}; - -static void bind_fs_ssbos(struct st_context *st) +void st_bind_fs_ssbos(struct st_context *st) { - struct gl_shader_program *prog = + struct gl_program *prog = st->ctx->_Shader->CurrentProgram[MESA_SHADER_FRAGMENT]; - if (!prog) - return; - - st_bind_ssbos(st, prog->_LinkedShaders[MESA_SHADER_FRAGMENT], - PIPE_SHADER_FRAGMENT); + st_bind_ssbos(st, prog, PIPE_SHADER_FRAGMENT); } -const struct st_tracked_state st_bind_fs_ssbos = { - bind_fs_ssbos -}; - -static void bind_gs_ssbos(struct st_context *st) +void st_bind_gs_ssbos(struct st_context *st) { - struct gl_shader_program *prog = + struct gl_program *prog = st->ctx->_Shader->CurrentProgram[MESA_SHADER_GEOMETRY]; - if (!prog) - return; - - st_bind_ssbos(st, prog->_LinkedShaders[MESA_SHADER_GEOMETRY], - PIPE_SHADER_GEOMETRY); + st_bind_ssbos(st, prog, PIPE_SHADER_GEOMETRY); } -const struct st_tracked_state st_bind_gs_ssbos = { - bind_gs_ssbos -}; - -static void bind_tcs_ssbos(struct st_context *st) +void st_bind_tcs_ssbos(struct st_context *st) { - struct gl_shader_program *prog = + struct gl_program *prog = st->ctx->_Shader->CurrentProgram[MESA_SHADER_TESS_CTRL]; - if (!prog) - return; - - st_bind_ssbos(st, prog->_LinkedShaders[MESA_SHADER_TESS_CTRL], - PIPE_SHADER_TESS_CTRL); + st_bind_ssbos(st, prog, PIPE_SHADER_TESS_CTRL); } -const struct st_tracked_state st_bind_tcs_ssbos = { - bind_tcs_ssbos -}; - -static void bind_tes_ssbos(struct st_context *st) +void st_bind_tes_ssbos(struct st_context *st) { - struct gl_shader_program *prog = + struct gl_program *prog = st->ctx->_Shader->CurrentProgram[MESA_SHADER_TESS_EVAL]; - if (!prog) - return; - - st_bind_ssbos(st, prog->_LinkedShaders[MESA_SHADER_TESS_EVAL], - PIPE_SHADER_TESS_EVAL); + st_bind_ssbos(st, prog, PIPE_SHADER_TESS_EVAL); } -const struct st_tracked_state st_bind_tes_ssbos = { - bind_tes_ssbos -}; - -static void bind_cs_ssbos(struct st_context *st) +void st_bind_cs_ssbos(struct st_context *st) { - struct gl_shader_program *prog = + struct gl_program *prog = st->ctx->_Shader->CurrentProgram[MESA_SHADER_COMPUTE]; - if (!prog) - return; - - st_bind_ssbos(st, prog->_LinkedShaders[MESA_SHADER_COMPUTE], - PIPE_SHADER_COMPUTE); + st_bind_ssbos(st, prog, PIPE_SHADER_COMPUTE); } - -const struct st_tracked_state st_bind_cs_ssbos = { - bind_cs_ssbos -};