when a zero dimension buffer is allocated, turn the allocation into

a 1x1 buffer instead of Nx1 (or 1xN)

Change-Id: I27eeb15e83e13002dd9405f4e52b54f7dffc0fe7
This commit is contained in:
Mathias Agopian 2010-04-15 14:57:39 -07:00
parent 27f962f985
commit 5629eb1676
2 changed files with 10 additions and 11 deletions

View File

@ -73,9 +73,9 @@ private:
struct alloc_rec_t {
uint32_t w;
uint32_t h;
uint32_t s;
PixelFormat format;
uint32_t usage;
void* vaddr;
size_t size;
};

View File

@ -15,6 +15,8 @@
** limitations under the License.
*/
#define LOG_TAG "GraphicBufferAllocator"
#include <cutils/log.h>
#include <utils/Singleton.h>
@ -61,9 +63,9 @@ void GraphicBufferAllocator::dump(String8& result) const
const size_t c = list.size();
for (size_t i=0 ; i<c ; i++) {
const alloc_rec_t& rec(list.valueAt(i));
snprintf(buffer, SIZE, "%10p: %7.2f KiB | %4u x %4u | %2d | 0x%08x\n",
snprintf(buffer, SIZE, "%10p: %7.2f KiB | %4u (%4u) x %4u | %2d | 0x%08x\n",
list.keyAt(i), rec.size/1024.0f,
rec.w, rec.h, rec.format, rec.usage);
rec.w, rec.s, rec.h, rec.format, rec.usage);
result.append(buffer);
total += rec.size;
}
@ -71,16 +73,13 @@ void GraphicBufferAllocator::dump(String8& result) const
result.append(buffer);
}
static inline uint32_t clamp(uint32_t c) {
return c>0 ? c : 1;
}
status_t GraphicBufferAllocator::alloc(uint32_t w, uint32_t h, PixelFormat format,
int usage, buffer_handle_t* handle, int32_t* stride)
{
// make sure to not allocate a 0 x 0 buffer
w = clamp(w);
h = clamp(h);
// make sure to not allocate a N x 0 or 0 x N buffer, since this is
// allowed from an API stand-point allocate a 1x1 buffer instead.
if (!w || !h)
w = h = 1;
// we have a h/w allocator and h/w buffer is requested
status_t err;
@ -100,9 +99,9 @@ status_t GraphicBufferAllocator::alloc(uint32_t w, uint32_t h, PixelFormat forma
alloc_rec_t rec;
rec.w = w;
rec.h = h;
rec.s = *stride;
rec.format = format;
rec.usage = usage;
rec.vaddr = 0;
rec.size = h * stride[0] * bytesPerPixel(format);
list.add(*handle, rec);
} else {