diff options
author | Robert Bragg <robert@linux.intel.com> | 2012-10-25 17:09:09 +0100 |
---|---|---|
committer | Robert Bragg <robert@linux.intel.com> | 2012-11-26 23:33:06 +0000 |
commit | a602cae233b16d2ec9ad6fd238b169720467cf75 (patch) | |
tree | 31c0e94ffb5c12eba70d9a69e1cdd8a281106732 | |
parent | 0283423dad59ba3d3e4cde400c29ac8e7803f888 (diff) | |
download | cogl-a602cae233b16d2ec9ad6fd238b169720467cf75.tar.gz |
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>
-rw-r--r-- | 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 de00cb14..0c883f97 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 * |