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 <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; > } -- Eric Anholt e...@anholt.net eric.anh...@intel.com
signature.asc
Description: This is a digitally signed message part
------------------------------------------------------------------------------ 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