summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSamuel Pitoiset <[email protected]>2015-10-17 11:24:50 +0200
committerSamuel Pitoiset <[email protected]>2015-10-30 17:57:15 +0100
commit0d0329df8fc95754a8edd76d1da0b32e2aaf83df (patch)
tree4c6ba0be42b3d8b606db704d87aec7416c0b3670
parent5f1eeb799bd9bcdb32382961e57ef74253701ed2 (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.c39
-rw-r--r--src/gallium/drivers/nouveau/nv50/nv50_query_hw.h3
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;