glx: Sync <GL/glxext.h> with Khronos
[mesa.git] / src / mesa / state_tracker / st_atom_storagebuf.c
index 43dd3000a3d7222b0b8f12986687e887193bfa25..5ec3175f2c91fe5af891292550c534f8080e7063 100644 (file)
@@ -47,14 +47,16 @@ st_bind_ssbos(struct st_context *st, struct gl_program *prog,
    unsigned i;
    struct pipe_shader_buffer buffers[MAX_SHADER_STORAGE_BUFFERS];
    struct gl_program_constants *c;
-
+   int buffer_base;
    if (!prog || !st->pipe->set_shader_buffers)
       return;
 
    c = &st->ctx->Const.Program[prog->info.stage];
 
+   buffer_base = st->has_hw_atomics ? 0 : c->MaxAtomicBuffers;
+
    for (i = 0; i < prog->info.num_ssbos; i++) {
-      struct gl_shader_storage_buffer_binding *binding;
+      struct gl_buffer_binding *binding;
       struct st_buffer_object *st_obj;
       struct pipe_shader_buffer *sb = &buffers[i];
 
@@ -79,15 +81,16 @@ st_bind_ssbos(struct st_context *st, struct gl_program *prog,
          sb->buffer_size = 0;
       }
    }
-   st->pipe->set_shader_buffers(st->pipe, shader_type, c->MaxAtomicBuffers,
-                                prog->info.num_ssbos, 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 (prog->info.num_ssbos < c->MaxShaderStorageBlocks)
       st->pipe->set_shader_buffers(
             st->pipe, shader_type,
-            c->MaxAtomicBuffers + prog->info.num_ssbos,
+            buffer_base + prog->info.num_ssbos,
             c->MaxShaderStorageBlocks - prog->info.num_ssbos,
-            NULL);
+            NULL, 0);
 }
 
 void st_bind_vs_ssbos(struct st_context *st)