Mesa (9.1): mesa: handle missing read buffer in _mesa_get_color_read_format /type()

Ian Romanick idr at kemper.freedesktop.org
Wed Jun 26 17:58:38 UTC 2013


Module: Mesa
Branch: 9.1
Commit: 8d9372bdbee35dcbb78af23618acbe21e8a19ec4
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=8d9372bdbee35dcbb78af23618acbe21e8a19ec4

Author: Brian Paul <brianp at vmware.com>
Date:   Sun Jun  2 18:07:55 2013 -0600

mesa: handle missing read buffer in _mesa_get_color_read_format/type()

We were crashing when GL_READ_BUFFER == GL_NONE.  Check for NULL
pointers and reorganize the code.  The spec doesn't say which error
to generate in this situation, but NVIDIA raises GL_INVALID_OPERATION.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=65173
NOTE: This is a candidate for the stable branches.

Tested-by: Vedran Rodic <vrodic at gmail.com>
Reviewed-by: José Fonseca <jfonseca at vmware.com>
(cherry picked from commit e20a2df4017ab10dd7199936948c6ac809bfacb6)

---

 src/mesa/main/framebuffer.c |   78 ++++++++++++++++++++++++++----------------
 1 files changed, 48 insertions(+), 30 deletions(-)

diff --git a/src/mesa/main/framebuffer.c b/src/mesa/main/framebuffer.c
index d3abc2b..a6d9f0b 100644
--- a/src/mesa/main/framebuffer.c
+++ b/src/mesa/main/framebuffer.c
@@ -871,18 +871,29 @@ _mesa_dest_buffer_exists(struct gl_context *ctx, GLenum format)
 GLenum
 _mesa_get_color_read_format(struct gl_context *ctx)
 {
-   const GLenum data_type = _mesa_get_format_datatype(
-                               ctx->ReadBuffer->_ColorReadBuffer->Format);
-
-   switch (ctx->ReadBuffer->_ColorReadBuffer->Format) {
-   case MESA_FORMAT_ARGB8888:
-      return GL_BGRA;
-   case MESA_FORMAT_RGB565:
-      return GL_BGR;
-   default:
-      if (data_type == GL_UNSIGNED_INT || data_type == GL_INT) {
+   if (!ctx->ReadBuffer || !ctx->ReadBuffer->_ColorReadBuffer) {
+      /* The spec is unclear how to handle this case, but NVIDIA's
+       * driver generates GL_INVALID_OPERATION.
+       */
+      _mesa_error(ctx, GL_INVALID_OPERATION,
+                  "glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_FORMAT: "
+                  "no GL_READ_BUFFER)");
+      return GL_NONE;
+   }
+   else {
+      const GLenum format = ctx->ReadBuffer->_ColorReadBuffer->Format;
+      const GLenum data_type = _mesa_get_format_datatype(format);
+
+      if (format == MESA_FORMAT_ARGB8888)
+         return GL_BGRA;
+      else if (format == MESA_FORMAT_RGB565)
+         return GL_BGR;
+
+      switch (data_type) {
+      case GL_UNSIGNED_INT:
+      case GL_INT:
          return GL_RGBA_INTEGER;
-      } else {
+      default:
          return GL_RGBA;
       }
    }
@@ -895,26 +906,33 @@ _mesa_get_color_read_format(struct gl_context *ctx)
 GLenum
 _mesa_get_color_read_type(struct gl_context *ctx)
 {
-   const GLenum data_type = _mesa_get_format_datatype(
-                               ctx->ReadBuffer->_ColorReadBuffer->Format);
-
-   switch (ctx->ReadBuffer->_ColorReadBuffer->Format) {
-   case MESA_FORMAT_RGB565:
-      return GL_UNSIGNED_SHORT_5_6_5_REV;
-   default:
-      break;
+   if (!ctx->ReadBuffer || !ctx->ReadBuffer->_ColorReadBuffer) {
+      /* The spec is unclear how to handle this case, but NVIDIA's
+       * driver generates GL_INVALID_OPERATION.
+       */
+      _mesa_error(ctx, GL_INVALID_OPERATION,
+                  "glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_TYPE: "
+                  "no GL_READ_BUFFER)");
+      return GL_NONE;
    }
-
-   switch (data_type) {
-   case GL_SIGNED_NORMALIZED:
-      return GL_BYTE;
-   case GL_UNSIGNED_INT:
-   case GL_INT:
-   case GL_FLOAT:
-      return data_type;
-   case GL_UNSIGNED_NORMALIZED:
-   default:
-      return GL_UNSIGNED_BYTE;
+   else {
+      const GLenum format = ctx->ReadBuffer->_ColorReadBuffer->Format;
+      const GLenum data_type = _mesa_get_format_datatype(format);
+
+      if (format == MESA_FORMAT_RGB565)
+         return GL_UNSIGNED_SHORT_5_6_5_REV;
+
+      switch (data_type) {
+      case GL_SIGNED_NORMALIZED:
+         return GL_BYTE;
+      case GL_UNSIGNED_INT:
+      case GL_INT:
+      case GL_FLOAT:
+         return data_type;
+      case GL_UNSIGNED_NORMALIZED:
+      default:
+         return GL_UNSIGNED_BYTE;
+      }
    }
 }
 




More information about the mesa-commit mailing list