aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRob Clark <[email protected]>2016-07-11 16:23:10 -0400
committerRob Clark <[email protected]>2016-07-30 09:23:42 -0400
commit10baf05b2caaa0900c71ac64c91301e953176516 (patch)
treeba06ed1147ca112b69e11e805315332fa870fbed
parentba3009688892713b711ca6e9420d813f0bdce43f (diff)
freedreno: use prsc for hw queries
Switch to using a pipe_resource (rather than an fd_bo directly) for hw query result buffers. This is first step towards making queries work properly with reordered batches, since we'll need the additional dependency tracking to know which batches to flush. Signed-off-by: Rob Clark <[email protected]>
-rw-r--r--src/gallium/drivers/freedreno/freedreno_context.h2
-rw-r--r--src/gallium/drivers/freedreno/freedreno_query_hw.c76
-rw-r--r--src/gallium/drivers/freedreno/freedreno_query_hw.h2
3 files changed, 45 insertions, 35 deletions
diff --git a/src/gallium/drivers/freedreno/freedreno_context.h b/src/gallium/drivers/freedreno/freedreno_context.h
index 6fafa394042..74f53ee554f 100644
--- a/src/gallium/drivers/freedreno/freedreno_context.h
+++ b/src/gallium/drivers/freedreno/freedreno_context.h
@@ -182,7 +182,7 @@ struct fd_context {
struct list_head current_queries;
/* current query result bo and tile stride: */
- struct fd_bo *query_bo;
+ struct pipe_resource *query_buf;
uint32_t query_tile_stride;
/* table with PIPE_PRIM_MAX entries mapping PIPE_PRIM_x to
diff --git a/src/gallium/drivers/freedreno/freedreno_query_hw.c b/src/gallium/drivers/freedreno/freedreno_query_hw.c
index 4c450c62dc4..808bcefc2ad 100644
--- a/src/gallium/drivers/freedreno/freedreno_query_hw.c
+++ b/src/gallium/drivers/freedreno/freedreno_query_hw.c
@@ -32,6 +32,7 @@
#include "freedreno_query_hw.h"
#include "freedreno_context.h"
+#include "freedreno_resource.h"
#include "freedreno_util.h"
struct fd_hw_sample_period {
@@ -237,12 +238,14 @@ fd_hw_get_query_result(struct fd_context *ctx, struct fd_query *q,
period = LIST_ENTRY(struct fd_hw_sample_period,
hq->periods.prev, list);
- ret = fd_bo_cpu_prep(period->end->bo, ctx->screen->pipe,
+ struct fd_resource *rsc = fd_resource(period->end->prsc);
+
+ ret = fd_bo_cpu_prep(rsc->bo, ctx->screen->pipe,
DRM_FREEDRENO_PREP_READ | DRM_FREEDRENO_PREP_NOSYNC);
if (ret)
return false;
- fd_bo_cpu_fini(period->end->bo);
+ fd_bo_cpu_fini(rsc->bo);
}
/* sum the result across all sample periods: */
@@ -252,22 +255,21 @@ fd_hw_get_query_result(struct fd_context *ctx, struct fd_query *q,
unsigned i;
/* start and end samples should be from same batch: */
- assert(start->bo == end->bo);
+ assert(start->prsc == end->prsc);
assert(start->num_tiles == end->num_tiles);
- for (i = 0; i < start->num_tiles; i++) {
- void *ptr;
+ struct fd_resource *rsc = fd_resource(start->prsc);
- fd_bo_cpu_prep(start->bo, ctx->screen->pipe,
- DRM_FREEDRENO_PREP_READ);
+ fd_bo_cpu_prep(rsc->bo, ctx->screen->pipe, DRM_FREEDRENO_PREP_READ);
- ptr = fd_bo_map(start->bo);
+ void *ptr = fd_bo_map(rsc->bo);
+ for (i = 0; i < start->num_tiles; i++) {
p->accumulate_result(ctx, sampptr(period->start, i, ptr),
sampptr(period->end, i, ptr), result);
-
- fd_bo_cpu_fini(start->bo);
}
+
+ fd_bo_cpu_fini(rsc->bo);
}
return true;
@@ -317,7 +319,7 @@ fd_hw_sample_init(struct fd_context *ctx, uint32_t size)
ctx->next_sample_offset = align(ctx->next_sample_offset, size);
samp->offset = ctx->next_sample_offset;
/* NOTE: util_slab_alloc() does not zero out the buffer: */
- samp->bo = NULL;
+ samp->prsc = NULL;
samp->num_tiles = 0;
samp->tile_stride = 0;
ctx->next_sample_offset += size;
@@ -327,36 +329,35 @@ fd_hw_sample_init(struct fd_context *ctx, uint32_t size)
void
__fd_hw_sample_destroy(struct fd_context *ctx, struct fd_hw_sample *samp)
{
- if (samp->bo)
- fd_bo_del(samp->bo);
+ pipe_resource_reference(&samp->prsc, NULL);
util_slab_free(&ctx->sample_pool, samp);
}
static void
-prepare_sample(struct fd_hw_sample *samp, struct fd_bo *bo,
+prepare_sample(struct fd_hw_sample *samp, struct pipe_resource *prsc,
uint32_t num_tiles, uint32_t tile_stride)
{
- if (samp->bo) {
- assert(samp->bo == bo);
+ if (samp->prsc) {
+ assert(samp->prsc == prsc);
assert(samp->num_tiles == num_tiles);
assert(samp->tile_stride == tile_stride);
return;
}
- samp->bo = fd_bo_ref(bo);
+ pipe_resource_reference(&samp->prsc, prsc);
samp->num_tiles = num_tiles;
samp->tile_stride = tile_stride;
}
static void
-prepare_query(struct fd_hw_query *hq, struct fd_bo *bo,
+prepare_query(struct fd_hw_query *hq, struct pipe_resource *prsc,
uint32_t num_tiles, uint32_t tile_stride)
{
struct fd_hw_sample_period *period, *s;
/* prepare all the samples in the query: */
LIST_FOR_EACH_ENTRY_SAFE(period, s, &hq->current_periods, list) {
- prepare_sample(period->start, bo, num_tiles, tile_stride);
- prepare_sample(period->end, bo, num_tiles, tile_stride);
+ prepare_sample(period->start, prsc, num_tiles, tile_stride);
+ prepare_sample(period->end, prsc, num_tiles, tile_stride);
/* move from current_periods list to periods list: */
list_del(&period->list);
@@ -365,13 +366,13 @@ prepare_query(struct fd_hw_query *hq, struct fd_bo *bo,
}
static void
-prepare_queries(struct fd_context *ctx, struct fd_bo *bo,
+prepare_queries(struct fd_context *ctx, struct pipe_resource *prsc,
uint32_t num_tiles, uint32_t tile_stride,
struct list_head *list, bool remove)
{
struct fd_hw_query *hq, *s;
LIST_FOR_EACH_ENTRY_SAFE(hq, s, list, list) {
- prepare_query(hq, bo, num_tiles, tile_stride);
+ prepare_query(hq, prsc, num_tiles, tile_stride);
if (remove)
list_delinit(&hq->list);
}
@@ -384,25 +385,34 @@ void
fd_hw_query_prepare(struct fd_context *ctx, uint32_t num_tiles)
{
uint32_t tile_stride = ctx->next_sample_offset;
- struct fd_bo *bo;
+ struct pipe_resource *prsc;
- if (ctx->query_bo)
- fd_bo_del(ctx->query_bo);
+ pipe_resource_reference(&ctx->query_buf, NULL);
if (tile_stride > 0) {
- bo = fd_bo_new(ctx->dev, tile_stride * num_tiles,
- DRM_FREEDRENO_GEM_CACHE_WCOMBINE |
- DRM_FREEDRENO_GEM_TYPE_KMEM);
+ struct pipe_screen *pscreen = &ctx->screen->base;
+ struct pipe_resource templ = {
+ .target = PIPE_BUFFER,
+ .format = PIPE_FORMAT_R8_UNORM,
+ .bind = PIPE_BIND_QUERY_BUFFER,
+ .width0 = tile_stride * num_tiles,
+ .height0 = 1,
+ .depth0 = 1,
+ .array_size = 1,
+ .last_level = 0,
+ .nr_samples = 1,
+ };
+ prsc = pscreen->resource_create(pscreen, &templ);
} else {
- bo = NULL;
+ prsc = NULL;
}
- ctx->query_bo = bo;
+ ctx->query_buf = prsc;
ctx->query_tile_stride = tile_stride;
- prepare_queries(ctx, bo, num_tiles, tile_stride,
+ prepare_queries(ctx, prsc, num_tiles, tile_stride,
&ctx->active_queries, false);
- prepare_queries(ctx, bo, num_tiles, tile_stride,
+ prepare_queries(ctx, prsc, num_tiles, tile_stride,
&ctx->current_queries, true);
/* reset things for next batch: */
@@ -422,7 +432,7 @@ fd_hw_query_prepare_tile(struct fd_context *ctx, uint32_t n,
fd_wfi(ctx, ring);
OUT_PKT0 (ring, HW_QUERY_BASE_REG, 1);
- OUT_RELOCW(ring, ctx->query_bo, offset, 0, 0);
+ OUT_RELOCW(ring, fd_resource(ctx->query_buf)->bo, offset, 0, 0);
}
void
diff --git a/src/gallium/drivers/freedreno/freedreno_query_hw.h b/src/gallium/drivers/freedreno/freedreno_query_hw.h
index 095140ea033..0afece3495f 100644
--- a/src/gallium/drivers/freedreno/freedreno_query_hw.h
+++ b/src/gallium/drivers/freedreno/freedreno_query_hw.h
@@ -107,7 +107,7 @@ struct fd_hw_sample {
* This way we can defer allocation until total # of requested
* samples, and total # of tiles, is known.
*/
- struct fd_bo *bo;
+ struct pipe_resource *prsc;
uint32_t num_tiles;
uint32_t tile_stride;
};