mirror of
https://github.com/brl/mutter.git
synced 2024-11-29 03:20:46 -05:00
Check for out-of-memory when allocating 2d textures
This makes Cogl explicitly check for out-of-memory errors reported by the opengl driver in cogl_texture_2d_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_2d_new_with_size() api not _new_from_data() or _new_from_bitmap(). Reviewed-by: Neil Roberts <neil@linux.intel.com> (cherry picked from commit 0283423dad59ba3d3e4cde400c29ac8e7803f888)
This commit is contained in:
parent
4f6fe6f0e2
commit
31d105abd8
@ -159,6 +159,8 @@ cogl_gl_prototypes_h = \
|
||||
$(NULL)
|
||||
|
||||
cogl_driver_sources += \
|
||||
$(srcdir)/driver/gl/cogl-util-gl-private.h \
|
||||
$(srcdir)/driver/gl/cogl-util-gl.c \
|
||||
$(srcdir)/driver/gl/cogl-framebuffer-gl-private.h \
|
||||
$(srcdir)/driver/gl/cogl-framebuffer-gl.c \
|
||||
$(srcdir)/driver/gl/cogl-texture-2d-gl-private.h \
|
||||
|
@ -37,6 +37,7 @@
|
||||
#include "cogl-texture-2d-private.h"
|
||||
#include "cogl-pipeline-opengl-private.h"
|
||||
#include "cogl-error-private.h"
|
||||
#include "cogl-util-gl-private.h"
|
||||
|
||||
void
|
||||
_cogl_texture_2d_gl_free (CoglTexture2D *tex_2d)
|
||||
@ -97,6 +98,7 @@ _cogl_texture_2d_gl_new_with_size (CoglContext *ctx,
|
||||
GLenum gl_intformat;
|
||||
GLenum gl_format;
|
||||
GLenum gl_type;
|
||||
GLenum gl_error;
|
||||
|
||||
internal_format = ctx->driver_vtable->pixel_format_to_gl (ctx,
|
||||
internal_format,
|
||||
@ -113,8 +115,19 @@ _cogl_texture_2d_gl_new_with_size (CoglContext *ctx,
|
||||
_cogl_bind_gl_texture_transient (GL_TEXTURE_2D,
|
||||
tex_2d->gl_texture,
|
||||
tex_2d->is_foreign);
|
||||
GE( ctx, glTexImage2D (GL_TEXTURE_2D, 0, gl_intformat,
|
||||
width, height, 0, gl_format, gl_type, NULL) );
|
||||
|
||||
/* Clear any GL errors */
|
||||
while ((gl_error = ctx->glGetError ()) != GL_NO_ERROR)
|
||||
;
|
||||
|
||||
ctx->glTexImage2D (GL_TEXTURE_2D, 0, gl_intformat,
|
||||
width, height, 0, gl_format, gl_type, NULL);
|
||||
|
||||
if (_cogl_gl_util_catch_out_of_memory (ctx, error))
|
||||
{
|
||||
cogl_object_unref (tex_2d);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return tex_2d;
|
||||
}
|
||||
|
33
cogl/driver/gl/cogl-util-gl-private.h
Normal file
33
cogl/driver/gl/cogl-util-gl-private.h
Normal file
@ -0,0 +1,33 @@
|
||||
/*
|
||||
* Cogl
|
||||
*
|
||||
* An object oriented GL/GLES Abstraction/Utility Layer
|
||||
*
|
||||
* Copyright (C) 2012 Intel Corporation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*
|
||||
* Authors:
|
||||
* Robert Bragg <robert@linux.intel.com>
|
||||
*/
|
||||
|
||||
#ifndef _COGL_UTIL_GL_PRIVATE_H_
|
||||
|
||||
#include "cogl-types.h"
|
||||
|
||||
CoglBool
|
||||
_cogl_gl_util_catch_out_of_memory (CoglContext *ctx, CoglError **error);
|
||||
|
||||
#endif /* _COGL_UTIL_GL_PRIVATE_H_ */
|
66
cogl/driver/gl/cogl-util-gl.c
Normal file
66
cogl/driver/gl/cogl-util-gl.c
Normal file
@ -0,0 +1,66 @@
|
||||
/*
|
||||
* Cogl
|
||||
*
|
||||
* An object oriented GL/GLES Abstraction/Utility Layer
|
||||
*
|
||||
* Copyright (C) 2012 Intel Corporation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*
|
||||
* Authors:
|
||||
* Robert Bragg <robert@linux.intel.com>
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include "cogl-types.h"
|
||||
#include "cogl-context-private.h"
|
||||
#include "cogl-error-private.h"
|
||||
#include "cogl-internal.h"
|
||||
#include "cogl-util-gl-private.h"
|
||||
|
||||
CoglBool
|
||||
_cogl_gl_util_catch_out_of_memory (CoglContext *ctx, CoglError **error)
|
||||
{
|
||||
GLenum gl_error;
|
||||
CoglBool out_of_memory = FALSE;
|
||||
|
||||
while ((gl_error = ctx->glGetError ()) != GL_NO_ERROR)
|
||||
{
|
||||
if (gl_error == GL_OUT_OF_MEMORY)
|
||||
out_of_memory = TRUE;
|
||||
#ifdef COGL_GL_DEBUG
|
||||
else
|
||||
{
|
||||
g_warning ("%s: GL error (%d): %s\n",
|
||||
G_STRLOC,
|
||||
gl_error,
|
||||
_cogl_gl_error_to_string (gl_error));
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
if (out_of_memory)
|
||||
{
|
||||
_cogl_set_error (error, COGL_SYSTEM_ERROR,
|
||||
COGL_SYSTEM_ERROR_NO_MEMORY,
|
||||
"Out of memory");
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
Loading…
Reference in New Issue
Block a user