[Mesa-dev] [PATCH] nvc0: fix 64-bit integer query buffer writes

Ilia Mirkin imirkin at alum.mit.edu
Fri Feb 10 13:07:52 UTC 2017


On Fri, Feb 10, 2017 at 5:26 AM, Samuel Pitoiset
<samuel.pitoiset at gmail.com> wrote:
>
>
> On 02/10/2017 02:29 AM, Ilia Mirkin wrote:
>>
>> 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 <imirkin at alum.mit.edu>
>> ---
>>  src/gallium/drivers/nouveau/nvc0/mme/com9097.mme   | 22 ++++++++++++-----
>>  src/gallium/drivers/nouveau/nvc0/mme/com9097.mme.h | 28
>> ++++++++++++++--------
>>  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 11c2056..7c5ec8f 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 1c8f4bb..9618da6 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 ff20fe6..0991af8 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?
>> */
>
>
> What about that comment? Maybe you should remove it?

It's still valid. This case still doesn't work.

>
> I would recommend you to run some query tests from piglit however. :)

I did - still fails. But much less so - basically the above case + the
compute invocations cases. Both for another time.

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


More information about the mesa-dev mailing list