OSDN Git Service

sf: vds: Avoid HWC for certain scenarios
authorManoj Kumar AVM <manojavm@codeaurora.org>
Fri, 2 Oct 2015 21:53:50 +0000 (14:53 -0700)
committerGerrit - the friendly Code Review server <code-review@localhost>
Mon, 2 Nov 2015 16:15:21 +0000 (08:15 -0800)
Reserve HWC for VDS for WFD use case. During WFD usecase, sink usage
will contain GRALLOC_USAGE_PRIVATE_WFD flag.

When HWC is avoided, all virtual displays are composed using GLES.
This means that GLES composes directly into the sink buffer and
signals the consumer. Furthermore, it is expected that any color
conversion will be handled on the consumer side.

CRs-Fixed: 908380
Change-Id: I93ff54c79ece788b6caf3f4172835d8ac1362f62

services/surfaceflinger/DisplayUtils.cpp
services/surfaceflinger/DisplayUtils.h
services/surfaceflinger/SurfaceFlinger.cpp

index e4e2183..83d84aa 100644 (file)
@@ -44,6 +44,9 @@
 #include <DisplayHardware/ExHWComposer.h>
 #include <DisplayHardware/ExVirtualDisplaySurface.h>
 #include <dlfcn.h>
+#if QTI_BSP
+#include <gralloc_priv.h>
+#endif
 
 namespace android {
 
@@ -157,5 +160,17 @@ bool DisplayUtils::createV4L2BasedVirtualDisplay(HWComposer* hwc, int32_t &hwcDi
     return false;
 }
 
+bool DisplayUtils::canAllocateHwcDisplayIdForVDS(int usage) {
+    // on AOSP builds with QTI_BSP disabled, we should allocate hwc display id for virtual display
+    int flag_mask = 0xffffffff;
+
+#if QTI_BSP
+    // Reserve hardware acceleration for WFD use-case
+    flag_mask = GRALLOC_USAGE_PRIVATE_WFD;
+#endif
+
+    return (usage & flag_mask);
+}
+
 }; // namespace android
 
index cdf2b67..bb3d16b 100644 (file)
@@ -61,6 +61,7 @@ class DisplayUtils {
             sp<IGraphicBufferProducer> &producer, sp<IGraphicBufferProducer> bqProducer,
             sp<IGraphicBufferConsumer> bqConsumer, String8 currentStateDisplayName,
             bool currentStateIsSecure, int currentStateType);
+    bool canAllocateHwcDisplayIdForVDS(int usage);
     DisplayUtils();
   private:
     static DisplayUtils* sDisplayUtils;
index 21c8aa5..5f37b0b 100644 (file)
@@ -1430,6 +1430,7 @@ void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags)
                         if (state.surface != NULL) {
 
                             int width = 0;
+                            DisplayUtils* displayUtils = DisplayUtils::getInstance();
                             int status = state.surface->query(
                                     NATIVE_WINDOW_WIDTH, &width);
                             ALOGE_IF(status != NO_ERROR,
@@ -1442,11 +1443,19 @@ void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags)
                             if (MAX_VIRTUAL_DISPLAY_DIMENSION == 0 ||
                                     (width <= MAX_VIRTUAL_DISPLAY_DIMENSION &&
                                      height <= MAX_VIRTUAL_DISPLAY_DIMENSION)) {
-                                hwcDisplayId = allocateHwcDisplayId(state.type);
+                                int usage = 0;
+                                status = state.surface->query(
+                                    NATIVE_WINDOW_CONSUMER_USAGE_BITS, &usage);
+                                ALOGW_IF(status != NO_ERROR,
+                                        "Unable to query usage (%d)", status);
+                                if ( (status == NO_ERROR) &&
+                                     displayUtils->canAllocateHwcDisplayIdForVDS(usage)) {
+                                    hwcDisplayId = allocateHwcDisplayId(state.type);
+                                }
                             }
 
-                            DisplayUtils::getInstance()->initVDSInstance(mHwc, hwcDisplayId,
-                                    state.surface, dispSurface, producer, bqProducer, bqConsumer,
+                            displayUtils->initVDSInstance(mHwc, hwcDisplayId, state.surface,
+                                    dispSurface, producer, bqProducer, bqConsumer,
                                     state.displayName, state.isSecure, state.type);
 
                         }