blob: 36fa788eb596c60cc1eb4c3373786c8f6e3ab0e5 [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"
#include "src/gpu/SurfaceContext.h"
#include "src/gpu/SurfaceFillContext.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)) {
}
GrSurfaceProxyView BaseDevice::readSurfaceView() {
return this->surfaceFillContext()->readSurfaceView();
}
/** Checks that the alpha type is legal and gets constructor flags. Returns false if device creation
should fail. */
bool BaseDevice::CheckAlphaTypeAndGetFlags(SkAlphaType alphaType,
InitContents init,
DeviceFlags* flags) {
*flags = DeviceFlags::kNone;
switch (alphaType) {
case kPremul_SkAlphaType:
break;
case kOpaque_SkAlphaType:
*flags |= DeviceFlags::kIsOpaque;
break;
default: // If it is unpremul or unknown don't try to render
return false;
}
if (InitContents::kClear == init) {
*flags |= DeviceFlags::kNeedClear;
}
return true;
}
SkImageInfo BaseDevice::MakeInfo(SurfaceContext* sc, DeviceFlags flags) {
SkColorType colorType = GrColorTypeToSkColorType(sc->colorInfo().colorType());
return SkImageInfo::Make(sc->width(), sc->height(), colorType,
flags & DeviceFlags::kIsOpaque ? kOpaque_SkAlphaType
: kPremul_SkAlphaType,
sc->colorInfo().refColorSpace());
}
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