glx: Sync <GL/glxext.h> with Khronos
[mesa.git] / src / mesa / state_tracker / st_atom_storagebuf.c
index f165cc3e0a18b80f58e36d611dec292a103de131..5ec3175f2c91fe5af891292550c534f8080e7063 100644 (file)
 #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;
-
-   if (!shader || !st->pipe->set_shader_buffers)
+   int buffer_base;
+   if (!prog || !st->pipe->set_shader_buffers)
       return;
 
-   c = &st->ctx->Const.Program[shader->Stage];
+   c = &st->ctx->Const.Program[prog->info.stage];
+
+   buffer_base = st->has_hw_atomics ? 0 : c->MaxAtomicBuffers;
 
-   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;
@@ -79,118 +81,62 @@ 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);
+   st->pipe->set_shader_buffers(st->pipe, shader_type, buffer_base,
+                                prog->info.num_ssbos, buffers,
+                                prog->sh.ShaderStorageBlocksWriteAccess);
    /* clear out any stale shader buffers */
-   if (shader->NumShaderStorageBlocks < c->MaxShaderStorageBlocks)
+   if (prog->info.num_ssbos < c->MaxShaderStorageBlocks)
       st->pipe->set_shader_buffers(
             st->pipe, shader_type,
-            c->MaxAtomicBuffers + shader->NumShaderStorageBlocks,
-            c->MaxShaderStorageBlocks - shader->NumShaderStorageBlocks,
-            NULL);
+            buffer_base + prog->info.num_ssbos,
+            c->MaxShaderStorageBlocks - prog->info.num_ssbos,
+            NULL, 0);
 }
 
-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);
+}