lpr->num_slices_faces[level] = num_slices;
lpr->layout[level] = alloc_layout_array(num_slices, width, height);
+ if (!lpr->layout[level]) {
+ goto fail;
+ }
}
/* Compute size of next mipmap level */
}
return TRUE;
+
+fail:
+ for (level = 0; level <= pt->last_level; level++) {
+ if (lpr->layout[level]) {
+ FREE(lpr->layout[level]);
+ }
+ }
+
+ return FALSE;
}
lpr->img_stride[0] = 0;
lpr->layout[0] = alloc_layout_array(1, width, height);
- //lpr->layout[0][0] = LP_TEX_LAYOUT_LINEAR;
+ if (!lpr->layout[0]) {
+ return FALSE;
+ }
lpr->dt = winsys->displaytarget_create(winsys,
lpr->base.bind,
struct winsys_handle *whandle)
{
struct sw_winsys *winsys = llvmpipe_screen(screen)->winsys;
- struct llvmpipe_resource *lpr = CALLOC_STRUCT(llvmpipe_resource);
+ struct llvmpipe_resource *lpr;
unsigned width, height, width_t, height_t;
/* XXX Seems like from_handled depth textures doesn't work that well */
- if (!lpr)
- return NULL;
+ lpr = CALLOC_STRUCT(llvmpipe_resource);
+ if (!lpr) {
+ goto no_lpr;
+ }
lpr->base = *template;
pipe_reference_init(&lpr->base.reference, 1);
template,
whandle,
&lpr->row_stride[0]);
- if (!lpr->dt)
- goto fail;
+ if (!lpr->dt) {
+ goto no_dt;
+ }
lpr->layout[0] = alloc_layout_array(1, lpr->base.width0, lpr->base.height0);
+ if (!lpr->layout[0]) {
+ goto no_layout_0;
+ }
- assert(lpr->layout[0]);
assert(lpr->layout[0][0] == LP_TEX_LAYOUT_NONE);
lpr->id = id_counter++;
return &lpr->base;
- fail:
+no_layout_0:
+ winsys->displaytarget_destroy(winsys, lpr->dt);
+no_dt:
FREE(lpr);
+no_lpr:
return NULL;
}
assert(resource);
assert(level <= resource->last_level);
+ if (usage & PIPE_TRANSFER_MAP_PERMANENTLY) {
+ return NULL;
+ }
+
/*
* Transfers, like other pipe operations, must happen in order, so flush the
* context if necessary.
if (!llvmpipe_flush_resource(pipe, resource,
level,
box->depth > 1 ? -1 : box->z,
- 0, /* flush_flags */
read_only,
TRUE, /* cpu_access */
do_not_block,
transfer->box.z);
}
-static unsigned int
+unsigned int
llvmpipe_is_resource_referenced( struct pipe_context *pipe,
struct pipe_resource *presource,
unsigned level, int layer)
struct llvmpipe_context *llvmpipe = llvmpipe_context( pipe );
if (presource->target == PIPE_BUFFER)
- return PIPE_UNREFERENCED;
+ return LP_UNREFERENCED;
return lp_setup_is_resource_referenced(llvmpipe->setup, presource);
}
pipe->transfer_destroy = llvmpipe_transfer_destroy;
pipe->transfer_map = llvmpipe_transfer_map;
pipe->transfer_unmap = llvmpipe_transfer_unmap;
- pipe->is_resource_referenced = llvmpipe_is_resource_referenced;
pipe->transfer_flush_region = u_default_transfer_flush_region;
pipe->transfer_inline_write = u_default_transfer_inline_write;