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

Commit 439bd45a authored by Derek Sollenberger's avatar Derek Sollenberger Committed by android-build-merger
Browse files

Merge "Respect a Layer's (e.g. SurfaceTexture) colorSpace when compositing" into pi-dev

am: 9298ad1b

Change-Id: I833be024184025bc03f071ce449fd96f24077a06
parents f683c14b 9298ad1b
Loading
Loading
Loading
Loading
+10 −6
Original line number Original line Diff line number Diff line
@@ -40,7 +40,6 @@ DeferredLayerUpdater::DeferredLayerUpdater(RenderState& renderState, CreateLayer
}
}


DeferredLayerUpdater::~DeferredLayerUpdater() {
DeferredLayerUpdater::~DeferredLayerUpdater() {
    SkSafeUnref(mColorFilter);
    setTransform(nullptr);
    setTransform(nullptr);
    mRenderState.unregisterDeferredLayerUpdater(this);
    mRenderState.unregisterDeferredLayerUpdater(this);
    destroyLayer();
    destroyLayer();
@@ -67,8 +66,11 @@ void DeferredLayerUpdater::destroyLayer() {
void DeferredLayerUpdater::setPaint(const SkPaint* paint) {
void DeferredLayerUpdater::setPaint(const SkPaint* paint) {
    mAlpha = PaintUtils::getAlphaDirect(paint);
    mAlpha = PaintUtils::getAlphaDirect(paint);
    mMode = PaintUtils::getBlendModeDirect(paint);
    mMode = PaintUtils::getBlendModeDirect(paint);
    SkColorFilter* colorFilter = (paint) ? paint->getColorFilter() : nullptr;
    if (paint) {
    SkRefCnt_SafeAssign(mColorFilter, colorFilter);
        mColorFilter = paint->refColorFilter();
    } else {
        mColorFilter.reset();
    }
}
}


void DeferredLayerUpdater::apply() {
void DeferredLayerUpdater::apply() {
@@ -143,7 +145,7 @@ void DeferredLayerUpdater::doUpdateTexImage() {
#endif
#endif
        mSurfaceTexture->getTransformMatrix(transform);
        mSurfaceTexture->getTransformMatrix(transform);


        updateLayer(forceFilter, transform);
        updateLayer(forceFilter, transform, mSurfaceTexture->getCurrentDataSpace());
    }
    }
}
}


@@ -153,17 +155,19 @@ void DeferredLayerUpdater::doUpdateVkTexImage() {
                        Layer::Api::OpenGL, Layer::Api::Vulkan);
                        Layer::Api::OpenGL, Layer::Api::Vulkan);


    static const mat4 identityMatrix;
    static const mat4 identityMatrix;
    updateLayer(false, identityMatrix.data);
    updateLayer(false, identityMatrix.data, HAL_DATASPACE_UNKNOWN);


    VkLayer* vkLayer = static_cast<VkLayer*>(mLayer);
    VkLayer* vkLayer = static_cast<VkLayer*>(mLayer);
    vkLayer->updateTexture();
    vkLayer->updateTexture();
}
}


void DeferredLayerUpdater::updateLayer(bool forceFilter, const float* textureTransform) {
void DeferredLayerUpdater::updateLayer(bool forceFilter, const float* textureTransform,
                                       android_dataspace dataspace) {
    mLayer->setBlend(mBlend);
    mLayer->setBlend(mBlend);
    mLayer->setForceFilter(forceFilter);
    mLayer->setForceFilter(forceFilter);
    mLayer->setSize(mWidth, mHeight);
    mLayer->setSize(mWidth, mHeight);
    mLayer->getTexTransform().load(textureTransform);
    mLayer->getTexTransform().load(textureTransform);
    mLayer->setDataSpace(dataspace);
}
}


