[Mesa-dev] Gallium: Moving BlitFramebuffer implementation into drivers

Jose Fonseca jfonseca at vmware.com
Mon Sep 10 03:31:00 PDT 2012



----- Original Message -----
> Hi everyone,
> 
> I'd like to move the BlitFramebuffer implementation into gallium
> drivers. The pros are:
> - allowing MSAA resource blitting to be accelerated on any hardware
> - allowing stencil blitting to be accelerated on any hardware
> - drivers are more likely to take a faster codepath if they have the
> full description of the blit operation
> - easy way to do blitting in state trackers (no modules needed)
> - unduplication of code between u_blitter and u_blit (by dropping
> u_blit), so that we can more concentrate on improving the former
> 
> This is the proposed interface:
> 
> /**
>  * Information to describe a blit call.
>  */
> struct pipe_blit_info
> {
>    struct {
>       struct pipe_resource *resource;
>       unsigned level;
>       struct pipe_box box; /**< negative width, height only legal for
>       src */
>       /* For pipe_surface-like format casting: */
>       enum pipe_format format; /**< must be supported for sampling
>       (src)
>                                     or rendering (dst) */
>    } dst, src;
> 
>    unsigned mask; /**< bitmask of PIPE_MASK_R/G/B/A/Z/S */
>    unsigned filter; /**< PIPE_TEX_FILTER_* */
> 
>    boolean scissor_enable;
>    struct pipe_scissor_state scissor;
> };
> 
> struct pipe_context
> {
> ...
>    void (*blit)(struct pipe_context *pipe,
>                 const struct pipe_blit_info *info);
> ...
> };
> 
> The reason for having the scissor state in there is that the source
> texture cannot be clipped to the scissor rectangle easily if the blit
> is scaled (stretched). The result of such clipping would have to be
> in
> floats.
> 
> There are pretty much no limitations of what it can do, just like
> BlitFramebuffer (which allows flipping, scaling, format conversions,
> upsampling and downsampling (= resolve), out-of-bounds reads are
> clamped etc.), except that we should also allow the render condition
> to take effect? Not sure it would be needed though.
> 
> I will gladly implement the new blit hook in all drivers. I will use
> u_blitter for that. i915g is a good example of how easy it can be:
> http://cgit.freedesktop.org/mesa/mesa/tree/src/gallium/drivers/i915/i915_surface.c#n46
> 
> This deprecates resource_resolve. Note that resource_resolve already
> allows scaling (there is a cap for that though), flipping, and format
> conversions. pipe_resolve_info is really not much different from
> pipe_blit_info and may just as well be removed.
> 
> I am not sure if it deprecates resource_copy_region (let's talk only
> about textures here). Drivers are free to use resource_copy_region
> for
> those blits that are equivalent to it, so in the end it doesn't
> matter
> if the state tracker is using blit or resource_copy_region.
> 
> It also deprecates u_blit. I'd like all traces of u_blit to disappear
> from st/mesa at least. I'd also like to remove all code that tries
> resource_copy_region first before using u_blit, because drivers are
> better off deciding that for themselves (CopyTexSubImage is one such
> example).
> 
> I am also fixing all BlitFramebuffer tests that st/mesa fails at the
> moment.
> 
> That's it. I am looking forward to your comments.
> 
> Marek

IMO, although pipe helper modules like draw/u_blitter create several problems as they are not water-tight layers, I think overall this new interface is a good idea. 

Software renderers like llvmpipe/softpipe would benefit from a specialized software blitter does doesn't go through the full texture quad. svga pipe driver too, has dedicated stretch-blit commands that currently go unused.

But I'd prefer that u_blit was not removed/changed immediately, but simply marked deprecated and left untouched for a transitory period: we have internal state trackers that rely on it, and we want to be able to continue using it, until the new blit method becomes fully functional and stable.

Also, I think it would be simpler to keep resource_copy_region for now.

Jose


More information about the mesa-dev mailing list