Loading libs/hwui/DeferredLayerUpdater.cpp +10 −6 Original line number Original line Diff line number Diff line Loading @@ -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(); Loading @@ -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() { Loading Loading @@ -143,7 +145,7 @@ void DeferredLayerUpdater::doUpdateTexImage() { #endif #endif mSurfaceTexture->getTransformMatrix(transform); mSurfaceTexture->getTransformMatrix(transform); updateLayer(forceFilter, transform); updateLayer(forceFilter, transform, mSurfaceTexture->getCurrentDataSpace()); } } } } Loading @@ -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() { Loading libs/hwui/DeferredLayerUpdater.h +4 −3 Original line number Original line Diff line number Diff line Loading @@ -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> Loading @@ -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, Loading Loading @@ -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(); Loading @@ -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; Loading libs/hwui/GlLayer.cpp +1 −1 Original line number Original line Diff line number Diff line Loading @@ -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) { Loading libs/hwui/GlLayer.h +1 −1 Original line number Original line Diff line number Diff line Loading @@ -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; } Loading libs/hwui/Layer.cpp +32 −8 Original line number Original line Diff line number Diff line Loading @@ -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 Loading
libs/hwui/DeferredLayerUpdater.cpp +10 −6 Original line number Original line Diff line number Diff line Loading @@ -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(); Loading @@ -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() { Loading Loading @@ -143,7 +145,7 @@ void DeferredLayerUpdater::doUpdateTexImage() { #endif #endif mSurfaceTexture->getTransformMatrix(transform); mSurfaceTexture->getTransformMatrix(transform); updateLayer(forceFilter, transform); updateLayer(forceFilter, transform, mSurfaceTexture->getCurrentDataSpace()); } } } } Loading @@ -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() { Loading
libs/hwui/DeferredLayerUpdater.h +4 −3 Original line number Original line Diff line number Diff line Loading @@ -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> Loading @@ -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, Loading Loading @@ -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(); Loading @@ -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; Loading
libs/hwui/GlLayer.cpp +1 −1 Original line number Original line Diff line number Diff line Loading @@ -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) { Loading
libs/hwui/GlLayer.h +1 −1 Original line number Original line Diff line number Diff line Loading @@ -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; } Loading
libs/hwui/Layer.cpp +32 −8 Original line number Original line Diff line number Diff line Loading @@ -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