SurfaceFlinger: Add support for DisplayUtils
Add DisplayUtils class which uses the custom implementations of ExLayer, ExSurfaceFlinger, ExHWComposer, and ExVirtualDisplaySurface classes if needed Change-Id: Ibdd8da5d3d0d602f42b76a15d0994c6aa98bee3f
This commit is contained in:
parent
8eaa19460d
commit
20f9ced881
|
@ -34,8 +34,8 @@ LOCAL_SRC_FILES := \
|
||||||
RenderEngine/Texture.cpp \
|
RenderEngine/Texture.cpp \
|
||||||
RenderEngine/GLES10RenderEngine.cpp \
|
RenderEngine/GLES10RenderEngine.cpp \
|
||||||
RenderEngine/GLES11RenderEngine.cpp \
|
RenderEngine/GLES11RenderEngine.cpp \
|
||||||
RenderEngine/GLES20RenderEngine.cpp
|
RenderEngine/GLES20RenderEngine.cpp \
|
||||||
|
DisplayUtils.cpp
|
||||||
|
|
||||||
LOCAL_CFLAGS := -DLOG_TAG=\"SurfaceFlinger\"
|
LOCAL_CFLAGS := -DLOG_TAG=\"SurfaceFlinger\"
|
||||||
LOCAL_CFLAGS += -DGL_GLEXT_PROTOTYPES -DEGL_EGLEXT_PROTOTYPES
|
LOCAL_CFLAGS += -DGL_GLEXT_PROTOTYPES -DEGL_EGLEXT_PROTOTYPES
|
||||||
|
@ -106,6 +106,17 @@ LOCAL_SHARED_LIBRARIES := \
|
||||||
libgui \
|
libgui \
|
||||||
libpowermanager
|
libpowermanager
|
||||||
|
|
||||||
|
LOCAL_WHOLE_STATIC_LIBRARIES += libexsurfaceflinger
|
||||||
|
|
||||||
|
LOCAL_C_INCLUDES += $(ANDROID_BUILD_TOP)/vendor/qcom/opensource/display-frameworks/native/services/surfaceflinger/
|
||||||
|
|
||||||
|
ifeq ($(TARGET_USES_QCOM_BSP), true)
|
||||||
|
LOCAL_C_INCLUDES += hardware/qcom/display/libgralloc
|
||||||
|
LOCAL_C_INCLUDES += hardware/qcom/display/libqdutils
|
||||||
|
LOCAL_SHARED_LIBRARIES += libqdutils
|
||||||
|
LOCAL_CFLAGS += -DQTI_BSP
|
||||||
|
endif
|
||||||
|
|
||||||
LOCAL_MODULE := libsurfaceflinger
|
LOCAL_MODULE := libsurfaceflinger
|
||||||
|
|
||||||
LOCAL_CFLAGS += -Wall -Werror -Wunused -Wunreachable-code
|
LOCAL_CFLAGS += -Wall -Werror -Wunused -Wunreachable-code
|
||||||
|
|
|
@ -74,7 +74,7 @@ public:
|
||||||
const sp<SurfaceFlinger>& flinger,
|
const sp<SurfaceFlinger>& flinger,
|
||||||
EventHandler& handler);
|
EventHandler& handler);
|
||||||
|
|
||||||
~HWComposer();
|
virtual ~HWComposer();
|
||||||
|
|
||||||
status_t initCheck() const;
|
status_t initCheck() const;
|
||||||
|
|
||||||
|
@ -304,6 +304,11 @@ public:
|
||||||
// for debugging ----------------------------------------------------------
|
// for debugging ----------------------------------------------------------
|
||||||
void dump(String8& out) const;
|
void dump(String8& out) const;
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------
|
||||||
|
* Extensions
|
||||||
|
*/
|
||||||
|
virtual inline bool isVDSEnabled() const { return true; };
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void loadHwcModule();
|
void loadHwcModule();
|
||||||
int loadFbHalModule();
|
int loadFbHalModule();
|
||||||
|
|
|
@ -152,7 +152,7 @@ status_t VirtualDisplaySurface::prepareFrame(CompositionType compositionType) {
|
||||||
// format/usage and get a new buffer when the GLES driver calls
|
// format/usage and get a new buffer when the GLES driver calls
|
||||||
// dequeueBuffer().
|
// dequeueBuffer().
|
||||||
mOutputFormat = mDefaultOutputFormat;
|
mOutputFormat = mDefaultOutputFormat;
|
||||||
mOutputUsage = GRALLOC_USAGE_HW_COMPOSER;
|
setOutputUsage(GRALLOC_USAGE_HW_COMPOSER);
|
||||||
refreshOutputBuffer();
|
refreshOutputBuffer();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -377,7 +377,7 @@ status_t VirtualDisplaySurface::dequeueBuffer(int* pslot, sp<Fence>* fence, bool
|
||||||
mSinkBufferWidth, mSinkBufferHeight,
|
mSinkBufferWidth, mSinkBufferHeight,
|
||||||
buf->getPixelFormat(), buf->getUsage());
|
buf->getPixelFormat(), buf->getUsage());
|
||||||
mOutputFormat = format;
|
mOutputFormat = format;
|
||||||
mOutputUsage = usage;
|
setOutputUsage(usage);
|
||||||
result = refreshOutputBuffer();
|
result = refreshOutputBuffer();
|
||||||
if (result < 0)
|
if (result < 0)
|
||||||
return result;
|
return result;
|
||||||
|
@ -616,6 +616,10 @@ const char* VirtualDisplaySurface::dbgSourceStr(Source s) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void VirtualDisplaySurface::setOutputUsage(uint32_t usage) {
|
||||||
|
mOutputUsage = usage;
|
||||||
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
} // namespace android
|
} // namespace android
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|
|
@ -72,6 +72,8 @@ class VirtualDisplaySurface : public DisplaySurface,
|
||||||
public BnGraphicBufferProducer,
|
public BnGraphicBufferProducer,
|
||||||
private ConsumerBase {
|
private ConsumerBase {
|
||||||
public:
|
public:
|
||||||
|
friend class ExVirtualDisplaySurface;
|
||||||
|
|
||||||
VirtualDisplaySurface(HWComposer& hwc, int32_t dispId,
|
VirtualDisplaySurface(HWComposer& hwc, int32_t dispId,
|
||||||
const sp<IGraphicBufferProducer>& sink,
|
const sp<IGraphicBufferProducer>& sink,
|
||||||
const sp<IGraphicBufferProducer>& bqProducer,
|
const sp<IGraphicBufferProducer>& bqProducer,
|
||||||
|
@ -118,6 +120,7 @@ private:
|
||||||
virtual status_t allowAllocation(bool allow);
|
virtual status_t allowAllocation(bool allow);
|
||||||
virtual status_t setGenerationNumber(uint32_t generationNumber);
|
virtual status_t setGenerationNumber(uint32_t generationNumber);
|
||||||
virtual String8 getConsumerName() const override;
|
virtual String8 getConsumerName() const override;
|
||||||
|
virtual void setOutputUsage(uint32_t flag);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Utility methods
|
// Utility methods
|
||||||
|
|
|
@ -0,0 +1,106 @@
|
||||||
|
/* Copyright (c) 2015, The Linux Foundation. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the following
|
||||||
|
* disclaimer in the documentation and/or other materials provided
|
||||||
|
* with the distribution.
|
||||||
|
* * Neither the name of The Linux Foundation nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
|
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
|
||||||
|
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||||
|
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||||
|
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#include <utils/Errors.h>
|
||||||
|
#include <utils/Log.h>
|
||||||
|
|
||||||
|
#include <ui/GraphicBuffer.h>
|
||||||
|
|
||||||
|
#include "DisplayUtils.h"
|
||||||
|
#include <ExSurfaceFlinger.h>
|
||||||
|
#include <ExLayer.h>
|
||||||
|
#include <DisplayHardware/ExHWComposer.h>
|
||||||
|
#include <DisplayHardware/ExVirtualDisplaySurface.h>
|
||||||
|
#include <dlfcn.h>
|
||||||
|
|
||||||
|
namespace android {
|
||||||
|
|
||||||
|
DisplayUtils* DisplayUtils::sDisplayUtils = NULL;
|
||||||
|
bool DisplayUtils::sUseExtendedImpls = false;
|
||||||
|
|
||||||
|
DisplayUtils::DisplayUtils() {
|
||||||
|
#ifdef QTI_BSP
|
||||||
|
sUseExtendedImpls = true;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
DisplayUtils* DisplayUtils::getInstance() {
|
||||||
|
if(sDisplayUtils == NULL) {
|
||||||
|
sDisplayUtils = new DisplayUtils();
|
||||||
|
}
|
||||||
|
return sDisplayUtils;
|
||||||
|
}
|
||||||
|
|
||||||
|
SurfaceFlinger* DisplayUtils::getSFInstance() {
|
||||||
|
if(sUseExtendedImpls) {
|
||||||
|
return new ExSurfaceFlinger();
|
||||||
|
} else {
|
||||||
|
return new SurfaceFlinger();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Layer* DisplayUtils::getLayerInstance(SurfaceFlinger* flinger,
|
||||||
|
const sp<Client>& client, const String8& name,
|
||||||
|
uint32_t w, uint32_t h, uint32_t flags) {
|
||||||
|
if(sUseExtendedImpls) {
|
||||||
|
return new ExLayer(flinger, client, name, w, h, flags);
|
||||||
|
} else {
|
||||||
|
return new Layer(flinger, client, name, w, h, flags);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
HWComposer* DisplayUtils::getHWCInstance(
|
||||||
|
const sp<SurfaceFlinger>& flinger,
|
||||||
|
HWComposer::EventHandler& handler) {
|
||||||
|
if(sUseExtendedImpls) {
|
||||||
|
return new ExHWComposer(flinger, handler);
|
||||||
|
} else {
|
||||||
|
return new HWComposer(flinger,handler);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
VirtualDisplaySurface* DisplayUtils::getVDSInstance(HWComposer* hwc, int32_t hwcDisplayId,
|
||||||
|
sp<IGraphicBufferProducer> currentStateSurface, sp<IGraphicBufferProducer> bqProducer,
|
||||||
|
sp<IGraphicBufferConsumer> bqConsumer, String8 currentStateDisplayName,
|
||||||
|
bool currentStateIsSecure)
|
||||||
|
{
|
||||||
|
if(sUseExtendedImpls) {
|
||||||
|
return new ExVirtualDisplaySurface(*hwc, hwcDisplayId, currentStateSurface, bqProducer,
|
||||||
|
bqConsumer, currentStateDisplayName, currentStateIsSecure);
|
||||||
|
} else {
|
||||||
|
return new VirtualDisplaySurface(*hwc, hwcDisplayId, currentStateSurface, bqProducer,
|
||||||
|
bqConsumer, currentStateDisplayName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}; // namespace android
|
||||||
|
|
|
@ -0,0 +1,71 @@
|
||||||
|
/* Copyright (c) 2015, The Linux Foundation. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the following
|
||||||
|
* disclaimer in the documentation and/or other materials provided
|
||||||
|
* with the distribution.
|
||||||
|
* * Neither the name of The Linux Foundation nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
|
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
|
||||||
|
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||||
|
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||||
|
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef ANDROID_DISPLAY_UTILS_H
|
||||||
|
#define ANDROID_DISPLAY_UTILS_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#include "Layer.h"
|
||||||
|
#include "SurfaceFlinger.h"
|
||||||
|
#include "DisplayHardware/HWComposer.h"
|
||||||
|
#include "DisplayHardware/VirtualDisplaySurface.h"
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
namespace android {
|
||||||
|
|
||||||
|
class IGraphicBufferProducer;
|
||||||
|
class IGraphicBufferConsumer;
|
||||||
|
class DisplaySurface;
|
||||||
|
|
||||||
|
/* Factory Classes */
|
||||||
|
|
||||||
|
class DisplayUtils {
|
||||||
|
public:
|
||||||
|
static DisplayUtils* getInstance() ANDROID_API;
|
||||||
|
SurfaceFlinger* getSFInstance() ANDROID_API;
|
||||||
|
Layer* getLayerInstance(SurfaceFlinger*, const sp<Client>&,
|
||||||
|
const String8&, uint32_t,
|
||||||
|
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,
|
||||||
|
sp<IGraphicBufferConsumer> bqConsumer, String8 currentStateDisplayName,
|
||||||
|
bool currentStateIsSecure);
|
||||||
|
DisplayUtils();
|
||||||
|
private:
|
||||||
|
static DisplayUtils* sDisplayUtils;
|
||||||
|
static bool sUseExtendedImpls;
|
||||||
|
};
|
||||||
|
|
||||||
|
}; // namespace android
|
||||||
|
|
||||||
|
#endif // ANDROID_DISPLAY_UTILS_H
|
|
@ -320,7 +320,7 @@ Rect Layer::getContentCrop() const {
|
||||||
return crop;
|
return crop;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Rect reduce(const Rect& win, const Region& exclude) {
|
Rect Layer::reduce(const Rect& win, const Region& exclude) const{
|
||||||
if (CC_LIKELY(exclude.isEmpty())) {
|
if (CC_LIKELY(exclude.isEmpty())) {
|
||||||
return win;
|
return win;
|
||||||
}
|
}
|
||||||
|
@ -494,6 +494,7 @@ void Layer::setGeometry(
|
||||||
frame.intersect(hw->getViewport(), &frame);
|
frame.intersect(hw->getViewport(), &frame);
|
||||||
const Transform& tr(hw->getTransform());
|
const Transform& tr(hw->getTransform());
|
||||||
layer.setFrame(tr.transform(frame));
|
layer.setFrame(tr.transform(frame));
|
||||||
|
setPosition(hw, layer, s);
|
||||||
layer.setCrop(computeCrop(hw));
|
layer.setCrop(computeCrop(hw));
|
||||||
layer.setPlaneAlpha(s.alpha);
|
layer.setPlaneAlpha(s.alpha);
|
||||||
|
|
||||||
|
|
|
@ -71,6 +71,7 @@ class Layer : public SurfaceFlingerConsumer::ContentsChangedListener {
|
||||||
static int32_t sSequence;
|
static int32_t sSequence;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
friend class ExLayer;
|
||||||
mutable bool contentDirty;
|
mutable bool contentDirty;
|
||||||
// regions below are in window-manager space
|
// regions below are in window-manager space
|
||||||
Region visibleRegion;
|
Region visibleRegion;
|
||||||
|
@ -285,6 +286,17 @@ public:
|
||||||
// the current orientation of the display device.
|
// the current orientation of the display device.
|
||||||
void updateTransformHint(const sp<const DisplayDevice>& hw) const;
|
void updateTransformHint(const sp<const DisplayDevice>& hw) const;
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------
|
||||||
|
* Extensions
|
||||||
|
*/
|
||||||
|
virtual bool isExtOnly() const { return false; }
|
||||||
|
virtual bool isIntOnly() const { return false; }
|
||||||
|
virtual bool isSecureDisplay() const { return false; }
|
||||||
|
virtual bool isYuvLayer() const { return false; }
|
||||||
|
virtual void setPosition(const sp<const DisplayDevice>& /*hw*/,
|
||||||
|
HWComposer::HWCLayerInterface& /*layer*/,
|
||||||
|
const State& /*state*/) { }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* returns the rectangle that crops the content of the layer and scales it
|
* returns the rectangle that crops the content of the layer and scales it
|
||||||
* to the layer's size.
|
* to the layer's size.
|
||||||
|
@ -336,6 +348,7 @@ protected:
|
||||||
LayerCleaner(const sp<SurfaceFlinger>& flinger, const sp<Layer>& layer);
|
LayerCleaner(const sp<SurfaceFlinger>& flinger, const sp<Layer>& layer);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Rect reduce(const Rect& win, const Region& exclude) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Interface implementation for SurfaceFlingerConsumer::ContentsChangedListener
|
// Interface implementation for SurfaceFlingerConsumer::ContentsChangedListener
|
||||||
|
|
|
@ -77,6 +77,7 @@
|
||||||
|
|
||||||
#include "RenderEngine/RenderEngine.h"
|
#include "RenderEngine/RenderEngine.h"
|
||||||
#include <cutils/compiler.h>
|
#include <cutils/compiler.h>
|
||||||
|
#include "DisplayUtils.h"
|
||||||
|
|
||||||
#define DISPLAY_COUNT 1
|
#define DISPLAY_COUNT 1
|
||||||
|
|
||||||
|
@ -444,7 +445,7 @@ void SurfaceFlinger::init() {
|
||||||
|
|
||||||
// Initialize the H/W composer object. There may or may not be an
|
// Initialize the H/W composer object. There may or may not be an
|
||||||
// actual hardware composer underneath.
|
// actual hardware composer underneath.
|
||||||
mHwc = new HWComposer(this,
|
mHwc = DisplayUtils::getInstance()->getHWCInstance(this,
|
||||||
*static_cast<HWComposer::EventHandler *>(this));
|
*static_cast<HWComposer::EventHandler *>(this));
|
||||||
|
|
||||||
// get a RenderEngine for the given display / config (can't fail)
|
// get a RenderEngine for the given display / config (can't fail)
|
||||||
|
@ -874,6 +875,7 @@ void SurfaceFlinger::onHotplugReceived(int type, bool connected) {
|
||||||
} else {
|
} else {
|
||||||
mCurrentState.displays.removeItem(mBuiltinDisplays[type]);
|
mCurrentState.displays.removeItem(mBuiltinDisplays[type]);
|
||||||
mBuiltinDisplays[type].clear();
|
mBuiltinDisplays[type].clear();
|
||||||
|
updateVisibleRegionsDirty();
|
||||||
}
|
}
|
||||||
setTransactionFlags(eDisplayTransactionNeeded);
|
setTransactionFlags(eDisplayTransactionNeeded);
|
||||||
|
|
||||||
|
@ -1053,6 +1055,7 @@ void SurfaceFlinger::postComposition()
|
||||||
}
|
}
|
||||||
|
|
||||||
void SurfaceFlinger::rebuildLayerStacks() {
|
void SurfaceFlinger::rebuildLayerStacks() {
|
||||||
|
updateExtendedMode();
|
||||||
// rebuild the visible layer list per screen
|
// rebuild the visible layer list per screen
|
||||||
if (CC_UNLIKELY(mVisibleRegionsDirty)) {
|
if (CC_UNLIKELY(mVisibleRegionsDirty)) {
|
||||||
ATRACE_CALL();
|
ATRACE_CALL();
|
||||||
|
@ -1068,14 +1071,13 @@ void SurfaceFlinger::rebuildLayerStacks() {
|
||||||
const Transform& tr(hw->getTransform());
|
const Transform& tr(hw->getTransform());
|
||||||
const Rect bounds(hw->getBounds());
|
const Rect bounds(hw->getBounds());
|
||||||
if (hw->isDisplayOn()) {
|
if (hw->isDisplayOn()) {
|
||||||
SurfaceFlinger::computeVisibleRegions(layers,
|
computeVisibleRegions(hw->getHwcDisplayId(), layers,
|
||||||
hw->getLayerStack(), dirtyRegion, opaqueRegion);
|
hw->getLayerStack(), dirtyRegion, opaqueRegion);
|
||||||
|
|
||||||
const size_t count = layers.size();
|
const size_t count = layers.size();
|
||||||
for (size_t i=0 ; i<count ; i++) {
|
for (size_t i=0 ; i<count ; i++) {
|
||||||
const sp<Layer>& layer(layers[i]);
|
const sp<Layer>& layer(layers[i]);
|
||||||
const Layer::State& s(layer->getDrawingState());
|
{
|
||||||
if (s.layerStack == hw->getLayerStack()) {
|
|
||||||
Region drawRegion(tr.transform(
|
Region drawRegion(tr.transform(
|
||||||
layer->visibleNonTransparentRegion));
|
layer->visibleNonTransparentRegion));
|
||||||
drawRegion.andSelf(bounds);
|
drawRegion.andSelf(bounds);
|
||||||
|
@ -1155,6 +1157,8 @@ void SurfaceFlinger::setUpHWComposer() {
|
||||||
sp<const DisplayDevice> hw(mDisplays[dpy]);
|
sp<const DisplayDevice> hw(mDisplays[dpy]);
|
||||||
const int32_t id = hw->getHwcDisplayId();
|
const int32_t id = hw->getHwcDisplayId();
|
||||||
if (id >= 0) {
|
if (id >= 0) {
|
||||||
|
bool freezeSurfacePresent = false;
|
||||||
|
isfreezeSurfacePresent(freezeSurfacePresent, hw, id);
|
||||||
const Vector< sp<Layer> >& currentLayers(
|
const Vector< sp<Layer> >& currentLayers(
|
||||||
hw->getVisibleLayersSortedByZ());
|
hw->getVisibleLayersSortedByZ());
|
||||||
const size_t count = currentLayers.size();
|
const size_t count = currentLayers.size();
|
||||||
|
@ -1167,6 +1171,7 @@ void SurfaceFlinger::setUpHWComposer() {
|
||||||
*/
|
*/
|
||||||
const sp<Layer>& layer(currentLayers[i]);
|
const sp<Layer>& layer(currentLayers[i]);
|
||||||
layer->setPerFrameData(hw, *cur);
|
layer->setPerFrameData(hw, *cur);
|
||||||
|
setOrientationEventControl(freezeSurfacePresent,id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1440,9 +1445,9 @@ void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags)
|
||||||
hwcDisplayId = allocateHwcDisplayId(state.type);
|
hwcDisplayId = allocateHwcDisplayId(state.type);
|
||||||
}
|
}
|
||||||
|
|
||||||
sp<VirtualDisplaySurface> vds = new VirtualDisplaySurface(
|
sp<VirtualDisplaySurface> vds = DisplayUtils::getInstance()->getVDSInstance(
|
||||||
*mHwc, hwcDisplayId, state.surface,
|
mHwc, hwcDisplayId, state.surface,
|
||||||
bqProducer, bqConsumer, state.displayName);
|
bqProducer, bqConsumer, state.displayName, state.isSecure);
|
||||||
|
|
||||||
dispSurface = vds;
|
dispSurface = vds;
|
||||||
producer = vds;
|
producer = vds;
|
||||||
|
@ -1639,7 +1644,7 @@ void SurfaceFlinger::commitTransaction()
|
||||||
mTransactionCV.broadcast();
|
mTransactionCV.broadcast();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SurfaceFlinger::computeVisibleRegions(
|
void SurfaceFlinger::computeVisibleRegions(size_t dpy,
|
||||||
const LayerVector& currentLayers, uint32_t layerStack,
|
const LayerVector& currentLayers, uint32_t layerStack,
|
||||||
Region& outDirtyRegion, Region& outOpaqueRegion)
|
Region& outDirtyRegion, Region& outOpaqueRegion)
|
||||||
{
|
{
|
||||||
|
@ -1650,6 +1655,9 @@ void SurfaceFlinger::computeVisibleRegions(
|
||||||
Region dirty;
|
Region dirty;
|
||||||
|
|
||||||
outDirtyRegion.clear();
|
outDirtyRegion.clear();
|
||||||
|
bool bIgnoreLayers = false;
|
||||||
|
int indexLOI = -1;
|
||||||
|
getIndexLOI(dpy, currentLayers, bIgnoreLayers, indexLOI);
|
||||||
|
|
||||||
size_t i = currentLayers.size();
|
size_t i = currentLayers.size();
|
||||||
while (i--) {
|
while (i--) {
|
||||||
|
@ -1658,8 +1666,9 @@ void SurfaceFlinger::computeVisibleRegions(
|
||||||
// start with the whole surface at its current location
|
// start with the whole surface at its current location
|
||||||
const Layer::State& s(layer->getDrawingState());
|
const Layer::State& s(layer->getDrawingState());
|
||||||
|
|
||||||
// only consider the layers on the given layer stack
|
if(updateLayerVisibleNonTransparentRegion(dpy, layer,
|
||||||
if (s.layerStack != layerStack)
|
bIgnoreLayers, indexLOI,
|
||||||
|
layerStack, i))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -2092,6 +2101,8 @@ void SurfaceFlinger::setTransactionState(
|
||||||
uint32_t flags)
|
uint32_t flags)
|
||||||
{
|
{
|
||||||
ATRACE_CALL();
|
ATRACE_CALL();
|
||||||
|
|
||||||
|
delayDPTransactionIfNeeded(displays);
|
||||||
Mutex::Autolock _l(mStateLock);
|
Mutex::Autolock _l(mStateLock);
|
||||||
uint32_t transactionFlags = 0;
|
uint32_t transactionFlags = 0;
|
||||||
|
|
||||||
|
@ -2338,7 +2349,7 @@ status_t SurfaceFlinger::createNormalLayer(const sp<Client>& client,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
*outLayer = new Layer(this, client, name, w, h, flags);
|
*outLayer = DisplayUtils::getInstance()->getLayerInstance(this, client, name, w, h, flags);
|
||||||
status_t err = (*outLayer)->setBuffers(w, h, format, flags);
|
status_t err = (*outLayer)->setBuffers(w, h, format, flags);
|
||||||
if (err == NO_ERROR) {
|
if (err == NO_ERROR) {
|
||||||
*handle = (*outLayer)->getHandle();
|
*handle = (*outLayer)->getHandle();
|
||||||
|
@ -3312,7 +3323,7 @@ void SurfaceFlinger::renderScreenImplLocked(
|
||||||
const Layer::State& state(layer->getDrawingState());
|
const Layer::State& state(layer->getDrawingState());
|
||||||
if (state.layerStack == hw->getLayerStack()) {
|
if (state.layerStack == hw->getLayerStack()) {
|
||||||
if (state.z >= minLayerZ && state.z <= maxLayerZ) {
|
if (state.z >= minLayerZ && state.z <= maxLayerZ) {
|
||||||
if (layer->isVisible()) {
|
if (canDrawLayerinScreenShot(hw,layer)) {
|
||||||
if (filtering) layer->setFiltering(true);
|
if (filtering) layer->setFiltering(true);
|
||||||
layer->draw(hw, useIdentityTransform);
|
layer->draw(hw, useIdentityTransform);
|
||||||
if (filtering) layer->setFiltering(false);
|
if (filtering) layer->setFiltering(false);
|
||||||
|
@ -3488,6 +3499,29 @@ void SurfaceFlinger::checkScreenshot(size_t w, size_t s, size_t h, void const* v
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------
|
||||||
|
* Extensions
|
||||||
|
*/
|
||||||
|
|
||||||
|
bool SurfaceFlinger::updateLayerVisibleNonTransparentRegion(const int& /*dpy*/,
|
||||||
|
const sp<Layer>& layer, bool& /*bIgnoreLayers*/, int& /*indexLOI*/,
|
||||||
|
uint32_t layerStack, const int& /*i*/) {
|
||||||
|
|
||||||
|
const Layer::State& s(layer->getDrawingState());
|
||||||
|
|
||||||
|
// only consider the layers on the given layer stack
|
||||||
|
if (s.layerStack != layerStack)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SurfaceFlinger::canDrawLayerinScreenShot(
|
||||||
|
const sp<const DisplayDevice>& /*hw*/,
|
||||||
|
const sp<Layer>& layer) {
|
||||||
|
return layer->isVisible();
|
||||||
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
SurfaceFlinger::LayerVector::LayerVector() {
|
SurfaceFlinger::LayerVector::LayerVector() {
|
||||||
|
|
|
@ -84,6 +84,8 @@ class SurfaceFlinger : public BnSurfaceComposer,
|
||||||
private HWComposer::EventHandler
|
private HWComposer::EventHandler
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
friend class ExSurfaceFlinger;
|
||||||
|
|
||||||
static char const* getServiceName() ANDROID_API {
|
static char const* getServiceName() ANDROID_API {
|
||||||
return "SurfaceFlinger";
|
return "SurfaceFlinger";
|
||||||
}
|
}
|
||||||
|
@ -234,6 +236,38 @@ private:
|
||||||
virtual void onVSyncReceived(int type, nsecs_t timestamp);
|
virtual void onVSyncReceived(int type, nsecs_t timestamp);
|
||||||
virtual void onHotplugReceived(int disp, bool connected);
|
virtual void onHotplugReceived(int disp, bool connected);
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------
|
||||||
|
* Extensions
|
||||||
|
*/
|
||||||
|
virtual void updateExtendedMode() { }
|
||||||
|
|
||||||
|
virtual void getIndexLOI(size_t /*dpy*/,
|
||||||
|
const LayerVector& /*currentLayers*/,
|
||||||
|
bool& /*bIgnoreLayers*/,
|
||||||
|
int& /*indexLOI*/) { }
|
||||||
|
|
||||||
|
virtual bool updateLayerVisibleNonTransparentRegion(
|
||||||
|
const int& dpy, const sp<Layer>& layer,
|
||||||
|
bool& bIgnoreLayers, int& indexLOI,
|
||||||
|
uint32_t layerStack, const int& i);
|
||||||
|
|
||||||
|
virtual void delayDPTransactionIfNeeded(
|
||||||
|
const Vector<DisplayState>& /*displays*/) { }
|
||||||
|
|
||||||
|
virtual bool canDrawLayerinScreenShot(
|
||||||
|
const sp<const DisplayDevice>& hw,
|
||||||
|
const sp<Layer>& layer);
|
||||||
|
|
||||||
|
virtual void isfreezeSurfacePresent(
|
||||||
|
bool& freezeSurfacePresent,
|
||||||
|
const sp<const DisplayDevice>& /*hw*/,
|
||||||
|
const int32_t& /*id*/) { freezeSurfacePresent = false; }
|
||||||
|
|
||||||
|
virtual void setOrientationEventControl(
|
||||||
|
bool& /*freezeSurfacePresent*/,
|
||||||
|
const int32_t& /*id*/) { }
|
||||||
|
|
||||||
|
virtual void updateVisibleRegionsDirty() { }
|
||||||
/* ------------------------------------------------------------------------
|
/* ------------------------------------------------------------------------
|
||||||
* Message handling
|
* Message handling
|
||||||
*/
|
*/
|
||||||
|
@ -373,7 +407,7 @@ private:
|
||||||
* Compositing
|
* Compositing
|
||||||
*/
|
*/
|
||||||
void invalidateHwcGeometry();
|
void invalidateHwcGeometry();
|
||||||
static void computeVisibleRegions(
|
void computeVisibleRegions(size_t dpy,
|
||||||
const LayerVector& currentLayers, uint32_t layerStack,
|
const LayerVector& currentLayers, uint32_t layerStack,
|
||||||
Region& dirtyRegion, Region& opaqueRegion);
|
Region& dirtyRegion, Region& opaqueRegion);
|
||||||
|
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#include <binder/ProcessState.h>
|
#include <binder/ProcessState.h>
|
||||||
#include <binder/IServiceManager.h>
|
#include <binder/IServiceManager.h>
|
||||||
#include "SurfaceFlinger.h"
|
#include "SurfaceFlinger.h"
|
||||||
|
#include "DisplayUtils.h"
|
||||||
|
|
||||||
using namespace android;
|
using namespace android;
|
||||||
|
|
||||||
|
@ -35,7 +36,7 @@ int main(int, char**) {
|
||||||
ps->startThreadPool();
|
ps->startThreadPool();
|
||||||
|
|
||||||
// instantiate surfaceflinger
|
// instantiate surfaceflinger
|
||||||
sp<SurfaceFlinger> flinger = new SurfaceFlinger();
|
sp<SurfaceFlinger> flinger = DisplayUtils::getInstance()->getSFInstance();
|
||||||
|
|
||||||
setpriority(PRIO_PROCESS, 0, PRIORITY_URGENT_DISPLAY);
|
setpriority(PRIO_PROCESS, 0, PRIORITY_URGENT_DISPLAY);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue