diff --git a/libs/hwui/pipeline/skia/GLFunctorDrawable.cpp b/libs/hwui/pipeline/skia/GLFunctorDrawable.cpp index c58ba6868eb5d..8d5967bbd4617 100644 --- a/libs/hwui/pipeline/skia/GLFunctorDrawable.cpp +++ b/libs/hwui/pipeline/skia/GLFunctorDrawable.cpp @@ -27,6 +27,7 @@ #include "include/gpu/GpuTypes.h" // from Skia #include "utils/GLUtils.h" #include +#include "renderthread/CanvasContext.h" namespace android { namespace uirenderer { @@ -131,6 +132,8 @@ void GLFunctorDrawable::onDraw(SkCanvas* canvas) { mat4.getColMajor(&info.transform[0]); info.color_space_ptr = canvas->imageInfo().colorSpace(); info.currentHdrSdrRatio = getTargetHdrSdrRatio(info.color_space_ptr); + info.fboColorType = canvas->imageInfo().colorType(); + info.shouldDither = renderthread::CanvasContext::shouldDither(); // ensure that the framebuffer that the webview will render into is bound before we clear // the stencil and/or draw the functor. diff --git a/libs/hwui/pipeline/skia/VkFunctorDrawable.cpp b/libs/hwui/pipeline/skia/VkFunctorDrawable.cpp index e299d12b1d679..b62711f50c946 100644 --- a/libs/hwui/pipeline/skia/VkFunctorDrawable.cpp +++ b/libs/hwui/pipeline/skia/VkFunctorDrawable.cpp @@ -15,22 +15,25 @@ */ #include "VkFunctorDrawable.h" -#include #include #include #include #include #include +#include #include #include #include + #include + +#include "effects/GainmapRenderer.h" +#include "renderthread/CanvasContext.h" #include "renderthread/RenderThread.h" #include "renderthread/VulkanManager.h" #include "thread/ThreadBase.h" #include "utils/TimeUtils.h" -#include "effects/GainmapRenderer.h" namespace android { namespace uirenderer { @@ -75,6 +78,7 @@ void VkFunctorDrawHandler::draw(const GrBackendDrawableInfo& info) { .clip_bottom = mClip.fBottom, .is_layer = !vulkan_info.fFromSwapchainOrAndroidWindow, .currentHdrSdrRatio = getTargetHdrSdrRatio(mImageInfo.colorSpace()), + .shouldDither = renderthread::CanvasContext::shouldDither(), }; mat4.getColMajor(¶ms.transform[0]); params.secondary_command_buffer = vulkan_info.fSecondaryCommandBuffer; diff --git a/libs/hwui/private/hwui/DrawGlInfo.h b/libs/hwui/private/hwui/DrawGlInfo.h index 7888c8719e880..eb1f9304a5c8b 100644 --- a/libs/hwui/private/hwui/DrawGlInfo.h +++ b/libs/hwui/private/hwui/DrawGlInfo.h @@ -18,6 +18,7 @@ #define ANDROID_HWUI_DRAW_GL_INFO_H #include +#include namespace android { namespace uirenderer { @@ -91,6 +92,12 @@ struct DrawGlInfo { // be baked into the color_space_ptr, so this is just to indicate the amount of extended // range is available if desired float currentHdrSdrRatio; + + // Whether or not dithering is globally enabled + bool shouldDither; + + // The color type of the destination framebuffer + SkColorType fboColorType; }; // struct DrawGlInfo } // namespace uirenderer diff --git a/libs/hwui/private/hwui/DrawVkInfo.h b/libs/hwui/private/hwui/DrawVkInfo.h index 8f7063d72314f..1220806589278 100644 --- a/libs/hwui/private/hwui/DrawVkInfo.h +++ b/libs/hwui/private/hwui/DrawVkInfo.h @@ -76,6 +76,9 @@ struct VkFunctorDrawParams { // be baked into the color_space_ptr, so this is just to indicate the amount of extended // range is available if desired float currentHdrSdrRatio; + + // Whether or not dithering is globally enabled + bool shouldDither; }; } // namespace uirenderer diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index f60c1f3c6ad83..a73d7e4632141 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -1077,6 +1077,12 @@ void CanvasContext::startHintSession() { mHintSessionWrapper.init(); } +bool CanvasContext::shouldDither() { + CanvasContext* self = getActiveContext(); + if (!self) return false; + return self->mColorMode != ColorMode::Default; +} + } /* namespace renderthread */ } /* namespace uirenderer */ } /* namespace android */ diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h index d7215de923759..613381aeaefa3 100644 --- a/libs/hwui/renderthread/CanvasContext.h +++ b/libs/hwui/renderthread/CanvasContext.h @@ -234,6 +234,8 @@ public: void startHintSession(); + static bool shouldDither(); + private: CanvasContext(RenderThread& thread, bool translucent, RenderNode* rootRenderNode, IContextFactory* contextFactory, std::unique_ptr renderPipeline,