Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f44e020b authored by Manoj Kumar AVM's avatar Manoj Kumar AVM Committed by Linux Build Service Account
Browse files

sf: vds: Avoid HWC for certain scenarios

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
parent ed40bda9
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -44,6 +44,9 @@
#include <ExSurfaceFlinger/ExHWComposer.h>
#include <ExSurfaceFlinger/ExVirtualDisplaySurface.h>
#include <dlfcn.h>
#if QTI_BSP
#include <gralloc_priv.h>
#endif

#if QTI_BSP
#include <gralloc_priv.h>
@@ -161,5 +164,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
+1 −0
Original line number Diff line number Diff line
@@ -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;
+16 −7
Original line number Diff line number Diff line
@@ -1493,6 +1493,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,
@@ -1505,11 +1506,19 @@ void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags)
                            if (MAX_VIRTUAL_DISPLAY_DIMENSION == 0 ||
                                (width <= MAX_VIRTUAL_DISPLAY_DIMENSION &&
                                 height <= MAX_VIRTUAL_DISPLAY_DIMENSION)) {
                                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);
                        }
                    } else {