diff options
Diffstat (limited to 'src/gallium/drivers/panfrost')
-rw-r--r-- | src/gallium/drivers/panfrost/pan_context.c | 9 | ||||
-rw-r--r-- | src/gallium/drivers/panfrost/pan_job.c | 21 | ||||
-rw-r--r-- | src/gallium/drivers/panfrost/pan_job.h | 3 |
3 files changed, 32 insertions, 1 deletions
diff --git a/src/gallium/drivers/panfrost/pan_context.c b/src/gallium/drivers/panfrost/pan_context.c index a8fda5dcee6..b8edf302803 100644 --- a/src/gallium/drivers/panfrost/pan_context.c +++ b/src/gallium/drivers/panfrost/pan_context.c @@ -162,7 +162,14 @@ panfrost_clear( double depth, unsigned stencil) { struct panfrost_context *ctx = pan_context(pipe); - struct panfrost_batch *batch = panfrost_get_batch_for_fbo(ctx); + + /* TODO: panfrost_get_fresh_batch_for_fbo() instantiates a new batch if + * the existing batch targeting this FBO has draws. We could probably + * avoid that by replacing plain clears by quad-draws with a specific + * color/depth/stencil value, thus avoiding the generation of extra + * fragment/set_value jobs. + */ + struct panfrost_batch *batch = panfrost_get_fresh_batch_for_fbo(ctx); panfrost_batch_add_fbo_bos(batch); panfrost_batch_clear(batch, buffers, color, depth, stencil); diff --git a/src/gallium/drivers/panfrost/pan_job.c b/src/gallium/drivers/panfrost/pan_job.c index a56f4044fda..ae482a9a7a6 100644 --- a/src/gallium/drivers/panfrost/pan_job.c +++ b/src/gallium/drivers/panfrost/pan_job.c @@ -293,6 +293,27 @@ panfrost_get_batch_for_fbo(struct panfrost_context *ctx) return batch; } +struct panfrost_batch * +panfrost_get_fresh_batch_for_fbo(struct panfrost_context *ctx) +{ + struct panfrost_batch *batch; + + batch = panfrost_get_batch(ctx, &ctx->pipe_framebuffer); + + /* The batch has no draw/clear queued, let's return it directly. + * Note that it's perfectly fine to re-use a batch with an + * existing clear, we'll just update it with the new clear request. + */ + if (!batch->last_job.gpu) + return batch; + + /* Otherwise, we need to freeze the existing one and instantiate a new + * one. + */ + panfrost_freeze_batch(batch); + return panfrost_get_batch(ctx, &ctx->pipe_framebuffer); +} + static bool panfrost_batch_fence_is_signaled(struct panfrost_batch_fence *fence) { diff --git a/src/gallium/drivers/panfrost/pan_job.h b/src/gallium/drivers/panfrost/pan_job.h index 25905b51673..1da5d57aec1 100644 --- a/src/gallium/drivers/panfrost/pan_job.h +++ b/src/gallium/drivers/panfrost/pan_job.h @@ -169,6 +169,9 @@ panfrost_batch_fence_reference(struct panfrost_batch_fence *batch); struct panfrost_batch * panfrost_get_batch_for_fbo(struct panfrost_context *ctx); +struct panfrost_batch * +panfrost_get_fresh_batch_for_fbo(struct panfrost_context *ctx); + void panfrost_batch_init(struct panfrost_context *ctx); |