This eliminates the separate i830_allocate_memory_tiled function which means
that all memory objects will have tiling parameters set correctly.

Signed-off-by: Keith Packard <kei...@keithp.com>
---
 src/i830.h         |   19 ++-
 src/i830_display.c |   10 +-
 src/i830_memory.c  |  340 +++++++++++++++++++++++++---------------------------
 src/i830_video.c   |    7 +-
 src/i965_hwmc.c    |    6 +-
 5 files changed, 191 insertions(+), 191 deletions(-)

diff --git a/src/i830.h b/src/i830.h
index 8ad5c69..fe7c8b2 100644
--- a/src/i830.h
+++ b/src/i830.h
@@ -147,6 +147,8 @@ enum tile_format {
     TILE_YMAJOR
 };
 
+#define PITCH_NONE 0
+
 /** Record of a linear allocation in the aperture. */
 typedef struct _i830_memory i830_memory;
 struct _i830_memory {
@@ -851,13 +853,9 @@ Bool i830_allocator_init(ScrnInfoPtr pScrn, unsigned long 
offset,
                         unsigned long size);
 void i830_allocator_fini(ScrnInfoPtr pScrn);
 i830_memory * i830_allocate_memory(ScrnInfoPtr pScrn, const char *name,
-                                  unsigned long size, unsigned long alignment,
-                                  int flags);
-i830_memory *i830_allocate_memory_tiled(ScrnInfoPtr pScrn, const char *name,
-                                       unsigned long size,
-                                       unsigned long pitch,
-                                       unsigned long alignment, int flags,
-                                       enum tile_format tile_format);
+                                  unsigned long size, unsigned long pitch,
+                                  unsigned long alignment, int flags,
+                                  enum tile_format tile_format);
 void i830_describe_allocations(ScrnInfoPtr pScrn, int verbosity,
                               const char *prefix);
 void i830_reset_allocations(ScrnInfoPtr pScrn);
@@ -878,6 +876,13 @@ extern uint32_t i830_create_new_fb(ScrnInfoPtr pScrn, int 
width, int height,
                                   int *pitch);
 extern Bool I830IsPrimary(ScrnInfoPtr pScrn);
 
+Bool
+i830_tiled_width(I830Ptr i830, int *width, int cpp);
+
+int
+i830_pad_drawable_width(int width, int cpp);
+
+
 extern Bool I830I2CInit(ScrnInfoPtr pScrn, I2CBusPtr *bus_ptr, int i2c_reg,
                        char *name);
 
diff --git a/src/i830_display.c b/src/i830_display.c
index 2e5d55a..e3236c9 100644
--- a/src/i830_display.c
+++ b/src/i830_display.c
@@ -1575,12 +1575,14 @@ i830_crtc_shadow_allocate (xf86CrtcPtr crtc, int width, 
int height)
     unsigned long rotate_pitch;
     int align = KB(4), size;
 
-    rotate_pitch = pScrn->displayWidth * pI830->cpp;
+    width = i830_pad_drawable_width(width, pI830->cpp);
+    rotate_pitch = width * pI830->cpp;
     size = rotate_pitch * height;
 
     assert(intel_crtc->rotate_mem == NULL);
     intel_crtc->rotate_mem = i830_allocate_memory(pScrn, "rotated crtc",
-                                                 size, align, 0);
+                                                 size, rotate_pitch, align,
+                                                 0, TILE_NONE);
     if (intel_crtc->rotate_mem == NULL) {
        xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
                   "Couldn't allocate shadow memory for rotated CRTC\n");
