blob: 104a20a1bf934be581cde2815488112c3b4d0196 [file] [log] [blame]
/*
* 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<SkImage> MakeTextureImage(SkCanvas* canvas, sk_sp<SkImage> 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