aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/mtl/GrMtlGpu.mm
diff options
context:
space:
mode:
authorGravatar Timothy Liang <timliang@google.com>2018-07-02 17:36:20 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2018-07-11 16:27:28 +0000
commit58f153db313033289ce4a0a7f68bdf6c66238460 (patch)
tree8c3a4cbde7d6d38680756ff2144fc3b88aaab3c7 /src/gpu/mtl/GrMtlGpu.mm
parent0421083a447a8ab105d20c786f7d8377f30a6d5d (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.mm37
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) {