From: Alyssa Rosenzweig Date: Wed, 3 Apr 2019 03:52:36 +0000 (+0000) Subject: panfrost: Size tiled temp buffers correctly X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=b34d8222c7874bded1d8b3849252f40aadc7e1b5;p=mesa.git panfrost: Size tiled temp buffers correctly This should lower transient memory usage and improve performance slightly (due to less memory to malloc/free, better cache locality, etc). Signed-off-by: Alyssa Rosenzweig --- diff --git a/src/gallium/drivers/panfrost/pan_resource.c b/src/gallium/drivers/panfrost/pan_resource.c index 217b27c5778..15d522f1963 100644 --- a/src/gallium/drivers/panfrost/pan_resource.c +++ b/src/gallium/drivers/panfrost/pan_resource.c @@ -390,8 +390,6 @@ panfrost_transfer_map(struct pipe_context *pctx, transfer->base.level = level; transfer->base.usage = usage; transfer->base.box = *box; - transfer->base.stride = bo->slices[level].stride; - transfer->base.layer_stride = bo->cubemap_stride; pipe_resource_reference(&transfer->base.resource, resource); @@ -413,12 +411,17 @@ panfrost_transfer_map(struct pipe_context *pctx, if (usage & PIPE_TRANSFER_MAP_DIRECTLY) return NULL; + transfer->base.stride = box->width * bytes_per_pixel; + transfer->base.layer_stride = transfer->base.stride * box->height; + /* TODO: Reads */ - /* TODO: Only allocate "just" enough, shortening the stride */ - transfer->map = malloc(transfer->base.stride * box->height); + transfer->map = malloc(transfer->base.layer_stride * box->depth); return transfer->map; } else { + transfer->base.stride = bo->slices[level].stride; + transfer->base.layer_stride = bo->cubemap_stride; + return bo->cpu + bo->slices[level].offset + transfer->base.box.z * bo->cubemap_stride @@ -440,7 +443,6 @@ panfrost_tile_texture(struct panfrost_screen *screen, struct panfrost_resource * trans->base.box.width, trans->base.box.height, util_format_get_blocksize(rsrc->base.format), - bo->slices[level].stride, u_minify(rsrc->base.width0, level), trans->map, bo->cpu diff --git a/src/gallium/drivers/panfrost/pan_swizzle.c b/src/gallium/drivers/panfrost/pan_swizzle.c index afc89506b33..291bd1f88ae 100644 --- a/src/gallium/drivers/panfrost/pan_swizzle.c +++ b/src/gallium/drivers/panfrost/pan_swizzle.c @@ -149,15 +149,18 @@ swizzle_bpp4_align16(int width, int height, int source_stride, int block_pitch, void panfrost_texture_swizzle(unsigned off_x, unsigned off_y, - int width, int height, int bytes_per_pixel, int source_stride, int dest_width, + int width, int height, int bytes_per_pixel, int dest_width, const uint8_t *pixels, uint8_t *ldest) { /* Calculate maximum size, overestimating a bit */ int block_pitch = ALIGN(dest_width, 16) >> 4; + /* Strides must be tight, since we're only ever called indirectly */ + int source_stride = width * bytes_per_pixel; + /* Use fast path if available */ - if (!(off_x || off_y)) { + if (!(off_x || off_y) && (width == dest_width)) { if (bytes_per_pixel == 4 /* && (ALIGN(width, 16) == width) */) { swizzle_bpp4_align16(width, height, source_stride >> 2, (block_pitch * 256 >> 4), (const uint32_t *) pixels, (uint32_t *) ldest); return; diff --git a/src/gallium/drivers/panfrost/pan_swizzle.h b/src/gallium/drivers/panfrost/pan_swizzle.h index 6f4dadef494..f4188f13930 100644 --- a/src/gallium/drivers/panfrost/pan_swizzle.h +++ b/src/gallium/drivers/panfrost/pan_swizzle.h @@ -32,7 +32,7 @@ panfrost_generate_space_filler_indices(void); void panfrost_texture_swizzle(unsigned off_x, unsigned off_y, - int width, int height, int bytes_per_pixel, int source_stride, int dest_width, + int width, int height, int bytes_per_pixel, int dest_width, const uint8_t *pixels, uint8_t *ldest);