@@ -1599,13 +1601,13 @@ i830_crtc_shadow_create(xf86CrtcPtr crtc, void *data, 
int width, int height)
 {
     ScrnInfoPtr pScrn = crtc->scrn;
     I830Ptr pI830 = I830PTR(pScrn);
-    unsigned long rotate_pitch;
+    int rotate_pitch;
     PixmapPtr rotate_pixmap;
 
     if (!data)
        data = i830_crtc_shadow_allocate (crtc, width, height);
     
-    rotate_pitch = pScrn->displayWidth * pI830->cpp;
+    rotate_pitch = i830_pad_drawable_width(width, pI830->cpp) * pI830->cpp;
 
     rotate_pixmap = GetScratchPixmapHeader(pScrn->pScreen,
                                           width, height,
diff --git a/src/i830_memory.c b/src/i830_memory.c
index ca15964..a5e7dcd 100644
--- a/src/i830_memory.c
+++ b/src/i830_memory.c
@@ -120,7 +120,9 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 static i830_memory *
 i830_allocate_aperture(ScrnInfoPtr pScrn, const char *name,
-                      long size, unsigned long alignment, int flags);
+                      unsigned long size, unsigned long pitch,
+                      unsigned long alignment, int flags,
+                      enum tile_format tile_format);
 
 static int i830_set_tiling(ScrnInfoPtr pScrn, unsigned int offset,
                           unsigned int pitch, unsigned int size,
@@ -494,8 +496,9 @@ i830_allocator_init(ScrnInfoPtr pScrn, unsigned long 
offset, unsigned long size)
        /* Create the aperture allocation */
        pI830->memory_manager =
            i830_allocate_aperture(pScrn, "DRI memory manager",
-                                  mmsize, GTT_PAGE_SIZE,
-                                  ALIGN_BOTH_ENDS | NEED_NON_STOLEN);
+                                  mmsize, 0, GTT_PAGE_SIZE,
+                                  ALIGN_BOTH_ENDS | NEED_NON_STOLEN,
+                                  TILE_NONE);
 
        if (pI830->memory_manager != NULL) {
            if (!pI830->use_drm_mode) {
@@ -638,7 +641,9 @@ i830_get_stolen_physical(ScrnInfoPtr pScrn, unsigned long 
offset,
  */
 static i830_memory *
 i830_allocate_aperture(ScrnInfoPtr pScrn, const char *name,
-                      long size, unsigned long alignment, int flags)
+                      unsigned long size, unsigned long pitch,
+                      unsigned long alignment, int flags,
+                      enum tile_format tile_format)
 {
     I830Ptr pI830 = I830PTR(pScrn);
     i830_memory *mem, *scan;
@@ -660,6 +665,9 @@ i830_allocate_aperture(ScrnInfoPtr pScrn, const char *name,
     mem->size = size;
     mem->allocated_size = size;
     mem->alignment = alignment;
+    mem->tiling = tile_format;
+    mem->pitch = pitch;
+    mem->fence_nr = -1;
 
     if (alignment < GTT_PAGE_SIZE)
        alignment = GTT_PAGE_SIZE;
@@ -754,10 +762,14 @@ i830_allocate_agp_memory(ScrnInfoPtr pScrn, i830_memory 
*mem, int flags)
 #ifdef XF86DRI
 static i830_memory *
 i830_allocate_memory_bo(ScrnInfoPtr pScrn, const char *name,
-                       unsigned long size, unsigned long align, int flags)
+                       unsigned long size, unsigned long pitch,
+                       unsigned long align, int flags,
+                       enum tile_format tile_format)
 {
     I830Ptr pI830 = I830PTR(pScrn);
     i830_memory *mem;
+    uint32_t bo_tiling_mode = I915_TILING_NONE;
+    int            ret;
 
     assert((flags & NEED_PHYSICAL_ADDR) == 0);
 
@@ -789,9 +801,33 @@ i830_allocate_memory_bo(ScrnInfoPtr pScrn, const char 
*name,
     mem->size = size;
     mem->allocated_size = size;
     mem->alignment = align;
+    mem->tiling = tile_format;
+    mem->pitch = pitch;
+    mem->fence_nr = -1;
     if (flags & NEED_LIFETIME_FIXED)
        mem->lifetime_fixed_offset = TRUE;
 
+    switch (tile_format) {
+    case TILE_XMAJOR:
+       bo_tiling_mode = I915_TILING_X;
+       break;
+    case TILE_YMAJOR:
+       bo_tiling_mode = I915_TILING_Y;
+       break;
+    case TILE_NONE:
+    default:
+       bo_tiling_mode = I915_TILING_NONE;
+       break;
+    }
+
+    ret = dri_bo_set_tiling(mem->bo, &bo_tiling_mode);
+    if (ret != 0 || (bo_tiling_mode == I915_TILING_NONE && tile_format != 
TILE_NONE)) {
+       xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                  "Failed to set tiling on %s: %s\n",
+                  mem->name,
+                  ret == 0 ? "rejected by kernel" : strerror(errno));
+       mem->tiling = TILE_NONE;
+    }
     /* Bind it if we currently control the VT */
     if (pScrn->vtSema || pI830->use_drm_mode) {
        if (!i830_bind_memory(pScrn, mem)) {
@@ -813,7 +849,7 @@ i830_allocate_memory_bo(ScrnInfoPtr pScrn, const char *name,
 }
 #endif /* XF86DRI */
 
-/* Allocates video memory at the given size and alignment.
+/* Allocates video memory at the given size, pitch, alignment and tile format.
  *
  * The memory will be bound automatically when the driver is in control of the
  * VT.  When the kernel memory manager is available and compatible with flags
@@ -833,22 +869,51 @@ i830_allocate_memory_bo(ScrnInfoPtr pScrn, const char 
*name,
  */
 i830_memory *
 i830_allocate_memory(ScrnInfoPtr pScrn, const char *name,
-                    unsigned long size, unsigned long alignment, int flags)
+                    unsigned long size, unsigned long pitch,
+                    unsigned long alignment, int flags,
+                    enum tile_format tile_format)
 {
     i830_memory *mem;
-
 #ifdef XF86DRI
     I830Ptr pI830 = I830PTR(pScrn);
+#endif
 
+    /* Manage tile alignment and size constraints */
+    if (tile_format != TILE_NONE) {
+       /* Only allocate page-sized increments. */
+       size = ALIGN(size, GTT_PAGE_SIZE);
+
+       /* Check for maximum tiled region size */
+       if (IS_I9XX(pI830)) {
+           if (size > MB(128))
+               return NULL;
+       } else {
+           if (size > MB(64))
+               return NULL;
+       }
+
+       /* round to size necessary for the fence register to work */
+       size = i830_get_fence_size(pScrn, size);
+       if (IS_I965G(pI830)) {
+           if (alignment < GTT_PAGE_SIZE)
+               alignment = GTT_PAGE_SIZE;
+       } else {
+           /* The offset has to be aligned to at least the size of the fence
+            * region.
+            */
+           alignment = size;
+       }
+    }
+#ifdef XF86DRI
     if (pI830->use_drm_mode || (pI830->memory_manager &&
                                !(flags & NEED_PHYSICAL_ADDR) &&
                                !(flags & NEED_LIFETIME_FIXED)))
     {
-       return i830_allocate_memory_bo(pScrn, name, size, alignment, flags);
+       return i830_allocate_memory_bo(pScrn, name, size, pitch, alignment, 
flags, tile_format);
     } else
 #endif /* XF86DRI */
     {
-       mem = i830_allocate_aperture(pScrn, name, size, alignment, flags);
+       mem = i830_allocate_aperture(pScrn, name, size, pitch, alignment, 
flags, tile_format);
        if (mem == NULL)
            return NULL;
 
@@ -868,88 +933,6 @@ i830_allocate_memory(ScrnInfoPtr pScrn, const char *name,
     return mem;
 }
 
-/* Allocate a tiled region with the given size and pitch.
- *
- * As is, we might miss out on tiling some allocations on older hardware with
- * large framebuffer size and a small aperture size, where the first
- * allocations use a large alignment even though we've got fences to spare, and
- * the later allocations can't find enough aperture space left.  We could do
- * some search across all allocation options to fix this, probably, but that
- * would be another rewrite.
- */
-i830_memory *
-i830_allocate_memory_tiled(ScrnInfoPtr pScrn, const char *name,
-                          unsigned long size, unsigned long pitch,
-                          unsigned long alignment, int flags,
-                          enum tile_format tile_format)
-{
-    I830Ptr pI830 = I830PTR(pScrn);
-    unsigned long aper_size;
-    unsigned long aper_align;
-    i830_memory *mem;
-
-    if (tile_format == TILE_NONE)
-       return i830_allocate_memory(pScrn, name, size, alignment, flags);
-
-    /* Only allocate page-sized increments. */
-    size = ALIGN(size, GTT_PAGE_SIZE);
-
-    /* Check for maximum tiled region size */
-    if (IS_I9XX(pI830)) {
-       if (size > MB(128))
-           return NULL;
-    } else {
-       if (size > MB(64))
-           return NULL;
-    }
-
-    aper_size = i830_get_fence_size(pScrn, size);
-    if (IS_I965G(pI830)) {
-       aper_align = GTT_PAGE_SIZE;
-    } else {
-       /* The offset has to be aligned to at least the size of the fence
-        * region.
-        */
-       aper_align = aper_size;
-    }
-    if (aper_align < alignment)
-       aper_align = alignment;
-
-    mem = i830_allocate_memory(pScrn, name, aper_size, aper_align, flags);
-    if (mem == NULL)
-       return NULL;
-    mem->size = size;
-    mem->tiling = tile_format;
-    mem->pitch = pitch;
-    mem->fence_nr = -1;
-
-#ifdef XF86DRI
-    if (mem->bo != 0) {
-       uint32_t    tiling_mode = I915_TILING_NONE;
-       int         ret;
-
-       if (tile_format == TILE_XMAJOR)
-           tiling_mode = I915_TILING_X;
-       else
-           tiling_mode = I915_TILING_Y;
-
-       ret = dri_bo_set_tiling(mem->bo, &tiling_mode);
-       if (ret != 0 || tiling_mode == I915_TILING_NONE) {
-               xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
-                          "Failed to set tiling on %s: %s\n",
-                          mem->name,
-                          ret == 0 ? "rejected by kernel" : strerror(errno));
-               i830_free_memory(pScrn, mem);
-               return i830_allocate_memory(pScrn, name, size, alignment,
-                                           flags);
-           return FALSE;
-       }
-    }
-#endif
-
-    return mem;
-}
-
 void
 i830_describe_allocations(ScrnInfoPtr pScrn, int verbosity, const char *prefix)
 {
@@ -1043,9 +1026,9 @@ i830_allocate_ringbuffer(ScrnInfoPtr pScrn)
      * the ringbuffer since init time, so allocate it fixed for its lifetime.
      */
     pI830->LpRing->mem = i830_allocate_memory(pScrn, "ring buffer",
-                                             PRIMARY_RINGBUFFER_SIZE,
+                                             PRIMARY_RINGBUFFER_SIZE, 
PITCH_NONE,
                                              GTT_PAGE_SIZE,
-                                             NEED_LIFETIME_FIXED);
+                                             NEED_LIFETIME_FIXED, TILE_NONE);
     if (pI830->LpRing->mem == NULL) {
        xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
                   "Failed to allocate Ring Buffer space\n");
@@ -1078,8 +1061,8 @@ i830_allocate_overlay(ScrnInfoPtr pScrn)
        flags |= NEED_PHYSICAL_ADDR;
 
     pI830->overlay_regs = i830_allocate_memory(pScrn, "overlay registers",
-                                              OVERLAY_SIZE, GTT_PAGE_SIZE,
-                                              flags);
+                                              OVERLAY_SIZE, PITCH_NONE, 
GTT_PAGE_SIZE,
+                                              flags, TILE_NONE);
     if (pI830->overlay_regs == NULL) {
        xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
                   "Failed to allocate Overlay register space.\n");
@@ -1157,7 +1140,7 @@ i830_allocate_framebuffer(ScrnInfoPtr pScrn, I830Ptr 
pI830, BoxPtr FbMemBox,
     char *name;
     int flags;
     i830_memory *front_buffer = NULL;
-    Bool tiling;
+    enum tile_format tile_format = TILE_NONE;
 
     flags = ALLOW_SHARING;
 
@@ -1231,33 +1214,34 @@ i830_allocate_framebuffer(ScrnInfoPtr pScrn, I830Ptr 
pI830, BoxPtr FbMemBox,
      * acceleration operations (non-XY COLOR_BLT) can't be done to tiled
      * buffers.
      */
-    if ((pI830->accel <= ACCEL_XAA && IS_I965G(pI830)) || pI830->use_drm_mode)
-       tiling = FALSE;
-    else
-       tiling = pI830->tiling;
+    if (pI830->tiling)
+       tile_format = TILE_XMAJOR;
+    if (pI830->accel == ACCEL_XAA && IS_I965G(pI830))
+       tile_format = TILE_NONE;
+    if (pI830->use_drm_mode)
+       tile_format = TILE_NONE;
+
+    if (!IsTileable(pScrn, pitch))
+       tile_format = TILE_NONE;
 
-    if (!i830_check_display_stride(pScrn, pitch, tiling)) {
+    if (!i830_check_display_stride(pScrn, pitch, tile_format != TILE_NONE)) {
        xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Front buffer stride %d kB "
                "exceed display limit\n", pitch/1024);
        return NULL;
     }
 
     /* Attempt to allocate it tiled first if we have page flipping on. */
-    if (tiling && IsTileable(pScrn, pitch)) {
+    if (tile_format != TILE_NONE) {
        /* XXX: probably not the case on 965 */
        if (IS_I9XX(pI830))
            align = MB(1);
        else
            align = KB(512);
-       front_buffer = i830_allocate_memory_tiled(pScrn, name, size,
-                                                 pitch, align, flags,
-                                                 TILE_XMAJOR);
-    }
-
-    /* If not, attempt it linear */
-    if (front_buffer == NULL) {
-       front_buffer = i830_allocate_memory(pScrn, name, size, KB(64), flags);
-    }
+    } else
+       align = KB(64);
+    front_buffer = i830_allocate_memory(pScrn, name, size,
+                                       pitch, align, flags,
+                                       tile_format);
 
     if (front_buffer == NULL) {
        xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Failed to allocate "
@@ -1301,8 +1285,8 @@ i830_allocate_cursor_buffers(ScrnInfoPtr pScrn)
     size = xf86_config->num_crtc * (HWCURSOR_SIZE + HWCURSOR_SIZE_ARGB);
 
     pI830->cursor_mem = i830_allocate_memory(pScrn, "HW cursors",
-                                            size, GTT_PAGE_SIZE,
-                                            flags);
+                                            size, PITCH_NONE, GTT_PAGE_SIZE,
+                                            flags, TILE_NONE);
     if (pI830->cursor_mem != NULL)
        return TRUE;
 
@@ -1316,14 +1300,18 @@ i830_allocate_cursor_buffers(ScrnInfoPtr pScrn)
        pI830->cursor_mem_classic[i] = i830_allocate_memory (pScrn, 
                                                             "Core cursor",
                                                             HWCURSOR_SIZE,
+                                                            PITCH_NONE,
                                                             GTT_PAGE_SIZE,
-                                                            flags);
+                                                            flags,
+                                                            TILE_NONE);
        if (!pI830->cursor_mem_classic[i])
            return FALSE;
        pI830->cursor_mem_argb[i] = i830_allocate_memory (pScrn, "ARGB cursor",
                                                          HWCURSOR_SIZE_ARGB,
+                                                         PITCH_NONE,
                                                          GTT_PAGE_SIZE,
-                                                         flags);
+                                                         flags,
+                                                         TILE_NONE);
        if (!pI830->cursor_mem_argb[i])
            return FALSE;
 
@@ -1368,7 +1356,9 @@ static void i830_setup_fb_compression(ScrnInfoPtr pScrn)
      */
     pI830->compressed_front_buffer =
        i830_allocate_memory(pScrn, "compressed frame buffer",
-                            compressed_size, KB(4), NEED_PHYSICAL_ADDR);
+                            compressed_size, PITCH_NONE,
+                            KB(4), NEED_PHYSICAL_ADDR,
+                            TILE_NONE);
 
     if (!pI830->compressed_front_buffer) {
        pI830->fb_compression = FALSE;
@@ -1378,8 +1368,10 @@ static void i830_setup_fb_compression(ScrnInfoPtr pScrn)
     if (!IS_GM45(pI830)) {
        pI830->compressed_ll_buffer =
            i830_allocate_memory(pScrn, "compressed ll buffer",
-                                FBC_LL_SIZE + FBC_LL_PAD, KB(4),
-                                NEED_PHYSICAL_ADDR);
+                                FBC_LL_SIZE + FBC_LL_PAD,
+                                PITCH_NONE, KB(4),
+                                NEED_PHYSICAL_ADDR,
+                                TILE_NONE);
        if (!pI830->compressed_ll_buffer) {
            i830_free_memory(pScrn, pI830->compressed_front_buffer);
            pI830->fb_compression = FALSE;
@@ -1433,7 +1425,8 @@ i830_allocate_2d_memory(ScrnInfoPtr pScrn)
 
     /* Space for the X Server's 3D context.  32k is fine for right now. */
     pI830->logical_context = i830_allocate_memory(pScrn, "logical 3D context",
-                                                 KB(32), GTT_PAGE_SIZE, 0);
+                                                 KB(32), PITCH_NONE, 
GTT_PAGE_SIZE, 0,
+                                                 TILE_NONE);
     if (pI830->logical_context == NULL) {
        xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
                   "Failed to allocate logical context space.\n");
@@ -1442,7 +1435,8 @@ i830_allocate_2d_memory(ScrnInfoPtr pScrn)
 
     if (pI830->memory_manager == NULL) {
        pI830->fake_bufmgr_mem = i830_allocate_memory(pScrn, "fake bufmgr",
-                                                     MB(1), GTT_PAGE_SIZE, 0);
+                                                     MB(1), PITCH_NONE, 
GTT_PAGE_SIZE, 0,
+                                                     TILE_NONE);
        if (pI830->fake_bufmgr_mem == NULL) {
            xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
                       "Failed to allocate fake bufmgr space.\n");
@@ -1457,7 +1451,8 @@ i830_allocate_2d_memory(ScrnInfoPtr pScrn)
        pI830->gen4_render_state_mem =
            i830_allocate_memory(pScrn, "exa G965 state buffer",
                                 gen4_render_state_size(pScrn),
-                                GTT_PAGE_SIZE, 0);
+                                PITCH_NONE,
+                                GTT_PAGE_SIZE, 0, TILE_NONE);
        if (pI830->gen4_render_state_mem == NULL) {
            xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
                    "Failed to allocate exa state buffer for 965.\n");
@@ -1507,7 +1502,8 @@ i830_allocate_2d_memory(ScrnInfoPtr pScrn)
             */
            pI830->exa_offscreen =
                i830_allocate_memory(pScrn, "exa offscreen",
-                                    size, 1, NEED_LIFETIME_FIXED);
+                                    size, PITCH_NONE, 1, NEED_LIFETIME_FIXED,
+                                    TILE_NONE);
            if (pI830->exa_offscreen == NULL) {
                xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
                           "Failed to allocate EXA offscreen memory.\n");
@@ -1524,12 +1520,14 @@ i830_allocate_2d_memory(ScrnInfoPtr pScrn)
         */
        pI830->xaa_scratch =
            i830_allocate_memory(pScrn, "xaa scratch", MAX_SCRATCH_BUFFER_SIZE,
-                                GTT_PAGE_SIZE, NEED_LIFETIME_FIXED);
+                                PITCH_NONE, GTT_PAGE_SIZE, NEED_LIFETIME_FIXED,
+                                TILE_NONE);
        if (pI830->xaa_scratch == NULL) {
            pI830->xaa_scratch =
                i830_allocate_memory(pScrn, "xaa scratch",
-                                    MIN_SCRATCH_BUFFER_SIZE, GTT_PAGE_SIZE,
-                                    NEED_LIFETIME_FIXED);
+                                    MIN_SCRATCH_BUFFER_SIZE, PITCH_NONE,
+                                    GTT_PAGE_SIZE, NEED_LIFETIME_FIXED,
+                                    TILE_NONE);
            if (pI830->xaa_scratch == NULL) {
                xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
                           "Failed to allocate scratch buffer space\n");
@@ -1543,13 +1541,15 @@ i830_allocate_2d_memory(ScrnInfoPtr pScrn)
        {
            pI830->xaa_scratch_2 =
                i830_allocate_memory(pScrn, "xaa scratch 2",
-                                    MAX_SCRATCH_BUFFER_SIZE, GTT_PAGE_SIZE,
-                                    NEED_LIFETIME_FIXED);
+                                    MAX_SCRATCH_BUFFER_SIZE, PITCH_NONE,
+                                    GTT_PAGE_SIZE, NEED_LIFETIME_FIXED,
+                                    TILE_NONE);
            if (pI830->xaa_scratch_2 == NULL) {
                pI830->xaa_scratch_2 =
                    i830_allocate_memory(pScrn, "xaa scratch 2",
-                                        MIN_SCRATCH_BUFFER_SIZE,
-                                        GTT_PAGE_SIZE, NEED_LIFETIME_FIXED);
+                                        MIN_SCRATCH_BUFFER_SIZE, PITCH_NONE,
+                                        GTT_PAGE_SIZE, NEED_LIFETIME_FIXED,
+                                        TILE_NONE);
                if (pI830->xaa_scratch_2 == NULL) {
                    xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
                               "Failed to allocate secondary scratch "
@@ -1584,6 +1584,7 @@ i830_allocate_backbuffer(ScrnInfoPtr pScrn, i830_memory 
**buffer,
     unsigned int pitch = pScrn->displayWidth * pI830->cpp;
     unsigned long size;
     int height;
+    enum tile_format tile_format = TILE_NONE;;
 
     if (pI830->rotation & (RR_Rotate_0 | RR_Rotate_180))
        height = pScrn->virtualY;
@@ -1594,22 +1595,18 @@ i830_allocate_backbuffer(ScrnInfoPtr pScrn, i830_memory 
**buffer,
     if (pI830->tiling && IsTileable(pScrn, pitch))
     {
        size = ROUND_TO_PAGE(pitch * ALIGN(height, 16));
-       *buffer = i830_allocate_memory_tiled(pScrn, name, size, pitch,
-                                            GTT_PAGE_SIZE,
-                                            ALIGN_BOTH_ENDS |
-                                            ALLOW_SHARING,
-                                            TILE_XMAJOR);
+       tile_format = TILE_XMAJOR;
     }
-
-    /* Otherwise, just allocate it linear.  The offset must stay constant
-     * currently because we don't ever update the DRI maps after screen init.
-     */
-    if (*buffer == NULL) {
+    else
+    {
        size = ROUND_TO_PAGE(pitch * height);
-       *buffer = i830_allocate_memory(pScrn, name, size, GTT_PAGE_SIZE,
-                                      ALIGN_BOTH_ENDS |
-                                      ALLOW_SHARING);
+       tile_format = TILE_NONE;
     }
+    *buffer = i830_allocate_memory(pScrn, name, size, pitch,
+                                  GTT_PAGE_SIZE,
+                                  ALIGN_BOTH_ENDS |
+                                  ALLOW_SHARING,
+                                  tile_format);
 
     if (*buffer == NULL) {
        xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
@@ -1627,42 +1624,27 @@ i830_allocate_depthbuffer(ScrnInfoPtr pScrn)
     unsigned long size;
     unsigned int pitch = pScrn->displayWidth * pI830->cpp;
     int height;
+    int flags;
+    enum tile_format tile_format = TILE_NONE;
 
-    /* XXX: this rotation stuff is bogus */
-    if (pI830->rotation & (RR_Rotate_0 | RR_Rotate_180))
-       height = pScrn->virtualY;
-    else
-       height = pScrn->virtualX;
+    height = pScrn->virtualY;
 
     /* First try allocating it tiled */
+    flags = ALLOW_SHARING;
     if (pI830->tiling && IsTileable(pScrn, pitch))
     {
-       enum tile_format tile_format;
-
-       size = ROUND_TO_PAGE(pitch * ALIGN(height, 16));
-
        /* The 965 requires that the depth buffer be in Y Major format, while
         * the rest appear to fail when handed that format.
         */
        tile_format = IS_I965G(pI830) ? TILE_YMAJOR: TILE_XMAJOR;
-
-       pI830->depth_buffer =
-           i830_allocate_memory_tiled(pScrn, "depth buffer", size, pitch,
-                                      GTT_PAGE_SIZE,
-                                      ALIGN_BOTH_ENDS |
-                                      ALLOW_SHARING,
-                                      tile_format);
+       height = ALIGN(height, 16);
+       flags |= ALIGN_BOTH_ENDS;
     }
+    size = ROUND_TO_PAGE(pitch * height);
 
-    /* Otherwise, allocate it linear. The offset must stay constant
-     * currently because we don't ever update the DRI maps after screen init.
-     */
-    if (pI830->depth_buffer == NULL) {
-       size = ROUND_TO_PAGE(pitch * height);
-       pI830->depth_buffer =
-           i830_allocate_memory(pScrn, "depth buffer", size, GTT_PAGE_SIZE,
-                                ALLOW_SHARING);
-    }
+    pI830->depth_buffer =
+           i830_allocate_memory(pScrn, "depth buffer", size, pitch,
+                                GTT_PAGE_SIZE, flags, tile_format);
 
     if (pI830->depth_buffer == NULL) {
        xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
@@ -1703,9 +1685,11 @@ i830_allocate_texture_memory(ScrnInfoPtr pScrn)
         * made conditional on DRM version.
         */
        pI830->textures = i830_allocate_memory(pScrn, "classic textures", size,
+                                              PITCH_NONE,
                                               GTT_PAGE_SIZE,
                                               ALLOW_SHARING |
-                                              NEED_LIFETIME_FIXED);
+                                              NEED_LIFETIME_FIXED,
+                                              TILE_NONE);
        if (pI830->textures == NULL) {
            xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
                       "Failed to allocate texture space.\n");
@@ -1730,7 +1714,8 @@ i830_allocate_hwstatus(ScrnInfoPtr pScrn)
     if (HWS_NEED_NONSTOLEN(pI830))
            flags |= NEED_NON_STOLEN;
     pI830->hw_status = i830_allocate_memory(pScrn, "HW status",
-           HWSTATUS_PAGE_SIZE, GTT_PAGE_SIZE, flags);
+           HWSTATUS_PAGE_SIZE, PITCH_NONE, GTT_PAGE_SIZE, flags,
+                                           TILE_NONE);
     if (pI830->hw_status == NULL) {
        xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
                "Failed to allocate hw status page.\n");
@@ -1745,8 +1730,10 @@ i830_allocate_pwrctx(ScrnInfoPtr pScrn)
     I830Ptr pI830 = I830PTR(pScrn);
 
     pI830->power_context = i830_allocate_memory(pScrn, "power context",
-                                               PWRCTX_SIZE, GTT_PAGE_SIZE,
-                                               NEED_LIFETIME_FIXED);
+                                               PWRCTX_SIZE, PITCH_NONE,
+                                               GTT_PAGE_SIZE,
+                                               NEED_LIFETIME_FIXED,
+                                               TILE_NONE);
     if (!pI830->power_context) {
        xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
                "Failed to allocate power context.\n");
@@ -1812,6 +1799,11 @@ i830_set_tiling(ScrnInfoPtr pScrn, unsigned int offset,
 
     assert(tile_format != TILE_NONE);
 
+    if (pI830->need_sync) {
+       I830Sync(pScrn);
+       pI830->need_sync = FALSE;
+    }
+
     if (IS_I965G(pI830))
        max_fence = FENCE_NEW_NR;
     else
@@ -2115,8 +2107,8 @@ Bool i830_allocate_xvmc_buffer(ScrnInfoPtr pScrn, const 
char *name,
                                i830_memory **buffer, unsigned long size,
                                int flags)
 {
-    *buffer = i830_allocate_memory(pScrn, name, size,
-                                   GTT_PAGE_SIZE, flags);
+    *buffer = i830_allocate_memory(pScrn, name, size, PITCH_NONE,
+                                   GTT_PAGE_SIZE, flags, TILE_NONE);
 
     if (!*buffer) {
         xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
diff --git a/src/i830_video.c b/src/i830_video.c
index 87fa020..8a3718d 100644
--- a/src/i830_video.c
+++ b/src/i830_video.c
@@ -2389,8 +2389,9 @@ I830PutImage(ScrnInfoPtr pScrn,
     }
 
     if (pPriv->buf == NULL) {
-       pPriv->buf = i830_allocate_memory(pScrn, "xv buffer", alloc_size, 16,
-                                         0);
+       pPriv->buf = i830_allocate_memory(pScrn, "xv buffer",
+                                         alloc_size, 0, 16,
+                                         0, TILE_NONE);
     }
 
     if (pPriv->buf == NULL)
@@ -2724,7 +2725,7 @@ I830AllocateSurface(ScrnInfoPtr pScrn,
     fbpitch = pI830->cpp * pScrn->displayWidth;
     size = pitch * h;
 
-    pPriv->buf = i830_allocate_memory(pScrn, "xv surface buffer", size, 16, 0);
+    pPriv->buf = i830_allocate_memory(pScrn, "xv surface buffer", size, 0, 16, 
0, TILE_NONE);
     if (pPriv->buf == NULL) {
        xfree(surface->pitches);
        xfree(surface->offsets);
diff --git a/src/i965_hwmc.c b/src/i965_hwmc.c
index 1c293d1..99e86f5 100644
--- a/src/i965_hwmc.c
+++ b/src/i965_hwmc.c
@@ -49,7 +49,7 @@ static int alloc_drm_memory_tiled(ScrnInfoPtr pScrn,
        char *name, size_t size, unsigned long pitch, unsigned long alignment)
 {
     I830Ptr pI830 = I830PTR(pScrn);
-    if ((mem->buffer = i830_allocate_memory_tiled(pScrn, 
+    if ((mem->buffer = i830_allocate_memory(pScrn,
            name, size, pitch,
            GTT_PAGE_SIZE, ALIGN_BOTH_ENDS, TILE_XMAJOR)) == NULL) {
        ErrorF("Fail to alloc \n");
@@ -75,8 +75,8 @@ static int alloc_drm_memory(ScrnInfoPtr pScrn,
 {
     I830Ptr pI830 = I830PTR(pScrn);
     if ((mem->buffer = i830_allocate_memory(pScrn, 
-           name, size, 
-           GTT_PAGE_SIZE, ALIGN_BOTH_ENDS)) == NULL) {
+           name, size, PITCH_NONE, GTT_PAGE_SIZE,
+           ALIGN_BOTH_ENDS, TILE_NONE)) == NULL) {
        ErrorF("Fail to alloc \n");
        return BadAlloc;
     }
-- 
1.5.6.5


------------------------------------------------------------------------------
SF.Net email is Sponsored by MIX09, March 18-20, 2009 in Las Vegas, Nevada.
The future of the web can't happen without you.  Join us at MIX09 to help
pave the way to the Next Web now. Learn more and register at
http://ad.doubleclick.net/clk;208669438;13503038;i?http://2009.visitmix.com/
--
_______________________________________________
Dri-devel mailing list
Dri-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to