winsys/amdgpu: cleanup error handling in amdgpu_ctx_create

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
Nicolai Hähnle 2016-05-05 22:08:39 -05:00
parent fef08af99c
commit d464bfd12a

View file

@ -135,14 +135,16 @@ static struct radeon_winsys_ctx *amdgpu_ctx_create(struct radeon_winsys *ws)
struct amdgpu_bo_alloc_request alloc_buffer = {}; struct amdgpu_bo_alloc_request alloc_buffer = {};
amdgpu_bo_handle buf_handle; amdgpu_bo_handle buf_handle;
if (!ctx)
return NULL;
ctx->ws = amdgpu_winsys(ws); ctx->ws = amdgpu_winsys(ws);
ctx->refcount = 1; ctx->refcount = 1;
r = amdgpu_cs_ctx_create(ctx->ws->dev, &ctx->ctx); r = amdgpu_cs_ctx_create(ctx->ws->dev, &ctx->ctx);
if (r) { if (r) {
fprintf(stderr, "amdgpu: amdgpu_cs_ctx_create failed. (%i)\n", r); fprintf(stderr, "amdgpu: amdgpu_cs_ctx_create failed. (%i)\n", r);
FREE(ctx); goto error_create;
return NULL;
} }
alloc_buffer.alloc_size = ctx->ws->info.gart_page_size; alloc_buffer.alloc_size = ctx->ws->info.gart_page_size;
@ -152,24 +154,27 @@ static struct radeon_winsys_ctx *amdgpu_ctx_create(struct radeon_winsys *ws)
r = amdgpu_bo_alloc(ctx->ws->dev, &alloc_buffer, &buf_handle); r = amdgpu_bo_alloc(ctx->ws->dev, &alloc_buffer, &buf_handle);
if (r) { if (r) {
fprintf(stderr, "amdgpu: amdgpu_bo_alloc failed. (%i)\n", r); fprintf(stderr, "amdgpu: amdgpu_bo_alloc failed. (%i)\n", r);
amdgpu_cs_ctx_free(ctx->ctx); goto error_user_fence_alloc;
FREE(ctx);
return NULL;
} }
r = amdgpu_bo_cpu_map(buf_handle, (void**)&ctx->user_fence_cpu_address_base); r = amdgpu_bo_cpu_map(buf_handle, (void**)&ctx->user_fence_cpu_address_base);
if (r) { if (r) {
fprintf(stderr, "amdgpu: amdgpu_bo_cpu_map failed. (%i)\n", r); fprintf(stderr, "amdgpu: amdgpu_bo_cpu_map failed. (%i)\n", r);
amdgpu_bo_free(buf_handle); goto error_user_fence_map;
amdgpu_cs_ctx_free(ctx->ctx);
FREE(ctx);
return NULL;
} }
memset(ctx->user_fence_cpu_address_base, 0, alloc_buffer.alloc_size); memset(ctx->user_fence_cpu_address_base, 0, alloc_buffer.alloc_size);
ctx->user_fence_bo = buf_handle; ctx->user_fence_bo = buf_handle;
return (struct radeon_winsys_ctx*)ctx; return (struct radeon_winsys_ctx*)ctx;
error_user_fence_map:
amdgpu_bo_free(buf_handle);
error_user_fence_alloc:
amdgpu_cs_ctx_free(ctx->ctx);
error_create:
FREE(ctx);
return NULL;
} }
static void amdgpu_ctx_destroy(struct radeon_winsys_ctx *rwctx) static void amdgpu_ctx_destroy(struct radeon_winsys_ctx *rwctx)