freedreno: remove per-stateobj dirty_mask's

These never got updated in fd_context_all_dirty() so actually trying to
rely on them (in the case of fd5_emit_images()) ends up in some cases
where state is not emitted but should be.  Best to just rip this out.

Signed-off-by: Rob Clark <robdclark@gmail.com>
This commit is contained in:
Rob Clark 2018-06-11 14:05:19 -04:00
parent 5708440597
commit ced14f1c7a
5 changed files with 17 additions and 38 deletions

View File

@ -58,10 +58,6 @@ emit_constants(struct fd_ringbuffer *ring, uint32_t base,
uint32_t start_base = base;
unsigned i;
// XXX TODO only emit dirty consts.. but we need to keep track if
// they are clobbered by a clear, gmem2mem, or mem2gmem..
constbuf->dirty_mask = enabled_mask;
/* emit user constants: */
while (enabled_mask) {
unsigned index = ffs(enabled_mask) - 1;
@ -79,26 +75,22 @@ emit_constants(struct fd_ringbuffer *ring, uint32_t base,
if (shader && ((base - start_base) >= (shader->first_immediate * 4)))
break;
if (constbuf->dirty_mask & (1 << index)) {
const uint32_t *dwords;
const uint32_t *dwords;
if (cb->user_buffer) {
dwords = cb->user_buffer;
} else {
struct fd_resource *rsc = fd_resource(cb->buffer);
dwords = fd_bo_map(rsc->bo);
}
dwords = (uint32_t *)(((uint8_t *)dwords) + cb->buffer_offset);
OUT_PKT3(ring, CP_SET_CONSTANT, size + 1);
OUT_RING(ring, base);
for (i = 0; i < size; i++)
OUT_RING(ring, *(dwords++));
constbuf->dirty_mask &= ~(1 << index);
if (cb->user_buffer) {
dwords = cb->user_buffer;
} else {
struct fd_resource *rsc = fd_resource(cb->buffer);
dwords = fd_bo_map(rsc->bo);
}
dwords = (uint32_t *)(((uint8_t *)dwords) + cb->buffer_offset);
OUT_PKT3(ring, CP_SET_CONSTANT, size + 1);
OUT_RING(ring, base);
for (i = 0; i < size; i++)
OUT_RING(ring, *(dwords++));
base += size;
enabled_mask &= ~(1 << index);
}

View File

@ -219,11 +219,10 @@ fd5_emit_images(struct fd_context *ctx, struct fd_ringbuffer *ring,
enum pipe_shader_type shader)
{
struct fd_shaderimg_stateobj *so = &ctx->shaderimg[shader];
unsigned enabled_mask = so->enabled_mask;
so->dirty_mask &= so->enabled_mask;
while (so->dirty_mask) {
unsigned index = u_bit_scan(&so->dirty_mask);
while (enabled_mask) {
unsigned index = u_bit_scan(&enabled_mask);
unsigned slot = get_image_slot(index);
struct fd5_image img;
@ -233,4 +232,3 @@ fd5_emit_images(struct fd_context *ctx, struct fd_ringbuffer *ring,
emit_image_ssbo(ring, slot, &img, shader);
}
}

View File

@ -69,26 +69,22 @@ struct fd_program_stateobj {
struct fd_constbuf_stateobj {
struct pipe_constant_buffer cb[PIPE_MAX_CONSTANT_BUFFERS];
uint32_t enabled_mask;
uint32_t dirty_mask;
};
struct fd_shaderbuf_stateobj {
struct pipe_shader_buffer sb[PIPE_MAX_SHADER_BUFFERS];
uint32_t enabled_mask;
uint32_t dirty_mask;
};
struct fd_shaderimg_stateobj {
struct pipe_image_view si[PIPE_MAX_SHADER_IMAGES];
uint32_t enabled_mask;
uint32_t dirty_mask;
};
struct fd_vertexbuf_stateobj {
struct pipe_vertex_buffer vb[PIPE_MAX_ATTRIBS];
unsigned count;
uint32_t enabled_mask;
uint32_t dirty_mask;
};
struct fd_vertex_stateobj {

View File

@ -103,12 +103,10 @@ fd_set_constant_buffer(struct pipe_context *pctx,
*/
if (unlikely(!cb)) {
so->enabled_mask &= ~(1 << index);
so->dirty_mask &= ~(1 << index);
return;
}
so->enabled_mask |= 1 << index;
so->dirty_mask |= 1 << index;
ctx->dirty_shader[shader] |= FD_DIRTY_SHADER_CONST;
ctx->dirty |= FD_DIRTY_CONST;
}
@ -157,7 +155,6 @@ fd_set_shader_buffers(struct pipe_context *pctx,
so->enabled_mask &= ~mask;
}
so->dirty_mask |= mask;
ctx->dirty_shader[shader] |= FD_DIRTY_SHADER_SSBO;
}
@ -204,7 +201,6 @@ fd_set_shader_images(struct pipe_context *pctx,
so->enabled_mask &= ~mask;
}
so->dirty_mask |= mask;
ctx->dirty_shader[shader] |= FD_DIRTY_SHADER_IMAGE;
}

View File

@ -559,10 +559,8 @@ emit_user_consts(struct fd_context *ctx, const struct ir3_shader_variant *v,
struct fd_ringbuffer *ring, struct fd_constbuf_stateobj *constbuf)
{
const unsigned index = 0; /* user consts are index 0 */
/* TODO save/restore dirty_mask for binning pass instead: */
uint32_t dirty_mask = constbuf->enabled_mask;
if (dirty_mask & (1 << index)) {
if (constbuf->enabled_mask & (1 << index)) {
struct pipe_constant_buffer *cb = &constbuf->cb[index];
unsigned size = align(cb->buffer_size, 4) / 4; /* size in dwords */
@ -587,7 +585,6 @@ emit_user_consts(struct fd_context *ctx, const struct ir3_shader_variant *v,
ctx->emit_const(ring, v->type, 0,
cb->buffer_offset, size,
cb->user_buffer, cb->buffer);
constbuf->dirty_mask &= ~(1 << index);
}
}
}