From bf940ae42a9d3bc10458a58e8e86ca5872934e1c Mon Sep 17 00:00:00 2001 From: Oli Date: Tue, 18 Mar 2025 00:22:25 +0000 Subject: [PATCH] Direct2D: Do image cloning on GPU when possible Co-authored-by: Matt Gonzalez --- .../native/juce_Direct2DImage_windows.cpp | 22 +++++++++++++++++++ .../native/juce_Direct2DImage_windows.h | 9 ++------ 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/modules/juce_graphics/native/juce_Direct2DImage_windows.cpp b/modules/juce_graphics/native/juce_Direct2DImage_windows.cpp index d107483c0e..2ff5ffa5c6 100644 --- a/modules/juce_graphics/native/juce_Direct2DImage_windows.cpp +++ b/modules/juce_graphics/native/juce_Direct2DImage_windows.cpp @@ -537,6 +537,28 @@ private: bool initialState = extensions.isBackupEnabled(); }; +ImagePixelData::Ptr Direct2DPixelData::clone() +{ + auto device = getMostRelevantDevice(); + auto* exts = getBackupExtensions(); + + if (device == nullptr || exts == nullptr || exts->isBackupEnabled()) + return new Direct2DPixelData { backingData->clone(), State::drawn }; + + Ptr clonedPixelData = new Direct2DPixelData { pixelFormat, width, height, false }; + + const ScopedBackupDisabler scope { *this }; + const ScopedBackupDisabler clonedScope { *clonedPixelData }; + + copyPages (device, + *clonedPixelData, + *this, + { 0, 0 }, + { 0, 0, width, height }); + + return clonedPixelData; +} + void Direct2DPixelData::moveValidatedImageSection (Point destTopLeft, Rectangle sourceRect) { auto device = getMostRelevantDevice(); diff --git a/modules/juce_graphics/native/juce_Direct2DImage_windows.h b/modules/juce_graphics/native/juce_Direct2DImage_windows.h index 97def496a2..fa20c3b722 100644 --- a/modules/juce_graphics/native/juce_Direct2DImage_windows.h +++ b/modules/juce_graphics/native/juce_Direct2DImage_windows.h @@ -138,13 +138,8 @@ public: ~Direct2DPixelData() override; - /* Creates new software image storage with content matching the content of this image. - Does not copy any hardware resources. - */ - ImagePixelData::Ptr clone() override - { - return new Direct2DPixelData (backingData->clone(), State::drawn); - } + /* Creates new image storage with content matching the content of this image. */ + ImagePixelData::Ptr clone() override; std::unique_ptr createType() const override {