Clean up more i830_memory.c madness.

It was cooking up insane alignment values for buffers that new libdrm was
justifiably complaining about, but it turns out we don't need the alignment
values anywhere because the only case they're needed, they're computed
entirely by the kernel.  Also, the XVMC code was passing a completely unused
flag in.
This commit is contained in:
Eric Anholt 2009-10-07 16:12:25 -07:00
parent d525a0e993
commit 8b2d2ff0d0
4 changed files with 76 additions and 144 deletions

View File

@ -93,12 +93,6 @@ typedef struct _I830OutputRec I830OutputRec, *I830OutputPtr;
#define ALWAYS_SYNC 0
#define ALWAYS_FLUSH 0
enum tile_format {
TILE_NONE,
TILE_XMAJOR,
TILE_YMAJOR
};
#define PITCH_NONE 0
/** Record of a linear allocation in the aperture. */
@ -115,7 +109,7 @@ struct _i830_memory {
*/
unsigned long size;
enum tile_format tiling;
uint32_t tiling_mode;
/** Pitch value in bytes for tiled surfaces */
unsigned int pitch;
@ -130,7 +124,6 @@ struct _i830_memory {
/** @} */
dri_bo *bo;
uint32_t alignment;
uint32_t gem_name;
};
@ -351,8 +344,7 @@ Bool i830_allocator_init(ScrnInfoPtr scrn, unsigned long size);
void i830_allocator_fini(ScrnInfoPtr scrn);
i830_memory *i830_allocate_memory(ScrnInfoPtr scrn, const char *name,
unsigned long size, unsigned long pitch,
unsigned long alignment, int flags,
enum tile_format tile_format);
int flags, uint32_t tile_format);
void i830_describe_allocations(ScrnInfoPtr scrn, int verbosity,
const char *prefix);
void i830_reset_allocations(ScrnInfoPtr scrn);
@ -376,7 +368,7 @@ int i830_pad_drawable_width(int width, int cpp);
Bool i830_bind_all_memory(ScrnInfoPtr scrn);
unsigned long i830_get_fence_size(intel_screen_private *intel, unsigned long size);
unsigned long i830_get_fence_pitch(intel_screen_private *intel, unsigned long pitch,
int format);
uint32_t tiling_mode);
void i830_set_max_gtt_map_size(ScrnInfoPtr scrn);
i830_memory *i830_allocate_framebuffer(ScrnInfoPtr scrn);
@ -486,7 +478,6 @@ extern const int I830CopyROP[16];
/* Flags for memory allocation function */
#define NEED_PHYSICAL_ADDR 0x00000001
#define ALIGN_BOTH_ENDS 0x00000002
#define ALLOW_SHARING 0x00000010
#define DISABLE_REUSE 0x00000020

View File

