intel: Allow blit readpixels even when the pack alignment is set.
authorEric Anholt <eric@anholt.net>
Thu, 7 Feb 2013 01:03:49 +0000 (17:03 -0800)
committerEric Anholt <eric@anholt.net>
Thu, 14 Feb 2013 02:10:20 +0000 (18:10 -0800)
The default alignment is 4, so this fast path was rarely hit.  Rather
than introduce logic to handle alignment, just use the Mesa core
function.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=46632
Cc: neil@linux.intel.com
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/intel/intel_pixel_read.c

index bb9ce994913a92a6efc29272af13d1fb9e5bb030..324ffb2ee637ff86d5d8948282f6d7a0ae93f4f5 100644 (file)
@@ -77,7 +77,6 @@ do_blit_readpixels(struct gl_context * ctx,
    struct intel_region *src = intel_readbuf_region(intel);
    struct intel_buffer_object *dst = intel_buffer_object(pack->BufferObj);
    GLuint dst_offset;
-   GLuint rowLength;
    drm_intel_bo *dst_buffer;
    bool all;
    GLint dst_x, dst_y;
@@ -102,23 +101,19 @@ do_blit_readpixels(struct gl_context * ctx,
       return false;
    }
 
-   if (pack->Alignment != 1 || pack->SwapBytes || pack->LsbFirst) {
+   if (pack->SwapBytes || pack->LsbFirst) {
       DBG("%s: bad packing params\n", __FUNCTION__);
       return false;
    }
 
-   if (pack->RowLength > 0)
-      rowLength = pack->RowLength;
-   else
-      rowLength = width;
-
+   int dst_stride = _mesa_image_row_stride(pack, width, format, type);
    if (pack->Invert) {
       DBG("%s: MESA_PACK_INVERT not done yet\n", __FUNCTION__);
       return false;
    }
    else {
       if (_mesa_is_winsys_fbo(ctx->ReadBuffer))
-        rowLength = -rowLength;
+        dst_stride = -dst_stride;
    }
 
    dst_offset = (GLintptr)pixels;
@@ -152,7 +147,7 @@ do_blit_readpixels(struct gl_context * ctx,
    if (!intelEmitCopyBlit(intel,
                          src->cpp,
                          src->pitch, src->bo, 0, src->tiling,
-                         rowLength * src->cpp, dst_buffer, dst_offset, false,
+                         dst_stride, dst_buffer, dst_offset, false,
                          x, y,
                          dst_x, dst_y,
                          width, height,