xref: /aosp_15_r20/external/skia/src/gpu/graphite/mtl/MtlBackendTexture.mm (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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