mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-25 04:20:08 +01:00
gallium: adapt drivers to interface cleanups
This commit is contained in:
parent
decf6ed810
commit
c78748a527
12 changed files with 138 additions and 168 deletions
|
|
@ -65,14 +65,11 @@ cell_texture_layout(struct cell_texture *ct)
|
|||
w_tile = align(width, TILE_SIZE);
|
||||
h_tile = align(height, TILE_SIZE);
|
||||
|
||||
pt->nblocksx[level] = pf_get_nblocksx(&pt->block, w_tile);
|
||||
pt->nblocksy[level] = pf_get_nblocksy(&pt->block, h_tile);
|
||||
|
||||
ct->stride[level] = pt->nblocksx[level] * pt->block.size;
|
||||
ct->stride[level] = pf_get_stride(pt->format, w_tile);
|
||||
|
||||
ct->level_offset[level] = ct->buffer_size;
|
||||
|
||||
size = pt->nblocksx[level] * pt->nblocksy[level] * pt->block.size;
|
||||
size = ct->stride[level] * pf_get_nblocksy(pt->format, h_tile);
|
||||
if (pt->target == PIPE_TEXTURE_CUBE)
|
||||
size *= 6;
|
||||
else
|
||||
|
|
@ -283,10 +280,12 @@ cell_get_tex_surface(struct pipe_screen *screen,
|
|||
ps->zslice = zslice;
|
||||
|
||||
if (pt->target == PIPE_TEXTURE_CUBE) {
|
||||
ps->offset += face * pt->nblocksy[level] * ct->stride[level];
|
||||
unsigned h_tile = align(ps->height, TILE_SIZE);
|
||||
ps->offset += face * pf_get_nblocksy(ps->format, h_tile) * ct->stride[level];
|
||||
}
|
||||
else if (pt->target == PIPE_TEXTURE_3D) {
|
||||
ps->offset += zslice * pt->nblocksy[level] * ct->stride[level];
|
||||
unsigned h_tile = align(ps->height, TILE_SIZE);
|
||||
ps->offset += zslice * pf_get_nblocksy(ps->format, h_tile) * ct->stride[level];
|
||||
}
|
||||
else {
|
||||
assert(face == 0);
|
||||
|
|
@ -327,14 +326,10 @@ cell_get_tex_transfer(struct pipe_screen *screen,
|
|||
if (ctrans) {
|
||||
struct pipe_transfer *pt = &ctrans->base;
|
||||
pipe_texture_reference(&pt->texture, texture);
|
||||
pt->format = texture->format;
|
||||
pt->block = texture->block;
|
||||
pt->x = x;
|
||||
pt->y = y;
|
||||
pt->width = w;
|
||||
pt->height = h;
|
||||
pt->nblocksx = texture->nblocksx[level];
|
||||
pt->nblocksy = texture->nblocksy[level];
|
||||
pt->stride = ct->stride[level];
|
||||
pt->usage = usage;
|
||||
pt->face = face;
|
||||
|
|
@ -344,10 +339,12 @@ cell_get_tex_transfer(struct pipe_screen *screen,
|
|||
ctrans->offset = ct->level_offset[level];
|
||||
|
||||
if (texture->target == PIPE_TEXTURE_CUBE) {
|
||||
ctrans->offset += face * pt->nblocksy * pt->stride;
|
||||
unsigned h_tile = align(u_minify(texture->height0, level), TILE_SIZE);
|
||||
ctrans->offset += face * pf_get_nblocksy(texture->format, h_tile) * pt->stride;
|
||||
}
|
||||
else if (texture->target == PIPE_TEXTURE_3D) {
|
||||
ctrans->offset += zslice * pt->nblocksy * pt->stride;
|
||||
unsigned h_tile = align(u_minify(texture->height0, level), TILE_SIZE);
|
||||
ctrans->offset += zslice * pf_get_nblocksy(texture->format, h_tile) * pt->stride;
|
||||
}
|
||||
else {
|
||||
assert(face == 0);
|
||||
|
|
@ -400,7 +397,8 @@ cell_transfer_map(struct pipe_screen *screen, struct pipe_transfer *transfer)
|
|||
* Create a buffer of ordinary memory for the linear texture.
|
||||
* This is the memory that the user will read/write.
|
||||
*/
|
||||
size = pt->nblocksx[level] * pt->nblocksy[level] * pt->block.size;
|
||||
size = pf_get_stride(pt->format, align(texWidth, TILE_SIZE)) *
|
||||
pf_get_nblocksy(pt->format, align(texHeight, TILE_SIZE));
|
||||
|
||||
ctrans->map = align_malloc(size, 16);
|
||||
if (!ctrans->map)
|
||||
|
|
@ -408,7 +406,7 @@ cell_transfer_map(struct pipe_screen *screen, struct pipe_transfer *transfer)
|
|||
|
||||
if (transfer->usage & PIPE_TRANSFER_READ) {
|
||||
/* need to untwiddle the texture to make a linear version */
|
||||
const uint bpp = pf_get_size(ct->base.format);
|
||||
const uint bpp = pf_get_blocksize(ct->base.format);
|
||||
if (bpp == 4) {
|
||||
const uint *src = (uint *) (ct->mapped + ctrans->offset);
|
||||
uint *dst = ctrans->map;
|
||||
|
|
@ -451,7 +449,7 @@ cell_transfer_unmap(struct pipe_screen *screen,
|
|||
/* The user wrote new texture data into the mapped buffer.
|
||||
* We need to convert the new linear data into the twiddled/tiled format.
|
||||
*/
|
||||
const uint bpp = pf_get_size(ct->base.format);
|
||||
const uint bpp = pf_get_blocksize(ct->base.format);
|
||||
if (bpp == 4) {
|
||||
const uint *src = ctrans->map;
|
||||
uint *dst = (uint *) (ct->mapped + ctrans->offset);
|
||||
|
|
|
|||
|
|
@ -48,17 +48,19 @@ i915_surface_copy(struct pipe_context *pipe,
|
|||
{
|
||||
struct i915_texture *dst_tex = (struct i915_texture *)dst->texture;
|
||||
struct i915_texture *src_tex = (struct i915_texture *)src->texture;
|
||||
struct pipe_texture *dpt = &dst_tex->base;
|
||||
struct pipe_texture *spt = &src_tex->base;
|
||||
|
||||
assert( dst != src );
|
||||
assert( dst_tex->base.block.size == src_tex->base.block.size );
|
||||
assert( dst_tex->base.block.width == src_tex->base.block.height );
|
||||
assert( dst_tex->base.block.height == src_tex->base.block.height );
|
||||
assert( dst_tex->base.block.width == 1 );
|
||||
assert( dst_tex->base.block.height == 1 );
|
||||
assert( pf_get_blocksize(dpt->format) == pf_get_blocksize(spt->format) );
|
||||
assert( pf_get_blockwidth(dpt->format) == pf_get_blockwidth(spt->format) );
|
||||
assert( pf_get_blockheight(dpt->format) == pf_get_blockheight(spt->format) );
|
||||
assert( pf_get_blockwidth(dpt->format) == 1 );
|
||||
assert( pf_get_blockheight(dpt->format) == 1 );
|
||||
|
||||
i915_copy_blit( i915_context(pipe),
|
||||
FALSE,
|
||||
dst_tex->base.block.size,
|
||||
pf_get_blocksize(dpt->format),
|
||||
(unsigned short) src_tex->stride, src_tex->buffer, src->offset,
|
||||
(unsigned short) dst_tex->stride, dst_tex->buffer, dst->offset,
|
||||
(short) srcx, (short) srcy, (short) dstx, (short) dsty, (short) width, (short) height );
|
||||
|
|
@ -72,12 +74,13 @@ i915_surface_fill(struct pipe_context *pipe,
|
|||
unsigned width, unsigned height, unsigned value)
|
||||
{
|
||||
struct i915_texture *tex = (struct i915_texture *)dst->texture;
|
||||
struct pipe_texture *pt = &tex->base;
|
||||
|
||||
assert(tex->base.block.width == 1);
|
||||
assert(tex->base.block.height == 1);
|
||||
assert(pf_get_blockwidth(pt->format) == 1);
|
||||
assert(pf_get_blockheight(pt->format) == 1);
|
||||
|
||||
i915_fill_blit( i915_context(pipe),
|
||||
tex->base.block.size,
|
||||
pf_get_blocksize(pt->format),
|
||||
(unsigned short) tex->stride,
|
||||
tex->buffer, dst->offset,
|
||||
(short) dstx, (short) dsty,
|
||||
|
|
|
|||
|
|
@ -74,6 +74,9 @@ static const int step_offsets[6][2] = {
|
|||
{-1, 1}
|
||||
};
|
||||
|
||||
/* XXX really need twice the size if x is already pot?
|
||||
Otherwise just use util_next_power_of_two?
|
||||
*/
|
||||
static unsigned
|
||||
power_of_two(unsigned x)
|
||||
{
|
||||
|
|
@ -83,13 +86,6 @@ power_of_two(unsigned x)
|
|||
return value;
|
||||
}
|
||||
|
||||
static unsigned
|
||||
round_up(unsigned n, unsigned multiple)
|
||||
{
|
||||
return (n + multiple - 1) & ~(multiple - 1);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* More advanced helper funcs
|
||||
*/
|
||||
|
|
@ -101,13 +97,8 @@ i915_miptree_set_level_info(struct i915_texture *tex,
|
|||
unsigned nr_images,
|
||||
unsigned w, unsigned h, unsigned d)
|
||||
{
|
||||
struct pipe_texture *pt = &tex->base;
|
||||
|
||||
assert(level < PIPE_MAX_TEXTURE_LEVELS);
|
||||
|
||||
pt->nblocksx[level] = pf_get_nblocksx(&pt->block, w);
|
||||
pt->nblocksy[level] = pf_get_nblocksy(&pt->block, h);
|
||||
|
||||
tex->nr_images[level] = nr_images;
|
||||
|
||||
/*
|
||||
|
|
@ -138,7 +129,7 @@ i915_miptree_set_image_offset(struct i915_texture *tex,
|
|||
|
||||
assert(img < tex->nr_images[level]);
|
||||
|
||||
tex->image_offset[level][img] = y * tex->stride + x * tex->base.block.size;
|
||||
tex->image_offset[level][img] = y * tex->stride + x * pf_get_blocksize(tex->base.format);
|
||||
|
||||
/*
|
||||
printf("%s level %d img %d pos %d,%d image_offset %x\n",
|
||||
|
|
@ -160,28 +151,28 @@ i915_scanout_layout(struct i915_texture *tex)
|
|||
{
|
||||
struct pipe_texture *pt = &tex->base;
|
||||
|
||||
if (pt->last_level > 0 || pt->block.size != 4)
|
||||
if (pt->last_level > 0 || pf_get_blocksize(pt->format) != 4)
|
||||
return FALSE;
|
||||
|
||||
i915_miptree_set_level_info(tex, 0, 1,
|
||||
tex->base.width0,
|
||||
tex->base.height0,
|
||||
pt->width0,
|
||||
pt->height0,
|
||||
1);
|
||||
i915_miptree_set_image_offset(tex, 0, 0, 0, 0);
|
||||
|
||||
if (tex->base.width0 >= 240) {
|
||||
tex->stride = power_of_two(tex->base.nblocksx[0] * pt->block.size);
|
||||
tex->total_nblocksy = round_up(tex->base.nblocksy[0], 8);
|
||||
if (pt->width0 >= 240) {
|
||||
tex->stride = power_of_two(pf_get_stride(pt->format, pt->width0));
|
||||
tex->total_nblocksy = align(pf_get_nblocksy(pt->format, pt->height0), 8);
|
||||
tex->hw_tiled = INTEL_TILE_X;
|
||||
} else if (tex->base.width0 == 64 && tex->base.height0 == 64) {
|
||||
tex->stride = power_of_two(tex->base.nblocksx[0] * pt->block.size);
|
||||
tex->total_nblocksy = round_up(tex->base.nblocksy[0], 8);
|
||||
} else if (pt->width0 == 64 && pt->height0 == 64) {
|
||||
tex->stride = power_of_two(pf_get_stride(pt->format, pt->width0));
|
||||
tex->total_nblocksy = align(pf_get_nblocksy(pt->format, pt->height0), 8);
|
||||
} else {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
debug_printf("%s size: %d,%d,%d offset %d,%d (0x%x)\n", __FUNCTION__,
|
||||
tex->base.width0, tex->base.height0, pt->block.size,
|
||||
pt->width0, pt->height0, pf_get_blocksize(pt->format),
|
||||
tex->stride, tex->total_nblocksy, tex->stride * tex->total_nblocksy);
|
||||
|
||||
return TRUE;
|
||||
|
|
@ -195,25 +186,25 @@ i915_display_target_layout(struct i915_texture *tex)
|
|||
{
|
||||
struct pipe_texture *pt = &tex->base;
|
||||
|
||||
if (pt->last_level > 0 || pt->block.size != 4)
|
||||
if (pt->last_level > 0 || pf_get_blocksize(pt->format) != 4)
|
||||
return FALSE;
|
||||
|
||||
/* fallback to normal textures for small textures */
|
||||
if (tex->base.width0 < 240)
|
||||
if (pt->width0 < 240)
|
||||
return FALSE;
|
||||
|
||||
i915_miptree_set_level_info(tex, 0, 1,
|
||||
tex->base.width0,
|
||||
tex->base.height0,
|
||||
pt->width0,
|
||||
pt->height0,
|
||||
1);
|
||||
i915_miptree_set_image_offset(tex, 0, 0, 0, 0);
|
||||
|
||||
tex->stride = power_of_two(tex->base.nblocksx[0] * pt->block.size);
|
||||
tex->total_nblocksy = round_up(tex->base.nblocksy[0], 8);
|
||||
tex->stride = power_of_two(pf_get_stride(pt->format, pt->width0));
|
||||
tex->total_nblocksy = align(pf_get_nblocksy(pt->format, pt->height0), 8);
|
||||
tex->hw_tiled = INTEL_TILE_X;
|
||||
|
||||
debug_printf("%s size: %d,%d,%d offset %d,%d (0x%x)\n", __FUNCTION__,
|
||||
tex->base.width0, tex->base.height0, pt->block.size,
|
||||
pt->width0, pt->height0, pf_get_blocksize(pt->format),
|
||||
tex->stride, tex->total_nblocksy, tex->stride * tex->total_nblocksy);
|
||||
|
||||
return TRUE;
|
||||
|
|
@ -226,34 +217,32 @@ i915_miptree_layout_2d(struct i915_texture *tex)
|
|||
unsigned level;
|
||||
unsigned width = pt->width0;
|
||||
unsigned height = pt->height0;
|
||||
unsigned nblocksx = pt->nblocksx[0];
|
||||
unsigned nblocksy = pt->nblocksy[0];
|
||||
unsigned nblocksy = pf_get_nblocksy(pt->format, pt->width0);
|
||||
|
||||
/* used for scanouts that need special layouts */
|
||||
if (tex->base.tex_usage & PIPE_TEXTURE_USAGE_PRIMARY)
|
||||
if (pt->tex_usage & PIPE_TEXTURE_USAGE_PRIMARY)
|
||||
if (i915_scanout_layout(tex))
|
||||
return;
|
||||
|
||||
/* for shared buffers we use some very like scanout */
|
||||
if (tex->base.tex_usage & PIPE_TEXTURE_USAGE_DISPLAY_TARGET)
|
||||
if (pt->tex_usage & PIPE_TEXTURE_USAGE_DISPLAY_TARGET)
|
||||
if (i915_display_target_layout(tex))
|
||||
return;
|
||||
|
||||
tex->stride = round_up(pt->nblocksx[0] * pt->block.size, 4);
|
||||
tex->stride = align(pf_get_stride(pt->format, pt->width0), 4);
|
||||
tex->total_nblocksy = 0;
|
||||
|
||||
for (level = 0; level <= pt->last_level; level++) {
|
||||
i915_miptree_set_level_info(tex, level, 1, width, height, 1);
|
||||
i915_miptree_set_image_offset(tex, level, 0, 0, tex->total_nblocksy);
|
||||
|
||||
nblocksy = round_up(MAX2(2, nblocksy), 2);
|
||||
nblocksy = align(MAX2(2, nblocksy), 2);
|
||||
|
||||
tex->total_nblocksy += nblocksy;
|
||||
|
||||
width = u_minify(width, 1);
|
||||
height = u_minify(height, 1);
|
||||
nblocksx = pf_get_nblocksx(&pt->block, width);
|
||||
nblocksy = pf_get_nblocksy(&pt->block, height);
|
||||
nblocksy = pf_get_nblocksy(pt->format, height);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -266,13 +255,12 @@ i915_miptree_layout_3d(struct i915_texture *tex)
|
|||
unsigned width = pt->width0;
|
||||
unsigned height = pt->height0;
|
||||
unsigned depth = pt->depth0;
|
||||
unsigned nblocksx = pt->nblocksx[0];
|
||||
unsigned nblocksy = pt->nblocksy[0];
|
||||
unsigned nblocksy = pf_get_nblocksy(pt->format, pt->height0);
|
||||
unsigned stack_nblocksy = 0;
|
||||
|
||||
/* Calculate the size of a single slice.
|
||||
*/
|
||||
tex->stride = round_up(pt->nblocksx[0] * pt->block.size, 4);
|
||||
tex->stride = align(pf_get_stride(pt->format, pt->width0), 4);
|
||||
|
||||
/* XXX: hardware expects/requires 9 levels at minimum.
|
||||
*/
|
||||
|
|
@ -283,8 +271,7 @@ i915_miptree_layout_3d(struct i915_texture *tex)
|
|||
|
||||
width = u_minify(width, 1);
|
||||
height = u_minify(height, 1);
|
||||
nblocksx = pf_get_nblocksx(&pt->block, width);
|
||||
nblocksy = pf_get_nblocksy(&pt->block, height);
|
||||
nblocksy = pf_get_nblocksy(pt->format, height);
|
||||
}
|
||||
|
||||
/* Fixup depth image_offsets:
|
||||
|
|
@ -309,14 +296,14 @@ i915_miptree_layout_cube(struct i915_texture *tex)
|
|||
{
|
||||
struct pipe_texture *pt = &tex->base;
|
||||
unsigned width = pt->width0, height = pt->height0;
|
||||
const unsigned nblocks = pt->nblocksx[0];
|
||||
const unsigned nblocks = pf_get_nblocksx(pt->format, pt->width0);
|
||||
unsigned level;
|
||||
unsigned face;
|
||||
|
||||
assert(width == height); /* cubemap images are square */
|
||||
|
||||
/* double pitch for cube layouts */
|
||||
tex->stride = round_up(nblocks * pt->block.size * 2, 4);
|
||||
tex->stride = align(nblocks * pf_get_blocksize(pt->format) * 2, 4);
|
||||
tex->total_nblocksy = nblocks * 4;
|
||||
|
||||
for (level = 0; level <= pt->last_level; level++) {
|
||||
|
|
@ -379,8 +366,8 @@ i945_miptree_layout_2d(struct i915_texture *tex)
|
|||
unsigned y = 0;
|
||||
unsigned width = pt->width0;
|
||||
unsigned height = pt->height0;
|
||||
unsigned nblocksx = pt->nblocksx[0];
|
||||
unsigned nblocksy = pt->nblocksy[0];
|
||||
unsigned nblocksx = pf_get_nblocksx(pt->format, pt->width0);
|
||||
unsigned nblocksy = pf_get_nblocksy(pt->format, pt->height0);
|
||||
|
||||
/* used for scanouts that need special layouts */
|
||||
if (tex->base.tex_usage & PIPE_TEXTURE_USAGE_PRIMARY)
|
||||
|
|
@ -392,7 +379,7 @@ i945_miptree_layout_2d(struct i915_texture *tex)
|
|||
if (i915_display_target_layout(tex))
|
||||
return;
|
||||
|
||||
tex->stride = round_up(pt->nblocksx[0] * pt->block.size, 4);
|
||||
tex->stride = align(pf_get_stride(pt->format, pt->width0), 4);
|
||||
|
||||
/* May need to adjust pitch to accomodate the placement of
|
||||
* the 2nd mipmap level. This occurs when the alignment
|
||||
|
|
@ -401,11 +388,11 @@ i945_miptree_layout_2d(struct i915_texture *tex)
|
|||
*/
|
||||
if (pt->last_level > 0) {
|
||||
unsigned mip1_nblocksx
|
||||
= align(pf_get_nblocksx(&pt->block, u_minify(width, 1)), align_x)
|
||||
+ pf_get_nblocksx(&pt->block, u_minify(width, 2));
|
||||
= align(pf_get_nblocksx(pt->format, u_minify(width, 1)), align_x)
|
||||
+ pf_get_nblocksx(pt->format, u_minify(width, 2));
|
||||
|
||||
if (mip1_nblocksx > nblocksx)
|
||||
tex->stride = mip1_nblocksx * pt->block.size;
|
||||
tex->stride = mip1_nblocksx * pf_get_blocksize(pt->format);
|
||||
}
|
||||
|
||||
/* Pitch must be a whole number of dwords
|
||||
|
|
@ -435,8 +422,8 @@ i945_miptree_layout_2d(struct i915_texture *tex)
|
|||
|
||||
width = u_minify(width, 1);
|
||||
height = u_minify(height, 1);
|
||||
nblocksx = pf_get_nblocksx(&pt->block, width);
|
||||
nblocksy = pf_get_nblocksy(&pt->block, height);
|
||||
nblocksx = pf_get_nblocksx(pt->format, width);
|
||||
nblocksy = pf_get_nblocksy(pt->format, height);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -447,17 +434,16 @@ i945_miptree_layout_3d(struct i915_texture *tex)
|
|||
unsigned width = pt->width0;
|
||||
unsigned height = pt->height0;
|
||||
unsigned depth = pt->depth0;
|
||||
unsigned nblocksx = pt->nblocksx[0];
|
||||
unsigned nblocksy = pt->nblocksy[0];
|
||||
unsigned nblocksy = pf_get_nblocksy(pt->format, pt->width0);
|
||||
unsigned pack_x_pitch, pack_x_nr;
|
||||
unsigned pack_y_pitch;
|
||||
unsigned level;
|
||||
|
||||
tex->stride = round_up(pt->nblocksx[0] * pt->block.size, 4);
|
||||
tex->stride = align(pf_get_stride(pt->format, pt->width0), 4);
|
||||
tex->total_nblocksy = 0;
|
||||
|
||||
pack_y_pitch = MAX2(pt->nblocksy[0], 2);
|
||||
pack_x_pitch = tex->stride / pt->block.size;
|
||||
pack_y_pitch = MAX2(nblocksy, 2);
|
||||
pack_x_pitch = tex->stride / pf_get_blocksize(pt->format);
|
||||
pack_x_nr = 1;
|
||||
|
||||
for (level = 0; level <= pt->last_level; level++) {
|
||||
|
|
@ -482,7 +468,7 @@ i945_miptree_layout_3d(struct i915_texture *tex)
|
|||
if (pack_x_pitch > 4) {
|
||||
pack_x_pitch >>= 1;
|
||||
pack_x_nr <<= 1;
|
||||
assert(pack_x_pitch * pack_x_nr * pt->block.size <= tex->stride);
|
||||
assert(pack_x_pitch * pack_x_nr * pf_get_blocksize(pt->format) <= tex->stride);
|
||||
}
|
||||
|
||||
if (pack_y_pitch > 2) {
|
||||
|
|
@ -492,8 +478,7 @@ i945_miptree_layout_3d(struct i915_texture *tex)
|
|||
width = u_minify(width, 1);
|
||||
height = u_minify(height, 1);
|
||||
depth = u_minify(depth, 1);
|
||||
nblocksx = pf_get_nblocksx(&pt->block, width);
|
||||
nblocksy = pf_get_nblocksy(&pt->block, height);
|
||||
nblocksy = pf_get_nblocksy(pt->format, height);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -503,7 +488,7 @@ i945_miptree_layout_cube(struct i915_texture *tex)
|
|||
struct pipe_texture *pt = &tex->base;
|
||||
unsigned level;
|
||||
|
||||
const unsigned nblocks = pt->nblocksx[0];
|
||||
const unsigned nblocks = pf_get_nblocksx(pt->format, pt->width0);
|
||||
unsigned face;
|
||||
unsigned width = pt->width0;
|
||||
unsigned height = pt->height0;
|
||||
|
|
@ -523,9 +508,9 @@ i945_miptree_layout_cube(struct i915_texture *tex)
|
|||
* or the final row of 4x4, 2x2 and 1x1 faces below this.
|
||||
*/
|
||||
if (nblocks > 32)
|
||||
tex->stride = round_up(nblocks * pt->block.size * 2, 4);
|
||||
tex->stride = align(nblocks * pf_get_blocksize(pt->format) * 2, 4);
|
||||
else
|
||||
tex->stride = 14 * 8 * pt->block.size;
|
||||
tex->stride = 14 * 8 * pf_get_blocksize(pt->format);
|
||||
|
||||
tex->total_nblocksy = nblocks * 4;
|
||||
|
||||
|
|
@ -645,9 +630,6 @@ i915_texture_create(struct pipe_screen *screen,
|
|||
pipe_reference_init(&tex->base.reference, 1);
|
||||
tex->base.screen = screen;
|
||||
|
||||
tex->base.nblocksx[0] = pf_get_nblocksx(&tex->base.block, tex->base.width0);
|
||||
tex->base.nblocksy[0] = pf_get_nblocksy(&tex->base.block, tex->base.height0);
|
||||
|
||||
if (is->is_i945) {
|
||||
if (!i945_miptree_layout(tex))
|
||||
goto fail;
|
||||
|
|
@ -829,14 +811,10 @@ i915_get_tex_transfer(struct pipe_screen *screen,
|
|||
trans = CALLOC_STRUCT(i915_transfer);
|
||||
if (trans) {
|
||||
pipe_texture_reference(&trans->base.texture, texture);
|
||||
trans->base.format = trans->base.format;
|
||||
trans->base.x = x;
|
||||
trans->base.y = y;
|
||||
trans->base.width = w;
|
||||
trans->base.height = h;
|
||||
trans->base.block = texture->block;
|
||||
trans->base.nblocksx = texture->nblocksx[level];
|
||||
trans->base.nblocksy = texture->nblocksy[level];
|
||||
trans->base.stride = tex->stride;
|
||||
trans->offset = offset;
|
||||
trans->base.usage = usage;
|
||||
|
|
@ -852,6 +830,7 @@ i915_transfer_map(struct pipe_screen *screen,
|
|||
struct intel_winsys *iws = i915_screen(tex->base.screen)->iws;
|
||||
char *map;
|
||||
boolean write = FALSE;
|
||||
enum pipe_format format = tex->base.format;
|
||||
|
||||
if (transfer->usage & PIPE_TRANSFER_WRITE)
|
||||
write = TRUE;
|
||||
|
|
@ -861,8 +840,8 @@ i915_transfer_map(struct pipe_screen *screen,
|
|||
return NULL;
|
||||
|
||||
return map + i915_transfer(transfer)->offset +
|
||||
transfer->y / transfer->block.height * transfer->stride +
|
||||
transfer->x / transfer->block.width * transfer->block.size;
|
||||
transfer->y / pf_get_blockheight(format) * transfer->stride +
|
||||
transfer->x / pf_get_blockwidth(format) * pf_get_blocksize(format);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
|||
|
|
@ -166,7 +166,7 @@ shade_quads(struct llvmpipe_context *llvmpipe,
|
|||
assert((y % 2) == 0);
|
||||
depth = llvmpipe->zsbuf_map +
|
||||
y*llvmpipe->zsbuf_transfer->stride +
|
||||
2*x*llvmpipe->zsbuf_transfer->block.size;
|
||||
2*x*pf_get_blocksize(llvmpipe->zsbuf_transfer->texture->format);
|
||||
}
|
||||
else
|
||||
depth = NULL;
|
||||
|
|
|
|||
|
|
@ -291,7 +291,7 @@ lp_find_cached_tex_tile(struct llvmpipe_tex_tile_cache *tc,
|
|||
assert(0);
|
||||
}
|
||||
|
||||
util_format_read_4ub(tc->tex_trans->format,
|
||||
util_format_read_4ub(tc->tex_trans->texture->format,
|
||||
(uint8_t *)tile->color, sizeof tile->color[0],
|
||||
tc->tex_trans_map, tc->tex_trans->stride,
|
||||
x, y, w, h);
|
||||
|
|
|
|||
|
|
@ -48,7 +48,6 @@
|
|||
/* Simple, maximally packed layout.
|
||||
*/
|
||||
|
||||
|
||||
/* Conventional allocation path for non-display textures:
|
||||
*/
|
||||
static boolean
|
||||
|
|
@ -63,20 +62,15 @@ llvmpipe_texture_layout(struct llvmpipe_screen *screen,
|
|||
|
||||
unsigned buffer_size = 0;
|
||||
|
||||
pf_get_block(lpt->base.format, &lpt->base.block);
|
||||
|
||||
for (level = 0; level <= pt->last_level; level++) {
|
||||
unsigned nblocksx, nblocksy;
|
||||
|
||||
pt->nblocksx[level] = pf_get_nblocksx(&pt->block, width);
|
||||
pt->nblocksy[level] = pf_get_nblocksy(&pt->block, height);
|
||||
|
||||
/* Allocate storage for whole quads. This is particularly important
|
||||
* for depth surfaces, which are currently stored in a swizzled format. */
|
||||
nblocksx = pf_get_nblocksx(&pt->block, align(width, 2));
|
||||
nblocksy = pf_get_nblocksy(&pt->block, align(height, 2));
|
||||
nblocksx = pf_get_nblocksx(pt->format, align(width, 2));
|
||||
nblocksy = pf_get_nblocksy(pt->format, align(height, 2));
|
||||
|
||||
lpt->stride[level] = align(nblocksx*pt->block.size, 16);
|
||||
lpt->stride[level] = align(nblocksx * pf_get_blocksize(pt->format), 16);
|
||||
|
||||
lpt->level_offset[level] = buffer_size;
|
||||
|
||||
|
|
@ -100,10 +94,6 @@ llvmpipe_displaytarget_layout(struct llvmpipe_screen *screen,
|
|||
{
|
||||
struct llvmpipe_winsys *winsys = screen->winsys;
|
||||
|
||||
pf_get_block(lpt->base.format, &lpt->base.block);
|
||||
lpt->base.nblocksx[0] = pf_get_nblocksx(&lpt->base.block, lpt->base.width0);
|
||||
lpt->base.nblocksy[0] = pf_get_nblocksy(&lpt->base.block, lpt->base.height0);
|
||||
|
||||
lpt->dt = winsys->displaytarget_create(winsys,
|
||||
lpt->base.format,
|
||||
lpt->base.width0,
|
||||
|
|
@ -180,8 +170,6 @@ llvmpipe_texture_blanket(struct pipe_screen * screen,
|
|||
lpt->base = *base;
|
||||
pipe_reference_init(&lpt->base.reference, 1);
|
||||
lpt->base.screen = screen;
|
||||
lpt->base.nblocksx[0] = pf_get_nblocksx(&lpt->base.block, lpt->base.width0);
|
||||
lpt->base.nblocksy[0] = pf_get_nblocksy(&lpt->base.block, lpt->base.height0);
|
||||
lpt->stride[0] = stride[0];
|
||||
|
||||
pipe_buffer_reference(&lpt->buffer, buffer);
|
||||
|
|
@ -255,11 +243,17 @@ llvmpipe_get_tex_surface(struct pipe_screen *screen,
|
|||
ps->level = level;
|
||||
ps->zslice = zslice;
|
||||
|
||||
/* XXX shouldn't that rather be
|
||||
tex_height = align(ps->height, 2);
|
||||
to account for alignment done in llvmpipe_texture_layout ?
|
||||
*/
|
||||
if (pt->target == PIPE_TEXTURE_CUBE) {
|
||||
ps->offset += face * pt->nblocksy[level] * lpt->stride[level];
|
||||
unsigned tex_height = ps->height;
|
||||
ps->offset += face * pf_get_nblocksy(pt->format, tex_height) * lpt->stride[level];
|
||||
}
|
||||
else if (pt->target == PIPE_TEXTURE_3D) {
|
||||
ps->offset += zslice * pt->nblocksy[level] * lpt->stride[level];
|
||||
unsigned tex_height = ps->height;
|
||||
ps->offset += zslice * pf_get_nblocksy(pt->format, tex_height) * lpt->stride[level];
|
||||
}
|
||||
else {
|
||||
assert(face == 0);
|
||||
|
|
@ -300,14 +294,10 @@ llvmpipe_get_tex_transfer(struct pipe_screen *screen,
|
|||
if (lpt) {
|
||||
struct pipe_transfer *pt = &lpt->base;
|
||||
pipe_texture_reference(&pt->texture, texture);
|
||||
pt->format = texture->format;
|
||||
pt->block = texture->block;
|
||||
pt->x = x;
|
||||
pt->y = y;
|
||||
pt->width = w;
|
||||
pt->height = h;
|
||||
pt->nblocksx = texture->nblocksx[level];
|
||||
pt->nblocksy = texture->nblocksy[level];
|
||||
pt->stride = lptex->stride[level];
|
||||
pt->usage = usage;
|
||||
pt->face = face;
|
||||
|
|
@ -316,11 +306,17 @@ llvmpipe_get_tex_transfer(struct pipe_screen *screen,
|
|||
|
||||
lpt->offset = lptex->level_offset[level];
|
||||
|
||||
/* XXX shouldn't that rather be
|
||||
tex_height = align(u_minify(texture->height0, level), 2)
|
||||
to account for alignment done in llvmpipe_texture_layout ?
|
||||
*/
|
||||
if (texture->target == PIPE_TEXTURE_CUBE) {
|
||||
lpt->offset += face * pt->nblocksy * pt->stride;
|
||||
unsigned tex_height = u_minify(texture->height0, level);
|
||||
lpt->offset += face * pf_get_nblocksy(texture->format, tex_height) * pt->stride;
|
||||
}
|
||||
else if (texture->target == PIPE_TEXTURE_3D) {
|
||||
lpt->offset += zslice * pt->nblocksy * pt->stride;
|
||||
unsigned tex_height = u_minify(texture->height0, level);
|
||||
lpt->offset += zslice * pf_get_nblocksy(texture->format, tex_height) * pt->stride;
|
||||
}
|
||||
else {
|
||||
assert(face == 0);
|
||||
|
|
@ -352,9 +348,11 @@ llvmpipe_transfer_map( struct pipe_screen *_screen,
|
|||
struct llvmpipe_screen *screen = llvmpipe_screen(_screen);
|
||||
ubyte *map, *xfer_map;
|
||||
struct llvmpipe_texture *lpt;
|
||||
enum pipe_format format;
|
||||
|
||||
assert(transfer->texture);
|
||||
lpt = llvmpipe_texture(transfer->texture);
|
||||
format = lpt->base.format;
|
||||
|
||||
if(lpt->dt) {
|
||||
struct llvmpipe_winsys *winsys = screen->winsys;
|
||||
|
|
@ -379,8 +377,8 @@ llvmpipe_transfer_map( struct pipe_screen *_screen,
|
|||
}
|
||||
|
||||
xfer_map = map + llvmpipe_transfer(transfer)->offset +
|
||||
transfer->y / transfer->block.height * transfer->stride +
|
||||
transfer->x / transfer->block.width * transfer->block.size;
|
||||
transfer->y / pf_get_blockheight(format) * transfer->stride +
|
||||
transfer->x / pf_get_blockwidth(format) * pf_get_blocksize(format);
|
||||
/*printf("map = %p xfer map = %p\n", map, xfer_map);*/
|
||||
return xfer_map;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -252,13 +252,13 @@ lp_flush_tile_cache(struct llvmpipe_tile_cache *tc)
|
|||
case LP_TILE_STATUS_CLEAR:
|
||||
/* Actually clear the tiles which were flagged as being in a
|
||||
* clear state. */
|
||||
util_fill_rect(tc->transfer_map, &pt->block, pt->stride,
|
||||
util_fill_rect(tc->transfer_map, pt->texture->format, pt->stride,
|
||||
x, y, w, h,
|
||||
tc->clear_val);
|
||||
break;
|
||||
|
||||
case LP_TILE_STATUS_DEFINED:
|
||||
lp_tile_write_4ub(pt->format,
|
||||
lp_tile_write_4ub(pt->texture->format,
|
||||
tile->color,
|
||||
tc->transfer_map, pt->stride,
|
||||
x, y, w, h);
|
||||
|
|
@ -306,7 +306,7 @@ lp_get_cached_tile(struct llvmpipe_tile_cache *tc,
|
|||
y &= ~(TILE_SIZE - 1);
|
||||
|
||||
if (!pipe_clip_tile(x, y, &w, &h, tc->transfer))
|
||||
lp_tile_read_4ub(pt->format,
|
||||
lp_tile_read_4ub(pt->texture->format,
|
||||
tile->color,
|
||||
tc->transfer_map, tc->transfer->stride,
|
||||
x, y, w, h);
|
||||
|
|
|
|||
|
|
@ -631,10 +631,10 @@ void r300_emit_aos(struct r300_context* r300, unsigned offset)
|
|||
for (i = 0; i < aos_count - 1; i += 2) {
|
||||
int buf_num1 = velem[i].vertex_buffer_index;
|
||||
int buf_num2 = velem[i+1].vertex_buffer_index;
|
||||
assert(vbuf[buf_num1].stride % 4 == 0 && pf_get_size(velem[i].src_format) % 4 == 0);
|
||||
assert(vbuf[buf_num2].stride % 4 == 0 && pf_get_size(velem[i+1].src_format) % 4 == 0);
|
||||
OUT_CS((pf_get_size(velem[i].src_format) >> 2) | (vbuf[buf_num1].stride << 6) |
|
||||
(pf_get_size(velem[i+1].src_format) << 14) | (vbuf[buf_num2].stride << 22));
|
||||
assert(vbuf[buf_num1].stride % 4 == 0 && pf_get_blocksize(velem[i].src_format) % 4 == 0);
|
||||
assert(vbuf[buf_num2].stride % 4 == 0 && pf_get_blocksize(velem[i+1].src_format) % 4 == 0);
|
||||
OUT_CS((pf_get_blocksize(velem[i].src_format) >> 2) | (vbuf[buf_num1].stride << 6) |
|
||||
(pf_get_blocksize(velem[i+1].src_format) << 14) | (vbuf[buf_num2].stride << 22));
|
||||
OUT_CS(vbuf[buf_num1].buffer_offset + velem[i].src_offset +
|
||||
offset * vbuf[buf_num1].stride);
|
||||
OUT_CS(vbuf[buf_num2].buffer_offset + velem[i+1].src_offset +
|
||||
|
|
@ -642,8 +642,8 @@ void r300_emit_aos(struct r300_context* r300, unsigned offset)
|
|||
}
|
||||
if (aos_count & 1) {
|
||||
int buf_num = velem[i].vertex_buffer_index;
|
||||
assert(vbuf[buf_num].stride % 4 == 0 && pf_get_size(velem[i].src_format) % 4 == 0);
|
||||
OUT_CS((pf_get_size(velem[i].src_format) >> 2) | (vbuf[buf_num].stride << 6));
|
||||
assert(vbuf[buf_num].stride % 4 == 0 && pf_get_blocksize(velem[i].src_format) % 4 == 0);
|
||||
OUT_CS((pf_get_blocksize(velem[i].src_format) >> 2) | (vbuf[buf_num].stride << 6));
|
||||
OUT_CS(vbuf[buf_num].buffer_offset + velem[i].src_offset +
|
||||
offset * vbuf[buf_num].stride);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -311,14 +311,10 @@ r300_get_tex_transfer(struct pipe_screen *screen,
|
|||
trans = CALLOC_STRUCT(r300_transfer);
|
||||
if (trans) {
|
||||
pipe_texture_reference(&trans->transfer.texture, texture);
|
||||
trans->transfer.format = texture->format;
|
||||
trans->transfer.x = x;
|
||||
trans->transfer.y = y;
|
||||
trans->transfer.width = w;
|
||||
trans->transfer.height = h;
|
||||
trans->transfer.block = texture->block;
|
||||
trans->transfer.nblocksx = texture->nblocksx[level];
|
||||
trans->transfer.nblocksy = texture->nblocksy[level];
|
||||
trans->transfer.stride = r300_texture_get_stride(tex, level);
|
||||
trans->transfer.usage = usage;
|
||||
|
||||
|
|
@ -344,6 +340,7 @@ static void* r300_transfer_map(struct pipe_screen* screen,
|
|||
{
|
||||
struct r300_texture* tex = (struct r300_texture*)transfer->texture;
|
||||
char* map;
|
||||
enum pipe_format format = tex->tex.format;
|
||||
|
||||
map = pipe_buffer_map(screen, tex->buffer,
|
||||
pipe_transfer_buffer_flags(transfer));
|
||||
|
|
@ -353,8 +350,8 @@ static void* r300_transfer_map(struct pipe_screen* screen,
|
|||
}
|
||||
|
||||
return map + r300_transfer(transfer)->offset +
|
||||
transfer->y / transfer->block.height * transfer->stride +
|
||||
transfer->x / transfer->block.width * transfer->block.size;
|
||||
transfer->y / pf_get_blockheight(format) * transfer->stride +
|
||||
transfer->x / pf_get_blockwidth(format) * pf_get_blocksize(format);
|
||||
}
|
||||
|
||||
static void r300_transfer_unmap(struct pipe_screen* screen,
|
||||
|
|
|
|||
|
|
@ -105,7 +105,7 @@ unsigned r300_texture_get_stride(struct r300_texture* tex, unsigned level)
|
|||
return 0;
|
||||
}
|
||||
|
||||
return align(pf_get_stride(&tex->tex.block, u_minify(tex->tex.width0, level)), 32);
|
||||
return align(pf_get_stride(tex->tex.format, u_minify(tex->tex.width0, level)), 32);
|
||||
}
|
||||
|
||||
static void r300_setup_miptree(struct r300_texture* tex)
|
||||
|
|
@ -115,11 +115,10 @@ static void r300_setup_miptree(struct r300_texture* tex)
|
|||
int i;
|
||||
|
||||
for (i = 0; i <= base->last_level; i++) {
|
||||
base->nblocksx[i] = pf_get_nblocksx(&base->block, u_minify(base->width0, i));
|
||||
base->nblocksy[i] = pf_get_nblocksy(&base->block, u_minify(base->height0, i));
|
||||
unsigned nblocksy = pf_get_nblocksy(base->format, u_minify(base->height0, i));
|
||||
|
||||
stride = r300_texture_get_stride(tex, i);
|
||||
layer_size = stride * base->nblocksy[i];
|
||||
layer_size = stride * nblocksy;
|
||||
|
||||
if (base->target == PIPE_TEXTURE_CUBE)
|
||||
size = layer_size * 6;
|
||||
|
|
@ -129,7 +128,7 @@ static void r300_setup_miptree(struct r300_texture* tex)
|
|||
tex->offset[i] = align(tex->size, 32);
|
||||
tex->size = tex->offset[i] + size;
|
||||
tex->layer_size[i] = layer_size;
|
||||
tex->pitch[i] = stride / base->block.size;
|
||||
tex->pitch[i] = stride / pf_get_blocksize(base->format);
|
||||
|
||||
debug_printf("r300: Texture miptree: Level %d "
|
||||
"(%dx%dx%d px, pitch %d bytes)\n",
|
||||
|
|
@ -245,7 +244,7 @@ static struct pipe_texture*
|
|||
tex->tex.screen = screen;
|
||||
|
||||
tex->stride_override = *stride;
|
||||
tex->pitch[0] = *stride / base->block.size;
|
||||
tex->pitch[0] = *stride / pf_get_blocksize(base->format);
|
||||
|
||||
r300_setup_flags(tex);
|
||||
r300_setup_texture_state(tex, r300_screen(screen)->caps->is_r500);
|
||||
|
|
@ -283,7 +282,6 @@ r300_video_surface_create(struct pipe_screen *screen,
|
|||
template.width0 = util_next_power_of_two(width);
|
||||
template.height0 = util_next_power_of_two(height);
|
||||
template.depth0 = 1;
|
||||
pf_get_block(template.format, &template.block);
|
||||
template.tex_usage = PIPE_TEXTURE_USAGE_SAMPLER |
|
||||
PIPE_TEXTURE_USAGE_RENDER_TARGET;
|
||||
|
||||
|
|
|
|||
|
|
@ -158,7 +158,8 @@ svga_transfer_dma_band(struct svga_transfer *st,
|
|||
st->base.x + st->base.width,
|
||||
y + h,
|
||||
st->base.zslice + 1,
|
||||
texture->base.block.size*8/(texture->base.block.width*texture->base.block.height));
|
||||
pf_get_blocksize(texture->base.format)*8/
|
||||
(pf_get_blockwidth(texture->base.format)*pf_get_blockheight(texture->base.format)));
|
||||
|
||||
box.x = st->base.x;
|
||||
box.y = y;
|
||||
|
|
@ -208,7 +209,8 @@ svga_transfer_dma(struct svga_transfer *st,
|
|||
}
|
||||
else {
|
||||
unsigned y, h, srcy;
|
||||
h = st->hw_nblocksy * st->base.block.height;
|
||||
unsigned blockheight = pf_get_blockheight(st->base.texture->format);
|
||||
h = st->hw_nblocksy * blockheight;
|
||||
srcy = 0;
|
||||
for(y = 0; y < st->base.height; y += h) {
|
||||
unsigned offset, length;
|
||||
|
|
@ -218,11 +220,11 @@ svga_transfer_dma(struct svga_transfer *st,
|
|||
h = st->base.height - y;
|
||||
|
||||
/* Transfer band must be aligned to pixel block boundaries */
|
||||
assert(y % st->base.block.height == 0);
|
||||
assert(h % st->base.block.height == 0);
|
||||
assert(y % blockheight == 0);
|
||||
assert(h % blockheight == 0);
|
||||
|
||||
offset = y * st->base.stride / st->base.block.height;
|
||||
length = h * st->base.stride / st->base.block.height;
|
||||
offset = y * st->base.stride / blockheight;
|
||||
length = h * st->base.stride / blockheight;
|
||||
|
||||
sw = (uint8_t *)st->swbuf + offset;
|
||||
|
||||
|
|
@ -291,8 +293,6 @@ svga_texture_create(struct pipe_screen *screen,
|
|||
height = templat->height0;
|
||||
depth = templat->depth0;
|
||||
for(level = 0; level <= templat->last_level; ++level) {
|
||||
tex->base.nblocksx[level] = pf_get_nblocksx(&tex->base.block, width);
|
||||
tex->base.nblocksy[level] = pf_get_nblocksy(&tex->base.block, height);
|
||||
width = u_minify(width, 1);
|
||||
height = u_minify(height, 1);
|
||||
depth = u_minify(depth, 1);
|
||||
|
|
@ -750,6 +750,8 @@ svga_get_tex_transfer(struct pipe_screen *screen,
|
|||
struct svga_screen *ss = svga_screen(screen);
|
||||
struct svga_winsys_screen *sws = ss->sws;
|
||||
struct svga_transfer *st;
|
||||
unsigned nblocksx = pf_get_nblocksx(texture->format, w);
|
||||
unsigned nblocksy = pf_get_nblocksy(texture->format, h);
|
||||
|
||||
/* We can't map texture storage directly */
|
||||
if (usage & PIPE_TRANSFER_MAP_DIRECTLY)
|
||||
|
|
@ -759,21 +761,17 @@ svga_get_tex_transfer(struct pipe_screen *screen,
|
|||
if (!st)
|
||||
return NULL;
|
||||
|
||||
st->base.format = texture->format;
|
||||
st->base.block = texture->block;
|
||||
st->base.x = x;
|
||||
st->base.y = y;
|
||||
st->base.width = w;
|
||||
st->base.height = h;
|
||||
st->base.nblocksx = pf_get_nblocksx(&texture->block, w);
|
||||
st->base.nblocksy = pf_get_nblocksy(&texture->block, h);
|
||||
st->base.stride = st->base.nblocksx*st->base.block.size;
|
||||
st->base.stride = nblocksx*pf_get_blocksize(texture->format);
|
||||
st->base.usage = usage;
|
||||
st->base.face = face;
|
||||
st->base.level = level;
|
||||
st->base.zslice = zslice;
|
||||
|
||||
st->hw_nblocksy = st->base.nblocksy;
|
||||
st->hw_nblocksy = nblocksy;
|
||||
|
||||
st->hwbuf = svga_winsys_buffer_create(ss,
|
||||
1,
|
||||
|
|
@ -789,15 +787,15 @@ svga_get_tex_transfer(struct pipe_screen *screen,
|
|||
if(!st->hwbuf)
|
||||
goto no_hwbuf;
|
||||
|
||||
if(st->hw_nblocksy < st->base.nblocksy) {
|
||||
if(st->hw_nblocksy < nblocksy) {
|
||||
/* We couldn't allocate a hardware buffer big enough for the transfer,
|
||||
* so allocate regular malloc memory instead */
|
||||
debug_printf("%s: failed to allocate %u KB of DMA, splitting into %u x %u KB DMA transfers\n",
|
||||
__FUNCTION__,
|
||||
(st->base.nblocksy*st->base.stride + 1023)/1024,
|
||||
(st->base.nblocksy + st->hw_nblocksy - 1)/st->hw_nblocksy,
|
||||
(nblocksy*st->base.stride + 1023)/1024,
|
||||
(nblocksy + st->hw_nblocksy - 1)/st->hw_nblocksy,
|
||||
(st->hw_nblocksy*st->base.stride + 1023)/1024);
|
||||
st->swbuf = MALLOC(st->base.nblocksy*st->base.stride);
|
||||
st->swbuf = MALLOC(nblocksy*st->base.stride);
|
||||
if(!st->swbuf)
|
||||
goto no_swbuf;
|
||||
}
|
||||
|
|
@ -1046,8 +1044,7 @@ svga_screen_buffer_from_texture(struct pipe_texture *texture,
|
|||
svga_translate_format(texture->format),
|
||||
stex->handle);
|
||||
|
||||
*stride = pf_get_nblocksx(&texture->block, texture->width0) *
|
||||
texture->block.size;
|
||||
*stride = pf_get_stride(texture->format, texture->width0);
|
||||
|
||||
return *buffer != NULL;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -210,7 +210,7 @@ static int update_zero_stride( struct svga_context *svga,
|
|||
mapped_buffer = pipe_buffer_map_range(svga->pipe.screen,
|
||||
vbuffer->buffer,
|
||||
vel->src_offset,
|
||||
pf_get_size(vel->src_format),
|
||||
pf_get_blocksize(vel->src_format),
|
||||
PIPE_BUFFER_USAGE_CPU_READ);
|
||||
translate->set_buffer(translate, vel->vertex_buffer_index,
|
||||
mapped_buffer,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue