1*c8dee2aaSAndroid Build Coastguard Worker/* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2024 Google LLC 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker#include "include/core/SkString.h" 8*c8dee2aaSAndroid Build Coastguard Worker#include "include/gpu/MutableTextureState.h" 9*c8dee2aaSAndroid Build Coastguard Worker#include "include/gpu/graphite/mtl/MtlGraphiteTypes.h" 10*c8dee2aaSAndroid Build Coastguard Worker#include "src/gpu/graphite/BackendTexturePriv.h" 11*c8dee2aaSAndroid Build Coastguard Worker#include "src/gpu/graphite/mtl/MtlGraphiteTypesPriv.h" 12*c8dee2aaSAndroid Build Coastguard Worker#include "src/gpu/mtl/MtlUtilsPriv.h" 13*c8dee2aaSAndroid Build Coastguard Worker 14*c8dee2aaSAndroid Build Coastguard Worker#include <cstdint> 15*c8dee2aaSAndroid Build Coastguard Worker 16*c8dee2aaSAndroid Build Coastguard Worker#import <Metal/Metal.h> 17*c8dee2aaSAndroid Build Coastguard Worker 18*c8dee2aaSAndroid Build Coastguard Workernamespace skgpu::graphite { 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Workerclass MtlBackendTextureData final : public BackendTextureData { 21*c8dee2aaSAndroid Build Coastguard Workerpublic: 22*c8dee2aaSAndroid Build Coastguard Worker MtlBackendTextureData(CFTypeRef tex) : fMtlTexture(tex) {} 23*c8dee2aaSAndroid Build Coastguard Worker 24*c8dee2aaSAndroid Build Coastguard Worker#if defined(SK_DEBUG) 25*c8dee2aaSAndroid Build Coastguard Worker skgpu::BackendApi type() const override { return skgpu::BackendApi::kMetal; } 26*c8dee2aaSAndroid Build Coastguard Worker#endif 27*c8dee2aaSAndroid Build Coastguard Worker 28*c8dee2aaSAndroid Build Coastguard Worker CFTypeRef texture() const { return fMtlTexture; } 29*c8dee2aaSAndroid Build Coastguard Worker 30*c8dee2aaSAndroid Build Coastguard Workerprivate: 31*c8dee2aaSAndroid Build Coastguard Worker CFTypeRef fMtlTexture; 32*c8dee2aaSAndroid Build Coastguard Worker 33*c8dee2aaSAndroid Build Coastguard Worker void copyTo(AnyBackendTextureData& dstData) const override { 34*c8dee2aaSAndroid Build Coastguard Worker // Don't assert that dstData is a metal type because it could be 35*c8dee2aaSAndroid Build Coastguard Worker // uninitialized and that assert would fail. 36*c8dee2aaSAndroid Build Coastguard Worker dstData.emplace<MtlBackendTextureData>(fMtlTexture); 37*c8dee2aaSAndroid Build Coastguard Worker } 38*c8dee2aaSAndroid Build Coastguard Worker 39*c8dee2aaSAndroid Build Coastguard Worker bool equal(const BackendTextureData* that) const override { 40*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(!that || that->type() == skgpu::BackendApi::kMetal); 41*c8dee2aaSAndroid Build Coastguard Worker if (auto otherMtl = static_cast<const MtlBackendTextureData*>(that)) { 42*c8dee2aaSAndroid Build Coastguard Worker return fMtlTexture == otherMtl->fMtlTexture; 43*c8dee2aaSAndroid Build Coastguard Worker } 44*c8dee2aaSAndroid Build Coastguard Worker return false; 45*c8dee2aaSAndroid Build Coastguard Worker } 46*c8dee2aaSAndroid Build Coastguard Worker}; 47*c8dee2aaSAndroid Build Coastguard Worker 48*c8dee2aaSAndroid Build Coastguard Workerstatic const MtlBackendTextureData* get_and_cast_data(const BackendTexture& tex) { 49*c8dee2aaSAndroid Build Coastguard Worker auto data = BackendTexturePriv::GetData(tex); 50*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(!data || data->type() == skgpu::BackendApi::kMetal); 51*c8dee2aaSAndroid Build Coastguard Worker return static_cast<const MtlBackendTextureData*>(data); 52*c8dee2aaSAndroid Build Coastguard Worker} 53*c8dee2aaSAndroid Build Coastguard Worker 54*c8dee2aaSAndroid Build Coastguard Workernamespace BackendTextures { 55*c8dee2aaSAndroid Build Coastguard WorkerBackendTexture MakeMetal(SkISize dimensions, CFTypeRef mtlTexture) { 56*c8dee2aaSAndroid Build Coastguard Worker return BackendTexturePriv::Make( 57*c8dee2aaSAndroid Build Coastguard Worker dimensions, TextureInfos::MakeMetal(mtlTexture), MtlBackendTextureData(mtlTexture)); 58*c8dee2aaSAndroid Build Coastguard Worker} 59*c8dee2aaSAndroid Build Coastguard Worker 60*c8dee2aaSAndroid Build Coastguard WorkerCFTypeRef GetMtlTexture(const BackendTexture& tex) { 61*c8dee2aaSAndroid Build Coastguard Worker if (!tex.isValid() || tex.backend() != skgpu::BackendApi::kMetal) { 62*c8dee2aaSAndroid Build Coastguard Worker return nullptr; 63*c8dee2aaSAndroid Build Coastguard Worker } 64*c8dee2aaSAndroid Build Coastguard Worker const MtlBackendTextureData* mtlData = get_and_cast_data(tex); 65*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(mtlData); 66*c8dee2aaSAndroid Build Coastguard Worker return mtlData->texture(); 67*c8dee2aaSAndroid Build Coastguard Worker} 68*c8dee2aaSAndroid Build Coastguard Worker 69*c8dee2aaSAndroid Build Coastguard Worker} // namespace BackendTextures 70*c8dee2aaSAndroid Build Coastguard Worker 71*c8dee2aaSAndroid Build Coastguard Worker} // namespace skgpu::graphite 72