[Mesa-dev] [PATCH] nv50: make sure to clear _all_ layers of all attachments
Emil Velikov
emil.l.velikov at gmail.com
Thu Feb 13 09:05:49 PST 2014
On 13/02/14 16:14, Ilia Mirkin wrote:
> On Thu, Feb 13, 2014 at 9:57 AM, Emil Velikov <emil.l.velikov at gmail.com> wrote:
>> On 13/02/14 10:13, Ilia Mirkin wrote:
>>> Unfortunately there's only one RT_ARRAY_MODE setting for all
>>> attachments, so clears were previously truncated to the minimum number
>>> of layers any attachment had. Instead set the RT_ARRAY_MODE to 512 (the
>>> max number of layers) before doing the clear. This fixes
>>> gl-3.2-layered-rendering-clear-color-mismatched-layer-count.
>>>
>> Pardon my ignorance but how did you gather the maximum number of layers
>> ? The headers list values up-to 0xffff.
>>
>> Guessing that setting the maximum number of layers is a slight overkill
>> but I'm definitely not opposed to it.
>
> The headers sure do...
>
> [369050.901062] nouveau E[ PGRAPH][0000:02:00.0] DATA_ERROR INVALID_VALUE
> [369050.901069] nouveau E[ PGRAPH][0000:02:00.0] ch 4 [0x003f92e000
> gl-3.2-layered-[13468]] subc 3 class 0x8297 mthd 0x1224 data
> 0x0000ffff
> [369178.121557] nouveau E[ PGRAPH][0000:02:00.0] DATA_ERROR INVALID_VALUE
> [369178.121567] nouveau E[ PGRAPH][0000:02:00.0] ch 4 [0x003f92e000
> gl-3.2-layered-[14400]] subc 3 class 0x8297 mthd 0x1224 data
> 0x00000201
>
> And also
>
> case PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS:
> return 512;
>
> So I'm pretty sure that 512 is max. I'll have to check whether the
> rnndb can support a max value like that.
>
> CLEAR_BUFFERS explicitly gets the layer id from the code, so we'll
> never try to clear a layer that we don't think is there. The whole
> problem originates from the issues around multiple attachments with
> different numbers of layers. Setting the max just avoids the card from
> checking whether the layer id is valid or not based on the
> RT_ARRAY_MODE.
>
>>> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_surface.c b/src/gallium/drivers/nouveau/nv50/nv50_surface.c
>>> index a22436b..68924c9 100644
>>> --- a/src/gallium/drivers/nouveau/nv50/nv50_surface.c
>>> +++ b/src/gallium/drivers/nouveau/nv50/nv50_surface.c
>>> @@ -366,7 +366,7 @@ nv50_clear_depth_stencil(struct pipe_context *pipe,
>>> PUSH_DATA (push, bo->offset + sf->offset);
>>> PUSH_DATA (push, nv50_format_table[dst->format].rt);
>>> PUSH_DATA (push, mt->level[sf->base.u.tex.level].tile_mode);
>>> - PUSH_DATA (push, 0);
>>> + PUSH_DATA (push, mt->layer_stride >> 2);
>> I'm guessing that this hunk could be separated, as it does make sense to
>> set the stride when doing the clears.
>
> I guess it could be. But it's related to clearing and layers and I
> noticed it when I was doing this exercise, so... seems reasonable to
> throw it in here.
>
Fair enough. Can you please add a couple of words in the commit msg.
>>
>> Does this make make any difference wrt the test in question ?
>
> Not in the least. The test goes down the nv50_clear path. No idea what
> hits this path, but it's part of the pipe interface.
>
Three users - st/vega, st/clover and the aux/postprocess(effectively
mlaa). mlaa gets initialized as it's detected in the dri-config,
regardless if it's settings :\
Not sure how that would cause any issues though.
FWIW the patch is Reviewed-by: Emil Velikov <emil.l.velikov at gmail.com>
-Emil
> -ilia
>
More information about the mesa-dev
mailing list