Mesa (main): panfrost: Wrap occlusion query in pipe_resource
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Tue Jul 6 19:10:17 UTC 2021
Module: Mesa
Branch: main
Commit: 9769696659db051bfc18d49653888ae563d89fdd
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=9769696659db051bfc18d49653888ae563d89fdd
Author: Alyssa Rosenzweig <alyssa at rosenzweig.io>
Date: Mon May 17 15:56:53 2021 -0400
panfrost: Wrap occlusion query in pipe_resource
For proper tracking.
Signed-off-by: Alyssa Rosenzweig <alyssa at rosenzweig.io>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11077>
---
src/gallium/drivers/panfrost/pan_context.c | 31 ++++++++++++++++--------------
src/gallium/drivers/panfrost/pan_context.h | 2 +-
2 files changed, 18 insertions(+), 15 deletions(-)
diff --git a/src/gallium/drivers/panfrost/pan_context.c b/src/gallium/drivers/panfrost/pan_context.c
index 3a82e3a59b5..2630f17b28f 100644
--- a/src/gallium/drivers/panfrost/pan_context.c
+++ b/src/gallium/drivers/panfrost/pan_context.c
@@ -446,8 +446,10 @@ panfrost_draw_emit_tiler(struct panfrost_batch *batch,
cfg.occlusion_query = MALI_OCCLUSION_MODE_COUNTER;
else
cfg.occlusion_query = MALI_OCCLUSION_MODE_PREDICATE;
- cfg.occlusion = ctx->occlusion_query->bo->ptr.gpu;
- panfrost_batch_add_bo(ctx->batch, ctx->occlusion_query->bo,
+
+ struct panfrost_resource *rsrc = pan_resource(ctx->occlusion_query->rsrc);
+ cfg.occlusion = rsrc->image.data.bo->ptr.gpu;
+ panfrost_batch_write_rsrc(ctx->batch, rsrc,
PIPE_SHADER_FRAGMENT);
}
}
@@ -1726,10 +1728,8 @@ panfrost_destroy_query(struct pipe_context *pipe, struct pipe_query *q)
{
struct panfrost_query *query = (struct panfrost_query *) q;
- if (query->bo) {
- panfrost_bo_unreference(query->bo);
- query->bo = NULL;
- }
+ if (query->rsrc)
+ pipe_resource_reference(&query->rsrc, NULL);
ralloc_free(q);
}
@@ -1747,14 +1747,16 @@ panfrost_begin_query(struct pipe_context *pipe, struct pipe_query *q)
case PIPE_QUERY_OCCLUSION_PREDICATE_CONSERVATIVE: {
unsigned size = sizeof(uint64_t) * dev->core_count;
- /* Allocate a bo for the query results to be stored */
- if (!query->bo) {
- query->bo = panfrost_bo_create(dev, size, 0,
- "Occlusion query result");
+ /* Allocate a resource for the query results to be stored */
+ if (!query->rsrc) {
+ query->rsrc = pipe_buffer_create(ctx->base.screen,
+ PIPE_BIND_QUERY_BUFFER, 0, size);
}
/* Default to 0 if nothing at all drawn. */
- memset(query->bo->ptr.cpu, 0, size);
+ uint8_t *zeroes = alloca(size);
+ memset(zeroes, 0, size);
+ pipe_buffer_write(pipe, query->rsrc, 0, size, zeroes);
query->msaa = (ctx->pipe_framebuffer.samples > 1);
ctx->occlusion_query = query;
@@ -1813,16 +1815,17 @@ panfrost_get_query_result(struct pipe_context *pipe,
struct panfrost_query *query = (struct panfrost_query *) q;
struct panfrost_context *ctx = pan_context(pipe);
struct panfrost_device *dev = pan_device(ctx->base.screen);
+ struct panfrost_resource *rsrc = pan_resource(query->rsrc);
switch (query->type) {
case PIPE_QUERY_OCCLUSION_COUNTER:
case PIPE_QUERY_OCCLUSION_PREDICATE:
case PIPE_QUERY_OCCLUSION_PREDICATE_CONSERVATIVE:
- panfrost_flush_batches_accessing_bo(ctx, query->bo, false);
- panfrost_bo_wait(query->bo, INT64_MAX, false);
+ panfrost_flush_batches_accessing_bo(ctx, rsrc->image.data.bo, false);
+ panfrost_bo_wait(rsrc->image.data.bo, INT64_MAX, false);
/* Read back the query results */
- uint64_t *result = (uint64_t *) query->bo->ptr.cpu;
+ uint64_t *result = (uint64_t *) rsrc->image.data.bo->ptr.cpu;
if (query->type == PIPE_QUERY_OCCLUSION_COUNTER) {
uint64_t passed = 0;
diff --git a/src/gallium/drivers/panfrost/pan_context.h b/src/gallium/drivers/panfrost/pan_context.h
index 64d0e738d8d..7213bcfa5d3 100644
--- a/src/gallium/drivers/panfrost/pan_context.h
+++ b/src/gallium/drivers/panfrost/pan_context.h
@@ -97,7 +97,7 @@ struct panfrost_query {
};
/* Memory for the GPU to writeback the value of the query */
- struct panfrost_bo *bo;
+ struct pipe_resource *rsrc;
/* Whether an occlusion query is for a MSAA framebuffer */
bool msaa;
More information about the mesa-commit
mailing list