blob: a2d8fa3539a1e7cea98b5577aee37dfe05f0b757 [file] [log] [blame]
/*
* 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 "GrMtlGpu.h"
#include "GrMtlUtil.h"
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];
desc.resourceOptions = MTLResourceStorageModePrivate;
desc.usage = MTLTextureUsageRenderTarget;
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());
}