diff options
author | Baldev Sahu <bsahu@codeaurora.org> | 2015-08-12 16:25:05 +0530 |
---|---|---|
committer | Linux Build Service Account <lnxbuild@localhost> | 2015-10-06 03:22:26 -0600 |
commit | 3652b2386511917de05beefcbc4bf1521450a1bf (patch) | |
tree | 51d630fb1ea973078f4aca39620ad6ac5a659877 /services/surfaceflinger | |
parent | bd170ee5b6f210cfa8db72d6bfbe0cff5ed08594 (diff) | |
download | frameworks_native-3652b2386511917de05beefcbc4bf1521450a1bf.zip frameworks_native-3652b2386511917de05beefcbc4bf1521450a1bf.tar.gz frameworks_native-3652b2386511917de05beefcbc4bf1521450a1bf.tar.bz2 |
SurfaceFlinger: Add support for V4L2 based wfd solution.
This change add support for V4L2 based Wi-Fi display.
Change-Id: Ib3f3868eb0b7fa2bf7e58246fb2c5cd0ddceb7e1
Diffstat (limited to 'services/surfaceflinger')
-rw-r--r-- | services/surfaceflinger/DisplayUtils.cpp | 69 | ||||
-rw-r--r-- | services/surfaceflinger/DisplayUtils.h | 13 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 10 |
3 files changed, 76 insertions, 16 deletions
diff --git a/services/surfaceflinger/DisplayUtils.cpp b/services/surfaceflinger/DisplayUtils.cpp index 3937df0..e4e2183 100644 --- a/services/surfaceflinger/DisplayUtils.cpp +++ b/services/surfaceflinger/DisplayUtils.cpp @@ -33,8 +33,11 @@ #include <utils/Errors.h> #include <utils/Log.h> +#include <gui/Surface.h> #include <ui/GraphicBuffer.h> +#include "RenderEngine/RenderEngine.h" +#include "DisplayHardware/FramebufferSurface.h" #include "DisplayUtils.h" #include <ExSurfaceFlinger.h> #include <ExLayer.h> @@ -88,19 +91,71 @@ HWComposer* DisplayUtils::getHWCInstance( } } -VirtualDisplaySurface* DisplayUtils::getVDSInstance(HWComposer* hwc, int32_t hwcDisplayId, - sp<IGraphicBufferProducer> currentStateSurface, sp<IGraphicBufferProducer> bqProducer, +void DisplayUtils::initVDSInstance(HWComposer* hwc, int32_t hwcDisplayId, + sp<IGraphicBufferProducer> currentStateSurface, sp<DisplaySurface> &dispSurface, + sp<IGraphicBufferProducer> &producer, sp<IGraphicBufferProducer> bqProducer, sp<IGraphicBufferConsumer> bqConsumer, String8 currentStateDisplayName, - bool currentStateIsSecure) + bool currentStateIsSecure, int currentStateType) { if(sUseExtendedImpls) { - return new ExVirtualDisplaySurface(*hwc, hwcDisplayId, currentStateSurface, bqProducer, - bqConsumer, currentStateDisplayName, currentStateIsSecure); + if(hwc->isVDSEnabled()) { + VirtualDisplaySurface* vds = new ExVirtualDisplaySurface(*hwc, hwcDisplayId, + currentStateSurface, bqProducer, bqConsumer, currentStateDisplayName, + currentStateIsSecure); + dispSurface = vds; + producer = vds; + } else if(!createV4L2BasedVirtualDisplay(hwc, hwcDisplayId, dispSurface, producer, + currentStateSurface, bqProducer, bqConsumer, currentStateType)) { + VirtualDisplaySurface* vds = new VirtualDisplaySurface(*hwc, hwcDisplayId, + currentStateSurface, bqProducer, bqConsumer, currentStateDisplayName); + dispSurface = vds; + producer = vds; + } } else { - return new VirtualDisplaySurface(*hwc, hwcDisplayId, currentStateSurface, bqProducer, - bqConsumer, currentStateDisplayName); + VirtualDisplaySurface* vds = new VirtualDisplaySurface(*hwc, hwcDisplayId, + currentStateSurface, bqProducer, bqConsumer, currentStateDisplayName); + dispSurface = vds; + producer = vds; } } +bool DisplayUtils::createV4L2BasedVirtualDisplay(HWComposer* hwc, int32_t &hwcDisplayId, + sp<DisplaySurface> &dispSurface, sp<IGraphicBufferProducer> &producer, + sp<IGraphicBufferProducer> currentStateSurface, + sp<IGraphicBufferProducer> bqProducer, sp<IGraphicBufferConsumer> bqConsumer, + int currentStateType) { + char value[PROPERTY_VALUE_MAX]; + property_get("persist.sys.wfd.virtual", value, "0"); + int wfdVirtual = atoi(value); + if(wfdVirtual && hwcDisplayId > 0) { + //Read virtual display properties and create a + //rendering surface for it inorder to be handled + //by hwc. + + sp<ANativeWindow> mNativeWindow = new Surface(currentStateSurface); + ANativeWindow* const window = mNativeWindow.get(); + + int format; + window->query(window, NATIVE_WINDOW_FORMAT, &format); + EGLSurface surface; + EGLint w, h; + EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); + // In M AOSP getEGLConfig() always returns EGL_NO_CONFIG as + // EGL_ANDROIDX_no_config_context active now. + EGLConfig config = RenderEngine::chooseEglConfig(display, format); + + surface = eglCreateWindowSurface(display, config, window, NULL); + eglQuerySurface(display, surface, EGL_WIDTH, &w); + eglQuerySurface(display, surface, EGL_HEIGHT, &h); + if(hwc->setVirtualDisplayProperties(hwcDisplayId, w, h, format) != NO_ERROR) + return false; + + dispSurface = new FramebufferSurface(*hwc, currentStateType, bqConsumer); + producer = bqProducer; + return true; + } + return false; +} + }; // namespace android diff --git a/services/surfaceflinger/DisplayUtils.h b/services/surfaceflinger/DisplayUtils.h index c35e36a..cdf2b67 100644 --- a/services/surfaceflinger/DisplayUtils.h +++ b/services/surfaceflinger/DisplayUtils.h @@ -56,14 +56,21 @@ class DisplayUtils { uint32_t, uint32_t); HWComposer* getHWCInstance(const sp<SurfaceFlinger>& flinger, HWComposer::EventHandler& handler); - VirtualDisplaySurface* getVDSInstance(HWComposer* hwc, int32_t hwcDisplayId, - sp<IGraphicBufferProducer> currentStateSurface, sp<IGraphicBufferProducer> bqProducer, + void initVDSInstance(HWComposer* hwc, int32_t hwcDisplayId, + sp<IGraphicBufferProducer> currentStateSurface, sp<DisplaySurface> &dispSurface, + sp<IGraphicBufferProducer> &producer, sp<IGraphicBufferProducer> bqProducer, sp<IGraphicBufferConsumer> bqConsumer, String8 currentStateDisplayName, - bool currentStateIsSecure); + bool currentStateIsSecure, int currentStateType); DisplayUtils(); private: static DisplayUtils* sDisplayUtils; static bool sUseExtendedImpls; + + bool createV4L2BasedVirtualDisplay(HWComposer* hwc, int32_t &hwcDisplayId, + sp<DisplaySurface> &dispSurface, sp<IGraphicBufferProducer> &producer, + sp<IGraphicBufferProducer> currentStateSurface, + sp<IGraphicBufferProducer> bqProducer, + sp<IGraphicBufferConsumer> bqConsumer, int currentStateType); }; }; // namespace android diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index d7cf130..3b4330d 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -1445,12 +1445,10 @@ void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags) hwcDisplayId = allocateHwcDisplayId(state.type); } - sp<VirtualDisplaySurface> vds = DisplayUtils::getInstance()->getVDSInstance( - mHwc, hwcDisplayId, state.surface, - bqProducer, bqConsumer, state.displayName, state.isSecure); + DisplayUtils::getInstance()->initVDSInstance(mHwc, hwcDisplayId, + state.surface, dispSurface, producer, bqProducer, bqConsumer, + state.displayName, state.isSecure, state.type); - dispSurface = vds; - producer = vds; } } else { ALOGE_IF(state.surface!=NULL, @@ -1466,7 +1464,7 @@ void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags) } const wp<IBinder>& display(curr.keyAt(i)); - if (dispSurface != NULL) { + if (dispSurface != NULL && producer != NULL) { sp<DisplayDevice> hw = new DisplayDevice(this, state.type, hwcDisplayId, mHwc->getFormat(hwcDisplayId), state.isSecure, |