summaryrefslogtreecommitdiffstats
path: root/src/mesa/drivers/dri
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/drivers/dri')
-rw-r--r--src/mesa/drivers/dri/i965/intel_copy_image.c34
1 files changed, 28 insertions, 6 deletions
diff --git a/src/mesa/drivers/dri/i965/intel_copy_image.c b/src/mesa/drivers/dri/i965/intel_copy_image.c
index fdc6c8cc978..1ca6003cd12 100644
--- a/src/mesa/drivers/dri/i965/intel_copy_image.c
+++ b/src/mesa/drivers/dri/i965/intel_copy_image.c
@@ -25,6 +25,7 @@
* Jason Ekstrand <[email protected]>
*/
+#include "brw_blorp.h"
#include "intel_fbo.h"
#include "intel_tex.h"
#include "intel_blit.h"
@@ -209,8 +210,33 @@ copy_miptrees(struct brw_context *brw,
int dst_x, int dst_y, int dst_z, unsigned dst_level,
int src_width, int src_height)
{
+ struct gl_context *ctx = &brw->ctx;
unsigned bw, bh;
+ if (brw->gen >= 6 &&
+ brw->format_supported_as_render_target[dst_mt->format] &&
+ !_mesa_is_format_compressed(src_mt->format)) {
+
+ /* We'll use the destination format for both images */
+ mesa_format format = dst_mt->format;
+
+ brw_blorp_blit_miptrees(brw,
+ src_mt, src_level, src_z, format, SWIZZLE_XYZW,
+ dst_mt, dst_level, dst_z, format,
+ src_x, src_y,
+ src_x + src_width, src_y + src_height,
+ dst_x, dst_y,
+ dst_x + src_width, dst_y + src_height,
+ GL_NEAREST, false, false, /* mirror */
+ false, false);
+ return;
+ }
+
+ if (src_mt->num_samples > 0 || dst_mt->num_samples > 0) {
+ _mesa_problem(ctx, "Failed to copy multisampled texture with BLORP\n");
+ return;
+ }
+
/* We are now going to try and copy the texture using the blitter. If
* that fails, we will fall back mapping the texture and using memcpy.
* In either case, we need to do a full resolve.
@@ -267,7 +293,8 @@ intel_copy_image_sub_data(struct gl_context *ctx,
struct intel_mipmap_tree *src_mt, *dst_mt;
unsigned src_level, dst_level;
- if (_mesa_meta_CopyImageSubData_uncompressed(ctx,
+ if (brw->gen < 6 &&
+ _mesa_meta_CopyImageSubData_uncompressed(ctx,
src_image, src_renderbuffer,
src_x, src_y, src_z,
dst_image, dst_renderbuffer,
@@ -309,11 +336,6 @@ intel_copy_image_sub_data(struct gl_context *ctx,
dst_level = 0;
}
- if (src_mt->num_samples > 0 || dst_mt->num_samples > 0) {
- _mesa_problem(ctx, "Failed to copy multisampled texture with BLORP\n");
- return;
- }
-
copy_miptrees(brw, src_mt, src_x, src_y, src_z, src_level,
dst_mt, dst_x, dst_y, dst_z, dst_level,
src_width, src_height);