summaryrefslogtreecommitdiffstats
path: root/gfx/skia/skia/src/gpu/mtl/GrMtlStencilAttachment.mm
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/skia/skia/src/gpu/mtl/GrMtlStencilAttachment.mm')
-rw-r--r--gfx/skia/skia/src/gpu/mtl/GrMtlStencilAttachment.mm72
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());
+}