diff options
| author | Christoph Bumiller <e0425955@student.tuwien.ac.at> | 2010-01-24 15:13:17 +0100 | 
|---|---|---|
| committer | Christoph Bumiller <e0425955@student.tuwien.ac.at> | 2010-01-24 15:13:17 +0100 | 
| commit | d6fd31a8d47b6cc70b5e64757e1272ccc6594350 (patch) | |
| tree | 425813cb36d10c84ab6288be02a680ab1c124c02 | |
| parent | 21b2c0a6e5ecb6d542bd7d3750c5a0b745104edd (diff) | |
nv50: implement render_condition
Still not handling queries on multiple contexts though.
| -rw-r--r-- | src/gallium/drivers/nv50/nv50_query.c | 40 | 
1 files changed, 36 insertions, 4 deletions
diff --git a/src/gallium/drivers/nv50/nv50_query.c b/src/gallium/drivers/nv50/nv50_query.c index 5a4ab3508b..9eba4c9611 100644 --- a/src/gallium/drivers/nv50/nv50_query.c +++ b/src/gallium/drivers/nv50/nv50_query.c @@ -48,7 +48,7 @@ nv50_query_create(struct pipe_context *pipe, unsigned type)  	assert (q->type == PIPE_QUERY_OCCLUSION_COUNTER);  	q->type = type; -	ret = nouveau_bo_new(dev, NOUVEAU_BO_VRAM | NOUVEAU_BO_MAP, 256, +	ret = nouveau_bo_new(dev, NOUVEAU_BO_GART | NOUVEAU_BO_MAP, 256,  			     16, &q->bo);  	if (ret) {  		FREE(q); @@ -95,11 +95,13 @@ nv50_query_end(struct pipe_context *pipe, struct pipe_query *pq)  	MARK_RING (chan, 5, 2); /* flush on lack of space or relocs */  	BEGIN_RING(chan, tesla, NV50TCL_QUERY_ADDRESS_HIGH, 4); -	OUT_RELOCh(chan, q->bo, 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_WR); -	OUT_RELOCl(chan, q->bo, 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_WR); +	OUT_RELOCh(chan, q->bo, 0, NOUVEAU_BO_GART | NOUVEAU_BO_WR); +	OUT_RELOCl(chan, q->bo, 0, NOUVEAU_BO_GART | NOUVEAU_BO_WR);  	OUT_RING  (chan, 0x00000000);  	OUT_RING  (chan, 0x0100f002); -	FIRE_RING (chan); + +	BEGIN_RING(chan, tesla, NV50TCL_SAMPLECNT_ENABLE, 1); +	OUT_RING  (chan, 0);  }  static boolean @@ -123,6 +125,35 @@ nv50_query_result(struct pipe_context *pipe, struct pipe_query *pq,  	return q->ready;  } +static void +nv50_render_condition(struct pipe_context *pipe, +		      struct pipe_query *pq, uint mode) +{ +	struct nv50_context *nv50 = nv50_context(pipe); +	struct nouveau_channel *chan = nv50->screen->base.channel; +	struct nouveau_grobj *tesla = nv50->screen->tesla; +	struct nv50_query *q; + +	if (!pq) { +		BEGIN_RING(chan, tesla, NV50TCL_COND_MODE, 1); +		OUT_RING  (chan, NV50TCL_COND_MODE_ALWAYS); +		return; +	} +	q = nv50_query(pq); + +	if (mode == PIPE_RENDER_COND_WAIT || +	    mode == PIPE_RENDER_COND_BY_REGION_WAIT) { +		/* XXX: big fence, FIFO semaphore might be better */ +		BEGIN_RING(chan, tesla, 0x0110, 1); +		OUT_RING  (chan, 0); +	} + +	BEGIN_RING(chan, tesla, NV50TCL_COND_ADDRESS_HIGH, 3); +	OUT_RELOCh(chan, q->bo, 0, NOUVEAU_BO_GART | NOUVEAU_BO_RD); +	OUT_RELOCl(chan, q->bo, 0, NOUVEAU_BO_GART | NOUVEAU_BO_RD); +	OUT_RING  (chan, NV50TCL_COND_MODE_RES); +} +  void  nv50_init_query_functions(struct nv50_context *nv50)  { @@ -131,4 +162,5 @@ nv50_init_query_functions(struct nv50_context *nv50)  	nv50->pipe.begin_query = nv50_query_begin;  	nv50->pipe.end_query = nv50_query_end;  	nv50->pipe.get_query_result = nv50_query_result; +	nv50->pipe.render_condition = nv50_render_condition;  }  | 
