[Mesa-dev] [PATCH 3/4] i965/blorp: Implement logic for additional buffer formats.
Kenneth Graunke
kenneth at whitecape.org
Thu Jun 7 19:20:41 CEST 2012
On 06/07/2012 10:17 AM, Paul Berry wrote:
> On 6 June 2012 23:42, Kenneth Graunke <kenneth at whitecape.org
> <mailto:kenneth at whitecape.org>> wrote:
>
> On 06/06/2012 12:20 PM, Paul Berry wrote:
> > Previously the blorp engine only supported RGBA8 color buffers and
> > 24-bit depth buffers. This patch adds support for any color buffer
> > format that is supported as a render target, and for 16-bit and 32-bit
> > depth buffers.
> >
> > This required threading the brw_context struct through into
> > brw_blorp_surface_info::set() so that it can consult the
> > brw->render_target_format array.
> > ---
> > src/mesa/drivers/dri/i965/brw_blorp.cpp | 37
> +++++++++++++++++++++++---
> > src/mesa/drivers/dri/i965/brw_blorp.h | 3 +-
> > src/mesa/drivers/dri/i965/brw_blorp_blit.cpp | 4 +-
> > 3 files changed, 37 insertions(+), 7 deletions(-)
> >
> > diff --git a/src/mesa/drivers/dri/i965/brw_blorp.cpp
> b/src/mesa/drivers/dri/i965/brw_blorp.cpp
> > index d6d00e7..32ea738 100644
> > --- a/src/mesa/drivers/dri/i965/brw_blorp.cpp
> > +++ b/src/mesa/drivers/dri/i965/brw_blorp.cpp
> > @@ -53,23 +53,52 @@ brw_blorp_mip_info::set(struct
> intel_mipmap_tree *mt,
> > }
> >
> > void
> > -brw_blorp_surface_info::set(struct intel_mipmap_tree *mt,
> > +brw_blorp_surface_info::set(struct brw_context *brw,
> > + struct intel_mipmap_tree *mt,
> > unsigned int level, unsigned int layer)
> > {
> > brw_blorp_mip_info::set(mt, level, layer);
> > this->num_samples = mt->num_samples;
> > this->array_spacing_lod0 = mt->array_spacing_lod0;
> > + this->map_stencil_as_y_tiled = false;
> >
> > - if (mt->format == MESA_FORMAT_S8) {
> > + switch (mt->format) {
> > + case MESA_FORMAT_S8:
> > /* The miptree is a W-tiled stencil buffer. Surface states
> can't be set
> > * up for W tiling, so we'll need to use Y tiling and have
> the WM
> > * program swizzle the coordinates.
> > */
> > this->map_stencil_as_y_tiled = true;
> > this->brw_surfaceformat = BRW_SURFACEFORMAT_R8_UNORM;
> > - } else {
> > - this->map_stencil_as_y_tiled = false;
> > + break;
> > + case MESA_FORMAT_X8_Z24:
> > + case MESA_FORMAT_Z32_FLOAT:
> > + /* The miptree consists of 32 bits per pixel, arranged
> either as 24-bit
> > + * depth values interleaved with 8 "don't care" bits, or as
> 32-bit
> > + * floating point depth values. Since depth values don't
> require any
> > + * blending, it doesn't matter how we interpret the bit
> pattern as long
> > + * as we copy the right amount of data, so just map it as
> 8-bit RGBA.
>
> Nitpick...you're not mapping it as RGBA. I would believe either
> "just map it as 8-bit BGRA" ... or "as 8-bit ARGB" since I can never
> keep the endianness straight.
>
> Of course, the point of the comment is precisely that it doesn't
> matter... :)
>
>
> Yeah, I didn't want to trouble the reader with this subtlety, but you
> are technically correct. I'll update the comment.
>
>
>
> > + */
> > this->brw_surfaceformat = BRW_SURFACEFORMAT_B8G8R8A8_UNORM;
> > + break;
> > + case MESA_FORMAT_Z16:
> > + /* The miptree consists of 16 bits per pixel of depth data.
> Since depth
> > + * values don't require any blending, it doesn't matter how
> we interpret
> > + * the bit pattern as long as we copy the right amount of
> data, so just
> > + * map is as 8-bit RG.
> > + */
> > + this->brw_surfaceformat = BRW_SURFACEFORMAT_R8G8_UNORM;
> > + break;
> > + default:
> > + /* Blorp blits don't support any sort of format conversion,
> so we can
> > + * safely assume that the same format is being used for the
> source and
> > + * destination. Therefore the format must be supported as
> a render
> > + * target, even if this is the source image. So we can
> convert to a
> > + * surface format using brw->render_target_format.
> > + */
> > + assert(brw->format_supported_as_render_target[mt->format]);
> > + this->brw_surfaceformat =
> brw->render_target_format[mt->format];
>
> Why not just do:
>
> default:
> this->brw_surfaceformat = brw_format_for_mesa_format(mt->format);
>
>
> The trouble is that brw->render_target_format[] and
> brw_format_for_mesa_format() don't do the same thing. In particular,
> brw->render_target_format maps several formats that are otherwise
> unsupported as render targets onto equivalent formats that are supported:
>
> BRW_SURFACEFORMAT_B8G8R8X8_UNORM -> BRW_SURFACEFORMAT_B8G8R8A8_UNORM
> BRW_SURFACEFORMAT_I32_FLOAT -> BRW_SURFACEFORMAT_R32_FLOAT
> BRW_SURFACEFORMAT_L32_FLOAT -> BRW_SURFACEFORMAT_R32_FLOAT
> BRW_SURFACEFORMAT_I16_FLOAT -> BRW_SURFACEFORMAT_R16_FLOAT
> BRW_SURFACEFORMAT_L16_FLOAT -> BRW_SURFACEFORMAT_R16_FLOAT
>
> Blorp needs to use brw->render_target_format[] so that these mappings
> will occur, otherwise it will try to map the render target using an
> unsupported format.
*grumble-grumble* luminance formats *grumble*
Right then :)
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
More information about the mesa-dev
mailing list