summaryrefslogtreecommitdiffstats
path: root/src/gallium
diff options
context:
space:
mode:
authorDave Airlie <[email protected]>2018-11-27 13:42:58 +1000
committerKenneth Graunke <[email protected]>2019-02-21 10:26:10 -0800
commit311a1b3198e3095ffafb1e4c703e5b5407220136 (patch)
tree0b95c77f42dec594d94aa5bcefdb111ad1da5aaa /src/gallium
parent00645ea01ce9f6a8ad278e05f858535670c6e6a4 (diff)
iris: execute compute related query on compute batch.
This only happens for the compute invocations query.
Diffstat (limited to 'src/gallium')
-rw-r--r--src/gallium/drivers/iris/iris_query.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/src/gallium/drivers/iris/iris_query.c b/src/gallium/drivers/iris/iris_query.c
index 7639c5f7afa..62862927adc 100644
--- a/src/gallium/drivers/iris/iris_query.c
+++ b/src/gallium/drivers/iris/iris_query.c
@@ -98,6 +98,8 @@ struct iris_query {
struct iris_bo *bo;
struct iris_query_snapshots *map;
+
+ int batch_idx;
};
struct iris_query_snapshots {
@@ -137,7 +139,7 @@ iris_is_query_pipelined(struct iris_query *q)
static void
mark_available(struct iris_context *ice, struct iris_query *q)
{
- struct iris_batch *batch = &ice->batches[IRIS_BATCH_RENDER];
+ struct iris_batch *batch = &ice->batches[q->batch_idx];
unsigned flags = PIPE_CONTROL_WRITE_IMMEDIATE;
unsigned offset = offsetof(struct iris_query_snapshots, snapshots_landed);
@@ -170,7 +172,7 @@ iris_pipelined_write(struct iris_batch *batch,
static void
write_value(struct iris_context *ice, struct iris_query *q, unsigned offset)
{
- struct iris_batch *batch = &ice->batches[IRIS_BATCH_RENDER];
+ struct iris_batch *batch = &ice->batches[q->batch_idx];
const struct gen_device_info *devinfo = &batch->screen->devinfo;
if (!iris_is_query_pipelined(q)) {
@@ -429,7 +431,7 @@ overflow_result_to_gpr0(struct iris_context *ice, struct iris_query *q)
static void
calculate_result_on_gpu(struct iris_context *ice, struct iris_query *q)
{
- struct iris_batch *batch = &ice->batches[IRIS_BATCH_RENDER];
+ struct iris_batch *batch = &ice->batches[q->batch_idx];
if (q->type == PIPE_QUERY_SO_OVERFLOW_PREDICATE ||
q->type == PIPE_QUERY_SO_OVERFLOW_ANY_PREDICATE) {
@@ -466,6 +468,10 @@ iris_create_query(struct pipe_context *ctx,
q->type = query_type;
q->index = index;
+ if (q->type == PIPE_QUERY_PIPELINE_STATISTICS && q->index == 10)
+ q->batch_idx = IRIS_BATCH_COMPUTE;
+ else
+ q->batch_idx = IRIS_BATCH_RENDER;
return (struct pipe_query *) q;
}
@@ -552,8 +558,8 @@ iris_get_query_result(struct pipe_context *ctx,
const struct gen_device_info *devinfo = &screen->devinfo;
if (!q->ready) {
- if (iris_batch_references(&ice->batches[IRIS_BATCH_RENDER], q->bo))
- iris_batch_flush(&ice->batches[IRIS_BATCH_RENDER]);
+ if (iris_batch_references(&ice->batches[q->batch_idx], q->bo))
+ iris_batch_flush(&ice->batches[q->batch_idx]);
if (!q->map->snapshots_landed) {
if (wait)
@@ -622,7 +628,7 @@ iris_get_query_result_resource(struct pipe_context *ctx,
{
struct iris_context *ice = (void *) ctx;
struct iris_query *q = (void *) query;
- struct iris_batch *batch = &ice->batches[IRIS_BATCH_RENDER];
+ struct iris_batch *batch = &ice->batches[q->batch_idx];
const struct gen_device_info *devinfo = &batch->screen->devinfo;
struct iris_resource *res = (void *) p_res;
unsigned snapshots_landed_offset =