diff options
author | Ilia Mirkin <[email protected]> | 2016-09-17 18:23:49 -0400 |
---|---|---|
committer | Ilia Mirkin <[email protected]> | 2017-02-11 20:25:26 -0500 |
commit | 2b0580123ed5b87ba00df93d174e20eabd9d1ecd (patch) | |
tree | 324558606088ba4836ab47a00528a1c4c47f8f97 /src/gallium/drivers/nouveau | |
parent | 399e267f0e633df41eb1922f7c5f0958a40d6a52 (diff) |
nvc0: fix 64-bit integer query buffer writes
The former logic just plain didn't work at all. We need to write the
subsequent dword to the next buffer location.
Signed-off-by: Ilia Mirkin <[email protected]>
Diffstat (limited to 'src/gallium/drivers/nouveau')
-rw-r--r-- | src/gallium/drivers/nouveau/nvc0/mme/com9097.mme | 22 | ||||
-rw-r--r-- | src/gallium/drivers/nouveau/nvc0/mme/com9097.mme.h | 28 | ||||
-rw-r--r-- | src/gallium/drivers/nouveau/nvc0/nvc0_query_hw.c | 7 |
3 files changed, 37 insertions, 20 deletions
diff --git a/src/gallium/drivers/nouveau/nvc0/mme/com9097.mme b/src/gallium/drivers/nouveau/nvc0/mme/com9097.mme index 11c20564c36..7c5ec8f52b9 100644 --- a/src/gallium/drivers/nouveau/nvc0/mme/com9097.mme +++ b/src/gallium/drivers/nouveau/nvc0/mme/com9097.mme @@ -508,18 +508,21 @@ daic_runout_check: * parm[3] = MSB of start value * parm[4] = desired sequence * parm[5] = actual sequence + * parm[6] = query high address + * parm[7] = query low address */ .section #mme9097_query_buffer_write parm $r2 parm $r3 parm $r4 - parm $r5 maddr 0x16c2 /* QUERY_SEQUENCE */ + parm $r5 maddr 0x16c0 /* QUERY_ADDRESS_HIGH */ parm $r6 parm $r7 mov $r6 (sub $r7 $r6) /* actual - desired */ mov $r6 (sbb 0x0 0x0) /* if there was underflow, not reached yet */ - braz annul $r6 #qbw_ready - exit + parm $r7 + exit braz $r6 #qbw_ready + parm $r6 qbw_ready: mov $r2 (sub $r2 $r4) braz $r1 #qbw_postclamp @@ -531,12 +534,19 @@ qbw_ready: qbw_clamp: mov $r2 $r1 qbw_postclamp: + send $r7 + send $r6 send $r2 + branz $r1 #qbw_done mov $r4 0x1000 - branz annul $r1 #qbw_done send (extrinsrt 0x0 $r4 0x0 0x10 0x10) - maddr 0x16c2 /* QUERY_SEQUENCE */ + maddr 0x16c0 /* QUERY_ADDRESS_HIGH */ + mov $r5 0x4 + mov $r6 (add $r6 $r5) + mov $r7 (adc $r7 0x0) + send $r7 + send $r6 send $r3 qbw_done: exit send (extrinsrt 0x0 $r4 0x0 0x10 0x10) - nop + maddrsend 0x44 diff --git a/src/gallium/drivers/nouveau/nvc0/mme/com9097.mme.h b/src/gallium/drivers/nouveau/nvc0/mme/com9097.mme.h index 1c8f4bbf273..9618da6e28c 100644 --- a/src/gallium/drivers/nouveau/nvc0/mme/com9097.mme.h +++ b/src/gallium/drivers/nouveau/nvc0/mme/com9097.mme.h @@ -336,18 +336,19 @@ uint32_t mme9097_draw_arrays_indirect_count[] = { uint32_t mme9097_query_buffer_write[] = { 0x00000201, 0x00000301, -/* 0x000a: qbw_ready */ +/* 0x000b: qbw_ready */ 0x00000401, - 0x05b08551, -/* 0x0011: qbw_clamp */ -/* 0x0012: qbw_postclamp */ + 0x05b00551, +/* 0x0012: qbw_clamp */ +/* 0x0013: qbw_postclamp */ 0x00000601, 0x00000701, -/* 0x0018: qbw_done */ 0x0005be10, 0x00060610, - 0x0000b027, - 0x00000091, +/* 0x0020: qbw_done */ + 0x00000701, + 0x0000b087, + 0x00000601, 0x00051210, 0x0001c807, 0x00075b10, @@ -356,12 +357,19 @@ uint32_t mme9097_query_buffer_write[] = { 0x00060410, 0x0000a027, 0x00000a11, + 0x00003841, + 0x00003041, 0x00001041, + 0x00028817, 0x04000411, - 0x00010837, 0x84010042, - 0x05b08021, + 0x05b00021, + 0x00010511, + 0x00017610, + 0x00023f10, + 0x00003841, + 0x00003041, 0x00001841, 0x840100c2, - 0x00000011, + 0x00110071, }; diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_query_hw.c b/src/gallium/drivers/nouveau/nvc0/nvc0_query_hw.c index ff20fe6355b..0991af872be 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_query_hw.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_query_hw.c @@ -406,10 +406,7 @@ nvc0_hw_get_query_result_resource(struct nvc0_context *nvc0, nouveau_pushbuf_space(push, 32, 2, 0); PUSH_REFN (push, hq->bo, NOUVEAU_BO_GART | NOUVEAU_BO_RD); PUSH_REFN (push, buf->bo, buf->domain | NOUVEAU_BO_WR); - BEGIN_NVC0(push, NVC0_3D(QUERY_ADDRESS_HIGH), 2); - PUSH_DATAh(push, buf->address + offset); - PUSH_DATA (push, buf->address + offset); - BEGIN_1IC0(push, NVC0_3D(MACRO_QUERY_BUFFER_WRITE), 7); + BEGIN_1IC0(push, NVC0_3D(MACRO_QUERY_BUFFER_WRITE), 9); if (q->type == PIPE_QUERY_OCCLUSION_PREDICATE) /* XXX what if 64-bit? */ PUSH_DATA(push, 0x00000001); else if (result_type == PIPE_QUERY_TYPE_I32) @@ -468,6 +465,8 @@ nvc0_hw_get_query_result_resource(struct nvc0_context *nvc0, nouveau_pushbuf_data(push, hq->bo, hq->offset, 4 | NVC0_IB_ENTRY_1_NO_PREFETCH); } + PUSH_DATAh(push, buf->address + offset); + PUSH_DATA (push, buf->address + offset); if (buf->mm) { nouveau_fence_ref(nvc0->screen->base.fence.current, &buf->fence); |