*
**************************************************************************/
-#include "main/imports.h"
+#include "util/imports.h"
#include "program/prog_parameter.h"
#include "program/prog_print.h"
#include "compiler/glsl/ir_uniform.h"
{
unsigned i;
struct pipe_shader_buffer buffers[MAX_SHADER_STORAGE_BUFFERS];
- struct gl_program_constants *c;
-
if (!prog || !st->pipe->set_shader_buffers)
return;
- c = &st->ctx->Const.Program[prog->info.stage];
-
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];
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;
sb->buffer_size = 0;
}
}
- st->pipe->set_shader_buffers(st->pipe, shader_type, c->MaxAtomicBuffers,
- prog->info.num_ssbos, buffers);
- /* clear out any stale shader buffers */
- if (prog->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 + prog->info.num_ssbos,
- c->MaxShaderStorageBlocks - prog->info.num_ssbos,
- NULL);
+ num_ssbos,
+ st->last_num_ssbos[shader_type] - num_ssbos,
+ NULL, 0);
+ st->last_num_ssbos[shader_type] = num_ssbos;
+ }
}
void st_bind_vs_ssbos(struct st_context *st)