@ -147,7 +147,7 @@ Bool intel_xvmc_init_batch(ScrnInfoPtr scrn)
if (!i830_allocate_xvmc_buffer(scrn, "[XvMC] batch buffer",
&(xvmc_driver->batch), size,
ALIGN_BOTH_ENDS))
0))
return FALSE;
if (drmAddMap(intel->drmSubFD,

View File

@ -122,12 +122,13 @@ unsigned long i830_get_fence_size(intel_screen_private *intel, unsigned long siz
* calculate that here.
*/
unsigned long
i830_get_fence_pitch(intel_screen_private *intel, unsigned long pitch, int format)
i830_get_fence_pitch(intel_screen_private *intel, unsigned long pitch,
uint32_t tiling_mode)
{
unsigned long i;
unsigned long tile_width = (format == I915_TILING_Y) ? 128 : 512;
unsigned long tile_width = (tiling_mode == I915_TILING_Y) ? 128 : 512;
if (format == TILE_NONE)
if (tiling_mode == I915_TILING_NONE)
return pitch;
/* 965 is flexible */
@ -140,18 +141,6 @@ i830_get_fence_pitch(intel_screen_private *intel, unsigned long pitch, int forma
return i;
}
/**
* On some chips, pitch width has to be a power of two tile width, so
* calculate that here.
*/
static unsigned long i830_get_fence_alignment(intel_screen_private *intel, unsigned long size)
{
if (IS_I965G(intel))
return 4096;
else
return i830_get_fence_size(intel, size);
}
static Bool
i830_check_display_stride(ScrnInfoPtr scrn, int stride, Bool tiling)
{
@ -298,85 +287,6 @@ void i830_allocator_fini(ScrnInfoPtr scrn)
intel->memory_list = NULL;
}
static i830_memory *i830_allocate_memory_bo(ScrnInfoPtr scrn, const char *name,
unsigned long size,
unsigned long pitch,
unsigned long align, int flags,
enum tile_format tile_format)
{
intel_screen_private *intel = intel_get_screen_private(scrn);
i830_memory *mem;
uint32_t bo_tiling_mode = I915_TILING_NONE;
int ret;
assert((flags & NEED_PHYSICAL_ADDR) == 0);
/* Only allocate page-sized increments. */
size = ALIGN(size, GTT_PAGE_SIZE);
align = i830_get_fence_alignment(intel, size);
mem = xcalloc(1, sizeof(*mem));
if (mem == NULL)
return NULL;
mem->name = xstrdup(name);
if (mem->name == NULL) {
xfree(mem);
return NULL;
}
mem->bo = dri_bo_alloc(intel->bufmgr, name, size, align);
if (!mem->bo) {
xfree(mem->name);
xfree(mem);
return NULL;
}
/* Give buffer obviously wrong offset/end until it's pinned. */
mem->offset = -1;
mem->end = -1;
mem->size = size;
mem->alignment = align;
mem->tiling = tile_format;
mem->pitch = pitch;
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 = drm_intel_bo_set_tiling(mem->bo, &bo_tiling_mode, pitch);
if (ret != 0
|| (bo_tiling_mode == I915_TILING_NONE
&& tile_format != TILE_NONE)) {
xf86DrvMsg(scrn->scrnIndex, X_ERROR,
"Failed to set tiling on %s: %s\n", mem->name,
ret == 0 ? "rejected by kernel" : strerror(errno));
mem->tiling = TILE_NONE;
}
if (flags & DISABLE_REUSE)
drm_intel_bo_disable_reuse(mem->bo);
/* Insert new allocation into the list */
mem->prev = NULL;
mem->next = intel->bo_list;
if (intel->bo_list != NULL)
intel->bo_list->prev = mem;
intel->bo_list = mem;
return mem;
}
/* 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
@ -387,8 +297,6 @@ static i830_memory *i830_allocate_memory_bo(ScrnInfoPtr scrn, const char *name,
* flags:
* - NEED_PHYSICAL_ADDR: Allocates the memory physically contiguous, and return
* the bus address for that memory.
* - ALIGN_BOTH_ENDS: after choosing the alignment, align the end offset to
* @alignment as well.
* - NEED_NON-STOLEN: don't allow any part of the memory allocation to lie
* within stolen memory
* - NEED_LIFETIME_FIXED: don't allow the buffer object to move throughout
@ -397,14 +305,15 @@ static i830_memory *i830_allocate_memory_bo(ScrnInfoPtr scrn, const char *name,
*/
i830_memory *i830_allocate_memory(ScrnInfoPtr scrn, const char *name,
unsigned long size, unsigned long pitch,
unsigned long alignment, int flags,
enum tile_format tile_format)
int flags, uint32_t tiling_mode)
{
i830_memory *mem;
intel_screen_private *intel = intel_get_screen_private(scrn);
uint32_t requested_tiling_mode = tiling_mode;
int ret;
/* Manage tile alignment and size constraints */
if (tile_format != TILE_NONE) {
if (tiling_mode != I915_TILING_NONE) {
/* Only allocate page-sized increments. */
size = ALIGN(size, GTT_PAGE_SIZE);
@ -419,11 +328,54 @@ i830_memory *i830_allocate_memory(ScrnInfoPtr scrn, const char *name,
/* round to size necessary for the fence register to work */
size = i830_get_fence_size(intel, size);
alignment = i830_get_fence_alignment(intel, size);
}
return i830_allocate_memory_bo(scrn, name, size,
pitch, alignment, flags, tile_format);
assert((flags & NEED_PHYSICAL_ADDR) == 0);
/* Only allocate page-sized increments. */
size = ALIGN(size, GTT_PAGE_SIZE);
mem = xcalloc(1, sizeof(*mem));
if (mem == NULL)
return NULL;
mem->name = xstrdup(name);
if (mem->name == NULL) {
xfree(mem);
return NULL;
}
mem->bo = dri_bo_alloc(intel->bufmgr, name, size, GTT_PAGE_SIZE);
if (!mem->bo) {
xfree(mem->name);
xfree(mem);
return NULL;
}
/* Give buffer obviously wrong offset/end until it's pinned. */
mem->offset = -1;
mem->end = -1;
mem->size = size;
mem->pitch = pitch;
ret = drm_intel_bo_set_tiling(mem->bo, &tiling_mode, pitch);
if (ret != 0 || tiling_mode != requested_tiling_mode) {
xf86DrvMsg(scrn->scrnIndex, X_ERROR,
"Failed to set tiling on %s: %s\n", mem->name,
ret == 0 ? "rejected by kernel" : strerror(errno));
}
mem->tiling_mode = tiling_mode;
if (flags & DISABLE_REUSE)
drm_intel_bo_disable_reuse(mem->bo);
/* Insert new allocation into the list */
mem->prev = NULL;
mem->next = intel->bo_list;
if (intel->bo_list != NULL)
intel->bo_list->prev = mem;
intel->bo_list = mem;
return mem;
}
@ -453,9 +405,9 @@ i830_describe_allocations(ScrnInfoPtr scrn, int verbosity, const char *prefix)
char phys_suffix[32] = "";
char *tile_suffix = "";
if (mem->tiling == TILE_XMAJOR)
if (mem->tiling_mode == I915_TILING_X)
tile_suffix = " X tiled";
else if (mem->tiling == TILE_YMAJOR)
else if (mem->tiling_mode == I915_TILING_Y)
tile_suffix = " Y tiled";
xf86DrvMsgVerb(scrn->scrnIndex, X_INFO, verbosity,
@ -472,9 +424,9 @@ i830_describe_allocations(ScrnInfoPtr scrn, int verbosity, const char *prefix)
for (mem = intel->bo_list; mem != NULL; mem = mem->next) {
char *tile_suffix = "";
if (mem->tiling == TILE_XMAJOR)
if (mem->tiling_mode == I915_TILING_X)
tile_suffix = " X tiled";
else if (mem->tiling == TILE_YMAJOR)
else if (mem->tiling_mode == I915_TILING_Y)
tile_suffix = " Y tiled";
xf86DrvMsgVerb(scrn->scrnIndex, X_INFO, verbosity,
@ -527,11 +479,10 @@ i830_memory *i830_allocate_framebuffer(ScrnInfoPtr scrn)
intel_screen_private *intel = intel_get_screen_private(scrn);
unsigned int pitch = scrn->displayWidth * intel->cpp;
unsigned long minspace;
int align;
long size, fb_height;
int flags;
i830_memory *front_buffer = NULL;
enum tile_format tile_format = TILE_NONE;
uint32_t tiling_mode;
flags = ALLOW_SHARING | DISABLE_REUSE;
@ -548,30 +499,21 @@ i830_memory *i830_allocate_framebuffer(ScrnInfoPtr scrn)
size = ROUND_TO_PAGE(pitch * fb_height);
if (intel->tiling)
tile_format = TILE_XMAJOR;
if (intel->tiling && IsTileable(scrn, pitch))
tiling_mode = I915_TILING_X;
else
tiling_mode = I915_TILING_NONE;
if (!IsTileable(scrn, pitch))
tile_format = TILE_NONE;
if (!i830_check_display_stride(scrn, pitch, tile_format != TILE_NONE)) {
if (!i830_check_display_stride(scrn, pitch,
tiling_mode != I915_TILING_NONE)) {
xf86DrvMsg(scrn->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 (tile_format != TILE_NONE) {
/* XXX: probably not the case on 965 */
if (IS_I9XX(intel))
align = MB(1);
else
align = KB(512);
} else
align = KB(64);
front_buffer = i830_allocate_memory(scrn, "front buffer", size,
pitch, align, flags, tile_format);
pitch, flags, tiling_mode);
if (front_buffer == NULL) {
xf86DrvMsg(scrn->scrnIndex, X_ERROR,
@ -599,8 +541,7 @@ static Bool i830_allocate_cursor_buffers(ScrnInfoPtr scrn)
intel->cursor_mem_argb[i] =
i830_allocate_memory(scrn, "ARGB cursor",
HWCURSOR_SIZE_ARGB, PITCH_NONE,
GTT_PAGE_SIZE, DISABLE_REUSE,
TILE_NONE);
DISABLE_REUSE, I915_TILING_NONE);
if (!intel->cursor_mem_argb[i])
return FALSE;
@ -667,7 +608,7 @@ Bool i830_allocate_xvmc_buffer(ScrnInfoPtr scrn, const char *name,
int flags)
{
*buffer = i830_allocate_memory(scrn, name, size, PITCH_NONE,
GTT_PAGE_SIZE, flags, TILE_NONE);
flags, I915_TILING_NONE);
if (!*buffer) {
xf86DrvMsg(scrn->scrnIndex, X_ERROR,

View File

@ -316,7 +316,7 @@ static Bool i915_allocate_xvmc_buffers(ScrnInfoPtr scrn,
I915XvMCContextPriv * ctxpriv)
{
intel_screen_private *intel = intel_get_screen_private(scrn);
int flags = ALIGN_BOTH_ENDS;
int flags = 0;
/* on 915G/GM, load indirect can only use physical address...sigh */
if (IS_I915G(intel) || IS_I915GM(intel))
@ -354,7 +354,7 @@ static Bool i915_allocate_xvmc_buffers(ScrnInfoPtr scrn,
if (!i830_allocate_xvmc_buffer(scrn, "[XvMC]Correction Data Buffer",
&(ctxpriv->mcCorrdata), 512 * 1024,
ALIGN_BOTH_ENDS)) {
0)) {
return FALSE;
}
@ -595,7 +595,7 @@ static int i915_xvmc_create_surface(ScrnInfoPtr scrn, XvMCSurfacePtr pSurf,
if (!i830_allocate_xvmc_buffer(scrn, "XvMC surface",
&(sfpriv->surface), bufsize,
ALIGN_BOTH_ENDS)) {
0)) {
xf86DrvMsg(scrn->scrnIndex, X_ERROR,
"[XvMC] i915 : Failed to allocate XvMC surface space!\n");
xfree(sfpriv);
@ -687,7 +687,7 @@ static int i915_xvmc_create_subpict(ScrnInfoPtr scrn, XvMCSubpicturePtr pSubp,
if (!i830_allocate_xvmc_buffer(scrn, "XvMC surface",
&(sfpriv->surface), bufsize,
ALIGN_BOTH_ENDS)) {
0)) {
xf86DrvMsg(scrn->scrnIndex, X_ERROR,
"[XvMC] I915XvMCCreateSurface: Failed to allocate XvMC surface space!\n");
xfree(sfpriv);