blob: d3522b288661deb50465db45cfdd819260347926 [file] [log] [blame]
/*
* Copyright 2024 Google LLC
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "include/core/SkString.h"
#include "include/gpu/MutableTextureState.h"
#include "include/gpu/graphite/mtl/MtlGraphiteTypes_cpp.h"
#include "src/gpu/graphite/BackendTexturePriv.h"
#include "src/gpu/graphite/mtl/MtlGraphiteUtils.h"
#include "src/gpu/mtl/MtlUtilsPriv.h"
#include <cstdint>
#import <Metal/Metal.h>
namespace skgpu::graphite {
class MtlBackendTextureData final : public BackendTextureData {
public:
MtlBackendTextureData(CFTypeRef tex) : fMtlTexture(tex) {}
#if defined(SK_DEBUG)
skgpu::BackendApi type() const override { return skgpu::BackendApi::kMetal; }
#endif
CFTypeRef texture() const { return fMtlTexture; }
private:
CFTypeRef fMtlTexture;
void copyTo(AnyBackendTextureData& dstData) const override {
// Don't assert that dstData is a metal type because it could be
// uninitialized and that assert would fail.
dstData.emplace<MtlBackendTextureData>(fMtlTexture);
}
bool equal(const BackendTextureData* that) const override {
SkASSERT(!that || that->type() == skgpu::BackendApi::kMetal);
if (auto otherMtl = static_cast<const MtlBackendTextureData*>(that)) {
return fMtlTexture == otherMtl->fMtlTexture;
}
return false;
}
};
static const MtlBackendTextureData* get_and_cast_data(const BackendTexture& tex) {
auto data = BackendTexturePriv::GetData(tex);
SkASSERT(!data || data->type() == skgpu::BackendApi::kMetal);
return static_cast<const MtlBackendTextureData*>(data);
}
namespace BackendTextures {
BackendTexture MakeMetal(SkISize dimensions, CFTypeRef mtlTexture) {
return BackendTexturePriv::Make(
dimensions, TextureInfos::MakeMetal(mtlTexture), MtlBackendTextureData(mtlTexture));
}
CFTypeRef GetMtlTexture(const BackendTexture& tex) {
if (!tex.isValid() || tex.backend() != skgpu::BackendApi::kMetal) {
return nullptr;
}
const MtlBackendTextureData* mtlData = get_and_cast_data(tex);
SkASSERT(mtlData);
return mtlData->texture();
}
} // namespace BackendTextures
} // namespace skgpu::graphite