diff options
author | Timothy Liang <timliang@google.com> | 2018-07-02 17:36:20 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-07-11 16:27:28 +0000 |
commit | 58f153db313033289ce4a0a7f68bdf6c66238460 (patch) | |
tree | 8c3a4cbde7d6d38680756ff2144fc3b88aaab3c7 /src/gpu/mtl/GrMtlGpu.mm | |
parent | 0421083a447a8ab105d20c786f7d8377f30a6d5d (diff) |
refactored where texture descriptors are made for metal gpu backend
Bug: skia:
Change-Id: Ic90660b5ad5c1e795cd768bb7471e9ac80a59f47
Reviewed-on: https://skia-review.googlesource.com/138999
Reviewed-by: Greg Daniel <egdaniel@google.com>
Commit-Queue: Timothy Liang <timliang@google.com>
Diffstat (limited to 'src/gpu/mtl/GrMtlGpu.mm')
-rw-r--r-- | src/gpu/mtl/GrMtlGpu.mm | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/src/gpu/mtl/GrMtlGpu.mm b/src/gpu/mtl/GrMtlGpu.mm index d9dd3160ab..8c5f9ddf67 100644 --- a/src/gpu/mtl/GrMtlGpu.mm +++ b/src/gpu/mtl/GrMtlGpu.mm @@ -127,15 +127,48 @@ sk_sp<GrTexture> GrMtlGpu::onCreateTexture(const GrSurfaceDesc& desc, SkBudgeted if (!fMtlCaps->isConfigTexturable(desc.fConfig)) { return nullptr; } + MTLPixelFormat format; + if (!GrPixelConfigToMTLFormat(desc.fConfig, &format)) { + return nullptr; + } bool renderTarget = SkToBool(desc.fFlags & kRenderTarget_GrSurfaceFlag); + // This TexDesc refers to the texture that will be read by the client. Thus even if msaa is + // requested, this TexDesc describes the resolved texture. Therefore we always have samples set + // to 1. + MTLTextureDescriptor* texDesc = [[MTLTextureDescriptor alloc] init]; + texDesc.textureType = MTLTextureType2D; + texDesc.pixelFormat = format; + texDesc.width = desc.fWidth; + texDesc.height = desc.fHeight; + texDesc.depth = 1; + texDesc.mipmapLevelCount = mipLevels; + texDesc.sampleCount = 1; + texDesc.arrayLength = 1; + texDesc.cpuCacheMode = MTLCPUCacheModeWriteCombined; + // Make all textures have private gpu only access. We can use transfer buffers or textures + // to copy to them. + texDesc.storageMode = MTLStorageModePrivate; + texDesc.usage = MTLTextureUsageShaderRead | renderTarget ? MTLTextureUsageRenderTarget : 0; + + GrMipMapsStatus mipMapsStatus = GrMipMapsStatus::kNotAllocated; + if (mipLevels > 1) { + mipMapsStatus = GrMipMapsStatus::kValid; + for (int i = 0; i < mipLevels; ++i) { + if (!texels[i].fPixels) { + mipMapsStatus = GrMipMapsStatus::kDirty; + break; + } + } + } + sk_sp<GrMtlTexture> tex; if (renderTarget) { tex = GrMtlTextureRenderTarget::CreateNewTextureRenderTarget(this, budgeted, - desc, mipLevels); + desc, texDesc, mipMapsStatus); } else { - tex = GrMtlTexture::CreateNewTexture(this, budgeted, desc, mipLevels); + tex = GrMtlTexture::CreateNewTexture(this, budgeted, desc, texDesc, mipMapsStatus); } if (!tex) { |