From: Roland Scheidegger <srol...@vmware.com> Seems pointless to just duplicate some of the calculations (the calculation of actual memory used compared to what was predicted in llvmpipe_texture_layout actually could have differed slightly in some cases due to different alignment rules used though this should have been of no consequence). --- src/gallium/drivers/llvmpipe/lp_texture.c | 58 +++++++++---------------------- 1 file changed, 17 insertions(+), 41 deletions(-)
diff --git a/src/gallium/drivers/llvmpipe/lp_texture.c b/src/gallium/drivers/llvmpipe/lp_texture.c index 40e5815..3c87b28 100644 --- a/src/gallium/drivers/llvmpipe/lp_texture.c +++ b/src/gallium/drivers/llvmpipe/lp_texture.c @@ -59,16 +59,15 @@ static struct llvmpipe_resource resource_list; #endif static unsigned id_counter = 0; -static void -alloc_image_data(struct llvmpipe_resource *lpr); /** * Conventional allocation path for non-display textures: - * Just compute row strides here. Storage is allocated on demand later. + * Compute strides and allocate data (unless asked not to). */ static boolean llvmpipe_texture_layout(struct llvmpipe_screen *screen, - struct llvmpipe_resource *lpr) + struct llvmpipe_resource *lpr, + boolean allocate) { struct pipe_resource *pt = &lpr->base; unsigned level; @@ -149,6 +148,8 @@ llvmpipe_texture_layout(struct llvmpipe_screen *screen, goto fail; } + lpr->mip_offsets[level] = total_size; + total_size += (uint64_t) lpr->num_slices_faces[level] * (uint64_t) lpr->img_stride[level]; if (total_size > LP_MAX_TEXTURE_SIZE) { @@ -161,6 +162,16 @@ llvmpipe_texture_layout(struct llvmpipe_screen *screen, depth = u_minify(depth, 1); } + if (allocate) { + lpr->tex_data = align_malloc(total_size, util_cpu_caps.cacheline); + if (!lpr->tex_data) { + return FALSE; + } + else { + memset(lpr->tex_data, 0, total_size); + } + } + return TRUE; fail: @@ -179,7 +190,7 @@ llvmpipe_can_create_resource(struct pipe_screen *screen, struct llvmpipe_resource lpr; memset(&lpr, 0, sizeof(lpr)); lpr.base = *res; - return llvmpipe_texture_layout(llvmpipe_screen(screen), &lpr); + return llvmpipe_texture_layout(llvmpipe_screen(screen), &lpr, false); } @@ -247,13 +258,8 @@ llvmpipe_resource_create(struct pipe_screen *_screen, } else { /* texture map */ - if (!llvmpipe_texture_layout(screen, lpr)) - goto fail; - - alloc_image_data(lpr); - if (!lpr->tex_data) { + if (!llvmpipe_texture_layout(screen, lpr, true)) goto fail; - } } } else { @@ -747,36 +753,6 @@ llvmpipe_get_texture_image_address(struct llvmpipe_resource *lpr, /** - * Allocate storage for a linear image - * (all cube faces and all 3D slices, all levels). - */ -static void -alloc_image_data(struct llvmpipe_resource *lpr) -{ - uint alignment = MAX2(64, util_cpu_caps.cacheline); - uint level; - uint offset = 0; - - assert(!lpr->dt); - - /* not a display target - allocate regular memory */ - /* - * Offset calculation for start of a specific mip/layer is always - * offset = lpr->linear_mip_offsets[level] + lpr->img_stride[level] * layer - */ - for (level = 0; level <= lpr->base.last_level; level++) { - uint buffer_size = tex_image_size(lpr, level); - lpr->mip_offsets[level] = offset; - offset += align(buffer_size, alignment); - } - lpr->tex_data = align_malloc(offset, alignment); - if (lpr->tex_data) { - memset(lpr->tex_data, 0, offset); - } -} - - -/** * Return size of resource in bytes */ unsigned -- 1.9.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev