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 <samuel.pitoiset@gmail.com>
Reviewed-by: Pierre Moreau <pierre.morrow@free.fr>
This commit is contained in:
Samuel Pitoiset 2015-10-17 11:24:50 +02:00
parent 5f1eeb799b
commit 0d0329df8f
2 changed files with 30 additions and 12 deletions

View file

@ -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;
}

View file

@ -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;