/* * 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 "GrMtlTextureRenderTarget.h" #include "GrMtlGpu.h" #include "GrMtlUtil.h" GrMtlTextureRenderTarget::GrMtlTextureRenderTarget(GrMtlGpu* gpu, SkBudgeted budgeted, const GrSurfaceDesc& desc, id<MTLTexture> renderTexture, GrMipMapsStatus mipMapsStatus) : GrSurface(gpu, desc) , GrMtlTexture(gpu, desc, renderTexture, mipMapsStatus) , GrMtlRenderTarget(gpu, desc, renderTexture) { this->registerWithCache(budgeted); } GrMtlTextureRenderTarget::GrMtlTextureRenderTarget(GrMtlGpu* gpu, const GrSurfaceDesc& desc, id<MTLTexture> renderTexture, GrMipMapsStatus mipMapsStatus, GrWrapCacheable cacheable) : GrSurface(gpu, desc) , GrMtlTexture(gpu, desc, renderTexture, mipMapsStatus) , GrMtlRenderTarget(gpu, desc, renderTexture) { this->registerWithCacheWrapped(cacheable); } sk_sp<GrMtlTextureRenderTarget> GrMtlTextureRenderTarget::CreateNewTextureRenderTarget(GrMtlGpu* gpu, SkBudgeted budgeted, const GrSurfaceDesc& desc, MTLTextureDescriptor* texDesc, GrMipMapsStatus mipMapsStatus) { id<MTLTexture> renderTexture = [gpu->device() newTextureWithDescriptor:texDesc]; SkASSERT(nil != renderTexture); if (desc.fSampleCnt > 1) { return nullptr; } SkASSERT((MTLTextureUsageShaderRead | MTLTextureUsageRenderTarget) & renderTexture.usage); return sk_sp<GrMtlTextureRenderTarget>( new GrMtlTextureRenderTarget(gpu, budgeted, desc, renderTexture, mipMapsStatus)); } sk_sp<GrMtlTextureRenderTarget> GrMtlTextureRenderTarget::MakeWrappedTextureRenderTarget( GrMtlGpu* gpu, const GrSurfaceDesc& desc, id<MTLTexture> renderTexture, GrWrapCacheable cacheable) { SkASSERT(nil != renderTexture); GrMipMapsStatus mipMapsStatus = renderTexture.mipmapLevelCount > 1 ? GrMipMapsStatus::kDirty : GrMipMapsStatus::kNotAllocated; if (desc.fSampleCnt > 1) { return nullptr; } SkASSERT((MTLTextureUsageShaderRead | MTLTextureUsageRenderTarget) & renderTexture.usage); return sk_sp<GrMtlTextureRenderTarget>( new GrMtlTextureRenderTarget(gpu, desc, renderTexture, mipMapsStatus, cacheable)); }