trans->offset = box->x % screen->info.props.limits.minMemoryMapAlignment;
trans->staging_res = pipe_buffer_create(&screen->base, PIPE_BIND_LINEAR, PIPE_USAGE_STAGING, box->width + trans->offset);
if (!trans->staging_res)
- return NULL;
+ goto fail;
struct zink_resource *staging_res = zink_resource(trans->staging_res);
zink_copy_buffer(ctx, NULL, staging_res, res, trans->offset, box->x, box->width);
res = staging_res;
}
ptr = map_resource(screen, res);
if (!ptr)
- return NULL;
+ goto fail;
ptr = ((uint8_t *)ptr) + box->x;
}
VkMappedMemoryRange range = zink_resource_init_mem_range(screen, res->obj, offset, size);
if (vkInvalidateMappedMemoryRanges(screen->dev, 1, &range) != VK_SUCCESS) {
zink_bo_unmap(screen, res->obj->bo);
- return NULL;
+ goto fail;
}
}
trans->base.b.usage = usage;
success:
*transfer = &trans->base.b;
return ptr;
+
+fail:
+ destroy_transfer(ctx, trans);
+ return NULL;
}
static void *
trans->staging_res = zink_resource_create(pctx->screen, &templ);
if (!trans->staging_res)
- return NULL;
+ goto fail;
struct zink_resource *staging_res = zink_resource(trans->staging_res);
}
ptr = map_resource(screen, staging_res);
- if (!ptr)
- return NULL;
} else {
assert(!res->optimal_tiling);
ptr = map_resource(screen, res);
if (!ptr)
- return NULL;
+ goto fail;
if (zink_resource_has_usage(res)) {
if (usage & PIPE_MAP_WRITE)
zink_fence_wait(pctx);
}
ptr = ((uint8_t *)ptr) + offset;
}
+ if (!ptr)
+ goto fail;
+
if (sizeof(void*) == 4)
trans->base.b.usage |= ZINK_MAP_TEMPORARY;
if ((usage & PIPE_MAP_PERSISTENT) && !(usage & PIPE_MAP_COHERENT))
*transfer = &trans->base.b;
return ptr;
+
+fail:
+ destroy_transfer(ctx, trans);
+ return NULL;
}
static void