summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/vc4/vc4_resource.c
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2015-11-06 11:07:25 -0800
committerEric Anholt <[email protected]>2015-11-09 19:17:36 -0800
commiteb8fb0064dbde7a363c2f99466a51b346b09a029 (patch)
treea3eea902bf49f8e932c6f946f69e6dec8c231712 /src/gallium/drivers/vc4/vc4_resource.c
parent84608e07e7f45b14a77e4f771484f0091a6e7c14 (diff)
vc4: Return GL_OUT_OF_MEMORY when buffer allocation fails.
I was afraid our callers weren't prepared for this, but it looks like at least for resource creation, mesa/st throws an error appropriately. Cc: "11.0" <[email protected]>
Diffstat (limited to 'src/gallium/drivers/vc4/vc4_resource.c')
-rw-r--r--src/gallium/drivers/vc4/vc4_resource.c46
1 files changed, 29 insertions, 17 deletions
diff --git a/src/gallium/drivers/vc4/vc4_resource.c b/src/gallium/drivers/vc4/vc4_resource.c
index 146929637ec..bb723845531 100644
--- a/src/gallium/drivers/vc4/vc4_resource.c
+++ b/src/gallium/drivers/vc4/vc4_resource.c
@@ -35,11 +35,12 @@
static bool miptree_debug = false;
-static void
+static bool
vc4_resource_bo_alloc(struct vc4_resource *rsc)
{
struct pipe_resource *prsc = &rsc->base.b;
struct pipe_screen *pscreen = prsc->screen;
+ struct vc4_bo *bo;
if (miptree_debug) {
fprintf(stderr, "alloc %p: size %d + offset %d -> %d\n",
@@ -51,12 +52,18 @@ vc4_resource_bo_alloc(struct vc4_resource *rsc)
rsc->cube_map_stride * (prsc->array_size - 1));
}
- vc4_bo_unreference(&rsc->bo);
- rsc->bo = vc4_bo_alloc(vc4_screen(pscreen),
- rsc->slices[0].offset +
- rsc->slices[0].size +
- rsc->cube_map_stride * (prsc->array_size - 1),
- "resource");
+ bo = vc4_bo_alloc(vc4_screen(pscreen),
+ rsc->slices[0].offset +
+ rsc->slices[0].size +
+ rsc->cube_map_stride * (prsc->array_size - 1),
+ "resource");
+ if (bo) {
+ vc4_bo_unreference(&rsc->bo);
+ rsc->bo = bo;
+ return true;
+ } else {
+ return false;
+ }
}
static void
@@ -101,21 +108,27 @@ vc4_resource_transfer_map(struct pipe_context *pctx,
char *buf;
if (usage & PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE) {
- vc4_resource_bo_alloc(rsc);
+ if (vc4_resource_bo_alloc(rsc)) {
- /* If it might be bound as one of our vertex buffers, make
- * sure we re-emit vertex buffer state.
- */
- if (prsc->bind & PIPE_BIND_VERTEX_BUFFER)
- vc4->dirty |= VC4_DIRTY_VTXBUF;
+ /* If it might be bound as one of our vertex buffers,
+ * make sure we re-emit vertex buffer state.
+ */
+ if (prsc->bind & PIPE_BIND_VERTEX_BUFFER)
+ vc4->dirty |= VC4_DIRTY_VTXBUF;
+ } else {
+ /* If we failed to reallocate, flush everything so
+ * that we don't violate any syncing requirements.
+ */
+ vc4_flush(pctx);
+ }
} else if (!(usage & PIPE_TRANSFER_UNSYNCHRONIZED)) {
if (vc4_cl_references_bo(pctx, rsc->bo)) {
if ((usage & PIPE_TRANSFER_DISCARD_RANGE) &&
prsc->last_level == 0 &&
prsc->width0 == box->width &&
prsc->height0 == box->height &&
- prsc->depth0 == box->depth) {
- vc4_resource_bo_alloc(rsc);
+ prsc->depth0 == box->depth &&
+ vc4_resource_bo_alloc(rsc)) {
if (prsc->bind & PIPE_BIND_VERTEX_BUFFER)
vc4->dirty |= VC4_DIRTY_VTXBUF;
} else {
@@ -389,8 +402,7 @@ vc4_resource_create(struct pipe_screen *pscreen,
rsc->vc4_format = get_resource_texture_format(prsc);
vc4_setup_slices(rsc);
- vc4_resource_bo_alloc(rsc);
- if (!rsc->bo)
+ if (!vc4_resource_bo_alloc(rsc))
goto fail;
return prsc;