summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWill Thompson <will@willthompson.co.uk>2012-05-11 16:34:49 +0100
committerWill Thompson <will@willthompson.co.uk>2012-05-11 16:34:49 +0100
commitf368b357a76ef17ebcbd7478847b86767a487a2c (patch)
tree0f8e4284976d7ab0e5770a82ac9fbca504894e97
parenta8d4c8bfc33c10d122645ca1f8a942aa8e4f03b8 (diff)
exa: macro-ize CheckGLError()
This uses GCC statement expressionsโ€ฆ but that doesn't seem so bad. This means the debug messages get useful function and line number information, rather than always coming from CheckGLError. Also, I'll move most of this to -debug.h in a moment.
-rw-r--r--src/videocore-exa.c68
1 files changed, 41 insertions, 27 deletions
diff --git a/src/videocore-exa.c b/src/videocore-exa.c
index 0404792..caa9037 100644
--- a/src/videocore-exa.c
+++ b/src/videocore-exa.c
@@ -58,35 +58,49 @@ pix2scrn(PixmapPtr pPixmap)
return xf86Screens[(pPixmap)->drawable.pScreen->myNum];
}
-static Bool
-CheckGLError(ScrnInfoPtr pScrn, const char *context)
+static const char *
+GetGLErrorString(void)
{
GLenum error_code = glGetError ();
+ static char unknown_error_code[sizeof(GLenum) * 2 + 1];
switch (error_code)
{
case GL_NO_ERROR:
- return TRUE;
- break;
+ return NULL;
case GL_INVALID_ENUM:
- WARNING_MSG("%s: GL_INVALID_ENUM\n", context);
- break;
+ return "GL_INVALID_ENUM";
case GL_INVALID_VALUE:
- WARNING_MSG("%s: GL_INVALID_VALUE\n", context);
- break;
+ return "GL_INVALID_VALUE";
case GL_INVALID_OPERATION:
- WARNING_MSG("%s: GL_INVALID_OPERATION\n", context);
- break;
+ return "GL_INVALID_OPERATION";
case GL_OUT_OF_MEMORY:
- WARNING_MSG("%s: GL_OUT_OF_MEMORY\n", context);
- break;
+ return "GL_OUT_OF_MEMORY";
default:
- WARNING_MSG("%s: unknown error %x\n", context, error_code);
+ snprintf(unknown_error_code, sizeof(unknown_error_code),
+ "%x", error_code);
+ return unknown_error_code;
}
-
- return FALSE;
}
+/**
+ * CheckGLError:
+ * @context: a string giving additional context for the error
+ *
+ * If an error has occurred, evaluates to FALSE and logs a warning naming the
+ * error. If no error has occurred, evaluates to TRUE.
+ *
+ * Since this uses WARNING_MSG, ScrnInfoPtr pScrn must be in scope.
+ */
+#define CheckGLError(context) \
+ ({ \
+ const char *_error = GetGLErrorString(); \
+ if (_error) { \
+ WARNING_MSG("%s: %s\n", context, _error); \
+ } \
+ (_error == NULL); \
+ })
+
Bool
VideoCoreExaGetScreenSize(ScrnInfoPtr pScrn,
uint32_t *width, uint32_t *height)
@@ -140,14 +154,14 @@ InitEGL(ScreenPtr pScreen, VideoCoreExaPtr vcExa)
vcExa->display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
if (vcExa->display == EGL_NO_DISPLAY) {
- CheckGLError(pScrn, "eglGetDisplay returned EGL_NO_DISPLAY");
+ CheckGLError("eglGetDisplay returned EGL_NO_DISPLAY");
return FALSE;
}
DEBUG_MSG("eglInitialize");
if (!eglInitialize(vcExa->display, NULL, NULL)) {
- CheckGLError(pScrn, "eglInitialize failed");
+ CheckGLError("eglInitialize failed");
return FALSE;
}
@@ -157,7 +171,7 @@ InitEGL(ScreenPtr pScreen, VideoCoreExaPtr vcExa)
}
if (!eglChooseConfig(vcExa->display, chooseConfigAttrs, &vcExa->config, 1, &num_config)) {
- CheckGLError(pScrn, "eglChooseConfig failed");
+ CheckGLError("eglChooseConfig failed");
return FALSE;
}
@@ -211,12 +225,12 @@ InitEGL(ScreenPtr pScreen, VideoCoreExaPtr vcExa)
createWindowSurfaceAttrs);
if (vcExa->surf == EGL_NO_SURFACE) {
- CheckGLError(pScrn, "eglCreateWindowSurface failed");
+ CheckGLError("eglCreateWindowSurface failed");
return FALSE;
}
if (!eglMakeCurrent(vcExa->display, vcExa->surf, vcExa->surf, vcExa->ctx)) {
- CheckGLError(pScrn, "eglMakeCurrent failed");
+ CheckGLError("eglMakeCurrent failed");
return FALSE;
}
@@ -284,7 +298,7 @@ AllocateGlobalImage(ScrnInfoPtr pScrn, int width, int height,
global_image);
free(tmp);
- if (!CheckGLError(pScrn, "eglCreateGlobalImageBRCM")) {
+ if (!CheckGLError("eglCreateGlobalImageBRCM")) {
return FALSE;
}
@@ -303,7 +317,7 @@ CreateEGLImage(VideoCoreExaPtr vcExa, ScrnInfoPtr pScrn,
EGL_NATIVE_PIXMAP_KHR,
(EGLClientBuffer) global_image,
NULL);
- return CheckGLError(pScrn, "eglCreateImageKHR");
+ return CheckGLError("eglCreateImageKHR");
}
static Bool
@@ -315,7 +329,7 @@ BindToTexture(VideoCoreExaPtr vcExa, ScrnInfoPtr pScrn, EGLImageKHR egl_image,
vcExa->glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, egl_image);
glBindTexture(GL_TEXTURE_2D, 0);
- return CheckGLError(pScrn, "glEGLImageTargetTexture2DOES");
+ return CheckGLError("glEGLImageTargetTexture2DOES");
}
static void
@@ -523,7 +537,7 @@ VideoCorePrepareAccess(PixmapPtr pPixmap, int index)
}
ReadPixels(pScrn, priv->texture_id, 0, 0, width, height, priv->data, 0 /* FIXME: pitch */);
- if (!CheckGLError(pScrn, "PrepareAccess:ReadPixels")) {
+ if (!CheckGLError("PrepareAccess:ReadPixels")) {
free(priv->data);
priv->data = NULL;
return FALSE;
@@ -575,7 +589,7 @@ VideoCoreFinishAccess(PixmapPtr pPixmap, int index)
free(priv->data);
priv->data = NULL;
- CheckGLError(pScrn, "FinishAccess");
+ CheckGLError("FinishAccess");
}
static Bool
@@ -627,7 +641,7 @@ VideoCoreUploadToScreen(PixmapPtr pDst,
}
CopyToTexture(pScrn, priv->texture_id, x, y, w, h, src, src_pitch);
- return CheckGLError(pScrn, "UploadToScreen");
+ return CheckGLError("UploadToScreen");
}
static Bool
@@ -644,7 +658,7 @@ VideoCoreDownloadFromScreen(PixmapPtr pSrc,
}
ReadPixels(pScrn, priv->texture_id, x, y, w, h, dst, dst_pitch);
- return CheckGLError(pScrn, "DownloadFromScreen");
+ return CheckGLError("DownloadFromScreen");
}
VideoCoreExaPtr