mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-05 22:00:11 +01:00
st/mesa: don't move ssbo after atomic buffers if we support hw atomics
There is no need to have these overlap if we support hw atomics. Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu> Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
parent
8f91aa35a5
commit
c8ce3c2689
2 changed files with 13 additions and 9 deletions
|
|
@ -47,12 +47,14 @@ 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_buffer_binding *binding;
|
||||
struct st_buffer_object *st_obj;
|
||||
|
|
@ -79,13 +81,13 @@ 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,
|
||||
st->pipe->set_shader_buffers(st->pipe, shader_type, buffer_base,
|
||||
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,
|
||||
c->MaxAtomicBuffers + prog->info.num_ssbos,
|
||||
buffer_base + prog->info.num_ssbos,
|
||||
c->MaxShaderStorageBlocks - prog->info.num_ssbos,
|
||||
NULL);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2128,10 +2128,10 @@ glsl_to_tgsi_visitor::visit_expression(ir_expression* ir, st_src_reg *op)
|
|||
|
||||
case ir_unop_get_buffer_size: {
|
||||
ir_constant *const_offset = ir->operands[0]->as_constant();
|
||||
int buf_base = ctx->st->has_hw_atomics ? 0 : ctx->Const.Program[shader->Stage].MaxAtomicBuffers;
|
||||
st_src_reg buffer(
|
||||
PROGRAM_BUFFER,
|
||||
ctx->Const.Program[shader->Stage].MaxAtomicBuffers +
|
||||
(const_offset ? const_offset->value.u[0] : 0),
|
||||
buf_base + (const_offset ? const_offset->value.u[0] : 0),
|
||||
GLSL_TYPE_UINT);
|
||||
if (!const_offset) {
|
||||
buffer.reladdr = ralloc(mem_ctx, st_src_reg);
|
||||
|
|
@ -3352,11 +3352,10 @@ glsl_to_tgsi_visitor::visit_ssbo_intrinsic(ir_call *ir)
|
|||
ir_rvalue *offset = ((ir_instruction *)param)->as_rvalue();
|
||||
|
||||
ir_constant *const_block = block->as_constant();
|
||||
|
||||
int buf_base = st_context(ctx)->has_hw_atomics ? 0 : ctx->Const.Program[shader->Stage].MaxAtomicBuffers;
|
||||
st_src_reg buffer(
|
||||
PROGRAM_BUFFER,
|
||||
ctx->Const.Program[shader->Stage].MaxAtomicBuffers +
|
||||
(const_block ? const_block->value.u[0] : 0),
|
||||
buf_base + (const_block ? const_block->value.u[0] : 0),
|
||||
GLSL_TYPE_UINT);
|
||||
|
||||
if (!const_block) {
|
||||
|
|
@ -6581,7 +6580,10 @@ st_translate_program(
|
|||
|
||||
assert(prog->info.num_ssbos <= frag_const->MaxShaderStorageBlocks);
|
||||
for (i = 0; i < prog->info.num_ssbos; i++) {
|
||||
unsigned index = frag_const->MaxAtomicBuffers + i;
|
||||
unsigned index = i;
|
||||
if (!st_context(ctx)->has_hw_atomics)
|
||||
index += frag_const->MaxAtomicBuffers;
|
||||
|
||||
t->buffers[index] = ureg_DECL_buffer(ureg, index, false);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue