From 68f507d126fc60fba91eef57819dc0e2871173bf Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Wed, 21 Sep 2022 11:30:14 -0600 Subject: [PATCH] llvmpipe: asst. clean-ups in lp_texture.[ch] Signed-off-by: Brian Paul Part-of: --- src/gallium/drivers/llvmpipe/lp_texture.c | 235 ++++++++++++---------- src/gallium/drivers/llvmpipe/lp_texture.h | 27 ++- 2 files changed, 147 insertions(+), 115 deletions(-) diff --git a/src/gallium/drivers/llvmpipe/lp_texture.c b/src/gallium/drivers/llvmpipe/lp_texture.c index 615df6341b0..2095e4f3026 100644 --- a/src/gallium/drivers/llvmpipe/lp_texture.c +++ b/src/gallium/drivers/llvmpipe/lp_texture.c @@ -75,7 +75,6 @@ llvmpipe_texture_layout(struct llvmpipe_screen *screen, boolean allocate) { struct pipe_resource *pt = &lpr->base; - unsigned level; unsigned width = pt->width0; unsigned height = pt->height0; unsigned depth = pt->depth0; @@ -83,12 +82,12 @@ llvmpipe_texture_layout(struct llvmpipe_screen *screen, unsigned layers = pt->array_size; unsigned num_samples = util_res_sample_count(pt); - /* XXX: - * This alignment here (same for displaytarget) was added for the purpose of - * ARB_map_buffer_alignment. I am not convinced it's needed for non-buffer - * resources. Otherwise we'd want the max of cacheline size and 16 (max size - * of a block for all formats) though this should not be strictly necessary - * neither. In any case it can only affect compressed or 1d textures. + /* XXX: This alignment here (same for displaytarget) was added for the + * purpose of ARB_map_buffer_alignment. I am not convinced it's needed for + * non-buffer resources. Otherwise we'd want the max of cacheline size and + * 16 (max size of a block for all formats) though this should not be + * strictly necessary neither. In any case it can only affect compressed or + * 1d textures. */ uint64_t mip_align = MAX2(64, util_get_cpu_caps()->cacheline); @@ -104,7 +103,7 @@ llvmpipe_texture_layout(struct llvmpipe_screen *screen, assert(LP_MAX_TEXTURE_2D_LEVELS <= LP_MAX_TEXTURE_LEVELS); assert(LP_MAX_TEXTURE_3D_LEVELS <= LP_MAX_TEXTURE_LEVELS); - for (level = 0; level <= pt->last_level; level++) { + for (unsigned level = 0; level <= pt->last_level; level++) { uint64_t mipsize; unsigned align_x, align_y, nblocksx, nblocksy, block_size, num_slices; @@ -118,9 +117,9 @@ llvmpipe_texture_layout(struct llvmpipe_screen *screen, * handle specially in render output code (as we need to do special * handling there for buffers in any case). */ - if (util_format_is_compressed(pt->format)) + if (util_format_is_compressed(pt->format)) { align_x = align_y = 1; - else { + } else { align_x = LP_RASTER_BLOCK_SIZE; if (llvmpipe_resource_is_1d(&lpr->base)) align_y = 1; @@ -137,7 +136,8 @@ llvmpipe_texture_layout(struct llvmpipe_screen *screen, if (util_format_is_compressed(pt->format)) lpr->row_stride[level] = nblocksx * block_size; else - lpr->row_stride[level] = align(nblocksx * block_size, util_get_cpu_caps()->cacheline); + lpr->row_stride[level] = align(nblocksx * block_size, + util_get_cpu_caps()->cacheline); lpr->img_stride[level] = (uint64_t)lpr->row_stride[level] * nblocksy; @@ -178,8 +178,7 @@ llvmpipe_texture_layout(struct llvmpipe_screen *screen, lpr->tex_data = align_malloc(total_size, mip_align); if (!lpr->tex_data) { return FALSE; - } - else { + } else { memset(lpr->tex_data, 0, total_size); } } @@ -237,7 +236,8 @@ llvmpipe_displaytarget_layout(struct llvmpipe_screen *screen, static struct pipe_resource * llvmpipe_resource_create_all(struct pipe_screen *_screen, const struct pipe_resource *templat, - const void *map_front_private, bool alloc_backing) + const void *map_front_private, + bool alloc_backing) { struct llvmpipe_screen *screen = llvmpipe_screen(_screen); struct llvmpipe_resource *lpr = CALLOC_STRUCT(llvmpipe_resource); @@ -258,14 +258,12 @@ llvmpipe_resource_create_all(struct pipe_screen *_screen, /* displayable surface */ if (!llvmpipe_displaytarget_layout(screen, lpr, map_front_private)) goto fail; - } - else { + } else { /* texture map */ if (!llvmpipe_texture_layout(screen, lpr, alloc_backing)) goto fail; } - } - else { + } else { /* other data (vertex buffer, const buffer, etc) */ const uint bytes = templat->width0; assert(util_format_get_blocksize(templat->format) == 1); @@ -317,14 +315,17 @@ llvmpipe_resource_create_all(struct pipe_screen *_screen, return NULL; } + static struct pipe_resource * llvmpipe_resource_create_front(struct pipe_screen *_screen, const struct pipe_resource *templat, const void *map_front_private) { - return llvmpipe_resource_create_all(_screen, templat, map_front_private, true); + return llvmpipe_resource_create_all(_screen, templat, + map_front_private, true); } + static struct pipe_resource * llvmpipe_resource_create(struct pipe_screen *_screen, const struct pipe_resource *templat) @@ -332,22 +333,23 @@ llvmpipe_resource_create(struct pipe_screen *_screen, return llvmpipe_resource_create_front(_screen, templat, NULL); } + static struct pipe_resource * llvmpipe_resource_create_unbacked(struct pipe_screen *_screen, const struct pipe_resource *templat, uint64_t *size_required) { - struct pipe_resource *pt; - struct llvmpipe_resource *lpr; - pt = llvmpipe_resource_create_all(_screen, templat, NULL, false); + struct pipe_resource *pt = + llvmpipe_resource_create_all(_screen, templat, NULL, false); if (!pt) return pt; - lpr = llvmpipe_resource(pt); + struct llvmpipe_resource *lpr = llvmpipe_resource(pt); lpr->backable = true; *size_required = lpr->size_required; return pt; } + static struct pipe_memory_object * llvmpipe_memobj_create_from_handle(struct pipe_screen *pscreen, struct winsys_handle *handle, @@ -365,6 +367,7 @@ llvmpipe_memobj_create_from_handle(struct pipe_screen *pscreen, return NULL; } + static void llvmpipe_memobj_destroy(struct pipe_screen *pscreen, struct pipe_memory_object *memobj) @@ -378,6 +381,7 @@ llvmpipe_memobj_destroy(struct pipe_screen *pscreen, free(lpmo); } + static struct pipe_resource * llvmpipe_resource_from_memobj(struct pipe_screen *pscreen, const struct pipe_resource *templat, @@ -399,11 +403,10 @@ llvmpipe_resource_from_memobj(struct pipe_screen *pscreen, /* texture map */ if (!llvmpipe_texture_layout(screen, lpr, false)) goto fail; - if(lpmo->size < lpr->size_required) + if (lpmo->size < lpr->size_required) goto fail; lpr->tex_data = lpmo->data; - } - else { + } else { /* other data (vertex buffer, const buffer, etc) */ const uint bytes = templat->width0; assert(util_format_get_blocksize(templat->format) == 1); @@ -426,7 +429,7 @@ llvmpipe_resource_from_memobj(struct pipe_screen *pscreen, if (!(templat->flags & PIPE_RESOURCE_FLAG_DONT_OVER_ALLOCATE)) lpr->size_required += (LP_RASTER_BLOCK_SIZE - 1) * 4 * sizeof(float); - if(lpmo->size < lpr->size_required) + if (lpmo->size < lpr->size_required) goto fail; lpr->data = lpmo->data; } @@ -458,18 +461,16 @@ llvmpipe_resource_destroy(struct pipe_screen *pscreen, /* display target */ struct sw_winsys *winsys = screen->winsys; winsys->displaytarget_destroy(winsys, lpr->dt); - } - else if (llvmpipe_resource_is_texture(pt)) { + } else if (llvmpipe_resource_is_texture(pt)) { /* free linear image data */ if (lpr->tex_data) { if (!lpr->imported_memory) align_free(lpr->tex_data); lpr->tex_data = NULL; } - } - else if (lpr->data) { - if (!lpr->imported_memory) - align_free(lpr->data); + } else if (lpr->data) { + if (!lpr->imported_memory) + align_free(lpr->data); } } #ifdef DEBUG @@ -510,8 +511,7 @@ llvmpipe_resource_map(struct pipe_resource *resource, if (tex_usage == LP_TEX_USAGE_READ) { dt_usage = PIPE_MAP_READ; - } - else { + } else { dt_usage = PIPE_MAP_READ_WRITE; } @@ -525,13 +525,11 @@ llvmpipe_resource_map(struct pipe_resource *resource, lpr->tex_data = map; return map; - } - else if (llvmpipe_resource_is_texture(resource)) { + } else if (llvmpipe_resource_is_texture(resource)) { map = llvmpipe_get_texture_image_address(lpr, layer, level); return map; - } - else { + } else { return lpr->data; } } @@ -542,8 +540,8 @@ llvmpipe_resource_map(struct pipe_resource *resource, */ void llvmpipe_resource_unmap(struct pipe_resource *resource, - unsigned level, - unsigned layer) + unsigned level, + unsigned layer) { struct llvmpipe_resource *lpr = llvmpipe_resource(resource); @@ -630,8 +628,8 @@ no_lpr: static bool llvmpipe_resource_get_handle(struct pipe_screen *screen, struct pipe_context *ctx, - struct pipe_resource *pt, - struct winsys_handle *whandle, + struct pipe_resource *pt, + struct winsys_handle *whandle, unsigned usage) { struct sw_winsys *winsys = llvmpipe_screen(screen)->winsys; @@ -644,10 +642,11 @@ llvmpipe_resource_get_handle(struct pipe_screen *screen, return winsys->displaytarget_get_handle(winsys, lpr->dt, whandle); } + static struct pipe_resource * llvmpipe_resource_from_user_memory(struct pipe_screen *_screen, - const struct pipe_resource *resource, - void *user_memory) + const struct pipe_resource *resource, + void *user_memory) { struct llvmpipe_screen *screen = llvmpipe_screen(_screen); struct llvmpipe_resource *lpr; @@ -681,14 +680,15 @@ fail: return NULL; } + void * -llvmpipe_transfer_map_ms( struct pipe_context *pipe, - struct pipe_resource *resource, - unsigned level, - unsigned usage, - unsigned sample, - const struct pipe_box *box, - struct pipe_transfer **transfer ) +llvmpipe_transfer_map_ms(struct pipe_context *pipe, + struct pipe_resource *resource, + unsigned level, + unsigned usage, + unsigned sample, + const struct pipe_box *box, + struct pipe_transfer **transfer) { struct llvmpipe_context *llvmpipe = llvmpipe_context(pipe); struct llvmpipe_screen *screen = llvmpipe_screen(pipe->screen); @@ -697,15 +697,13 @@ llvmpipe_transfer_map_ms( struct pipe_context *pipe, struct pipe_transfer *pt; ubyte *map; enum pipe_format format; - enum lp_texture_usage tex_usage; - const char *mode; assert(resource); assert(level <= resource->last_level); /* - * Transfers, like other pipe operations, must happen in order, so flush the - * context if necessary. + * Transfers, like other pipe operations, must happen in order, so flush + * the context if necessary. */ if (!(usage & PIPE_MAP_UNSYNCHRONIZED)) { boolean read_only = !(usage & PIPE_MAP_WRITE); @@ -752,18 +750,19 @@ llvmpipe_transfer_map_ms( struct pipe_context *pipe, assert(level < LP_MAX_TEXTURE_LEVELS); /* - printf("tex_transfer_map(%d, %d %d x %d of %d x %d, usage %d )\n", + printf("tex_transfer_map(%d, %d %d x %d of %d x %d, usage %d)\n", transfer->x, transfer->y, transfer->width, transfer->height, transfer->texture->width0, transfer->texture->height0, transfer->usage); */ + enum lp_texture_usage tex_usage; + const char *mode; if (usage == PIPE_MAP_READ) { tex_usage = LP_TEX_USAGE_READ; mode = "read"; - } - else { + } else { tex_usage = LP_TEX_USAGE_READ_WRITE; mode = "read/write"; } @@ -774,10 +773,7 @@ llvmpipe_transfer_map_ms( struct pipe_context *pipe, format = lpr->base.format; - map = llvmpipe_resource_map(resource, - level, - box->z, - tex_usage); + map = llvmpipe_resource_map(resource, level, box->z, tex_usage); /* May want to do different things here depending on read/write nature @@ -797,17 +793,20 @@ llvmpipe_transfer_map_ms( struct pipe_context *pipe, return map; } + static void * -llvmpipe_transfer_map( struct pipe_context *pipe, - struct pipe_resource *resource, - unsigned level, - unsigned usage, - const struct pipe_box *box, - struct pipe_transfer **transfer ) +llvmpipe_transfer_map(struct pipe_context *pipe, + struct pipe_resource *resource, + unsigned level, + unsigned usage, + const struct pipe_box *box, + struct pipe_transfer **transfer) { - return llvmpipe_transfer_map_ms(pipe, resource, level, usage, 0, box, transfer); + return llvmpipe_transfer_map_ms(pipe, resource, level, usage, 0, + box, transfer); } + static void llvmpipe_transfer_unmap(struct pipe_context *pipe, struct pipe_transfer *transfer) @@ -827,12 +826,13 @@ llvmpipe_transfer_unmap(struct pipe_context *pipe, FREE(transfer); } + unsigned int -llvmpipe_is_resource_referenced( struct pipe_context *pipe, - struct pipe_resource *presource, - unsigned level) +llvmpipe_is_resource_referenced(struct pipe_context *pipe, + struct pipe_resource *presource, + unsigned level) { - struct llvmpipe_context *llvmpipe = llvmpipe_context( pipe ); + struct llvmpipe_context *llvmpipe = llvmpipe_context(pipe); if (!(presource->bind & (PIPE_BIND_DEPTH_STENCIL | PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW | @@ -848,18 +848,16 @@ llvmpipe_is_resource_referenced( struct pipe_context *pipe, * Returns the largest possible alignment for a format in llvmpipe */ unsigned -llvmpipe_get_format_alignment( enum pipe_format format ) +llvmpipe_get_format_alignment(enum pipe_format format) { const struct util_format_description *desc = util_format_description(format); unsigned size = 0; - unsigned bytes; - unsigned i; - for (i = 0; i < desc->nr_channels; ++i) { + for (unsigned i = 0; i < desc->nr_channels; ++i) { size += desc->channel[i].size; } - bytes = size / 8; + unsigned bytes = size / 8; if (!util_is_power_of_two_or_zero(bytes)) { bytes /= desc->nr_channels; @@ -926,11 +924,9 @@ ubyte * llvmpipe_get_texture_image_address(struct llvmpipe_resource *lpr, unsigned face_slice, unsigned level) { - unsigned offset; - assert(llvmpipe_resource_is_texture(&lpr->base)); - offset = lpr->mip_offsets[level]; + unsigned offset = lpr->mip_offsets[level]; if (face_slice > 0) offset += face_slice * tex_image_face_size(lpr, level); @@ -951,22 +947,24 @@ llvmpipe_resource_size(const struct pipe_resource *resource) if (llvmpipe_resource_is_texture(resource)) { /* Note this will always return 0 for displaytarget resources */ size = lpr->total_alloc_size; - } - else { + } else { size = resource->width0; } return size; } + static void llvmpipe_memory_barrier(struct pipe_context *pipe, - unsigned flags) + unsigned flags) { /* this may be an overly large hammer for this nut. */ llvmpipe_finish(pipe, "barrier"); } -static struct pipe_memory_allocation *llvmpipe_allocate_memory(struct pipe_screen *screen, uint64_t size) + +static struct pipe_memory_allocation * +llvmpipe_allocate_memory(struct pipe_screen *screen, uint64_t size) { uint64_t alignment; if (!os_get_page_size(&alignment)) @@ -974,41 +972,58 @@ static struct pipe_memory_allocation *llvmpipe_allocate_memory(struct pipe_scree return os_malloc_aligned(size, alignment); } -static void llvmpipe_free_memory(struct pipe_screen *screen, - struct pipe_memory_allocation *pmem) + +static void +llvmpipe_free_memory(struct pipe_screen *screen, + struct pipe_memory_allocation *pmem) { os_free_aligned(pmem); } + #ifdef PIPE_MEMORY_FD static const char *driver_id = "llvmpipe" MESA_GIT_SHA1; -static struct pipe_memory_allocation *llvmpipe_allocate_memory_fd(struct pipe_screen *screen, uint64_t size, int *fd) + +static struct pipe_memory_allocation * +llvmpipe_allocate_memory_fd(struct pipe_screen *screen, + uint64_t size, + int *fd) { uint64_t alignment; if (!os_get_page_size(&alignment)) alignment = 256; - return os_malloc_aligned_fd(size, alignment, fd, "llvmpipe memory fd", driver_id); + return os_malloc_aligned_fd(size, alignment, fd, + "llvmpipe memory fd", driver_id); } -static bool llvmpipe_import_memory_fd(struct pipe_screen *screen, int fd, struct pipe_memory_allocation **ptr, uint64_t *size) + +static bool +llvmpipe_import_memory_fd(struct pipe_screen *screen, + int fd, + struct pipe_memory_allocation **ptr, + uint64_t *size) { return os_import_memory_fd(fd, (void**)ptr, size, driver_id); } -static void llvmpipe_free_memory_fd(struct pipe_screen *screen, - struct pipe_memory_allocation *pmem) + +static void +llvmpipe_free_memory_fd(struct pipe_screen *screen, + struct pipe_memory_allocation *pmem) { os_free_fd(pmem); } #endif -static bool llvmpipe_resource_bind_backing(struct pipe_screen *screen, - struct pipe_resource *pt, - struct pipe_memory_allocation *pmem, - uint64_t offset) + +static bool +llvmpipe_resource_bind_backing(struct pipe_screen *screen, + struct pipe_resource *pt, + struct pipe_memory_allocation *pmem, + uint64_t offset) { struct llvmpipe_resource *lpr = llvmpipe_resource(pt); @@ -1027,17 +1042,22 @@ static bool llvmpipe_resource_bind_backing(struct pipe_screen *screen, return TRUE; } -static void *llvmpipe_map_memory(struct pipe_screen *screen, - struct pipe_memory_allocation *pmem) + +static void * +llvmpipe_map_memory(struct pipe_screen *screen, + struct pipe_memory_allocation *pmem) { return pmem; } -static void llvmpipe_unmap_memory(struct pipe_screen *screen, - struct pipe_memory_allocation *pmem) + +static void +llvmpipe_unmap_memory(struct pipe_screen *screen, + struct pipe_memory_allocation *pmem) { } + #ifdef DEBUG void llvmpipe_print_resources(void) @@ -1061,11 +1081,12 @@ llvmpipe_print_resources(void) } #endif + static void llvmpipe_get_resource_info(struct pipe_screen *screen, - struct pipe_resource *resource, - unsigned *stride, - unsigned *offset) + struct pipe_resource *resource, + unsigned *stride, + unsigned *offset) { struct llvmpipe_resource *lpr = llvmpipe_resource(resource); @@ -1073,6 +1094,7 @@ llvmpipe_get_resource_info(struct pipe_screen *screen, *offset = 0; } + static bool llvmpipe_resource_get_param(struct pipe_screen *screen, struct pipe_context *context, @@ -1119,8 +1141,10 @@ llvmpipe_resource_get_param(struct pipe_screen *screen, else if (param == PIPE_RESOURCE_PARAM_HANDLE_TYPE_FD) whandle.type = WINSYS_HANDLE_TYPE_FD; - if (!llvmpipe_resource_get_handle(screen, context, resource, &whandle, handle_usage)) + if (!llvmpipe_resource_get_handle(screen, context, resource, + &whandle, handle_usage)) { return false; + } *value = (uint64_t)(uintptr_t)whandle.handle; return true; default: @@ -1131,6 +1155,7 @@ llvmpipe_resource_get_param(struct pipe_screen *screen, return false; } + void llvmpipe_init_screen_resource_funcs(struct pipe_screen *screen) { diff --git a/src/gallium/drivers/llvmpipe/lp_texture.h b/src/gallium/drivers/llvmpipe/lp_texture.h index e14c9f0ee26..843bce6ce73 100644 --- a/src/gallium/drivers/llvmpipe/lp_texture.h +++ b/src/gallium/drivers/llvmpipe/lp_texture.h @@ -114,6 +114,7 @@ struct llvmpipe_transfer struct pipe_transfer base; }; + struct llvmpipe_memory_object { struct pipe_memory_object b; @@ -143,6 +144,7 @@ llvmpipe_transfer(struct pipe_transfer *pt) return (struct llvmpipe_transfer *) pt; } + static inline struct llvmpipe_memory_object * llvmpipe_memory_object(struct pipe_memory_object *pt) { @@ -217,6 +219,7 @@ llvmpipe_resource_stride(struct pipe_resource *resource, return lpr->row_stride[level]; } + static inline unsigned llvmpipe_sample_stride(struct pipe_resource *resource) { @@ -224,6 +227,7 @@ llvmpipe_sample_stride(struct pipe_resource *resource) return lpr->sample_stride; } + void * llvmpipe_resource_map(struct pipe_resource *resource, unsigned level, @@ -257,20 +261,23 @@ llvmpipe_print_resources(void); #define LP_REFERENCED_FOR_READ (1 << 0) #define LP_REFERENCED_FOR_WRITE (1 << 1) + unsigned int -llvmpipe_is_resource_referenced( struct pipe_context *pipe, - struct pipe_resource *presource, - unsigned level); +llvmpipe_is_resource_referenced(struct pipe_context *pipe, + struct pipe_resource *presource, + unsigned level); unsigned llvmpipe_get_format_alignment(enum pipe_format format); + void * -llvmpipe_transfer_map_ms( struct pipe_context *pipe, - struct pipe_resource *resource, - unsigned level, - unsigned usage, - unsigned sample, - const struct pipe_box *box, - struct pipe_transfer **transfer ); +llvmpipe_transfer_map_ms(struct pipe_context *pipe, + struct pipe_resource *resource, + unsigned level, + unsigned usage, + unsigned sample, + const struct pipe_box *box, + struct pipe_transfer **transfer); + #endif /* LP_TEXTURE_H */