diff options
-rw-r--r-- | src/mesa/drivers/dri/intel/intel_mipmap_tree.c | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/src/mesa/drivers/dri/intel/intel_mipmap_tree.c b/src/mesa/drivers/dri/intel/intel_mipmap_tree.c index ce03afad68a..a063f87d265 100644 --- a/src/mesa/drivers/dri/intel/intel_mipmap_tree.c +++ b/src/mesa/drivers/dri/intel/intel_mipmap_tree.c @@ -1565,10 +1565,30 @@ intel_miptree_map_singlesample(struct intel_context *intel, intel_miptree_map_etc(intel, mt, map, level, slice); } else if (mt->stencil_mt) { intel_miptree_map_depthstencil(intel, mt, map, level, slice); - } else if (intel->has_llc && - !(mode & GL_MAP_WRITE_BIT) && - !mt->compressed && - mt->region->tiling == I915_TILING_X) { + } + /* 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 by + * intel_miptree_map_blit) 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 + * intel_miptree_map_blit() when the region's pitsh is less than 32k. + */ + else if (intel->has_llc && + !(mode & GL_MAP_WRITE_BIT) && + !mt->compressed && + mt->region->tiling == I915_TILING_X && + mt->region->pitch < 32768) { intel_miptree_map_blit(intel, mt, map, level, slice); } else { intel_miptree_map_gtt(intel, mt, map, level, slice); |