From ec5af12b5d54f65ab119ce6f4eecd3a9fee5407d Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Sat, 30 Sep 2017 16:48:44 -0700 Subject: [PATCH] broadcom/vc5: Flush the job when mapping a transform feedback buffer. We will want something fancier for reusing a TF output within the same frame, but we at least need this in order for piglit tests to work. --- src/gallium/drivers/vc5/vc5_context.h | 4 ++++ src/gallium/drivers/vc5/vc5_emit.c | 3 +++ src/gallium/drivers/vc5/vc5_job.c | 25 +++++++++++++++++++++++++ 3 files changed, 32 insertions(+) diff --git a/src/gallium/drivers/vc5/vc5_context.h b/src/gallium/drivers/vc5/vc5_context.h index 472f0398596..96b21b8fa09 100644 --- a/src/gallium/drivers/vc5/vc5_context.h +++ b/src/gallium/drivers/vc5/vc5_context.h @@ -199,6 +199,9 @@ struct vc5_job { * execute our job. */ struct set *bos; + + struct set *write_prscs; + /* Size of the submit.bo_handles array. */ uint32_t bo_handles_size; @@ -437,6 +440,7 @@ struct vc5_job *vc5_get_job(struct vc5_context *vc5, struct pipe_surface *zsbuf); struct vc5_job *vc5_get_job_for_fbo(struct vc5_context *vc5); void vc5_job_add_bo(struct vc5_job *job, struct vc5_bo *bo); +void vc5_job_add_write_resource(struct vc5_job *job, struct pipe_resource *prsc); void vc5_job_submit(struct vc5_context *vc5, struct vc5_job *job); void vc5_flush_jobs_writing_resource(struct vc5_context *vc5, struct pipe_resource *prsc); diff --git a/src/gallium/drivers/vc5/vc5_emit.c b/src/gallium/drivers/vc5/vc5_emit.c index 60883d96d4b..7f78817bf91 100644 --- a/src/gallium/drivers/vc5/vc5_emit.c +++ b/src/gallium/drivers/vc5/vc5_emit.c @@ -440,6 +440,9 @@ vc5_emit_state(struct pipe_context *pctx) cl_address(rsc->bo, target->buffer_offset); }; + + vc5_job_add_write_resource(vc5->job, + target->buffer); /* XXX: buffer_size? */ } } else { diff --git a/src/gallium/drivers/vc5/vc5_job.c b/src/gallium/drivers/vc5/vc5_job.c index f90b449aca7..5b97e6bf72f 100644 --- a/src/gallium/drivers/vc5/vc5_job.c +++ b/src/gallium/drivers/vc5/vc5_job.c @@ -53,6 +53,16 @@ vc5_job_free(struct vc5_context *vc5, struct vc5_job *job) remove_from_ht(vc5->jobs, &job->key); + if (job->write_prscs) { + struct set_entry *entry; + + set_foreach(job->write_prscs, entry) { + const struct pipe_resource *prsc = entry->key; + + remove_from_ht(vc5->write_jobs, (void *)prsc); + } + } + for (int i = 0; i < VC5_MAX_DRAW_BUFFERS; i++) { if (job->cbufs[i]) { remove_from_ht(vc5->write_jobs, job->cbufs[i]->texture); @@ -120,6 +130,21 @@ vc5_job_add_bo(struct vc5_job *job, struct vc5_bo *bo) bo_handles[job->submit.bo_handle_count++] = bo->handle; } +void +vc5_job_add_write_resource(struct vc5_job *job, struct pipe_resource *prsc) +{ + struct vc5_context *vc5 = job->vc5; + + if (!job->write_prscs) { + job->write_prscs = _mesa_set_create(job, + _mesa_hash_pointer, + _mesa_key_pointer_equal); + } + + _mesa_set_add(job->write_prscs, prsc); + _mesa_hash_table_insert(vc5->write_jobs, prsc, job); +} + void vc5_flush_jobs_writing_resource(struct vc5_context *vc5, struct pipe_resource *prsc) -- 2.30.2