summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2013-09-26 17:08:28 -0700
committerEric Anholt <eric@anholt.net>2013-10-10 16:34:30 -0700
commitee8983beccfd4690e4cdd9b1d818aa284656ce88 (patch)
treed0eb1d25b111c760b7c98e7928ade46e54450122
parent18a8f31070def704ad65c86166eaadc6e1c3349c (diff)
i965: Clean up error handling for context creation.
The intel_screen.c used to be a dispatch to one of 3 driver functions, but was down to 1, so it was kind of a waste. In addition, it was trying to free all of the data that might have been partially freed in the kernel 3.6 check (which comes after intelInitContext, and thus might have had driverPrivate set and result in intelDestroyContext() doing work on the freed data). By moving the driverPrivate setup earlier, we can use intelDestroyContext() consistently and avoid such problems in the future. v2: Adjust the prototype of brwCreateContext to use the proper enum (fixing a compiler warning in some builds) Reviewed-by: Kenneth Graunke <kenneth@whitecape.org> (v1)
-rw-r--r--src/mesa/drivers/dri/i965/brw_context.c6
-rw-r--r--src/mesa/drivers/dri/i965/brw_context.h2
-rw-r--r--src/mesa/drivers/dri/i965/intel_context.c6
-rw-r--r--src/mesa/drivers/dri/i965/intel_screen.c28
4 files changed, 8 insertions, 34 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c
index 776d221393..c648d30cfa 100644
--- a/src/mesa/drivers/dri/i965/brw_context.c
+++ b/src/mesa/drivers/dri/i965/brw_context.c
@@ -276,7 +276,7 @@ brw_initialize_context_constants(struct brw_context *brw)
}
bool
-brwCreateContext(int api,
+brwCreateContext(gl_api api,
const struct gl_config *mesaVis,
__DRIcontext *driContextPriv,
unsigned major_version,
@@ -311,7 +311,7 @@ brwCreateContext(int api,
mesaVis, driContextPriv,
sharedContextPrivate, &functions,
error)) {
- ralloc_free(brw);
+ intelDestroyContext(driContextPriv);
return false;
}
@@ -332,7 +332,7 @@ brwCreateContext(int api,
if (!brw->hw_ctx) {
fprintf(stderr, "Gen6+ requires Kernel 3.6 or later.\n");
- ralloc_free(brw);
+ intelDestroyContext(driContextPriv);
return false;
}
}
diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h
index fee4e1a773..28ae261a68 100644
--- a/src/mesa/drivers/dri/i965/brw_context.h
+++ b/src/mesa/drivers/dri/i965/brw_context.h
@@ -1410,7 +1410,7 @@ void brwInitVtbl( struct brw_context *brw );
/*======================================================================
* brw_context.c
*/
-bool brwCreateContext(int api,
+bool brwCreateContext(gl_api api,
const struct gl_config *mesaVis,
__DRIcontext *driContextPriv,
unsigned major_version,
diff --git a/src/mesa/drivers/dri/i965/intel_context.c b/src/mesa/drivers/dri/i965/intel_context.c
index 3eb5b8b8dc..850d9a0b0c 100644
--- a/src/mesa/drivers/dri/i965/intel_context.c
+++ b/src/mesa/drivers/dri/i965/intel_context.c
@@ -426,6 +426,9 @@ intelInitContext(struct brw_context *brw,
brw->intelScreen = intelScreen;
brw->bufmgr = intelScreen->bufmgr;
+ driContextPriv->driverPrivate = brw;
+ brw->driContext = driContextPriv;
+
if (!_mesa_initialize_context(&brw->ctx, api, mesaVis, shareCtx,
functions)) {
*dri_ctx_error = __DRI_CTX_ERROR_NO_MEMORY;
@@ -433,9 +436,6 @@ intelInitContext(struct brw_context *brw,
return false;
}
- driContextPriv->driverPrivate = brw;
- brw->driContext = driContextPriv;
-
brw->gen = intelScreen->gen;
const int devID = intelScreen->deviceID;
diff --git a/src/mesa/drivers/dri/i965/intel_screen.c b/src/mesa/drivers/dri/i965/intel_screen.c
index aef3bbf7e7..b6b4275cc0 100644
--- a/src/mesa/drivers/dri/i965/intel_screen.c
+++ b/src/mesa/drivers/dri/i965/intel_screen.c
@@ -984,32 +984,6 @@ intelDestroyBuffer(__DRIdrawable * driDrawPriv)
_mesa_reference_framebuffer(&fb, NULL);
}
-static GLboolean
-intelCreateContext(gl_api api,
- const struct gl_config * mesaVis,
- __DRIcontext * driContextPriv,
- unsigned major_version,
- unsigned minor_version,
- uint32_t flags,
- unsigned *error,
- void *sharedContextPrivate)
-{
- bool success = false;
-
- success = brwCreateContext(api, mesaVis,
- driContextPriv,
- major_version, minor_version, flags,
- error, sharedContextPrivate);
-
- if (success)
- return true;
-
- if (driContextPriv->driverPrivate != NULL)
- intelDestroyContext(driContextPriv);
-
- return false;
-}
-
static bool
intel_init_bufmgr(struct intel_screen *intelScreen)
{
@@ -1371,7 +1345,7 @@ intelReleaseBuffer(__DRIscreen *screen, __DRIbuffer *buffer)
const struct __DriverAPIRec driDriverAPI = {
.InitScreen = intelInitScreen2,
.DestroyScreen = intelDestroyScreen,
- .CreateContext = intelCreateContext,
+ .CreateContext = brwCreateContext,
.DestroyContext = intelDestroyContext,
.CreateBuffer = intelCreateBuffer,
.DestroyBuffer = intelDestroyBuffer,