[Mesa-dev] [PATCH 1/9] st/mesa: always prefer pipe->clear over clear_with_quad

Marek Olšák maraeo at gmail.com
Fri Dec 13 10:36:41 PST 2013


I'll add a cap then.

The fast clear is a technique that doesn't actually clear memory.
Instead, it postpones clearing until later time in hope that the
cleared area will be overdrawn anyway and no clearing will have to be
done. The idea is to have a clear/non-cleared 1-bit flag per tile.
Instead of clearing the renderbuffer, you just clear the flags and
save the clear value in the renderbuffer structure, because that's the
only way to remember it. If the tile state is "non-cleared", the tile
contains valid pixels. If the tile state is "cleared", the tile
contains garbage and any reads from the renderbuffer should return the
saved clear value (e.g. for blending or depth/stencil testing).

If you render a primitive and the primitive covers an entire tile, you
draw new pixels and set the tile state to non-cleared (= the tile has
valid pixels). In this case you avoid clearing entirely. If there is a
primitive edge intersecting a tile, you draw new pixels for that
primitive and then you also have to write the saved clear value to the
other pixels which are outside of the primitive. After that, you also
set the tile state to non-cleared (= the tile has valid pixels).
That's how you do rendering and avoid clearing. If you have to map the
renderbuffer or put it on the screen, you must clear the tiles which
are still in the cleared state (= the tile has invalid pixels) by
explicitly writing the clear value to those tiles. This also implies
that you can have only one clear value per renderbuffer.

Marek

On Fri, Dec 13, 2013 at 5:46 PM, Jose Fonseca <jfonseca at vmware.com> wrote:
> What you mean by "fast clear"?
>
> llvmpipe depth-stencil buffers are interleaved, and AFAICT partial clears will be done with quads.  In other words, this will make llvmpipe slower.
>
> In truth, this will all drivers with interleaved z/s bufferss slower.  That is, this is optimizing for some drivers at expense of others which might have interleaved depth-stencil buffer.  The very fact that it is worthwhile doing this change for your gpu means that it must be worthwhile for others to leave it as it was...
>
> So, if this provides a significant performance difference, then I think the only option to have everybody happy is to have cap to choose the optimal behavior.
>
> Jose
>
> ----- Original Message -----
>> It will only be worse for combined Z-stencil buffers if Z and
>> stencil are interleaved, and if SW rasterizers don't support any kind
>> of fast clear.
>>
>> Marek
>>
>> On Fri, Dec 13, 2013 at 3:21 PM, Jose Fonseca <jfonseca at vmware.com> wrote:
>> > This is worse for SW renderers...
>> >
>> > Jose
>> >
>> > ----- Original Message -----
>> >> From: Marek Olšák <marek.olsak at amd.com>
>> >>
>> >> ---
>> >>  src/mesa/state_tracker/st_cb_clear.c | 12 +++++++-----
>> >>  1 file changed, 7 insertions(+), 5 deletions(-)
>> >>
>> >> diff --git a/src/mesa/state_tracker/st_cb_clear.c
>> >> b/src/mesa/state_tracker/st_cb_clear.c
>> >> index 887e58b..46f2f8d 100644
>> >> --- a/src/mesa/state_tracker/st_cb_clear.c
>> >> +++ b/src/mesa/state_tracker/st_cb_clear.c
>> >> @@ -476,14 +476,16 @@ st_Clear(struct gl_context *ctx, GLbitfield mask)
>> >>        }
>> >>     }
>> >>
>> >> -   /*
>> >> -    * If we're going to use clear_with_quad() for any reason, use it for
>> >> -    * everything possible.
>> >> +   /* Only use quad-based clearing for the renderbuffers which cannot
>> >> +    * use pipe->clear. We want to always use pipe->clear for the other
>> >> +    * renderbuffers, because it's likely to be faster. Even if there is
>> >> +    * a combined depth-stencil buffer, the depth and stencil components
>> >> +    * may be stored separately internally.
>> >>      */
>> >>     if (quad_buffers) {
>> >> -      quad_buffers |= clear_buffers;
>> >>        clear_with_quad(ctx, quad_buffers);
>> >> -   } else if (clear_buffers) {
>> >> +   }
>> >> +   if (clear_buffers) {
>> >>        /* We can't translate the clear color to the colorbuffer format,
>> >>         * because different colorbuffers may have different formats.
>> >>         */
>> >> --
>> >> 1.8.3.2
>> >>
>> >> _______________________________________________
>> >> mesa-dev mailing list
>> >> mesa-dev at lists.freedesktop.org
>> >> https://urldefense.proofpoint.com/v1/url?u=http://lists.freedesktop.org/mailman/listinfo/mesa-dev&k=oIvRg1%2BdGAgOoM1BIlLLqw%3D%3D%0A&r=NMr9uy2iTjWVixC0wOcYCWEIYhfo80qKwRgdodpoDzA%3D%0A&m=cvIgdPYPFAOCEZnN3p40o7cbw0cTfSQzytP%2Byju9mDI%3D%0A&s=b1c126addd7be0ac34d91039bb019dabb14c976597b451daa14f440755d95f14
>> >>
>>


More information about the mesa-dev mailing list