void DeferredLayerUpdater::detachSurfaceTexture() {
void DeferredLayerUpdater::detachSurfaceTexture() {
+4 −3
Original line number Original line Diff line number Diff line
@@ -20,6 +20,7 @@
#include <SkMatrix.h>
#include <SkMatrix.h>
#include <cutils/compiler.h>
#include <cutils/compiler.h>
#include <gui/GLConsumer.h>
#include <gui/GLConsumer.h>
#include <system/graphics.h>
#include <utils/StrongPointer.h>
#include <utils/StrongPointer.h>


#include <GLES2/gl2.h>
#include <GLES2/gl2.h>
@@ -41,7 +42,7 @@ public:
    // Note that DeferredLayerUpdater assumes it is taking ownership of the layer
    // Note that DeferredLayerUpdater assumes it is taking ownership of the layer
    // and will not call incrementRef on it as a result.
    // and will not call incrementRef on it as a result.
    typedef std::function<Layer*(RenderState& renderState, uint32_t layerWidth,
    typedef std::function<Layer*(RenderState& renderState, uint32_t layerWidth,
                                 uint32_t layerHeight, SkColorFilter* colorFilter, int alpha,
                                 uint32_t layerHeight, sk_sp<SkColorFilter> colorFilter, int alpha,
                                 SkBlendMode mode, bool blend)>
                                 SkBlendMode mode, bool blend)>
            CreateLayerFn;
            CreateLayerFn;
    ANDROID_API explicit DeferredLayerUpdater(RenderState& renderState, CreateLayerFn createLayerFn,
    ANDROID_API explicit DeferredLayerUpdater(RenderState& renderState, CreateLayerFn createLayerFn,
@@ -96,7 +97,7 @@ public:


    void detachSurfaceTexture();
    void detachSurfaceTexture();


    void updateLayer(bool forceFilter, const float* textureTransform);
    void updateLayer(bool forceFilter, const float* textureTransform, android_dataspace dataspace);


    void destroyLayer();
    void destroyLayer();


@@ -109,7 +110,7 @@ private:
    int mWidth = 0;
    int mWidth = 0;
    int mHeight = 0;
    int mHeight = 0;
    bool mBlend = false;
    bool mBlend = false;
    SkColorFilter* mColorFilter = nullptr;
    sk_sp<SkColorFilter> mColorFilter;
    int mAlpha = 255;
    int mAlpha = 255;
    SkBlendMode mMode = SkBlendMode::kSrcOver;
    SkBlendMode mMode = SkBlendMode::kSrcOver;
    sp<GLConsumer> mSurfaceTexture;
    sp<GLConsumer> mSurfaceTexture;
+1 −1
Original line number Original line Diff line number Diff line
@@ -32,7 +32,7 @@ namespace android {
namespace uirenderer {
namespace uirenderer {


GlLayer::GlLayer(RenderState& renderState, uint32_t layerWidth, uint32_t layerHeight,
GlLayer::GlLayer(RenderState& renderState, uint32_t layerWidth, uint32_t layerHeight,
                 SkColorFilter* colorFilter, int alpha, SkBlendMode mode, bool blend)
                 sk_sp<SkColorFilter> colorFilter, int alpha, SkBlendMode mode, bool blend)
        : Layer(renderState, Api::OpenGL, colorFilter, alpha, mode)
        : Layer(renderState, Api::OpenGL, colorFilter, alpha, mode)
        , caches(Caches::getInstance())
        , caches(Caches::getInstance())
        , texture(caches) {
        , texture(caches) {
+1 −1
Original line number Original line Diff line number Diff line
@@ -32,7 +32,7 @@ class Caches;
class GlLayer : public Layer {
class GlLayer : public Layer {
public:
public:
    GlLayer(RenderState& renderState, uint32_t layerWidth, uint32_t layerHeight,
    GlLayer(RenderState& renderState, uint32_t layerWidth, uint32_t layerHeight,
            SkColorFilter* colorFilter, int alpha, SkBlendMode mode, bool blend);
            sk_sp<SkColorFilter> colorFilter, int alpha, SkBlendMode mode, bool blend);
    virtual ~GlLayer();
    virtual ~GlLayer();


    uint32_t getWidth() const override { return texture.mWidth; }
    uint32_t getWidth() const override { return texture.mWidth; }
+32 −8
Original line number Original line Diff line number Diff line
@@ -18,34 +18,58 @@


#include "renderstate/RenderState.h"
#include "renderstate/RenderState.h"


#include <SkColorFilter.h>
#include <SkToSRGBColorFilter.h>


namespace android {
namespace android {
namespace uirenderer {
namespace uirenderer {


Layer::Layer(RenderState& renderState, Api api, SkColorFilter* colorFilter, int alpha,
Layer::Layer(RenderState& renderState, Api api, sk_sp<SkColorFilter> colorFilter, int alpha,
             SkBlendMode mode)
             SkBlendMode mode)
        : GpuMemoryTracker(GpuObjectType::Layer)
        : GpuMemoryTracker(GpuObjectType::Layer)
        , mRenderState(renderState)
        , mRenderState(renderState)
        , mApi(api)
        , mApi(api)
        , colorFilter(nullptr)
        , mColorFilter(colorFilter)
        , alpha(alpha)
        , alpha(alpha)
        , mode(mode) {
        , mode(mode) {
    // TODO: This is a violation of Android's typical ref counting, but it
    // TODO: This is a violation of Android's typical ref counting, but it
    // preserves the old inc/dec ref locations. This should be changed...
    // preserves the old inc/dec ref locations. This should be changed...
    incStrong(nullptr);
    incStrong(nullptr);

    buildColorSpaceWithFilter();
    renderState.registerLayer(this);
    renderState.registerLayer(this);
}
}


Layer::~Layer() {
Layer::~Layer() {
    SkSafeUnref(colorFilter);

    mRenderState.unregisterLayer(this);
    mRenderState.unregisterLayer(this);
}
}


void Layer::setColorFilter(SkColorFilter* filter) {
void Layer::setColorFilter(sk_sp<SkColorFilter> filter) {
    SkRefCnt_SafeAssign(colorFilter, filter);
    if (filter != mColorFilter) {
        mColorFilter = filter;
        buildColorSpaceWithFilter();
    }
}

void Layer::setDataSpace(android_dataspace dataspace) {
    if (dataspace != mCurrentDataspace) {
        mCurrentDataspace = dataspace;
        buildColorSpaceWithFilter();
    }
}

void Layer::buildColorSpaceWithFilter() {
    sk_sp<SkColorFilter> colorSpaceFilter;
    sk_sp<SkColorSpace> colorSpace = DataSpaceToColorSpace(mCurrentDataspace);
    if (colorSpace && !colorSpace->isSRGB()) {
        colorSpaceFilter = SkToSRGBColorFilter::Make(colorSpace);
    }

    if (mColorFilter && colorSpaceFilter) {
        mColorSpaceWithFilter = mColorFilter->makeComposed(colorSpaceFilter);
    } else if (colorSpaceFilter) {
        mColorSpaceWithFilter = colorSpaceFilter;
    } else {
        mColorSpaceWithFilter = mColorFilter;
    }
}
}


void Layer::postDecStrong() {
void Layer::postDecStrong() {
Loading