[cogl/wip/cogl-1.14: 79/177] Check for out-of-memory when allocating 3d textures



commit 8b9d3ffd5ecec900b852236133be55b09b4e0986
Author: Robert Bragg <robert linux intel com>
Date:   Thu Oct 25 17:09:09 2012 +0100

    Check for out-of-memory when allocating 3d textures
    
    This makes Cogl explicitly check for out-of-memory errors reported by
    the opengl driver in cogl_texture_3d_new_with_size() calls. This allows
    us to throw a COGL_SYSTEM_ERROR_NO_MEMORY error and return NULL so
    applications may gracefully handle this condition.
    
    This patch only affects the cogl_texture_3d_new_with_size() api not
    _new_from_data() or _new_from_bitmap().
    
    Reviewed-by: Neil Roberts <neil linux intel com>
    
    (cherry picked from commit a602cae233b16d2ec9ad6fd238b169720467cf75)

 cogl/cogl-texture-3d.c |   30 +++++++++++++++++++++---------
 1 files changed, 21 insertions(+), 9 deletions(-)
---
diff --git a/cogl/cogl-texture-3d.c b/cogl/cogl-texture-3d.c
index de00cb1..0c883f9 100644
--- a/cogl/cogl-texture-3d.c
+++ b/cogl/cogl-texture-3d.c
@@ -38,6 +38,7 @@
 #include "cogl-pipeline-private.h"
 #include "cogl-pipeline-opengl-private.h"
 #include "cogl-error-private.h"
+#include "cogl-util-gl-private.h"
 
 #include <string.h>
 #include <math.h>
@@ -137,7 +138,7 @@ _cogl_texture_3d_create_base (CoglContext *ctx,
 
   tex_3d->format = internal_format;
 
-  return tex_3d;
+  return _cogl_texture_3d_object_new (tex_3d);
 }
 
 static CoglBool
@@ -209,10 +210,11 @@ cogl_texture_3d_new_with_size (CoglContext *ctx,
                                CoglPixelFormat internal_format,
                                CoglError **error)
 {
-  CoglTexture3D         *tex_3d;
-  GLenum                 gl_intformat;
-  GLenum                 gl_format;
-  GLenum                 gl_type;
+  CoglTexture3D *tex_3d;
+  GLenum gl_intformat;
+  GLenum gl_format;
+  GLenum gl_type;
+  GLenum gl_error;
 
   /* Since no data, we need some internal format */
   if (internal_format == COGL_PIXEL_FORMAT_ANY)
@@ -239,10 +241,20 @@ cogl_texture_3d_new_with_size (CoglContext *ctx,
   _cogl_bind_gl_texture_transient (GL_TEXTURE_3D,
                                    tex_3d->gl_texture,
                                    FALSE);
-  GE( ctx, glTexImage3D (GL_TEXTURE_3D, 0, gl_intformat,
-                         width, height, depth, 0, gl_format, gl_type, NULL) );
+  /* Clear any GL errors */
+  while ((gl_error = ctx->glGetError ()) != GL_NO_ERROR)
+    ;
 
-  return _cogl_texture_3d_object_new (tex_3d);
+  ctx->glTexImage3D (GL_TEXTURE_3D, 0, gl_intformat,
+                     width, height, depth, 0, gl_format, gl_type, NULL);
+
+  if (_cogl_gl_util_catch_out_of_memory (ctx, error))
+    {
+      cogl_object_unref (tex_3d);
+      return NULL;
+    }
+
+  return tex_3d;
 }
 
 CoglTexture3D *
@@ -327,7 +339,7 @@ cogl_texture_3d_new_from_bitmap (CoglBitmap *bmp,
 
   cogl_object_unref (dst_bmp);
 
-  return _cogl_texture_3d_object_new (tex_3d);
+  return tex_3d;
 }
 
 CoglTexture3D *



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]