diff options
author | Mathias Agopian <mathias@google.com> | 2009-10-29 18:29:30 -0700 |
---|---|---|
committer | Mathias Agopian <mathias@google.com> | 2009-10-30 14:48:50 -0700 |
commit | 863e5fdde858d732ac76320369b6304599f23b4c (patch) | |
tree | b8d374db3d255ee24a6884167238ad8955bd722b | |
parent | df2d92940550bc68c3c237937bce7ac16d9fa91b (diff) | |
download | frameworks_native-863e5fdde858d732ac76320369b6304599f23b4c.zip frameworks_native-863e5fdde858d732ac76320369b6304599f23b4c.tar.gz frameworks_native-863e5fdde858d732ac76320369b6304599f23b4c.tar.bz2 |
fix[2222341] Soft reset while going back from camcorder settings
add a way to convert a mapped "pushbuffer" buffer to a gralloc handle
which then can be safely used by surfaceflinger, without including
gralloc_priv.h
-rw-r--r-- | libs/surfaceflinger/LayerBuffer.cpp | 57 | ||||
-rw-r--r-- | libs/surfaceflinger/LayerBuffer.h | 5 | ||||
-rw-r--r-- | opengl/libs/EGL/egl.cpp | 2 |
3 files changed, 42 insertions, 22 deletions
diff --git a/libs/surfaceflinger/LayerBuffer.cpp b/libs/surfaceflinger/LayerBuffer.cpp index f70bcf4..82a8e51 100644 --- a/libs/surfaceflinger/LayerBuffer.cpp +++ b/libs/surfaceflinger/LayerBuffer.cpp @@ -33,14 +33,13 @@ #include "SurfaceFlinger.h" #include "DisplayHardware/DisplayHardware.h" -#include "gralloc_priv.h" // needed for msm / copybit - namespace android { // --------------------------------------------------------------------------- const uint32_t LayerBuffer::typeInfo = LayerBaseClient::typeInfo | 0x20; const char* const LayerBuffer::typeID = "LayerBuffer"; +gralloc_module_t const* LayerBuffer::sGrallocModule = 0; // --------------------------------------------------------------------------- @@ -60,6 +59,16 @@ void LayerBuffer::onFirstRef() LayerBaseClient::onFirstRef(); mSurface = new SurfaceLayerBuffer(mFlinger, clientIndex(), const_cast<LayerBuffer *>(this)); + + hw_module_t const* module = (hw_module_t const*)sGrallocModule; + if (!module) { + // NOTE: technically there is a race here, but it shouldn't + // cause any problem since hw_get_module() always returns + // the same value. + if (hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module) == 0) { + sGrallocModule = (gralloc_module_t const *)module; + } + } } sp<LayerBaseClient::Surface> LayerBuffer::createSurface() const @@ -243,30 +252,36 @@ LayerBuffer::Buffer::Buffer(const ISurface::BufferHeap& buffers, ssize_t offset) : mBufferHeap(buffers) { NativeBuffer& src(mNativeBuffer); - - src.crop.l = 0; - src.crop.t = 0; - src.crop.r = buffers.w; - src.crop.b = buffers.h; - - src.img.w = buffers.hor_stride ?: buffers.w; - src.img.h = buffers.ver_stride ?: buffers.h; - src.img.format = buffers.format; - src.img.base = (void*)(intptr_t(buffers.heap->base()) + offset); - - // FIXME: gross hack, we should never access private_handle_t from here, - // but this is needed by msm drivers - private_handle_t* hnd = new private_handle_t( - buffers.heap->heapID(), buffers.heap->getSize(), 0); - hnd->offset = offset; - src.img.handle = hnd; + src.img.handle = 0; + + gralloc_module_t const * module = LayerBuffer::getGrallocModule(); + if (module && module->perform) { + int err = module->perform(module, + GRALLOC_MODULE_PERFORM_CREATE_HANDLE_FROM_BUFFER, + buffers.heap->heapID(), buffers.heap->getSize(), + offset, buffers.heap->base(), + &src.img.handle); + + if (err == NO_ERROR) { + src.crop.l = 0; + src.crop.t = 0; + src.crop.r = buffers.w; + src.crop.b = buffers.h; + + src.img.w = buffers.hor_stride ?: buffers.w; + src.img.h = buffers.ver_stride ?: buffers.h; + src.img.format = buffers.format; + src.img.base = (void*)(intptr_t(buffers.heap->base()) + offset); + } + } } LayerBuffer::Buffer::~Buffer() { NativeBuffer& src(mNativeBuffer); - if (src.img.handle) - delete (private_handle_t*)src.img.handle; + if (src.img.handle) { + native_handle_delete(src.img.handle); + } } // ============================================================================ diff --git a/libs/surfaceflinger/LayerBuffer.h b/libs/surfaceflinger/LayerBuffer.h index 438b711..47482f4 100644 --- a/libs/surfaceflinger/LayerBuffer.h +++ b/libs/surfaceflinger/LayerBuffer.h @@ -91,6 +91,11 @@ private: copybit_rect_t crop; }; + static gralloc_module_t const* sGrallocModule; + static gralloc_module_t const* getGrallocModule() { + return sGrallocModule; + } + class Buffer : public LightRefBase<Buffer> { public: Buffer(const ISurface::BufferHeap& buffers, ssize_t offset); diff --git a/opengl/libs/EGL/egl.cpp b/opengl/libs/EGL/egl.cpp index 5efecb0..c22c21b 100644 --- a/opengl/libs/EGL/egl.cpp +++ b/opengl/libs/EGL/egl.cpp @@ -1677,7 +1677,7 @@ EGLImageKHR eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target, } else { // In case of success, we need to clear all error flags // (especially those caused by the implementation that didn't - // succeed). TODO: we could about this if we knew this was + // succeed). TODO: we could avoid this if we knew this was // a "full" success (all implementation succeeded). eglGetError(); } |