1
0
Fork 0

Fix handling of binding errors when uploading a full texture

Both the texture drivers weren't handling errors correctly when a
CoglPixelBuffer was used to set the contents of an entire texture.
This was causing it to hit an assertion failure in the pixel buffer
tests.

Reviewed-by: Robert Bragg <robert@linux.intel.com>

(cherry picked from commit 888733d3c3b24080d2f136cedb3876a41312e4cf)
This commit is contained in:
Neil Roberts 2012-11-27 20:07:47 +00:00 committed by Robert Bragg
parent c72ede0560
commit 6bcfc8342a
4 changed files with 29 additions and 9 deletions

View file

@ -307,10 +307,21 @@ _cogl_texture_driver_upload_to_gl (CoglContext *ctx,
int bpp = _cogl_pixel_format_get_bytes_per_pixel (source_format); int bpp = _cogl_pixel_format_get_bytes_per_pixel (source_format);
GLenum gl_error; GLenum gl_error;
CoglBool status = TRUE; CoglBool status = TRUE;
CoglError *internal_error = NULL;
data = _cogl_bitmap_gl_bind (source_bmp, COGL_BUFFER_ACCESS_READ, 0, error); data = _cogl_bitmap_gl_bind (source_bmp,
if (!data) COGL_BUFFER_ACCESS_READ,
return FALSE; 0, /* hints */
&internal_error);
/* NB: _cogl_bitmap_gl_bind() may return NULL when successful so we
* have to explicitly check the cogl error pointer to catch
* problems... */
if (internal_error)
{
_cogl_propagate_error (error, internal_error);
return FALSE;
}
/* Setup gl alignment to match rowstride and top-left corner */ /* Setup gl alignment to match rowstride and top-left corner */
prep_gl_for_pixels_upload_full (ctx, prep_gl_for_pixels_upload_full (ctx,

View file

@ -350,6 +350,7 @@ _cogl_texture_driver_upload_to_gl (CoglContext *ctx,
CoglBitmap *bmp; CoglBitmap *bmp;
uint8_t *data; uint8_t *data;
GLenum gl_error; GLenum gl_error;
CoglError *internal_error = NULL;
CoglBool status = TRUE; CoglBool status = TRUE;
bmp = prepare_bitmap_alignment_for_upload (ctx, source_bmp, error); bmp = prepare_bitmap_alignment_for_upload (ctx, source_bmp, error);
@ -363,10 +364,18 @@ _cogl_texture_driver_upload_to_gl (CoglContext *ctx,
_cogl_bind_gl_texture_transient (gl_target, gl_handle, is_foreign); _cogl_bind_gl_texture_transient (gl_target, gl_handle, is_foreign);
data = _cogl_bitmap_gl_bind (bmp, COGL_BUFFER_ACCESS_READ, 0, error); data = _cogl_bitmap_gl_bind (bmp,
if (!data) COGL_BUFFER_ACCESS_READ,
0, /* hints */
&internal_error);
/* NB: _cogl_bitmap_gl_bind() may return NULL when successful so we
* have to explicitly check the cogl error pointer to catch
* problems... */
if (internal_error)
{ {
cogl_object_unref (bmp); cogl_object_unref (bmp);
_cogl_propagate_error (error, internal_error);
return FALSE; return FALSE;
} }

View file

@ -68,8 +68,8 @@ main (int argc, char **argv)
UNPORTED_TEST (test_multitexture); UNPORTED_TEST (test_multitexture);
UNPORTED_TEST (test_texture_mipmaps); UNPORTED_TEST (test_texture_mipmaps);
ADD_TEST (test_sub_texture, 0, 0); ADD_TEST (test_sub_texture, 0, 0);
ADD_TEST (test_pixel_buffer_map, 0, TEST_KNOWN_FAILURE); ADD_TEST (test_pixel_buffer_map, 0, 0);
ADD_TEST (test_pixel_buffer_set_data, 0, TEST_KNOWN_FAILURE); ADD_TEST (test_pixel_buffer_set_data, 0, 0);
ADD_TEST (test_pixel_buffer_sub_region, 0, 0); ADD_TEST (test_pixel_buffer_sub_region, 0, 0);
UNPORTED_TEST (test_texture_rectangle); UNPORTED_TEST (test_texture_rectangle);
ADD_TEST (test_texture_3d, TEST_REQUIREMENT_TEXTURE_3D, 0); ADD_TEST (test_texture_3d, TEST_REQUIREMENT_TEXTURE_3D, 0);

View file

@ -247,8 +247,8 @@ test_pixel_buffer_sub_region (void)
BITMAP_SIZE / 2, /* src_y */ BITMAP_SIZE / 2, /* src_y */
BITMAP_SIZE / 2, /* dst_x */ BITMAP_SIZE / 2, /* dst_x */
0, /* dst_y */ 0, /* dst_y */
BITMAP_SIZE / 2, /* dst_width */ BITMAP_SIZE / 2, /* width */
BITMAP_SIZE / 2, /* dst_height */ BITMAP_SIZE / 2, /* height */
bitmap); bitmap);
pipeline = create_pipeline_from_texture (texture); pipeline = create_pipeline_from_texture (texture);