i965/gen6: Set vertical alignment in SURFACE_STATE batch
authorChad Versace <chad.versace@linux.intel.com>
Thu, 17 Nov 2011 17:09:56 +0000 (09:09 -0800)
committerChad Versace <chad.versace@linux.intel.com>
Tue, 22 Nov 2011 18:50:52 +0000 (10:50 -0800)
Reviewed-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Chad Versace <chad.versace@linux.intel.com>
src/mesa/drivers/dri/i965/brw_defines.h
src/mesa/drivers/dri/i965/brw_wm_surface_state.c

index 746c89f87cc683cfabe737420df4117f39c93705..bb79bfbafdfe8284a7abf963a3f516049260b40c 100644 (file)
 #define BRW_SURFACE_MIN_LOD_MASK       INTEL_MASK(31, 28)
 
 /* Surface state DW5 */
-#define BRW_SURFACE_X_OFFSET_SHIFT     25
-#define BRW_SURFACE_X_OFFSET_MASK      INTEL_MASK(31, 25)
-#define BRW_SURFACE_Y_OFFSET_SHIFT     20
-#define BRW_SURFACE_Y_OFFSET_MASK      INTEL_MASK(23, 20)
+#define BRW_SURFACE_X_OFFSET_SHIFT             25
+#define BRW_SURFACE_X_OFFSET_MASK              INTEL_MASK(31, 25)
+#define BRW_SURFACE_VERTICAL_ALIGN_ENABLE      (1 << 24)
+#define BRW_SURFACE_Y_OFFSET_SHIFT             20
+#define BRW_SURFACE_Y_OFFSET_MASK              INTEL_MASK(23, 20)
 
 #define BRW_TEXCOORDMODE_WRAP            0
 #define BRW_TEXCOORDMODE_MIRROR          1
index 0c2c804b133db0112fc1f1d3613cfaa7d8925d8d..984a7bc22397c1b36a1e091562d306d7b7cd8dd9 100644 (file)
@@ -262,6 +262,7 @@ brw_update_texture_surface( struct gl_context *ctx, GLuint unit )
    struct brw_context *brw = brw_context(ctx);
    struct gl_texture_object *tObj = ctx->Texture.Unit[unit]._Current;
    struct intel_texture_object *intelObj = intel_texture_object(tObj);
+   struct intel_mipmap_tree *mt = intelObj->mt;
    struct gl_texture_image *firstImage = tObj->Image[0][tObj->BaseLevel];
    struct gl_sampler_object *sampler = _mesa_get_samplerobj(ctx, unit);
    const GLuint surf_index = SURF_INDEX_TEXTURE(unit);
@@ -294,7 +295,8 @@ brw_update_texture_surface( struct gl_context *ctx, GLuint unit )
              BRW_SURFACE_PITCH_SHIFT);
 
    surf[4] = 0;
-   surf[5] = 0;
+
+   surf[5] = (mt->align_h == 4) ? BRW_SURFACE_VERTICAL_ALIGN_ENABLE : 0;
 
    /* Emit relocation to surface contents */
    drm_intel_bo_emit_reloc(brw->intel.batch.bo,
@@ -447,6 +449,7 @@ brw_update_renderbuffer_surface(struct brw_context *brw,
    struct intel_context *intel = &brw->intel;
    struct gl_context *ctx = &intel->ctx;
    struct intel_renderbuffer *irb = intel_renderbuffer(rb);
+   struct intel_mipmap_tree *mt = irb->mt;
    struct intel_region *region = irb->mt->region;
    uint32_t *surf;
    uint32_t tile_x, tile_y;
@@ -509,7 +512,8 @@ brw_update_renderbuffer_surface(struct brw_context *brw,
    assert(tile_x % 4 == 0);
    assert(tile_y % 2 == 0);
    surf[5] = ((tile_x / 4) << BRW_SURFACE_X_OFFSET_SHIFT |
-             (tile_y / 2) << BRW_SURFACE_Y_OFFSET_SHIFT);
+             (tile_y / 2) << BRW_SURFACE_Y_OFFSET_SHIFT |
+             (mt->align_h == 4 ? BRW_SURFACE_VERTICAL_ALIGN_ENABLE : 0));
 
    if (intel->gen < 6) {
       /* _NEW_COLOR */