diff options
Diffstat (limited to 'gfx/skia/skia/src/gpu/mtl/GrMtlStencilAttachment.mm')
-rw-r--r-- | gfx/skia/skia/src/gpu/mtl/GrMtlStencilAttachment.mm | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/gfx/skia/skia/src/gpu/mtl/GrMtlStencilAttachment.mm b/gfx/skia/skia/src/gpu/mtl/GrMtlStencilAttachment.mm new file mode 100644 index 0000000000..01ed2c245f --- /dev/null +++ b/gfx/skia/skia/src/gpu/mtl/GrMtlStencilAttachment.mm @@ -0,0 +1,72 @@ +/* + * Copyright 2018 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "src/gpu/mtl/GrMtlGpu.h" +#include "src/gpu/mtl/GrMtlUtil.h" + +#if !__has_feature(objc_arc) +#error This file must be compiled with Arc. Use -fobjc-arc flag +#endif + +GrMtlStencilAttachment::GrMtlStencilAttachment(GrMtlGpu* gpu, + const Format& format, + const id<MTLTexture> stencilView) + : GrStencilAttachment(gpu, stencilView.width, stencilView.height, format.fStencilBits, + stencilView.sampleCount) + , fFormat(format) + , fStencilView(stencilView) { + this->registerWithCache(SkBudgeted::kYes); +} + +GrMtlStencilAttachment* GrMtlStencilAttachment::Create(GrMtlGpu* gpu, + int width, + int height, + int sampleCnt, + const Format& format) { + MTLTextureDescriptor* desc = + [MTLTextureDescriptor texture2DDescriptorWithPixelFormat:format.fInternalFormat + width:width + height:height + mipmapped:NO]; + if (@available(macOS 10.11, iOS 9.0, *)) { + desc.storageMode = MTLStorageModePrivate; + desc.usage = MTLTextureUsageRenderTarget; + } + desc.sampleCount = sampleCnt; + if (sampleCnt > 1) { + desc.textureType = MTLTextureType2DMultisample; + } + return new GrMtlStencilAttachment(gpu, format, [gpu->device() newTextureWithDescriptor:desc]); +} + +GrMtlStencilAttachment::~GrMtlStencilAttachment() { + // should have been released or abandoned first + SkASSERT(!fStencilView); +} + +size_t GrMtlStencilAttachment::onGpuMemorySize() const { + uint64_t size = this->width(); + size *= this->height(); + size *= fFormat.fTotalBits; + size *= this->numSamples(); + return static_cast<size_t>(size / 8); +} + +void GrMtlStencilAttachment::onRelease() { + fStencilView = nullptr; + GrStencilAttachment::onRelease(); +} + +void GrMtlStencilAttachment::onAbandon() { + fStencilView = nullptr; + GrStencilAttachment::onAbandon(); +} + +GrMtlGpu* GrMtlStencilAttachment::getMtlGpu() const { + SkASSERT(!this->wasDestroyed()); + return static_cast<GrMtlGpu*>(this->getGpu()); +} |