replace _mesa_logbase2 with util_logbase2
[mesa.git] / src / mesa / state_tracker / st_atom_storagebuf.c
index a581818d8c0dfac5cca08799f1c420551c209e84..2c5d4885841faac03b4ab9bb1fae87b79cd7dbde 100644 (file)
@@ -24,7 +24,7 @@
  *
  **************************************************************************/
 
-#include "main/imports.h"
+#include "util/imports.h"
 #include "program/prog_parameter.h"
 #include "program/prog_print.h"
 #include "compiler/glsl/ir_uniform.h"
 #include "st_program.h"
 
 static void
-st_bind_ssbos(struct st_context *st, struct gl_shader *shader,
-              unsigned shader_type)
+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 = &st->ctx->Const.Program[shader->Stage];
-
-   if (!shader || !st->pipe->set_shader_buffers)
+   if (!prog || !st->pipe->set_shader_buffers)
       return;
 
-   for (i = 0; i < shader->NumShaderStorageBlocks; 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;
@@ -77,118 +75,68 @@ st_bind_ssbos(struct st_context *st, struct gl_shader *shader,
          sb->buffer_size = 0;
       }
    }
-   st->pipe->set_shader_buffers(st->pipe, shader_type, c->MaxAtomicBuffers,
-                                shader->NumShaderStorageBlocks, buffers);
-   /* clear out any stale shader buffers */
-   if (shader->NumShaderStorageBlocks < 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->NumShaderStorageBlocks,
-            c->MaxShaderStorageBlocks - shader->NumShaderStorageBlocks,
-            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 = {
-   "st_bind_vs_ssbos",
-   {
-      0,
-      ST_NEW_VERTEX_PROGRAM | ST_NEW_STORAGE_BUFFER,
-   },
-   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 = {
-   "st_bind_fs_ssbos",
-   {
-      0,
-      ST_NEW_FRAGMENT_PROGRAM | ST_NEW_STORAGE_BUFFER,
-   },
-   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 = {
-   "st_bind_gs_ssbos",
-   {
-      0,
-      ST_NEW_GEOMETRY_PROGRAM | ST_NEW_STORAGE_BUFFER,
-   },
-   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 = {
-   "st_bind_tcs_ssbos",
-   {
-      0,
-      ST_NEW_TESSCTRL_PROGRAM | ST_NEW_STORAGE_BUFFER,
-   },
-   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 = {
-   "st_bind_tes_ssbos",
-   {
-      0,
-      ST_NEW_TESSEVAL_PROGRAM | ST_NEW_STORAGE_BUFFER,
-   },
-   bind_tes_ssbos
-};
+void st_bind_cs_ssbos(struct st_context *st)
+{
+   struct gl_program *prog =
+      st->ctx->_Shader->CurrentProgram[MESA_SHADER_COMPUTE];
+
+   st_bind_ssbos(st, prog, PIPE_SHADER_COMPUTE);
+}