llvmpipe: consolidate texture memory allocation code
And fix incorrect allocation of linear memory for display targets. This fixes fd.o bugs 27761 and 27762.
This commit is contained in:
@@ -160,6 +160,7 @@ llvmpipe_displaytarget_layout(struct llvmpipe_screen *screen,
|
||||
lpr->img_stride[0] = 0;
|
||||
|
||||
lpr->layout[0] = alloc_layout_array(1, width, height);
|
||||
//lpr->layout[0][0] = LP_TEX_LAYOUT_LINEAR;
|
||||
|
||||
lpr->dt = winsys->displaytarget_create(winsys,
|
||||
lpr->base.bind,
|
||||
@@ -307,6 +308,7 @@ llvmpipe_resource_map(struct pipe_resource *resource,
|
||||
struct llvmpipe_screen *screen = llvmpipe_screen(resource->screen);
|
||||
struct sw_winsys *winsys = screen->winsys;
|
||||
unsigned dt_usage;
|
||||
uint8_t *map2;
|
||||
|
||||
if (tex_usage == LP_TEX_USAGE_READ) {
|
||||
dt_usage = PIPE_TRANSFER_READ;
|
||||
@@ -325,11 +327,12 @@ llvmpipe_resource_map(struct pipe_resource *resource,
|
||||
/* install this linear image in texture data structure */
|
||||
lpr->linear[level].data = map;
|
||||
|
||||
map = llvmpipe_get_texture_image(lpr, face + zslice, level,
|
||||
tex_usage, layout);
|
||||
assert(map);
|
||||
/* make sure tiled data gets converted to linear data */
|
||||
map2 = llvmpipe_get_texture_image(lpr, 0, 0, tex_usage, layout);
|
||||
if (layout == LP_TEX_LAYOUT_LINEAR)
|
||||
assert(map == map2);
|
||||
|
||||
return map;
|
||||
return map2;
|
||||
}
|
||||
else if (resource_is_texture(resource)) {
|
||||
/* regular texture */
|
||||
@@ -841,6 +844,43 @@ llvmpipe_set_texture_image_layout(struct llvmpipe_resource *lpr,
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Allocate storage for a linear or tile texture image (all cube
|
||||
* faces and all 3D slices.
|
||||
*/
|
||||
static void
|
||||
alloc_image_data(struct llvmpipe_resource *lpr, unsigned level,
|
||||
enum lp_texture_layout layout)
|
||||
{
|
||||
if (lpr->dt)
|
||||
assert(level == 0);
|
||||
|
||||
if (layout == LP_TEX_LAYOUT_TILED) {
|
||||
/* tiled data is stored in regular memory */
|
||||
uint buffer_size = tex_image_size(lpr, level, layout);
|
||||
lpr->tiled[level].data = align_malloc(buffer_size, 16);
|
||||
}
|
||||
else {
|
||||
assert(layout == LP_TEX_LAYOUT_LINEAR);
|
||||
if (lpr->dt) {
|
||||
/* we get the linear memory from the winsys */
|
||||
struct llvmpipe_screen *screen = llvmpipe_screen(lpr->base.screen);
|
||||
struct sw_winsys *winsys = screen->winsys;
|
||||
|
||||
lpr->linear[0].data =
|
||||
winsys->displaytarget_map(winsys, lpr->dt,
|
||||
PIPE_TRANSFER_READ_WRITE);
|
||||
}
|
||||
else {
|
||||
/* not a display target - allocate regular memory */
|
||||
uint buffer_size = tex_image_size(lpr, level, LP_TEX_LAYOUT_LINEAR);
|
||||
lpr->linear[level].data = align_malloc(buffer_size, 16);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Return pointer to texture image data (either linear or tiled layout)
|
||||
* for a particular cube face or 3D texture slice.
|
||||
@@ -910,8 +950,7 @@ llvmpipe_get_texture_image(struct llvmpipe_resource *lpr,
|
||||
|
||||
if (!target_data) {
|
||||
/* allocate memory for the target image now */
|
||||
unsigned buffer_size = tex_image_size(lpr, level, layout);
|
||||
target_img->data = align_malloc(buffer_size, 16);
|
||||
alloc_image_data(lpr, level, layout);
|
||||
target_data = target_img->data;
|
||||
}
|
||||
|
||||
@@ -1032,9 +1071,8 @@ llvmpipe_get_texture_tile_linear(struct llvmpipe_resource *lpr,
|
||||
assert(y % TILE_SIZE == 0);
|
||||
|
||||
if (!linear_img->data) {
|
||||
/* allocate memory for the tiled image now */
|
||||
unsigned buffer_size = tex_image_size(lpr, level, LP_TEX_LAYOUT_LINEAR);
|
||||
linear_img->data = align_malloc(buffer_size, 16);
|
||||
/* allocate memory for the linear image now */
|
||||
alloc_image_data(lpr, level, LP_TEX_LAYOUT_LINEAR);
|
||||
}
|
||||
|
||||
/* compute address of the slice/face of the image that contains the tile */
|
||||
@@ -1084,8 +1122,7 @@ llvmpipe_get_texture_tile(struct llvmpipe_resource *lpr,
|
||||
|
||||
if (!tiled_img->data) {
|
||||
/* allocate memory for the tiled image now */
|
||||
unsigned buffer_size = tex_image_size(lpr, level, LP_TEX_LAYOUT_TILED);
|
||||
tiled_img->data = align_malloc(buffer_size, 16);
|
||||
alloc_image_data(lpr, level, LP_TEX_LAYOUT_TILED);
|
||||
}
|
||||
|
||||
/* compute address of the slice/face of the image that contains the tile */
|
||||
|
||||
Reference in New Issue
Block a user