From: Eric A. <er...@an...> - 2008-12-16 02:41:21
|
On Mon, 2008-12-15 at 15:57 -0800, Keith Packard wrote: > This eliminates the separate i830_allocate_memory_tiled function which means > that all memory objects will have tiling parameters set correctly. I like this whole series for the 2D driver. > Signed-off-by: Keith Packard <ke...@ke...> > --- > 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; > } -- Eric Anholt er...@an... eri...@in... |