intel: Fix software detiling of system stencil buffers
authorChad Versace <chad.versace@linux.intel.com>
Fri, 11 Nov 2011 02:39:25 +0000 (18:39 -0800)
committerChad Versace <chad.versace@linux.intel.com>
Tue, 15 Nov 2011 14:42:05 +0000 (06:42 -0800)
If a window system stencil buffer had a region with odd height, then the
calculated y offset needed for software detiling was off by one.  The bug
existed in intel_{map,unmap}_renderbuffer_s8() and in the intel_span.c
accessors.

Fixes the following Piglit tests on gen7:
    general/depthstencil-default_fb-readpixels-24_8
    general/depthstencil-default_fb-readpixels-FLOAT-and-USHORT

Fixes SIGABRT in the following Piglit tests on gen7:
    general/depthstencil-default_fb-blit
    general/depthstencil-default_fb-copypixels
    general/depthstencil-default_fb-drawpixels-24_8
    general/depthstencil-default_fb-drawpixels-FLOAT-and-USHORT

Reviewed-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Chad Versace <chad.versace@linux.intel.com>
src/mesa/drivers/dri/intel/intel_fbo.c
src/mesa/drivers/dri/intel/intel_span.c

index 8bda7ff..2a78edf 100644 (file)
@@ -267,8 +267,9 @@ intel_map_renderbuffer_s8(struct gl_context *ctx,
    irb->map_h = h;
 
    /* Flip the Y axis for the default framebuffer. */
    irb->map_h = h;
 
    /* Flip the Y axis for the default framebuffer. */
+   int region_h = irb->region->height;
    int y_flip = (rb->Name == 0) ? -1 : 1;
    int y_flip = (rb->Name == 0) ? -1 : 1;
-   int y_bias = (rb->Name == 0) ? (2 * irb->region->height - 1) : 0;
+   int y_bias = (rb->Name == 0) ? (region_h * 2 + region_h % 2 - 1) : 0;
 
    irb->map_buffer = malloc(w * h);
    untiled_s8_map = irb->map_buffer;
 
    irb->map_buffer = malloc(w * h);
    untiled_s8_map = irb->map_buffer;
@@ -353,8 +354,9 @@ intel_unmap_renderbuffer_s8(struct gl_context *ctx,
       uint8_t *tiled_s8_map = irb->region->bo->virtual;
 
       /* Flip the Y axis for the default framebuffer. */
       uint8_t *tiled_s8_map = irb->region->bo->virtual;
 
       /* Flip the Y axis for the default framebuffer. */
+      int region_h = irb->region->height;
       int y_flip = (rb->Name == 0) ? -1 : 1;
       int y_flip = (rb->Name == 0) ? -1 : 1;
-      int y_bias = (rb->Name == 0) ? (2 * irb->region->height - 1) : 0;
+      int y_bias = (rb->Name == 0) ? (region_h * 2 + region_h % 2 - 1) : 0;
 
       for (uint32_t pix_y = 0; pix_y < irb->map_h; pix_y++) {
         for (uint32_t pix_x = 0; pix_x < irb->map_w; pix_x++) {
 
       for (uint32_t pix_y = 0; pix_y < irb->map_h; pix_y++) {
         for (uint32_t pix_x = 0; pix_x < irb->map_w; pix_x++) {
index 478aec8..271d2e1 100644 (file)
@@ -141,10 +141,10 @@ intel_set_span_functions(struct intel_context *intel,
    struct intel_renderbuffer *irb = intel_renderbuffer(rb);            \
    uint8_t *buf = irb->region->bo->virtual;                            \
    unsigned stride = irb->region->pitch;                               \
    struct intel_renderbuffer *irb = intel_renderbuffer(rb);            \
    uint8_t *buf = irb->region->bo->virtual;                            \
    unsigned stride = irb->region->pitch;                               \
-   unsigned height = 2 * irb->region->height;                          \
+   unsigned height = irb->region->height;                              \
    bool flip = rb->Name == 0;                                          \
    int y_scale = flip ? -1 : 1;                                                \
    bool flip = rb->Name == 0;                                          \
    int y_scale = flip ? -1 : 1;                                                \
-   int y_bias = flip ? (height - 1) : 0;                               \
+   int y_bias = flip ? (height * 2 + height % 2 - 1) : 0;              \
 
 #undef Y_FLIP
 #define Y_FLIP(y) (y_scale * (y) + y_bias)
 
 #undef Y_FLIP
 #define Y_FLIP(y) (y_scale * (y) + y_bias)