summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKenneth Graunke <kenneth@whitecape.org>2013-09-29 22:22:52 -0700
committerKenneth Graunke <kenneth@whitecape.org>2013-10-09 16:36:50 -0700
commitb330125790498f44e5325ef30b7a1e0fd7245680 (patch)
tree4f732acbd9d5173d204fc7300e687b1326ffd4dc
parent72aade48fe7d4c4099ef713887c06b3aaacf1acd (diff)
i965/blorp: Allow format conversions for CopyTexSubImage.
BLORP performs blits by drawing a rectangle with a shader that samples from the source texture, and writes color data to the destination. The sampler always returns 32-bit RGBA float data, regardless of the source format's component ordering or data type. Likewise, the render target write message takes 32-bit RGBA float data, and converts it appropriately. So the bulk of the work is already taken care of for us. This greatly accelerates a lot of CopyTexSubImage calls, and makes Legends of Aethereus playable on Ivybridge. At the default settings, LOA continually blits between SRGBA8888 (the window format) and RGBA16_FLOAT. Since neither BLORP nor our BLT paths supported this, it fell back to meta, spending 33% of the CPU in floorf() converting between floats and half-floats. v2: Use != instead of ^ (suggested by Ian). Note that only CopyTexSubImage is affected by this patch (caught by Eric). Signed-off-by: Kenneth Graunke <kenneth@whitecape.org> Reviewed-by: Ian Romanick <ian.d.romanick@intel.com> Reviewed-by: Chad Versace <chad.versace@linux.intel.com> Reviewed-by: Eric Anholt <eric@anholt.net> Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--src/mesa/drivers/dri/i965/brw_blorp_blit.cpp15
1 files changed, 14 insertions, 1 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
index 999a317b82..2b94e2d517 100644
--- a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
+++ b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
@@ -353,10 +353,23 @@ brw_blorp_copytexsubimage(struct brw_context *brw,
if (brw->gen < 6)
return false;
- if (!color_formats_match(src_mt->format, dst_mt->format)) {
+ if (_mesa_get_format_base_format(src_mt->format) !=
+ _mesa_get_format_base_format(dst_mt->format)) {
return false;
}
+ /* We can't handle format conversions between Z24 and other formats since
+ * we have to lie about the surface format. See the comments in
+ * brw_blorp_surface_info::set().
+ */
+ if ((src_mt->format == MESA_FORMAT_X8_Z24) !=
+ (dst_mt->format == MESA_FORMAT_X8_Z24)) {
+ return false;
+ }
+
+ if (!brw->format_supported_as_render_target[dst_mt->format])
+ return false;
+
/* Source clipping shouldn't be necessary, since copytexsubimage (in
* src/mesa/main/teximage.c) calls _mesa_clip_copytexsubimage() which
* takes care of it.