X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fllvmpipe%2Flp_scene.c;h=ed998246fb9364e98a6fdb9f09a01d0399b6af85;hb=488dd2c1912132fe7ee5e81b05fb64ba62a46098;hp=54880f2f104dc63747612d5f6c1b297cce2f3a4e;hpb=f25836d7b2c21e046a725cf13c8649d3981693b7;p=mesa.git diff --git a/src/gallium/drivers/llvmpipe/lp_scene.c b/src/gallium/drivers/llvmpipe/lp_scene.c index 54880f2f104..ed998246fb9 100644 --- a/src/gallium/drivers/llvmpipe/lp_scene.c +++ b/src/gallium/drivers/llvmpipe/lp_scene.c @@ -58,7 +58,9 @@ lp_scene_create( struct pipe_context *pipe ) return NULL; scene->pipe = pipe; - scene->data.head = &scene->data.first; + + scene->data.head = + CALLOC_STRUCT(data_block); pipe_mutex_init(scene->mutex); @@ -72,8 +74,10 @@ lp_scene_create( struct pipe_context *pipe ) void lp_scene_destroy(struct lp_scene *scene) { + lp_fence_reference(&scene->fence, NULL); pipe_mutex_destroy(scene->mutex); - assert(scene->data.head == &scene->data.first); + assert(scene->data.head->next == NULL); + FREE(scene->data.head); FREE(scene); } @@ -118,6 +122,7 @@ lp_scene_bin_reset(struct lp_scene *scene, unsigned x, unsigned y) { struct cmd_bin *bin = lp_scene_get_bin(scene, x, y); + bin->last_state = NULL; bin->head = bin->tail; if (bin->tail) { bin->tail->next = NULL; @@ -133,30 +138,30 @@ lp_scene_begin_rasterization(struct lp_scene *scene) int i; //LP_DBG(DEBUG_RAST, "%s\n", __FUNCTION__); - + for (i = 0; i < scene->fb.nr_cbufs; i++) { struct pipe_surface *cbuf = scene->fb.cbufs[i]; + assert(cbuf->u.tex.first_layer == cbuf->u.tex.last_layer); scene->cbufs[i].stride = llvmpipe_resource_stride(cbuf->texture, - cbuf->level); + cbuf->u.tex.level); scene->cbufs[i].map = llvmpipe_resource_map(cbuf->texture, - cbuf->face, - cbuf->level, - cbuf->zslice, + cbuf->u.tex.level, + cbuf->u.tex.first_layer, LP_TEX_USAGE_READ_WRITE, LP_TEX_LAYOUT_LINEAR); } if (fb->zsbuf) { struct pipe_surface *zsbuf = scene->fb.zsbuf; - scene->zsbuf.stride = llvmpipe_resource_stride(zsbuf->texture, zsbuf->level); + assert(zsbuf->u.tex.first_layer == zsbuf->u.tex.last_layer); + scene->zsbuf.stride = llvmpipe_resource_stride(zsbuf->texture, zsbuf->u.tex.level); scene->zsbuf.blocksize = util_format_get_blocksize(zsbuf->texture->format); scene->zsbuf.map = llvmpipe_resource_map(zsbuf->texture, - zsbuf->face, - zsbuf->level, - zsbuf->zslice, + zsbuf->u.tex.level, + zsbuf->u.tex.first_layer, LP_TEX_USAGE_READ_WRITE, LP_TEX_LAYOUT_NONE); } @@ -178,9 +183,8 @@ lp_scene_end_rasterization(struct lp_scene *scene ) if (scene->cbufs[i].map) { struct pipe_surface *cbuf = scene->fb.cbufs[i]; llvmpipe_resource_unmap(cbuf->texture, - cbuf->face, - cbuf->level, - cbuf->zslice); + cbuf->u.tex.level, + cbuf->u.tex.first_layer); scene->cbufs[i].map = NULL; } } @@ -189,9 +193,8 @@ lp_scene_end_rasterization(struct lp_scene *scene ) if (scene->zsbuf.map) { struct pipe_surface *zsbuf = scene->fb.zsbuf; llvmpipe_resource_unmap(zsbuf->texture, - zsbuf->face, - zsbuf->level, - zsbuf->zslice); + zsbuf->u.tex.level, + zsbuf->u.tex.first_layer); scene->zsbuf.map = NULL; } @@ -200,7 +203,9 @@ lp_scene_end_rasterization(struct lp_scene *scene ) for (i = 0; i < scene->tiles_x; i++) { for (j = 0; j < scene->tiles_y; j++) { struct cmd_bin *bin = lp_scene_get_bin(scene, i, j); - bin->head = bin->tail = NULL; + bin->head = NULL; + bin->tail = NULL; + bin->last_state = NULL; } } @@ -220,7 +225,7 @@ lp_scene_end_rasterization(struct lp_scene *scene ) if (LP_DEBUG & DEBUG_SETUP) debug_printf("resource %d: %p %dx%d sz %d\n", j, - ref->resource[i], + (void *) ref->resource[i], ref->resource[i]->width0, ref->resource[i]->height0, llvmpipe_resource_size(ref->resource[i])); @@ -240,14 +245,13 @@ lp_scene_end_rasterization(struct lp_scene *scene ) struct data_block_list *list = &scene->data; struct data_block *block, *tmp; - for (block = list->head; block; block = tmp) { + for (block = list->head->next; block; block = tmp) { tmp = block->next; - if (block != &list->first) - FREE(block); + FREE(block); } - list->head = &list->first; list->head->next = NULL; + list->head->used = 0; } lp_fence_reference(&scene->fence, NULL); @@ -344,6 +348,7 @@ lp_scene_add_resource_reference(struct lp_scene *scene, /* Look at existing resource blocks: */ for (ref = scene->resources; ref; ref = ref->next) { + last = &ref->next; /* Search for this resource: */ @@ -351,27 +356,27 @@ lp_scene_add_resource_reference(struct lp_scene *scene, if (ref->resource[i] == resource) return TRUE; - /* If the block is half-empty, this is the last block. Append - * the reference here. - */ - if (ref->count < RESOURCE_REF_SZ) - goto add_new_ref; - - last = &ref->next; + if (ref->count < RESOURCE_REF_SZ) { + /* If the block is half-empty, then append the reference here. + */ + break; + } } - /* Otherwise, need to create a new block: + /* Create a new block if no half-empty block was found. */ - *last = lp_scene_alloc(scene, sizeof(struct resource_ref)); - if (*last) { + if (!ref) { + assert(*last == NULL); + *last = lp_scene_alloc(scene, sizeof *ref); + if (*last == NULL) + return FALSE; + ref = *last; memset(ref, 0, sizeof *ref); - goto add_new_ref; } - return FALSE; - -add_new_ref: + /* Append the reference to the reference block. + */ pipe_resource_reference(&ref->resource[ref->count++], resource); scene->resource_reference_size += llvmpipe_resource_size(resource); @@ -381,7 +386,7 @@ add_new_ref: * data. */ if (!initializing_scene && - scene->resource_reference_size < LP_SCENE_MAX_RESOURCE_SIZE) + scene->resource_reference_size >= LP_SCENE_MAX_RESOURCE_SIZE) return FALSE; return TRUE;