diff options
author | Mark Mueller <MarkKMueller@gmail.com> | 2013-12-04 19:52:53 -0800 |
---|---|---|
committer | Mark Mueller <MarkKMueller@gmail.com> | 2014-01-13 09:44:31 -0800 |
commit | d85697f3f129f26784c83c1f0e3b4c83b2d3c6f4 (patch) | |
tree | 0c0ef5f0d91d64d1fdbbdcb655c596879214a8e3 | |
parent | 5ea32a11d35fa9b9d853e63d89b7c6e6f676c5f4 (diff) |
Use render target format as sample format for depth/stencil blts. Avoid
blts when internal fomrat is smaller then target format and source is
larger than internal.
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_blorp.cpp | 8 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_blorp.h | 1 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_blorp_blit.cpp | 27 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_surface_formats.c | 2 |
4 files changed, 30 insertions, 8 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_blorp.cpp b/src/mesa/drivers/dri/i965/brw_blorp.cpp index b0256f30db..4094a6d683 100644 --- a/src/mesa/drivers/dri/i965/brw_blorp.cpp +++ b/src/mesa/drivers/dri/i965/brw_blorp.cpp @@ -90,8 +90,12 @@ brw_blorp_surface_info::set(struct brw_context *brw, this->map_stencil_as_y_tiled = mt->format == MESA_FORMAT_S8; this->msaa_layout = mt->msaa_layout; - gl_format linear_format = _mesa_get_srgb_format_linear(mt->format); - if (is_render_target) { + const gl_format linear_format = _mesa_get_srgb_format_linear(mt->format); + const GLenum base_format = _mesa_get_format_base_format(mt->format); + if (is_render_target || + GL_DEPTH_COMPONENT == base_format || + GL_STENCIL_INDEX == base_format || + GL_DEPTH_STENCIL == base_format) { /* set up for a render target */ brw_format_for_mesa_format(linear_format, &this->process_format_flags, &this->brw_surfaceformat, 0); _mesa_debug(&brw->ctx, "%s: using render format: 0x%x for %s\n", diff --git a/src/mesa/drivers/dri/i965/brw_blorp.h b/src/mesa/drivers/dri/i965/brw_blorp.h index 5707afa2e8..bc45c56347 100644 --- a/src/mesa/drivers/dri/i965/brw_blorp.h +++ b/src/mesa/drivers/dri/i965/brw_blorp.h @@ -370,6 +370,7 @@ public: static bool test_formats(struct brw_context *brw, gl_format src_format, gl_format dst_format, + GLenum internal_format = 0, GLint base_internal_format = 0); private: diff --git a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp index c0333561f2..11515cb118 100644 --- a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp +++ b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp @@ -408,7 +408,8 @@ brw_blorp_GPUcopytexsubimage(struct brw_context *brw, __FUNCTION__, _mesa_get_format_name(cacheTexFormat), _mesa_get_format_name(dst_image->TexFormat), _mesa_lookup_enum_by_nr(dst_image->InternalFormat), _mesa_lookup_enum_by_nr(dst_image->_BaseFormat)); - if (!brw_blorp_blit_params::test_formats(brw, cacheTexFormat, dst_image->TexFormat, dst_image->_BaseFormat)) { + if (!brw_blorp_blit_params::test_formats(brw, cacheTexFormat, dst_image->TexFormat, + dst_image->InternalFormat, dst_image->_BaseFormat)) { return false; } @@ -2314,6 +2315,7 @@ bool brw_blorp_blit_params::test_formats(struct brw_context *brw, gl_format src_format, gl_format dst_format, + GLenum internal_format, GLint base_internal_format) { struct gl_context *ctx = &brw->ctx; @@ -2379,8 +2381,10 @@ brw_blorp_blit_params::test_formats(struct brw_context *brw, linear_dst_format != MESA_FORMAT_XRGB8888) || (linear_dst_format == MESA_FORMAT_XRGB8888 && linear_src_format != MESA_FORMAT_ARGB8888))) { - _mesa_debug(ctx, "%s: Blorp doesn't yet support RGBX formats except blts to or from RGBA: dst: %s: src: %s.\n", - __FUNCTION__, _mesa_get_format_name(dst_format), _mesa_get_format_name(src_format)); + _mesa_debug(ctx, "%s: Blorp doesn't yet support RGBX formats except blts to or from " + "RGBA: dst: %s: src: %s.\n", + __FUNCTION__, _mesa_get_format_name(dst_format), + _mesa_get_format_name(src_format)); return false; } } @@ -2388,8 +2392,21 @@ brw_blorp_blit_params::test_formats(struct brw_context *brw, GLenum baseSourceFormat = _mesa_get_format_base_format(src_format); GLenum baseDestinationFormat = _mesa_get_format_base_format(dst_format); - return compare_source_to_target(brw, baseSourceFormat, baseDestinationFormat) && - (0 == base_internal_format || compare_source_to_target(brw, baseSourceFormat, base_internal_format)); + if (!(compare_source_to_target(brw, baseSourceFormat, baseDestinationFormat) && + (0 == base_internal_format || + compare_source_to_target(brw, baseSourceFormat, base_internal_format)))) { + return false; + } + + if (0 != internal_format || + (_mesa_sizeof_packed_type(internal_format) < _mesa_get_format_bytes(dst_format) && + _mesa_sizeof_packed_type(internal_format) >_mesa_get_format_bytes(src_format))) { + _mesa_debug(ctx, "%s: The internal format: %s is smaller then target format %s, and larger" + "the the source: %s\n", + __FUNCTION__, _mesa_lookup_enum_by_nr(internal_format), _mesa_get_format_name(dst_format), + _mesa_get_format_name(src_format)); + return false; + } } brw_blorp_blit_params::brw_blorp_blit_params(struct brw_context *brw, diff --git a/src/mesa/drivers/dri/i965/brw_surface_formats.c b/src/mesa/drivers/dri/i965/brw_surface_formats.c index 0b9071dfbc..5576148391 100644 --- a/src/mesa/drivers/dri/i965/brw_surface_formats.c +++ b/src/mesa/drivers/dri/i965/brw_surface_formats.c @@ -488,7 +488,7 @@ brw_format_for_mesa_format(gl_format mesa_format, blorp_process_format *process_ BRW_SURFACEFORMAT_I16_UNORM, desktop_gl_sel}, [MESA_FORMAT_X8_Z24] = {BRW_SURFACEFORMAT_B8G8R8A8_UNORM, - BRW_SURFACEFORMAT_R24_UNORM_X8_TYPELESS, + BRW_SURFACEFORMAT_I24X8_UNORM, 0}, [MESA_FORMAT_Z24_X8] = {BRW_SURFACEFORMAT_NONE, BRW_SURFACEFORMAT_NONE, |