diff --git a/src/output_context.c b/src/output_context.c
index 9949cb8..5153072 100644
--- a/src/output_context.c
+++ b/src/output_context.c
@@ -369,6 +369,48 @@ int kmscon_context_new(struct kmscon_context **out, void *gbm)
 
 	memset(ctx, 0, sizeof(*ctx));
 
+	ctx->display = eglGetDisplay((EGLNativeDisplayType) gbm);
+	if (!ctx->display) {
+		log_warning("context: cannot get EGL display\n");
+		ret = -EFAULT;
+		goto err_free;
+	}
+
+	ret = eglInitialize(ctx->display, &major, &minor);
+	if (!ret) {
+		log_warning("context: cannot initialize EGL display\n");
+		ret = -EFAULT;
+		goto err_free;
+	}
+
+	ext = eglQueryString(ctx->display, EGL_EXTENSIONS);
+	if (!ext || !strstr(ext, "EGL_KHR_surfaceless_opengl")) {
+		log_warning("context: surfaceless EGL not supported\n");
+		ret = -ENOTSUP;
+		goto err_display;
+	}
+
+	if (!eglBindAPI(EGL_OPENGL_API)) {
+		log_warning("context: cannot bind EGL OpenGL API\n");
+		ret = -EFAULT;
+		goto err_display;
+	}
+
+	ctx->context = eglCreateContext(ctx->display, NULL, EGL_NO_CONTEXT,
+									NULL);
+	if (!ctx->context) {
+		log_warning("context: cannot create EGL context\n");
+		ret = -EFAULT;
+		goto err_display;
+	}
+
+	if (!eglMakeCurrent(ctx->display, EGL_NO_SURFACE, EGL_NO_SURFACE,
+							ctx->context)) {
+		log_warning("context: cannot use EGL context\n");
+		ret = -EFAULT;
+		goto err_ctx;
+	}
+
 	ctx->proc_rbuf_storage = (void*)
 		eglGetProcAddress("glEGLImageTargetRenderbufferStorageOES");
 	ctx->proc_create_image =
@@ -438,7 +480,7 @@ int kmscon_context_new(struct kmscon_context **out, void *gbm)
 						!ctx->proc_destroy_image) {
 		log_warning("context: KHR images not supported\n");
 		ret = -ENOTSUP;
-		goto err_free;
+		goto err_ctx;
 	} else if (!ctx->proc_gen_renderbuffers ||
 			!ctx->proc_bind_renderbuffer ||
 			!ctx->proc_delete_renderbuffers ||
@@ -446,7 +488,7 @@ int kmscon_context_new(struct kmscon_context **out, void *gbm)
 			!ctx->proc_check_framebuffer_status) {
 		log_warning("context: renderbuffers not supported\n");
 		ret = -ENOTSUP;
-		goto err_free;
+		goto err_ctx;
 	} else if (!ctx->proc_create_shader ||
 			!ctx->proc_delete_shader ||
 			!ctx->proc_shader_source ||
@@ -455,7 +497,7 @@ int kmscon_context_new(struct kmscon_context **out, void *gbm)
 			!ctx->proc_get_shader_info_log) {
 		log_warning("context: shaders not supported\n");
 		ret = -ENOTSUP;
-		goto err_free;
+		goto err_ctx;
 	} else if (!ctx->proc_create_program ||
 			!ctx->proc_delete_program ||
 			!ctx->proc_use_program ||
@@ -472,48 +514,6 @@ int kmscon_context_new(struct kmscon_context **out, void *gbm)
 			!ctx->proc_draw_arrays) {
 		log_warning("context: shaders not supported\n");
 		ret = -ENOTSUP;
-		goto err_free;
-	}
-
-	ctx->display = eglGetDisplay((EGLNativeDisplayType) gbm);
-	if (!ctx->display) {
-		log_warning("context: cannot get EGL display\n");
-		ret = -EFAULT;
-		goto err_free;
-	}
-
-	ret = eglInitialize(ctx->display, &major, &minor);
-	if (!ret) {
-		log_warning("context: cannot initialize EGL display\n");
-		ret = -EFAULT;
-		goto err_free;
-	}
-
-	ext = eglQueryString(ctx->display, EGL_EXTENSIONS);
-	if (!ext || !strstr(ext, "EGL_KHR_surfaceless_opengl")) {
-		log_warning("context: surfaceless EGL not supported\n");
-		ret = -ENOTSUP;
-		goto err_display;
-	}
-
-	if (!eglBindAPI(EGL_OPENGL_API)) {
-		log_warning("context: cannot bind EGL OpenGL API\n");
-		ret = -EFAULT;
-		goto err_display;
-	}
-
-	ctx->context = eglCreateContext(ctx->display, NULL, EGL_NO_CONTEXT,
-									NULL);
-	if (!ctx->context) {
-		log_warning("context: cannot create EGL context\n");
-		ret = -EFAULT;
-		goto err_display;
-	}
-
-	if (!eglMakeCurrent(ctx->display, EGL_NO_SURFACE, EGL_NO_SURFACE,
-							ctx->context)) {
-		log_warning("context: cannot use EGL context\n");
-		ret = -EFAULT;
 		goto err_ctx;
 	}