X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fdrivers%2Fdri%2Fintel%2Fintel_tex_copy.c;h=6043ed26adbf558cee2cae6ccd496e013e5fd959;hb=bdf13dc8324c391b7d34f8bdaea72c4452ab7edb;hp=f4366330f88278b23a6a5fc98988777724dc3c46;hpb=79198063b8adb23536b291081f8df8571926950e;p=mesa.git diff --git a/src/mesa/drivers/dri/intel/intel_tex_copy.c b/src/mesa/drivers/dri/intel/intel_tex_copy.c index f4366330f88..6043ed26adb 100644 --- a/src/mesa/drivers/dri/intel/intel_tex_copy.c +++ b/src/mesa/drivers/dri/intel/intel_tex_copy.c @@ -41,6 +41,9 @@ #include "intel_fbo.h" #include "intel_tex.h" #include "intel_blit.h" +#ifndef I915 +#include "brw_context.h" +#endif #define FILE_DEBUG_FLAG DEBUG_TEXTURE @@ -70,6 +73,32 @@ intel_copy_texsubimage(struct intel_context *intel, assert(region); } + /* According to the Ivy Bridge PRM, Vol1 Part4, section 1.2.1.2 (Graphics + * Data Size Limitations): + * + * The BLT engine is capable of transferring very large quantities of + * graphics data. Any graphics data read from and written to the + * destination is permitted to represent a number of pixels that + * occupies up to 65,536 scan lines and up to 32,768 bytes per scan line + * at the destination. The maximum number of pixels that may be + * represented per scan line’s worth of graphics data depends on the + * color depth. + * + * Furthermore, intelEmitCopyBlit (which is called below) uses a signed + * 16-bit integer to represent buffer pitch, so it can only handle buffer + * pitches < 32k. + * + * As a result of these two limitations, we can only use the blitter to do + * this copy when the region's pitch is less than 32k. + */ + if (region->pitch >= 32768) + return false; + + if (intelImage->base.Base.TexObject->Target == GL_TEXTURE_1D_ARRAY || + intelImage->base.Base.TexObject->Target == GL_TEXTURE_2D_ARRAY) { + perf_debug("no support for array textures\n"); + } + copy_supported = intelImage->base.Base.TexFormat == intel_rb_format(irb); /* Converting ARGB8888 to XRGB8888 is trivial: ignore the alpha bits */ @@ -85,8 +114,7 @@ intel_copy_texsubimage(struct intel_context *intel, } if (!copy_supported && !copy_supported_with_alpha_override) { - if (unlikely(INTEL_DEBUG & DEBUG_PERF)) - fprintf(stderr, "%s mismatched formats %s, %s\n", + perf_debug("%s mismatched formats %s, %s\n", __FUNCTION__, _mesa_get_format_name(intelImage->base.Base.TexFormat), _mesa_get_format_name(intel_rb_format(irb))); @@ -101,7 +129,6 @@ intel_copy_texsubimage(struct intel_context *intel, intel_miptree_get_image_offset(intelImage->mt, intelImage->base.Base.Level, intelImage->base.Base.Face, - 0, &image_x, &image_y); /* The blitter can't handle Y-tiled buffers. */ @@ -152,15 +179,28 @@ intelCopyTexSubImage(struct gl_context *ctx, GLuint dims, GLint x, GLint y, GLsizei width, GLsizei height) { - if (dims == 3 || !intel_copy_texsubimage(intel_context(ctx), - intel_texture_image(texImage), - xoffset, yoffset, - intel_renderbuffer(rb), x, y, width, height)) { - fallback_debug("%s - fallback to swrast\n", __FUNCTION__); - _mesa_meta_CopyTexSubImage(ctx, dims, texImage, - xoffset, yoffset, zoffset, - rb, x, y, width, height); + struct intel_context *intel = intel_context(ctx); + if (dims != 3) { +#ifndef I915 + /* Try BLORP first. It can handle almost everything. */ + if (brw_blorp_copytexsubimage(intel, rb, texImage, x, y, + xoffset, yoffset, width, height)) + return; +#endif + + /* Next, try the BLT engine. */ + if (intel_copy_texsubimage(intel, + intel_texture_image(texImage), + xoffset, yoffset, + intel_renderbuffer(rb), x, y, width, height)) + return; } + + /* Finally, fall back to meta. This will likely be slow. */ + perf_debug("%s - fallback to swrast\n", __FUNCTION__); + _mesa_meta_CopyTexSubImage(ctx, dims, texImage, + xoffset, yoffset, zoffset, + rb, x, y, width, height); }