blob: c8164a67d2849314e653950553c16fc6a3ccc748 [file] [log] [blame]
/*
* Copyright 2021 Google LLC
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "src/gpu/graphite/Image_Graphite.h"
#include "include/core/SkColorSpace.h"
#include "include/core/SkImageInfo.h"
#include "include/gpu/graphite/Recorder.h"
#include "src/gpu/graphite/Caps.h"
#include "src/gpu/graphite/RecorderPriv.h"
#include "src/gpu/graphite/TextureUtils.h"
namespace skgpu::graphite {
Image::Image(uint32_t uniqueID,
TextureProxyView view,
const SkColorInfo& info)
: SkImage_Base(SkImageInfo::Make(view.proxy()->dimensions(), info), uniqueID)
, fTextureProxyView(std::move(view)) {
}
Image::Image(TextureProxyView view,
const SkColorInfo& info)
: SkImage_Base(SkImageInfo::Make(view.proxy()->dimensions(), info), kNeedNewImageUniqueID)
, fTextureProxyView(std::move(view)) {
}
Image::~Image() {}
bool Image::testingOnly_ReadPixels(Context* context,
Recorder* recorder,
const SkImageInfo& dstInfo,
void* dstPixels,
size_t dstRowBytes,
int srcX,
int srcY) {
return ReadPixelsHelper([recorder]() {
recorder->priv().flushTrackedDevices();
},
context,
recorder,
fTextureProxyView.proxy(),
dstInfo,
dstPixels,
dstRowBytes,
srcX,
srcY);
}
std::tuple<TextureProxyView, SkColorType> Image::onAsView(Recorder*,
Mipmapped mipmapped) const {
if (fTextureProxyView.proxy()->mipmapped() != mipmapped) {
// We will not generate miplevels
return {};
}
SkColorType ct = this->colorType();
return {fTextureProxyView, ct};
}
} // namespace skgpu::graphite
sk_sp<SkImage> SkImage::makeTextureImage(skgpu::graphite::Recorder* recorder,
RequiredImageProperties requiredProps) const {
if (!recorder) {
return nullptr;
}
if (this->dimensions().area() <= 1) {
requiredProps.fMipmapped = skgpu::graphite::Mipmapped::kNo;
}
if (as_IB(this)->isGraphiteBacked()) {
if (requiredProps.fMipmapped == skgpu::graphite::Mipmapped::kNo || this->hasMipmaps()) {
const SkImage* image = this;
return sk_ref_sp(const_cast<SkImage*>(image));
}
}
auto [view, ct] = as_IB(this)->asView(recorder, requiredProps.fMipmapped);
if (!view) {
return nullptr;
}
SkASSERT(view.proxy());
SkASSERT(requiredProps.fMipmapped == skgpu::graphite::Mipmapped::kNo ||
view.proxy()->mipmapped() == skgpu::graphite::Mipmapped::kYes);
SkColorInfo colorInfo(ct, this->alphaType(), this->refColorSpace());
return sk_make_sp<skgpu::graphite::Image>(std::move(view),
std::move(colorInfo));
}