On Wed, Jun 25, 2014 at 12:05 PM, Jon Ashburn <j...@lunarg.com> wrote:
> Existing texture read into PBO was using GPU Blit engine in which src and > dest formats must match. With commit 61e264f4fcdba, internally stored > texture > formats were no longer swizzled (BGRA instead of RGBA). This caused > existing > accelerated paths to fallback to the SW slow path since the internal > texture > format and the PBO format no longer matched. > > Switch glGetTexImage to PBO case to use blorp instead of GPU BLIT engine > and > handle formats that match but are swizzled using blorp. > --- > src/mesa/drivers/dri/i965/intel_tex_image.c | 52 > ++++++++++++++++++++++++----- > 1 file changed, 43 insertions(+), 9 deletions(-) > > diff --git a/src/mesa/drivers/dri/i965/intel_tex_image.c > b/src/mesa/drivers/dri/i965/intel_tex_image.c > index de0546a..0e86396 100644 > --- a/src/mesa/drivers/dri/i965/intel_tex_image.c > +++ b/src/mesa/drivers/dri/i965/intel_tex_image.c > @@ -24,6 +24,7 @@ > #include "intel_blit.h" > #include "intel_fbo.h" > #include "intel_image.h" > +#include "brw_blorp.h" > > #include "brw_context.h" > > @@ -84,6 +85,32 @@ intel_miptree_create_for_teximage(struct brw_context > *brw, > INTEL_MIPTREE_TILING_ANY); > } > > +static mesa_format > +format_swizzled_rgb(mesa_format format) > +{ > + switch (format) { > + case MESA_FORMAT_B8G8R8X8_UNORM: > + return MESA_FORMAT_R8G8B8X8_UNORM; > + case MESA_FORMAT_B8G8R8A8_UNORM: > + return MESA_FORMAT_R8G8B8A8_UNORM; > + case MESA_FORMAT_R8G8B8X8_UNORM: > + return MESA_FORMAT_B8G8R8X8_UNORM; > + case MESA_FORMAT_R8G8B8A8_UNORM: > + return MESA_FORMAT_B8G8R8A8_UNORM; > + case MESA_FORMAT_B8G8R8A8_SRGB: > + return MESA_FORMAT_R8G8B8A8_SRGB; > + case MESA_FORMAT_B8G8R8X8_SRGB: > + return MESA_FORMAT_R8G8B8X8_SRGB; > + case MESA_FORMAT_R8G8B8A8_SRGB: > + return MESA_FORMAT_B8G8R8A8_SRGB; > + case MESA_FORMAT_R8G8B8X8_SRGB: > + return MESA_FORMAT_B8G8R8X8_SRGB; > + default: > + /* All other formats that aren't byte swizzable */ > + return MESA_FORMAT_NONE; > + } > +} > + > /* XXX: Do this for TexSubImage also: > */ > static bool > @@ -427,15 +454,21 @@ blit_texture_to_pbo(struct gl_context *ctx, > GLuint dst_offset; > drm_intel_bo *dst_buffer; > GLenum target = texImage->TexObject->Target; > + bool rgb_swap; > + mesa_format swizzle_format = > format_swizzled_rgb(intelImage->mt->format); > > /* Check if we can use GPU blit to copy from the hardware texture > * format to the user's format/type. > * Note that GL's pixel transfer ops don't apply to glGetTexImage() > */ > > - if (!_mesa_format_matches_format_and_type(intelImage->mt->format, > format, > - type, false)) > - { > + if (_mesa_format_matches_format_and_type(intelImage->mt->format, > format, > + type, false)) { > + rgb_swap = false; > + } else if (_mesa_format_matches_format_and_type(swizzle_format, > + format, type, false)) { > + rgb_swap = true; > + } else { > perf_debug("%s: unsupported format, fallback to CPU mapping for > PBO\n", > __FUNCTION__); > > @@ -457,6 +490,7 @@ blit_texture_to_pbo(struct gl_context *ctx, > if (target == GL_TEXTURE_1D_ARRAY || > target == GL_TEXTURE_2D_ARRAY || > target == GL_TEXTURE_CUBE_MAP_ARRAY || > + target == GL_TEXTURE_CUBE_MAP || > This change is not intuitive. Talking with Jon, he added the test for CUBE_MAP because of a piglit failure when using blorp vs. previous intel_miptree_blit. Is there something different folks would recommend? > target == GL_TEXTURE_3D) { > perf_debug("%s: no support for multiple slices, fallback to CPU > mapping " > "for PBO\n", __FUNCTION__); > @@ -483,6 +517,7 @@ blit_texture_to_pbo(struct gl_context *ctx, > struct intel_mipmap_tree *pbo_mt = > intel_miptree_create_for_bo(brw, > dst_buffer, > + (rgb_swap) ? swizzle_format : > intelImage->mt->format, > dst_offset, > texImage->Width, texImage->Height, > @@ -491,13 +526,12 @@ blit_texture_to_pbo(struct gl_context *ctx, > if (!pbo_mt) > return false; > > - if (!intel_miptree_blit(brw, > - intelImage->mt, texImage->Level, > texImage->Face, > - 0, 0, false, > + brw_blorp_blit_miptrees(brw, > + intelImage->mt, texImage->Level, > texImage->Face, > pbo_mt, 0, 0, > - 0, 0, dst_flip, > - texImage->Width, texImage->Height, GL_COPY)) > - return false; > + 0, 0, texImage->Width, texImage->Height, > + 0, 0, texImage->Width, texImage->Height, > + GL_NEAREST, dst_flip, false); > > intel_miptree_release(&pbo_mt); > > -- > 1.8.1.2 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev > Reviewed-by: Courtney Goeltzenleuchter <court...@lunarg.com> -- Courtney Goeltzenleuchter LunarG
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev