diff options
author | Jesse Hall <jessehall@google.com> | 2013-11-06 15:35:08 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2013-11-06 15:35:09 +0000 |
commit | 493186312a9a8c0215da0d6d3a9b0369491c0796 (patch) | |
tree | 6ba97fcd2eedf459f9e110b15137cda8afdb6828 | |
parent | ee874caa81ad48d6d0ee34509d3050ca9c046676 (diff) | |
parent | 497ba0e08503806571b52ebe27cc7eee4c0e71a7 (diff) | |
download | frameworks_native-493186312a9a8c0215da0d6d3a9b0369491c0796.zip frameworks_native-493186312a9a8c0215da0d6d3a9b0369491c0796.tar.gz frameworks_native-493186312a9a8c0215da0d6d3a9b0369491c0796.tar.bz2 |
Merge "Don't use implementation-defined format with CPU consumers" into klp-dev
-rw-r--r-- | services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.cpp | 30 | ||||
-rw-r--r-- | services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.h | 1 |
2 files changed, 24 insertions, 7 deletions
diff --git a/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.cpp b/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.cpp index bbe8d68..2bf7d21 100644 --- a/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.cpp +++ b/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.cpp @@ -53,7 +53,6 @@ VirtualDisplaySurface::VirtualDisplaySurface(HWComposer& hwc, int32_t dispId, mHwc(hwc), mDisplayId(dispId), mDisplayName(name), - mOutputFormat(HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED), mOutputUsage(GRALLOC_USAGE_HW_COMPOSER), mProducerSlotSource(0), mDbgState(DBG_STATE_IDLE), @@ -65,8 +64,23 @@ VirtualDisplaySurface::VirtualDisplaySurface(HWComposer& hwc, int32_t dispId, resetPerFrameState(); int sinkWidth, sinkHeight; - mSource[SOURCE_SINK]->query(NATIVE_WINDOW_WIDTH, &sinkWidth); - mSource[SOURCE_SINK]->query(NATIVE_WINDOW_HEIGHT, &sinkHeight); + sink->query(NATIVE_WINDOW_WIDTH, &sinkWidth); + sink->query(NATIVE_WINDOW_HEIGHT, &sinkHeight); + + // Pick the buffer format to request from the sink when not rendering to it + // with GLES. If the consumer needs CPU access, use the default format + // set by the consumer. Otherwise allow gralloc to decide the format based + // on usage bits. + int sinkUsage; + sink->query(NATIVE_WINDOW_CONSUMER_USAGE_BITS, &sinkUsage); + if (sinkUsage & (GRALLOC_USAGE_SW_READ_MASK | GRALLOC_USAGE_SW_WRITE_MASK)) { + int sinkFormat; + sink->query(NATIVE_WINDOW_FORMAT, &sinkFormat); + mDefaultOutputFormat = sinkFormat; + } else { + mDefaultOutputFormat = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; + } + mOutputFormat = mDefaultOutputFormat; ConsumerBase::mName = String8::format("VDS: %s", mDisplayName.string()); mConsumer->setConsumerName(ConsumerBase::mName); @@ -121,7 +135,7 @@ status_t VirtualDisplaySurface::prepareFrame(CompositionType compositionType) { } if (mCompositionType != COMPOSITION_GLES && - (mOutputFormat != HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED || + (mOutputFormat != mDefaultOutputFormat || mOutputUsage != GRALLOC_USAGE_HW_COMPOSER)) { // We must have just switched from GLES-only to MIXED or HWC // composition. Stop using the format and usage requested by the GLES @@ -133,7 +147,7 @@ status_t VirtualDisplaySurface::prepareFrame(CompositionType compositionType) { // If we just switched *to* GLES-only mode, we'll change the // format/usage and get a new buffer when the GLES driver calls // dequeueBuffer(). - mOutputFormat = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; + mOutputFormat = mDefaultOutputFormat; mOutputUsage = GRALLOC_USAGE_HW_COMPOSER; refreshOutputBuffer(); } @@ -277,8 +291,10 @@ status_t VirtualDisplaySurface::dequeueBuffer(Source source, } if (result & BUFFER_NEEDS_REALLOCATION) { mSource[source]->requestBuffer(*sslot, &mProducerBuffers[pslot]); - VDS_LOGV("dequeueBuffer(%s): buffers[%d]=%p", - dbgSourceStr(source), pslot, mProducerBuffers[pslot].get()); + VDS_LOGV("dequeueBuffer(%s): buffers[%d]=%p fmt=%d usage=%#x", + dbgSourceStr(source), pslot, mProducerBuffers[pslot].get(), + mProducerBuffers[pslot]->getPixelFormat(), + mProducerBuffers[pslot]->getUsage()); } return result; diff --git a/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.h b/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.h index 57b5554..1e85ac4 100644 --- a/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.h +++ b/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.h @@ -132,6 +132,7 @@ private: const int32_t mDisplayId; const String8 mDisplayName; sp<IGraphicBufferProducer> mSource[2]; // indexed by SOURCE_* + uint32_t mDefaultOutputFormat; // // Inter-frame state |