X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fsoftpipe%2Fsp_texture.c;h=c49bfcaba55a4010abe8bece3f1a09b264df5a97;hb=5932c2f0b9b56e6eeee87baa7b0b493227850f69;hp=e1ea5df24ca420a1dbe836cf8a9ae597c855c2dc;hpb=59562e9ba5330cb2033757a582fe7f449140af46;p=mesa.git diff --git a/src/gallium/drivers/softpipe/sp_texture.c b/src/gallium/drivers/softpipe/sp_texture.c index e1ea5df24ca..c49bfcaba55 100644 --- a/src/gallium/drivers/softpipe/sp_texture.c +++ b/src/gallium/drivers/softpipe/sp_texture.c @@ -37,6 +37,7 @@ #include "util/u_math.h" #include "util/u_memory.h" #include "util/u_transfer.h" +#include "util/u_surface.h" #include "sp_context.h" #include "sp_flush.h" @@ -127,7 +128,8 @@ softpipe_can_create_resource(struct pipe_screen *screen, */ static boolean softpipe_displaytarget_layout(struct pipe_screen *screen, - struct softpipe_resource *spr) + struct softpipe_resource *spr, + const void *map_front_private) { struct sw_winsys *winsys = softpipe_screen(screen)->winsys; @@ -139,6 +141,7 @@ softpipe_displaytarget_layout(struct pipe_screen *screen, spr->base.width0, spr->base.height0, 64, + map_front_private, &spr->stride[0] ); return spr->dt != NULL; @@ -149,8 +152,9 @@ softpipe_displaytarget_layout(struct pipe_screen *screen, * Create new pipe_resource given the template information. */ static struct pipe_resource * -softpipe_resource_create(struct pipe_screen *screen, - const struct pipe_resource *templat) +softpipe_resource_create_front(struct pipe_screen *screen, + const struct pipe_resource *templat, + const void *map_front_private) { struct softpipe_resource *spr = CALLOC_STRUCT(softpipe_resource); if (!spr) @@ -162,14 +166,14 @@ softpipe_resource_create(struct pipe_screen *screen, pipe_reference_init(&spr->base.reference, 1); spr->base.screen = screen; - spr->pot = (util_is_power_of_two(templat->width0) && - util_is_power_of_two(templat->height0) && - util_is_power_of_two(templat->depth0)); + spr->pot = (util_is_power_of_two_or_zero(templat->width0) && + util_is_power_of_two_or_zero(templat->height0) && + util_is_power_of_two_or_zero(templat->depth0)); if (spr->base.bind & (PIPE_BIND_DISPLAY_TARGET | PIPE_BIND_SCANOUT | PIPE_BIND_SHARED)) { - if (!softpipe_displaytarget_layout(screen, spr)) + if (!softpipe_displaytarget_layout(screen, spr, map_front_private)) goto fail; } else { @@ -184,6 +188,12 @@ softpipe_resource_create(struct pipe_screen *screen, return NULL; } +static struct pipe_resource * +softpipe_resource_create(struct pipe_screen *screen, + const struct pipe_resource *templat) +{ + return softpipe_resource_create_front(screen, templat, NULL); +} static void softpipe_resource_destroy(struct pipe_screen *pscreen, @@ -209,7 +219,8 @@ softpipe_resource_destroy(struct pipe_screen *pscreen, static struct pipe_resource * softpipe_resource_from_handle(struct pipe_screen *screen, const struct pipe_resource *templat, - struct winsys_handle *whandle) + struct winsys_handle *whandle, + unsigned usage) { struct sw_winsys *winsys = softpipe_screen(screen)->winsys; struct softpipe_resource *spr = CALLOC_STRUCT(softpipe_resource); @@ -220,9 +231,9 @@ softpipe_resource_from_handle(struct pipe_screen *screen, pipe_reference_init(&spr->base.reference, 1); spr->base.screen = screen; - spr->pot = (util_is_power_of_two(templat->width0) && - util_is_power_of_two(templat->height0) && - util_is_power_of_two(templat->depth0)); + spr->pot = (util_is_power_of_two_or_zero(templat->width0) && + util_is_power_of_two_or_zero(templat->height0) && + util_is_power_of_two_or_zero(templat->depth0)); spr->dt = winsys->displaytarget_from_handle(winsys, templat, @@ -241,8 +252,10 @@ softpipe_resource_from_handle(struct pipe_screen *screen, static boolean softpipe_resource_get_handle(struct pipe_screen *screen, + struct pipe_context *ctx, struct pipe_resource *pt, - struct winsys_handle *whandle) + struct winsys_handle *whandle, + unsigned usage) { struct sw_winsys *winsys = softpipe_screen(screen)->winsys; struct softpipe_resource *spr = softpipe_resource(pt); @@ -259,9 +272,9 @@ softpipe_resource_get_handle(struct pipe_screen *screen, * Helper function to compute offset (in bytes) for a particular * texture level/face/slice from the start of the buffer. */ -static unsigned -sp_get_tex_image_offset(const struct softpipe_resource *spr, - unsigned level, unsigned layer) +unsigned +softpipe_get_tex_image_offset(const struct softpipe_resource *spr, + unsigned level, unsigned layer) { unsigned offset = spr->level_offset[level]; @@ -411,7 +424,7 @@ softpipe_transfer_map(struct pipe_context *pipe, pt->stride = spr->stride[level]; pt->layer_stride = spr->img_stride[level]; - spt->offset = sp_get_tex_image_offset(spr, level, box->z); + spt->offset = softpipe_get_tex_image_offset(spr, level, box->z); spt->offset += box->y / util_format_get_blockheight(format) * spt->base.stride + @@ -426,7 +439,7 @@ softpipe_transfer_map(struct pipe_context *pipe, map = spr->data; } - if (map == NULL) { + if (!map) { pipe_resource_reference(&pt->resource, NULL); FREE(spt); return NULL; @@ -503,10 +516,12 @@ softpipe_init_texture_funcs(struct pipe_context *pipe) pipe->transfer_unmap = softpipe_transfer_unmap; pipe->transfer_flush_region = u_default_transfer_flush_region; - pipe->transfer_inline_write = u_default_transfer_inline_write; + pipe->buffer_subdata = u_default_buffer_subdata; + pipe->texture_subdata = u_default_texture_subdata; pipe->create_surface = softpipe_create_surface; pipe->surface_destroy = softpipe_surface_destroy; + pipe->clear_texture = util_clear_texture; } @@ -514,6 +529,7 @@ void softpipe_init_screen_texture_funcs(struct pipe_screen *screen) { screen->resource_create = softpipe_resource_create; + screen->resource_create_front = softpipe_resource_create_front; screen->resource_destroy = softpipe_resource_destroy; screen->resource_from_handle = softpipe_resource_from_handle; screen->resource_get_handle = softpipe_resource_get_handle;