/* * Copyright 2023 Google LLC * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef GpuToolUtils_DEFINED #define GpuToolUtils_DEFINED #include "include/core/SkCanvas.h" #include "include/core/SkImage.h" #include "include/core/SkRefCnt.h" #if defined(SK_GANESH) #include "include/gpu/ganesh/GrDirectContext.h" #include "include/gpu/ganesh/GrRecordingContext.h" #include "include/gpu/ganesh/SkImageGanesh.h" #include "src/gpu/ganesh/GrCaps.h" #include "src/gpu/ganesh/GrDirectContextPriv.h" #endif #if defined(SK_GRAPHITE) #include "include/gpu/graphite/Image.h" #include "include/gpu/graphite/Recorder.h" #endif namespace ToolUtils { // We do not put this in a .cpp file because otherwise the defines from the client // (e.g. dm) won't be seen if this is compiled into a "core" tools library. inline sk_sp MakeTextureImage(SkCanvas* canvas, sk_sp orig) { if (!orig) { return nullptr; } #if defined(SK_GANESH) if (canvas->recordingContext() && canvas->recordingContext()->asDirectContext()) { GrDirectContext* dContext = canvas->recordingContext()->asDirectContext(); const GrCaps* caps = dContext->priv().caps(); if (orig->width() >= caps->maxTextureSize() || orig->height() >= caps->maxTextureSize()) { // Ganesh is able to tile large SkImage draws. Always forcing SkImages to be uploaded // prevents this feature from being tested by our tools. For now, leave excessively // large SkImages as bitmaps. return orig; } return SkImages::TextureFromImage(dContext, orig); } #endif #if defined(SK_GRAPHITE) if (canvas->recorder()) { return SkImages::TextureFromImage(canvas->recorder(), orig, {/*fMipmapped=*/false}); } #endif return orig; } } // namespace ToolUtils #endif