[Nouveau] [PATCH] nv50, nvc0: don't base decisions on available pushbuf space
Samuel Pitoiset
samuel.pitoiset at gmail.com
Sat Oct 10 12:55:33 PDT 2015
On 10/10/2015 09:42 PM, Ilia Mirkin wrote:
> On Sat, Oct 10, 2015 at 3:41 PM, Samuel Pitoiset
> <samuel.pitoiset at gmail.com> wrote:
>> This patch looks fine except that it should be a bit more normalized. I
>> mean, sometimes you break when PUSH_SPACE fails, sometimes not. Same for
>> PUSH_SPACE calls, sometimes you add it sometimes not.
> Meh. We need to get our error checking situation straight, but this
> isn't the patch to do it in.
Yeah, but this needs to be clarified.
>
>> Did you run a full piglit test this time ? :)
> Nope, but I ran a full piglit before this patch. Almost took down my
> box. Probably won't be running it again for this patch.
Ok, I'll run a full piglit this night then.
>
>> See my comment below.
>>
>>
>> On 10/10/2015 11:09 AM, Ilia Mirkin wrote:
>>> We still have to push everything out, might as well kick earlier and
>>> flip pushbufs when we know we'll need it. This resolves some issues with
>>> the new policy of making sure that we always leave a bit of room at the
>>> end for fences.
>>>
>>> Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
>>> Cc: mesa-stable at lists.freedesktop.org
>>> ---
>>> src/gallium/drivers/nouveau/nv50/nv50_shader_state.c | 9 ++-------
>>> src/gallium/drivers/nouveau/nv50/nv50_transfer.c | 16
>>> +++-------------
>>> src/gallium/drivers/nouveau/nvc0/nvc0_transfer.c | 20
>>> +++++---------------
>>> 3 files changed, 10 insertions(+), 35 deletions(-)
>>>
>>> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_shader_state.c
>>> b/src/gallium/drivers/nouveau/nv50/nv50_shader_state.c
>>> index fdde11f..941555f 100644
>>> --- a/src/gallium/drivers/nouveau/nv50/nv50_shader_state.c
>>> +++ b/src/gallium/drivers/nouveau/nv50/nv50_shader_state.c
>>> @@ -65,14 +65,9 @@ nv50_constbufs_validate(struct nv50_context *nv50)
>>> PUSH_DATA (push, (b << 12) | (i << 8) | p | 1);
>>> }
>>> while (words) {
>>> - unsigned nr;
>>> -
>>> - if (!PUSH_SPACE(push, 16))
>>> - break;
>>> - nr = PUSH_AVAIL(push);
>>> - assert(nr >= 16);
>>> - nr = MIN2(MIN2(nr - 3, words), NV04_PFIFO_MAX_PACKET_LEN);
>>> + unsigned nr = MIN2(words, NV04_PFIFO_MAX_PACKET_LEN);
>>> + PUSH_SPACE(push, nr + 3);
>>
>> This PUSH_SPACE call doesn't seem to be needed for me because
>> NV50_PUSH_EXPLICIT_SPACE_CHECKING is not set and the following BEGIN_XXX
>> calls will allocate space.
> I want to ensure that both of the below commands are in the same
> batch. Not sure if it's necessary, but... don't want to find out. They
> were in the same batch before. And this batch stuff is what was
> causing the M2MF errors I was seeing earlier.
>
>>
>>> BEGIN_NV04(push, NV50_3D(CB_ADDR), 1);
>>> PUSH_DATA (push, (start << 8) | b);
>>> BEGIN_NI04(push, NV50_3D(CB_DATA(0)), nr);
>>> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_transfer.c
>>> b/src/gallium/drivers/nouveau/nv50/nv50_transfer.c
>>> index be51407..9a3fd1e 100644
>>> --- a/src/gallium/drivers/nouveau/nv50/nv50_transfer.c
>>> +++ b/src/gallium/drivers/nouveau/nv50/nv50_transfer.c
>>> @@ -187,14 +187,7 @@ nv50_sifc_linear_u8(struct nouveau_context *nv,
>>> PUSH_DATA (push, 0);
>>> while (count) {
>>> - unsigned nr;
>>> -
>>> - if (!PUSH_SPACE(push, 16))
>>> - break;
>>> - nr = PUSH_AVAIL(push);
>>> - assert(nr >= 16);
>>> - nr = MIN2(count, nr - 1);
>>> - nr = MIN2(nr, NV04_PFIFO_MAX_PACKET_LEN);
>>> + unsigned nr = MIN2(count, NV04_PFIFO_MAX_PACKET_LEN);
>>> BEGIN_NI04(push, NV50_2D(SIFC_DATA), nr);
>>> PUSH_DATAp(push, src, nr);
>>> @@ -395,12 +388,9 @@ nv50_cb_push(struct nouveau_context *nv,
>>> nouveau_pushbuf_validate(push);
>>> while (words) {
>>> - unsigned nr;
>>> -
>>> - nr = PUSH_AVAIL(push);
>>> - nr = MIN2(nr - 7, words);
>>> - nr = MIN2(nr, NV04_PFIFO_MAX_PACKET_LEN - 1);
>>> + unsigned nr = MIN2(words, NV04_PFIFO_MAX_PACKET_LEN);
>>> + PUSH_SPACE(push, nr + 7);
>>> BEGIN_NV04(push, NV50_3D(CB_DEF_ADDRESS_HIGH), 3);
>>> PUSH_DATAh(push, bo->offset + base);
>>> PUSH_DATA (push, bo->offset + base);
>>> diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_transfer.c
>>> b/src/gallium/drivers/nouveau/nvc0/nvc0_transfer.c
>>> index aaec60a..d459dd6 100644
>>> --- a/src/gallium/drivers/nouveau/nvc0/nvc0_transfer.c
>>> +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_transfer.c
>>> @@ -188,14 +188,10 @@ nvc0_m2mf_push_linear(struct nouveau_context *nv,
>>> nouveau_pushbuf_validate(push);
>>> while (count) {
>>> - unsigned nr;
>>> + unsigned nr = MIN2(count, NV04_PFIFO_MAX_PACKET_LEN);
>>> - if (!PUSH_SPACE(push, 16))
>>> + if (!PUSH_SPACE(push, nr + 9))
>>> break;
>>> - nr = PUSH_AVAIL(push);
>>> - assert(nr >= 16);
>>> - nr = MIN2(count, nr - 9);
>>> - nr = MIN2(nr, NV04_PFIFO_MAX_PACKET_LEN);
>>> BEGIN_NVC0(push, NVC0_M2MF(OFFSET_OUT_HIGH), 2);
>>> PUSH_DATAh(push, dst->offset + offset);
>>> @@ -234,14 +230,10 @@ nve4_p2mf_push_linear(struct nouveau_context *nv,
>>> nouveau_pushbuf_validate(push);
>>> while (count) {
>>> - unsigned nr;
>>> + unsigned nr = MIN2(count, (NV04_PFIFO_MAX_PACKET_LEN - 1));
>>> - if (!PUSH_SPACE(push, 16))
>>> + if (!PUSH_SPACE(push, nr + 10))
>>> break;
>>> - nr = PUSH_AVAIL(push);
>>> - assert(nr >= 16);
>>> - nr = MIN2(count, nr - 8);
>>> - nr = MIN2(nr, (NV04_PFIFO_MAX_PACKET_LEN - 1));
>>> BEGIN_NVC0(push, NVE4_P2MF(UPLOAD_DST_ADDRESS_HIGH), 2);
>>> PUSH_DATAh(push, dst->offset + offset);
>>> @@ -571,9 +563,7 @@ nvc0_cb_bo_push(struct nouveau_context *nv,
>>> PUSH_DATA (push, bo->offset + base);
>>> while (words) {
>>> - unsigned nr = PUSH_AVAIL(push);
>>> - nr = MIN2(nr, words);
>>> - nr = MIN2(nr, NV04_PFIFO_MAX_PACKET_LEN - 1);
>>> + unsigned nr = MIN2(words, NV04_PFIFO_MAX_PACKET_LEN - 1);
>>> PUSH_SPACE(push, nr + 2);
>>> PUSH_REFN (push, bo, NOUVEAU_BO_WR | domain);
>>
More information about the Nouveau
mailing list