summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Bragg <robert@linux.intel.com>2012-09-01 02:13:32 +0100
committerRobert Bragg <robert@linux.intel.com>2012-09-17 23:06:20 +0100
commit66169276f4537f40f7111fe48b06a8673b7a2d9e (patch)
tree7f3ac317bce1efb96d831e1a473356edb4746315
parenta676f700a3f5f7a96d60ea5a52804d6cc55a7367 (diff)
downloadcogl-66169276f4537f40f7111fe48b06a8673b7a2d9e.tar.gz
texture-2d: improve new_from_foreign error handling
There were lots of places where cogl_texture_2d_new_from_foreign would simply return NULL without returning a corresponding error. We now return an error wherever we are returning NULL except in cases where the user provided invalid data. Reviewed-by: Neil Roberts <neil@linux.intel.com> (cherry picked from commit a1efc9405a13ac8aaf692c5f631a3b8f95d2f259)
-rw-r--r--cogl/cogl-texture-2d.c52
1 files changed, 38 insertions, 14 deletions
diff --git a/cogl/cogl-texture-2d.c b/cogl/cogl-texture-2d.c
index 8ea4c75f..c5a8dd04 100644
--- a/cogl/cogl-texture-2d.c
+++ b/cogl/cogl-texture-2d.c
@@ -343,7 +343,7 @@ cogl_texture_2d_new_from_data (CoglContext *ctx,
CoglTexture2D *
cogl_texture_2d_new_from_foreign (CoglContext *ctx,
- GLuint gl_handle,
+ unsigned int gl_handle,
int width,
int height,
CoglPixelFormat format,
@@ -353,17 +353,24 @@ cogl_texture_2d_new_from_foreign (CoglContext *ctx,
* in GLES, hence such a function prototype.
*/
- GLenum gl_error = 0;
- GLint gl_compressed = GL_FALSE;
- GLenum gl_int_format = 0;
+ GLenum gl_error = 0;
+ GLint gl_compressed = GL_FALSE;
+ GLenum gl_int_format = 0;
CoglTexture2D *tex_2d;
+ /* Assert it is a valid GL texture object */
+ g_return_val_if_fail (ctx->glIsTexture (gl_handle), NULL);
+
if (!ctx->texture_driver->allows_foreign_gl_target (ctx, GL_TEXTURE_2D))
- return NULL;
+ {
+ g_set_error (error,
+ COGL_ERROR,
+ COGL_ERROR_UNSUPPORTED,
+ "Foreign GL_TEXTURE_2D textures are not "
+ "supported by your system");
+ return NULL;
+ }
- /* Make sure it is a valid GL texture object */
- if (!ctx->glIsTexture (gl_handle))
- return NULL;
/* Make sure binding succeeds */
while ((gl_error = ctx->glGetError ()) != GL_NO_ERROR)
@@ -371,7 +378,13 @@ cogl_texture_2d_new_from_foreign (CoglContext *ctx,
_cogl_bind_gl_texture_transient (GL_TEXTURE_2D, gl_handle, TRUE);
if (ctx->glGetError () != GL_NO_ERROR)
- return NULL;
+ {
+ g_set_error (error,
+ COGL_ERROR,
+ COGL_ERROR_UNSUPPORTED,
+ "Failed to bind foreign GL_TEXTURE_2D texture");
+ return NULL;
+ }
/* Obtain texture parameters
(only level 0 we are interested in) */
@@ -398,7 +411,13 @@ cogl_texture_2d_new_from_foreign (CoglContext *ctx,
if (!ctx->driver_vtable->pixel_format_from_gl_internal (ctx,
gl_int_format,
&format))
- return NULL;
+ {
+ g_set_error (error,
+ COGL_ERROR,
+ COGL_ERROR_UNSUPPORTED,
+ "Unsupported internal format for foreign texture");
+ return NULL;
+ }
}
else
#endif
@@ -420,18 +439,23 @@ cogl_texture_2d_new_from_foreign (CoglContext *ctx,
*/
/* Validate width and height */
- if (width <= 0 || height <= 0)
- return NULL;
+ g_return_val_if_fail (width > 0 && height > 0, NULL);
/* Compressed texture images not supported */
if (gl_compressed == GL_TRUE)
- return NULL;
+ {
+ g_set_error (error,
+ COGL_ERROR,
+ COGL_ERROR_UNSUPPORTED,
+ "Compressed foreign textures aren't currently supported");
+ return NULL;
+ }
/* Note: previously this code would query the texture object for
whether it has GL_GENERATE_MIPMAP enabled to determine whether to
auto-generate the mipmap. This doesn't make much sense any more
since Cogl switch to using glGenerateMipmap. Ideally I think
- cogl_texture_new_from_foreign should take a flags parameter so
+ cogl_texture_2d_new_from_foreign should take a flags parameter so
that the application can decide whether it wants
auto-mipmapping. To be compatible with existing code, Cogl now
disables its own auto-mipmapping but leaves the value of