On Fri, Oct 23, 2015 at 1:30 PM, Bas Nieuwenhuizen
<b...@basnieuwenhuizen.nl> wrote:
> On Fri, Oct 23, 2015 at 12:50 PM, Marek Olšák <mar...@gmail.com> wrote:
>> On Fri, Oct 23, 2015 at 12:17 PM, Bas Nieuwenhuizen
>> <b...@basnieuwenhuizen.nl> wrote:
>>> On Thu, Oct 22, 2015 at 12:12 PM, Marek Olšák <mar...@gmail.com> wrote:
>>>>> diff --git a/src/gallium/drivers/radeonsi/si_descriptors.c 
>>>>> b/src/gallium/drivers/radeonsi/si_descriptors.c
>>>>> index 5548cba3..a277fa5 100644
>>>>> --- a/src/gallium/drivers/radeonsi/si_descriptors.c
>>>>> +++ b/src/gallium/drivers/radeonsi/si_descriptors.c
>>>>> @@ -234,7 +234,7 @@ static void si_set_sampler_views(struct pipe_context 
>>>>> *ctx,
>>>>>                         } else {
>>>>>                                 samplers->depth_texture_mask &= ~(1 << 
>>>>> slot);
>>>>>                         }
>>>>> -                       if (rtex->cmask.size || rtex->fmask.size) {
>>>>> +                       if (rtex->cmask.size || rtex->fmask.size || 
>>>>> rtex->surface.dcc_enabled) {
>>>>>                                 samplers->compressed_colortex_mask |= 1 
>>>>> << slot;
>>>>
>>>> I'd like this flag to be set only when dirty_level_mask is non-zero.
>>>> Setting this for all textures that have DCC is quite expensive in draw
>>>> calls.
>>>
>>> I think this code is incorrect even without considering DCC. If we do
>>> a fast clear on a surface which allocates a cmask and then use that
>>> surface as a texture without calling set_sampler_views in between
>>> (because it was bound before) we get a stale compressed_colortex_mask.
>>>
>>> Some testing shows that this can be triggered using OpenGL, although
>>> the GL_ARB_texture_barrier extension may be needed to make the result
>>> not undefined per the specification.
>>
>> In that case, we should decompress in texture_barrier and not in draw calls.
>>
>> Marek
>
>
> texture_barrier does not need to be called though, the language
> changes might be needed.
>
> Basically the test is
>
> fbo1, fbo2 framebuffers with 1 color buffer each:
>
> bind fbo2 as texture
> clear fbo1 using shader
> bind fbo1 as texture
> clear fbo2 using shader
> clear fbo1 using clear (which results in cmask being allocated for fbo1)
> bind fbo2 as texture
> copy fbo2 to fbo1 using copy shader (which wrongly does not decompress fbo1)
>
> If the clear shader has an unused sampler2D, then we bind fbo1 as a
> texture before the clear and do not rebind it afterwards.
>
> Note that the normal clear is the only one for which we have a
> rendering feedback loop, and it should not fetch from any texture at
> all. I don't think we need a texture barrier for that.
>
> I would think this would be most easily fixed by recomputing
> compressed_colortex_mask after a fast clear.

I'm afraid I don't understand the given example. Copying to fbo1
doesn't need decompression, because fbo1 is a color buffer.

I'm assuming there are no image stores.

Marek
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to