blob: efeea3598f4e081ed89d6a2966d3764cd6eaa235 [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/BaseDevice.h"
#include "include/gpu/GrRecordingContext.h"
#include "src/gpu/GrProxyProvider.h"
#include "src/gpu/GrRecordingContextPriv.h"
#include "src/gpu/GrSurfaceProxyView.h"
#define ASSERT_SINGLE_OWNER GR_ASSERT_SINGLE_OWNER(fContext->priv().singleOwner())
namespace skgpu {
BaseDevice::BaseDevice(sk_sp<GrRecordingContext> rContext,
const SkImageInfo& ii,
const SkSurfaceProps& props)
: INHERITED(ii, props)
, fContext(std::move(rContext)) {
}
GrRenderTargetProxy* BaseDevice::targetProxy() {
return this->readSurfaceView().asRenderTargetProxy();
}
bool BaseDevice::replaceBackingProxy(SkSurface::ContentChangeMode mode) {
ASSERT_SINGLE_OWNER
const SkImageInfo& ii = this->imageInfo();
GrRenderTargetProxy* oldRTP = this->targetProxy();
GrSurfaceProxyView oldView = this->readSurfaceView();
auto grColorType = SkColorTypeToGrColorType(ii.colorType());
auto format = fContext->priv().caps()->getDefaultBackendFormat(grColorType, GrRenderable::kYes);
if (!format.isValid()) {
return false;
}
GrProxyProvider* proxyProvider = fContext->priv().proxyProvider();
// This entry point is used by SkSurface_Gpu::onCopyOnWrite so it must create a
// kExact-backed render target proxy
sk_sp<GrTextureProxy> proxy = proxyProvider->createProxy(format,
ii.dimensions(),
GrRenderable::kYes,
oldRTP->numSamples(),
oldView.mipmapped(),
SkBackingFit::kExact,
oldRTP->isBudgeted(),
GrProtected::kNo);
if (!proxy) {
return false;
}
return this->replaceBackingProxy(mode, sk_ref_sp(proxy->asRenderTargetProxy()),
grColorType, ii.refColorSpace(), oldView.origin(),
this->surfaceProps());
}
} // namespace skgpu