From: <tj...@us...> - 2010-07-29 11:04:46
|
Revision: 13526 http://alleg.svn.sourceforge.net/alleg/?rev=13526&view=rev Author: tjaden Date: 2010-07-29 11:04:37 +0000 (Thu, 29 Jul 2010) Log Message: ----------- Don't allocate memory buffers for video bitmaps when using OpenGL. Except iPhone & Wiz ports, which still require the memory buffer. Modified Paths: -------------- allegro/branches/4.9/src/bitmap.c allegro/branches/4.9/src/opengl/ogl_bitmap.c allegro/branches/4.9/src/opengl/ogl_display.c allegro/branches/4.9/src/win/d3d_disp.cpp Modified: allegro/branches/4.9/src/bitmap.c =================================================================== --- allegro/branches/4.9/src/bitmap.c 2010-07-28 16:55:55 UTC (rev 13525) +++ allegro/branches/4.9/src/bitmap.c 2010-07-29 11:04:37 UTC (rev 13526) @@ -117,14 +117,9 @@ ASSERT(bitmap->pitch >= w * al_get_pixel_size(bitmap->format)); - /* If the true height is greater than bitmap->h then the display driver - * should allocate the memory itself. + /* The display driver should have set the bitmap->memory field if + * appropriate; video bitmaps may leave it NULL. */ - if (!bitmap->memory) { - size_t bytes = bitmap->pitch * h; - bitmap->memory = al_malloc(bytes); - //memset(bitmap->memory, 0, bytes); - } if (!bitmap->vt->upload_bitmap(bitmap)) { al_destroy_bitmap(bitmap); @@ -411,6 +406,7 @@ if (f < 0) { return NULL; } + ASSERT(bitmap->memory); if (format == ALLEGRO_PIXEL_FORMAT_ANY || bitmap->format == format || f == bitmap->format) { bitmap->locked_region.data = bitmap->memory + bitmap->pitch * y + x * al_get_pixel_size(bitmap->format); @@ -838,6 +834,8 @@ void *dst, int dst_format, int dst_pitch, int sx, int sy, int dx, int dy, int width, int height) { + ASSERT(src); + ASSERT(dst); ASSERT(_al_pixel_format_is_real(dst_format)); /* Use memcpy if no conversion is needed. */ Modified: allegro/branches/4.9/src/opengl/ogl_bitmap.c =================================================================== --- allegro/branches/4.9/src/opengl/ogl_bitmap.c 2010-07-28 16:55:55 UTC (rev 13525) +++ allegro/branches/4.9/src/opengl/ogl_bitmap.c 2010-07-29 11:04:37 UTC (rev 13526) @@ -556,10 +556,22 @@ ogl_bitmap->texture, error_string(e)); } - - glTexImage2D(GL_TEXTURE_2D, 0, glformats[bitmap->format][0], - ogl_bitmap->true_w, ogl_bitmap->true_h, 0, glformats[bitmap->format][2], - glformats[bitmap->format][1], bitmap->memory); + if (bitmap->memory == NULL) { + /* Ideally we could just call glTexImage2D with a NULL data parameter. + * However if we do that, without NPOT textures, we get some junk at the + * edges of our bitmaps when we draw them. + */ + unsigned char *buf = al_calloc(ogl_bitmap->true_h, ogl_bitmap->true_w); + glTexImage2D(GL_TEXTURE_2D, 0, glformats[bitmap->format][0], + ogl_bitmap->true_w, ogl_bitmap->true_h, 0, + GL_ALPHA, GL_UNSIGNED_BYTE, buf); + al_free(buf); + } + else { + glTexImage2D(GL_TEXTURE_2D, 0, glformats[bitmap->format][0], + ogl_bitmap->true_w, ogl_bitmap->true_h, 0, glformats[bitmap->format][2], + glformats[bitmap->format][1], bitmap->memory); + } e = glGetError(); if (e) { ALLEGRO_ERROR("glTexImage2D for format %s, size %dx%d failed (%s)\n", @@ -572,8 +584,8 @@ // the problem try to use multiple textures? return false; } - - if (!cfg_read) { + + if (!cfg_read) { ALLEGRO_SYSTEM *sys; const char *s; @@ -1010,7 +1022,6 @@ int true_w; int true_h; int pitch; - size_t bytes; (void)d; ALLEGRO_DEBUG("Creating OpenGL bitmap\n"); @@ -1062,21 +1073,30 @@ bitmap->bitmap.ct = 0; bitmap->bitmap.cr_excl = w; bitmap->bitmap.cb_excl = h; - al_identity_transform(&bitmap->bitmap.transform); // XXX back and front buffers should share a transform + /* Back and front buffers should share a transform, which they do + * because our OpenGL driver returns the same pointer for both. + */ + al_identity_transform(&bitmap->bitmap.transform); bitmap->true_w = true_w; bitmap->true_h = true_h; - bytes = pitch * true_h; - bitmap->bitmap.memory = al_malloc(bytes); - - /* We never allow un-initialized memory for OpenGL bitmaps, if it - * is uploaded to a floating point texture it can lead to Inf and - * NaN values which break all subsequent blending. - */ - // FIXME!~ - memset(bitmap->bitmap.memory, 0, bytes); +#if !defined(ALLEGRO_IPHONE) && !defined(ALLEGRO_GP2XWIZ) + bitmap->bitmap.memory = NULL; +#else + /* iPhone/Wiz ports still expect the buffer to be present. */ + { + size_t bytes = pitch * true_h; + bitmap->bitmap.memory = al_malloc(bytes); + /* We never allow un-initialized memory for OpenGL bitmaps, if it + * is uploaded to a floating point texture it can lead to Inf and + * NaN values which break all subsequent blending. + */ + memset(bitmap->bitmap.memory, 0, bytes); + } +#endif + return &bitmap->bitmap; } Modified: allegro/branches/4.9/src/opengl/ogl_display.c =================================================================== --- allegro/branches/4.9/src/opengl/ogl_display.c 2010-07-28 16:55:55 UTC (rev 13525) +++ allegro/branches/4.9/src/opengl/ogl_display.c 2010-07-29 11:04:37 UTC (rev 13526) @@ -211,7 +211,6 @@ bool _al_ogl_resize_backbuffer(ALLEGRO_BITMAP_OGL *b, int w, int h) { int pitch; - int bytes; pitch = w * al_get_pixel_size(b->bitmap.format); @@ -228,11 +227,18 @@ b->true_w = w; b->true_h = h; - /* FIXME: lazily manage memory */ - bytes = pitch * h; - al_free(b->bitmap.memory); - b->bitmap.memory = al_malloc(bytes); - memset(b->bitmap.memory, 0, bytes); +#if !defined(ALLEGRO_IPHONE) && !defined(ALLEGRO_GP2XWIZ) + b->bitmap.memory = NULL; +#else + /* iPhone/Wiz ports still expect the buffer to be present. */ + { + /* FIXME: lazily manage memory */ + size_t bytes = pitch * h; + al_free(b->bitmap.memory); + b->bitmap.memory = al_malloc(bytes); + memset(b->bitmap.memory, 0, bytes); + } +#endif return true; } Modified: allegro/branches/4.9/src/win/d3d_disp.cpp =================================================================== --- allegro/branches/4.9/src/win/d3d_disp.cpp 2010-07-28 16:55:55 UTC (rev 13525) +++ allegro/branches/4.9/src/win/d3d_disp.cpp 2010-07-29 11:04:37 UTC (rev 13526) @@ -2399,6 +2399,8 @@ bitmap->bitmap.pitch = w * al_get_pixel_size(format); al_identity_transform(&bitmap->bitmap.transform); + bitmap->bitmap.memory = (unsigned char *)al_malloc(bitmap->bitmap.pitch * h); + bitmap->video_texture = 0; bitmap->system_texture = 0; bitmap->initialized = false; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |