diff options
author | Samuel Pitoiset <[email protected]> | 2015-10-17 11:24:50 +0200 |
---|---|---|
committer | Samuel Pitoiset <[email protected]> | 2015-10-30 17:57:15 +0100 |
commit | 0d0329df8fc95754a8edd76d1da0b32e2aaf83df (patch) | |
tree | 4c6ba0be42b3d8b606db704d87aec7416c0b3670 | |
parent | 5f1eeb799bd9bcdb32382961e57ef74253701ed2 (diff) |
nv50: do not create an invalid HW query type
While we are at it, store the rotate offset for occlusion queries to
nv50_hw_query like on nvc0.
Signed-off-by: Samuel Pitoiset <[email protected]>
Reviewed-by: Pierre Moreau <[email protected]>
-rw-r--r-- | src/gallium/drivers/nouveau/nv50/nv50_query_hw.c | 39 | ||||
-rw-r--r-- | src/gallium/drivers/nouveau/nv50/nv50_query_hw.h | 3 |
2 files changed, 30 insertions, 12 deletions
diff --git a/src/gallium/drivers/nouveau/nv50/nv50_query_hw.c b/src/gallium/drivers/nouveau/nv50/nv50_query_hw.c index fcdd183e88a..945ce7abe50 100644 --- a/src/gallium/drivers/nouveau/nv50/nv50_query_hw.c +++ b/src/gallium/drivers/nouveau/nv50/nv50_query_hw.c @@ -126,9 +126,9 @@ nv50_hw_begin_query(struct nv50_context *nv50, struct nv50_query *q) * query might set the initial render condition to false even *after* we re- * initialized it to true. */ - if (q->type == PIPE_QUERY_OCCLUSION_COUNTER) { - hq->offset += 32; - hq->data += 32 / sizeof(*hq->data); + if (hq->rotate) { + hq->offset += hq->rotate; + hq->data += hq->rotate / sizeof(*hq->data); if (hq->offset - hq->base_offset == NV50_HW_QUERY_ALLOC_SPACE) nv50_hw_query_allocate(nv50, q, NV50_HW_QUERY_ALLOC_SPACE); @@ -339,22 +339,39 @@ nv50_hw_create_query(struct nv50_context *nv50, unsigned type, unsigned index) q->funcs = &hw_query_funcs; q->type = type; + switch (q->type) { + case PIPE_QUERY_OCCLUSION_COUNTER: + hq->rotate = 32; + break; + case PIPE_QUERY_PRIMITIVES_GENERATED: + case PIPE_QUERY_PRIMITIVES_EMITTED: + case PIPE_QUERY_SO_STATISTICS: + case PIPE_QUERY_PIPELINE_STATISTICS: + hq->is64bit = true; + break; + case PIPE_QUERY_TIME_ELAPSED: + case PIPE_QUERY_TIMESTAMP: + case PIPE_QUERY_TIMESTAMP_DISJOINT: + case PIPE_QUERY_GPU_FINISHED: + case NVA0_HW_QUERY_STREAM_OUTPUT_BUFFER_OFFSET: + break; + default: + debug_printf("invalid query type: %u\n", type); + FREE(q); + return NULL; + } + if (!nv50_hw_query_allocate(nv50, q, NV50_HW_QUERY_ALLOC_SPACE)) { FREE(hq); return NULL; } - if (q->type == PIPE_QUERY_OCCLUSION_COUNTER) { + if (hq->rotate) { /* we advance before query_begin ! */ - hq->offset -= 32; - hq->data -= 32 / sizeof(*hq->data); + hq->offset -= hq->rotate; + hq->data -= hq->rotate / sizeof(*hq->data); } - hq->is64bit = (type == PIPE_QUERY_PRIMITIVES_GENERATED || - type == PIPE_QUERY_PRIMITIVES_EMITTED || - type == PIPE_QUERY_SO_STATISTICS || - type == PIPE_QUERY_PIPELINE_STATISTICS); - return q; } diff --git a/src/gallium/drivers/nouveau/nv50/nv50_query_hw.h b/src/gallium/drivers/nouveau/nv50/nv50_query_hw.h index fe518a55895..294c67de9a4 100644 --- a/src/gallium/drivers/nouveau/nv50/nv50_query_hw.h +++ b/src/gallium/drivers/nouveau/nv50/nv50_query_hw.h @@ -14,9 +14,10 @@ struct nv50_hw_query { uint32_t sequence; struct nouveau_bo *bo; uint32_t base_offset; - uint32_t offset; /* base + i * 32 */ + uint32_t offset; /* base + i * rotate */ uint8_t state; bool is64bit; + uint8_t rotate; int nesting; /* only used for occlusion queries */ struct nouveau_mm_allocation *mm; struct nouveau_fence *fence; |