// Copyright 2022 Dolphin Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include #include "VideoCommon/AbstractFramebuffer.h" #include "VideoCommon/AbstractStagingTexture.h" #include "VideoCommon/AbstractTexture.h" #include "VideoBackends/Metal/MRCHelpers.h" namespace Metal { class Texture final : public AbstractTexture { public: explicit Texture(MRCOwned> tex, const TextureConfig& config); ~Texture(); void CopyRectangleFromTexture(const AbstractTexture* src, const MathUtil::Rectangle& src_rect, u32 src_layer, u32 src_level, const MathUtil::Rectangle& dst_rect, u32 dst_layer, u32 dst_level) override; void ResolveFromTexture(const AbstractTexture* src, const MathUtil::Rectangle& rect, u32 layer, u32 level) override; void Load(u32 level, u32 width, u32 height, u32 row_length, const u8* buffer, size_t buffer_size, u32 layer) override; id GetMTLTexture() const { return m_tex; } void SetMTLTexture(MRCOwned> tex) { m_tex = std::move(tex); } private: MRCOwned> m_tex; }; class StagingTexture final : public AbstractStagingTexture { public: StagingTexture(MRCOwned> buffer, StagingTextureType type, const TextureConfig& config); ~StagingTexture(); void CopyFromTexture(const AbstractTexture* src, const MathUtil::Rectangle& src_rect, u32 src_layer, u32 src_level, const MathUtil::Rectangle& dst_rect) override; void CopyToTexture(const MathUtil::Rectangle& src_rect, AbstractTexture* dst, const MathUtil::Rectangle& dst_rect, u32 dst_layer, u32 dst_level) override; bool Map() override; void Unmap() override; void Flush() override; private: MRCOwned> m_buffer; MRCOwned> m_wait_buffer; }; class Framebuffer final : public AbstractFramebuffer { public: Framebuffer(AbstractTexture* color, AbstractTexture* depth, u32 width, u32 height, u32 layers, u32 samples); ~Framebuffer(); id GetColor() const { return static_cast(GetColorAttachment())->GetMTLTexture(); } id GetDepth() const { return static_cast(GetDepthAttachment())->GetMTLTexture(); } }; } // namespace Metal