summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Mueller <MarkKMueller@gmail.com>2013-12-04 19:52:53 -0800
committerMark Mueller <MarkKMueller@gmail.com>2014-01-13 09:44:31 -0800
commitd85697f3f129f26784c83c1f0e3b4c83b2d3c6f4 (patch)
tree0c0ef5f0d91d64d1fdbbdcb655c596879214a8e3
parent5ea32a11d35fa9b9d853e63d89b7c6e6f676c5f4 (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.cpp8
-rw-r--r--src/mesa/drivers/dri/i965/brw_blorp.h1
-rw-r--r--src/mesa/drivers/dri/i965/brw_blorp_blit.cpp27
-rw-r--r--src/mesa/drivers/dri/i965/brw_surface_formats.c2
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,