diff options
author | The Android Open Source Project <initial-contribution@android.com> | 2008-12-17 18:05:43 -0800 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2008-12-17 18:05:43 -0800 |
commit | f013e1afd1e68af5e3b868c26a653bbfb39538f8 (patch) | |
tree | 7ad6c8fd9c7b55f4b4017171dec1cb760bbd26bf /libs/surfaceflinger/LayerBuffer.cpp | |
parent | e70cfafe580c6f2994c4827cd8a534aabf3eb05c (diff) | |
download | frameworks_base-f013e1afd1e68af5e3b868c26a653bbfb39538f8.zip frameworks_base-f013e1afd1e68af5e3b868c26a653bbfb39538f8.tar.gz frameworks_base-f013e1afd1e68af5e3b868c26a653bbfb39538f8.tar.bz2 |
Code drop from //branches/cupcake/...@124589
Diffstat (limited to 'libs/surfaceflinger/LayerBuffer.cpp')
-rw-r--r-- | libs/surfaceflinger/LayerBuffer.cpp | 52 |
1 files changed, 49 insertions, 3 deletions
diff --git a/libs/surfaceflinger/LayerBuffer.cpp b/libs/surfaceflinger/LayerBuffer.cpp index d871fc3..3861e68 100644 --- a/libs/surfaceflinger/LayerBuffer.cpp +++ b/libs/surfaceflinger/LayerBuffer.cpp @@ -104,7 +104,7 @@ void LayerBuffer::onDraw(const Region& clip) const * the requested scale factor, in which case we perform the scaling * in several passes. */ - copybit_t* copybit = mFlinger->getBlitEngine(); + copybit_device_t* copybit = mFlinger->getBlitEngine(); const float min = copybit->get(copybit, COPYBIT_MINIFICATION_LIMIT); const float mag = copybit->get(copybit, COPYBIT_MAGNIFICATION_LIMIT); @@ -123,7 +123,7 @@ void LayerBuffer::onDraw(const Region& clip) const if (UNLIKELY(mTemporaryDealer == 0)) { // allocate a memory-dealer for this the first time mTemporaryDealer = mFlinger->getSurfaceHeapManager() - ->createHeap(NATIVE_MEMORY_TYPE_PMEM); + ->createHeap(ISurfaceComposer::eHardware); mTempBitmap.init(mTemporaryDealer); } @@ -230,7 +230,18 @@ sp<LayerBaseClient::Surface> LayerBuffer::getSurface() const status_t LayerBuffer::registerBuffers(int w, int h, int hstride, int vstride, PixelFormat format, const sp<IMemoryHeap>& memoryHeap) { - status_t err = (memoryHeap!=0 && memoryHeap->heapID() >= 0) ? NO_ERROR : NO_INIT; + if (memoryHeap == NULL) { + // this is allowed, but in this case, it is illegal to receive + // postBuffer(). The surface just erases the framebuffer with + // fully transparent pixels. + mHeap.clear(); + mWidth = w; + mHeight = h; + mNeedsBlending = false; + return NO_ERROR; + } + + status_t err = (memoryHeap->heapID() >= 0) ? NO_ERROR : NO_INIT; if (err != NO_ERROR) return err; @@ -281,6 +292,32 @@ void LayerBuffer::unregisterBuffers() invalidateLocked(); } +sp<Overlay> LayerBuffer::createOverlay(uint32_t w, uint32_t h, int32_t format) +{ + sp<Overlay> result; + Mutex::Autolock _l(mLock); + if (mHeap != 0 || mBuffer != 0) { + // we're a push surface. error. + return result; + } + + overlay_device_t* overlay_dev = mFlinger->getOverlayEngine(); + if (overlay_dev == NULL) { + // overlays not supported + return result; + } + + overlay_t* overlay = overlay_dev->createOverlay(overlay_dev, w, h, format); + if (overlay == NULL) { + // couldn't create the overlay (no memory? no more overlays?) + return result; + } + + /* TODO: implement the real stuff here */ + + return result; +} + sp<LayerBuffer::Buffer> LayerBuffer::getBuffer() const { Mutex::Autolock _l(mLock); @@ -330,6 +367,15 @@ void LayerBuffer::SurfaceBuffer::unregisterBuffers() owner->unregisterBuffers(); } +sp<Overlay> LayerBuffer::SurfaceBuffer::createOverlay( + uint32_t w, uint32_t h, int32_t format) { + sp<Overlay> result; + LayerBuffer* owner(getOwner()); + if (owner) + result = owner->createOverlay(w, h, format); + return result; +} + void LayerBuffer::SurfaceBuffer::disown() { Mutex::Autolock _l(mLock); |