diff options
Diffstat (limited to 'src/gpu/mtl/GrMtlTextureRenderTarget.mm')
-rw-r--r-- | src/gpu/mtl/GrMtlTextureRenderTarget.mm | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/src/gpu/mtl/GrMtlTextureRenderTarget.mm b/src/gpu/mtl/GrMtlTextureRenderTarget.mm new file mode 100644 index 0000000000..99d1c9e358 --- /dev/null +++ b/src/gpu/mtl/GrMtlTextureRenderTarget.mm @@ -0,0 +1,85 @@ +/* + * 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); +} + +sk_sp<GrMtlTextureRenderTarget> +GrMtlTextureRenderTarget::Make(GrMtlGpu* gpu, + const GrSurfaceDesc& desc, + id<MTLTexture> renderTexture, + int mipLevels, + SkBudgeted budgeted, + bool isWrapped) { + SkASSERT(nil != renderTexture); + if (desc.fSampleCnt > 1) { + SkASSERT(false); // Currently don't support MSAA + return nullptr; + } + GrMipMapsStatus mipMapsStatus = mipLevels > 1 ? GrMipMapsStatus::kValid + : GrMipMapsStatus::kNotAllocated; + if (!isWrapped) { + return sk_sp<GrMtlTextureRenderTarget>(new GrMtlTextureRenderTarget(gpu, + budgeted, + desc, + renderTexture, + mipMapsStatus)); + } else { + return nullptr; // Currently don't support wrapped TextureRenderTargets + } +} + + +sk_sp<GrMtlTextureRenderTarget> +GrMtlTextureRenderTarget::CreateNewTextureRenderTarget(GrMtlGpu* gpu, + SkBudgeted budgeted, + const GrSurfaceDesc& desc, + int mipLevels) { + MTLPixelFormat format; + if (!GrPixelConfigToMTLFormat(desc.fConfig, &format)) { + return nullptr; + } + + MTLTextureDescriptor* descriptor = [[MTLTextureDescriptor alloc] init]; + descriptor.textureType = MTLTextureType2D; + descriptor.pixelFormat = format; + descriptor.width = desc.fWidth; + descriptor.height = desc.fHeight; + descriptor.depth = 1; + descriptor.mipmapLevelCount = mipLevels; + descriptor.sampleCount = 1; + descriptor.arrayLength = 1; + // descriptor.resourceOptions This looks to be set by setting cpuCacheMode and storageModes + descriptor.cpuCacheMode = MTLCPUCacheModeWriteCombined; + // RenderTargets never need to be mapped so their storage mode is set to private + descriptor.storageMode = MTLStorageModePrivate; + + descriptor.usage = MTLTextureUsageRenderTarget | MTLTextureUsageShaderRead; + + id<MTLTexture> texture = [gpu->device() newTextureWithDescriptor:descriptor]; + + return Make(gpu, desc, texture, mipLevels, budgeted, false); +} + +sk_sp<GrMtlTextureRenderTarget> +GrMtlTextureRenderTarget::MakeWrappedTextureRenderTarget(GrMtlGpu* gpu, + const GrSurfaceDesc& desc, + GrWrapOwnership wrapOwnership) { + return nullptr; +} |