Loading libs/hwui/DeferredLayerUpdater.cpp +10 −6 Original line number Diff line number Diff line Loading @@ -40,7 +40,6 @@ DeferredLayerUpdater::DeferredLayerUpdater(RenderState& renderState, CreateLayer } DeferredLayerUpdater::~DeferredLayerUpdater() { SkSafeUnref(mColorFilter); setTransform(nullptr); mRenderState.unregisterDeferredLayerUpdater(this); destroyLayer(); Loading @@ -67,8 +66,11 @@ void DeferredLayerUpdater::destroyLayer() { void DeferredLayerUpdater::setPaint(const SkPaint* paint) { mAlpha = PaintUtils::getAlphaDirect(paint); mMode = PaintUtils::getBlendModeDirect(paint); SkColorFilter* colorFilter = (paint) ? paint->getColorFilter() : nullptr; SkRefCnt_SafeAssign(mColorFilter, colorFilter); if (paint) { mColorFilter = paint->refColorFilter(); } else { mColorFilter.reset(); } } void DeferredLayerUpdater::apply() { Loading Loading @@ -143,7 +145,7 @@ void DeferredLayerUpdater::doUpdateTexImage() { #endif 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); static const mat4 identityMatrix; updateLayer(false, identityMatrix.data); updateLayer(false, identityMatrix.data, HAL_DATASPACE_UNKNOWN); VkLayer* vkLayer = static_cast<VkLayer*>(mLayer); 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->setForceFilter(forceFilter); mLayer->setSize(mWidth, mHeight); mLayer->getTexTransform().load(textureTransform); mLayer->setDataSpace(dataspace); } void DeferredLayerUpdater::detachSurfaceTexture() { Loading libs/hwui/DeferredLayerUpdater.h +4 −3 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ #include <SkMatrix.h> #include <cutils/compiler.h> #include <gui/GLConsumer.h> #include <system/graphics.h> #include <utils/StrongPointer.h> #include <GLES2/gl2.h> Loading @@ -41,7 +42,7 @@ public: // Note that DeferredLayerUpdater assumes it is taking ownership of the layer // and will not call incrementRef on it as a result. 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)> CreateLayerFn; ANDROID_API explicit DeferredLayerUpdater(RenderState& renderState, CreateLayerFn createLayerFn, Loading Loading @@ -96,7 +97,7 @@ public: void detachSurfaceTexture(); void updateLayer(bool forceFilter, const float* textureTransform); void updateLayer(bool forceFilter, const float* textureTransform, android_dataspace dataspace); void destroyLayer(); Loading @@ -109,7 +110,7 @@ private: int mWidth = 0; int mHeight = 0; bool mBlend = false; SkColorFilter* mColorFilter = nullptr; sk_sp<SkColorFilter> mColorFilter; int mAlpha = 255; SkBlendMode mMode = SkBlendMode::kSrcOver; sp<GLConsumer> mSurfaceTexture; Loading libs/hwui/GlLayer.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -32,7 +32,7 @@ namespace android { namespace uirenderer { 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) , caches(Caches::getInstance()) , texture(caches) { Loading libs/hwui/GlLayer.h +1 −1 Original line number Diff line number Diff line Loading @@ -32,7 +32,7 @@ class Caches; class GlLayer : public Layer { public: 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(); uint32_t getWidth() const override { return texture.mWidth; } Loading libs/hwui/Layer.cpp +32 −8 Original line number Diff line number Diff line Loading @@ -18,34 +18,58 @@ #include "renderstate/RenderState.h" #include <SkColorFilter.h> #include <SkToSRGBColorFilter.h> namespace android { 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) : GpuMemoryTracker(GpuObjectType::Layer) , mRenderState(renderState) , mApi(api) , colorFilter(nullptr) , mColorFilter(colorFilter) , alpha(alpha) , mode(mode) { // TODO: This is a violation of Android's typical ref counting, but it // preserves the old inc/dec ref locations. This should be changed... incStrong(nullptr); buildColorSpaceWithFilter(); renderState.registerLayer(this); } Layer::~Layer() { SkSafeUnref(colorFilter); mRenderState.unregisterLayer(this); } void Layer::setColorFilter(SkColorFilter* filter) { SkRefCnt_SafeAssign(colorFilter, filter); void Layer::setColorFilter(sk_sp<SkColorFilter> 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() { Loading Loading
libs/hwui/DeferredLayerUpdater.cpp +10 −6 Original line number Diff line number Diff line Loading @@ -40,7 +40,6 @@ DeferredLayerUpdater::DeferredLayerUpdater(RenderState& renderState, CreateLayer } DeferredLayerUpdater::~DeferredLayerUpdater() { SkSafeUnref(mColorFilter); setTransform(nullptr); mRenderState.unregisterDeferredLayerUpdater(this); destroyLayer(); Loading @@ -67,8 +66,11 @@ void DeferredLayerUpdater::destroyLayer() { void DeferredLayerUpdater::setPaint(const SkPaint* paint) { mAlpha = PaintUtils::getAlphaDirect(paint); mMode = PaintUtils::getBlendModeDirect(paint); SkColorFilter* colorFilter = (paint) ? paint->getColorFilter() : nullptr; SkRefCnt_SafeAssign(mColorFilter, colorFilter); if (paint) { mColorFilter = paint->refColorFilter(); } else { mColorFilter.reset(); } } void DeferredLayerUpdater::apply() { Loading Loading @@ -143,7 +145,7 @@ void DeferredLayerUpdater::doUpdateTexImage() { #endif 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); static const mat4 identityMatrix; updateLayer(false, identityMatrix.data); updateLayer(false, identityMatrix.data, HAL_DATASPACE_UNKNOWN); VkLayer* vkLayer = static_cast<VkLayer*>(mLayer); 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->setForceFilter(forceFilter); mLayer->setSize(mWidth, mHeight); mLayer->getTexTransform().load(textureTransform); mLayer->setDataSpace(dataspace); } void DeferredLayerUpdater::detachSurfaceTexture() { Loading
libs/hwui/DeferredLayerUpdater.h +4 −3 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ #include <SkMatrix.h> #include <cutils/compiler.h> #include <gui/GLConsumer.h> #include <system/graphics.h> #include <utils/StrongPointer.h> #include <GLES2/gl2.h> Loading @@ -41,7 +42,7 @@ public: // Note that DeferredLayerUpdater assumes it is taking ownership of the layer // and will not call incrementRef on it as a result. 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)> CreateLayerFn; ANDROID_API explicit DeferredLayerUpdater(RenderState& renderState, CreateLayerFn createLayerFn, Loading Loading @@ -96,7 +97,7 @@ public: void detachSurfaceTexture(); void updateLayer(bool forceFilter, const float* textureTransform); void updateLayer(bool forceFilter, const float* textureTransform, android_dataspace dataspace); void destroyLayer(); Loading @@ -109,7 +110,7 @@ private: int mWidth = 0; int mHeight = 0; bool mBlend = false; SkColorFilter* mColorFilter = nullptr; sk_sp<SkColorFilter> mColorFilter; int mAlpha = 255; SkBlendMode mMode = SkBlendMode::kSrcOver; sp<GLConsumer> mSurfaceTexture; Loading
libs/hwui/GlLayer.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -32,7 +32,7 @@ namespace android { namespace uirenderer { 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) , caches(Caches::getInstance()) , texture(caches) { Loading
libs/hwui/GlLayer.h +1 −1 Original line number Diff line number Diff line Loading @@ -32,7 +32,7 @@ class Caches; class GlLayer : public Layer { public: 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(); uint32_t getWidth() const override { return texture.mWidth; } Loading
libs/hwui/Layer.cpp +32 −8 Original line number Diff line number Diff line Loading @@ -18,34 +18,58 @@ #include "renderstate/RenderState.h" #include <SkColorFilter.h> #include <SkToSRGBColorFilter.h> namespace android { 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) : GpuMemoryTracker(GpuObjectType::Layer) , mRenderState(renderState) , mApi(api) , colorFilter(nullptr) , mColorFilter(colorFilter) , alpha(alpha) , mode(mode) { // TODO: This is a violation of Android's typical ref counting, but it // preserves the old inc/dec ref locations. This should be changed... incStrong(nullptr); buildColorSpaceWithFilter(); renderState.registerLayer(this); } Layer::~Layer() { SkSafeUnref(colorFilter); mRenderState.unregisterLayer(this); } void Layer::setColorFilter(SkColorFilter* filter) { SkRefCnt_SafeAssign(colorFilter, filter); void Layer::setColorFilter(sk_sp<SkColorFilter> 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() { Loading