// SPDX-FileCopyrightText: 2019-2024 Connor McLaughlin // SPDX-License-Identifier: CC-BY-NC-ND-4.0 #pragma once #include "gpu.h" #include "gpu_backend.h" #include "util/gpu_device.h" #include "common/heap_array.h" #include // TODO: Move to cpp // TODO: Rename to GPUSWBackend, preserved to avoid conflicts. class GPU_SW final : public GPUBackend { public: GPU_SW(GPUPresenter& presenter); ~GPU_SW() override; bool Initialize(bool upload_vram, Error* error) override; void RestoreDeviceContext() override; void FlushRender() override; u32 GetResolutionScale() const override; void ReadVRAM(u32 x, u32 y, u32 width, u32 height) override; void FillVRAM(u32 x, u32 y, u32 width, u32 height, u32 color, bool interlaced_rendering, u8 active_line_lsb) override; void UpdateVRAM(u32 x, u32 y, u32 width, u32 height, const void* data, bool set_mask, bool check_mask) override; void CopyVRAM(u32 src_x, u32 src_y, u32 dst_x, u32 dst_y, u32 width, u32 height, bool set_mask, bool check_mask) override; void DrawPolygon(const GPUBackendDrawPolygonCommand* cmd) override; void DrawPrecisePolygon(const GPUBackendDrawPrecisePolygonCommand* cmd) override; void DrawLine(const GPUBackendDrawLineCommand* cmd) override; void DrawPreciseLine(const GPUBackendDrawPreciseLineCommand* cmd) override; void DrawSprite(const GPUBackendDrawRectangleCommand* cmd) override; void DrawingAreaChanged() override; void ClearCache() override; void OnBufferSwapped() override; void UpdateDisplay(const GPUBackendUpdateDisplayCommand* cmd) override; void ClearVRAM() override; void LoadState(const GPUBackendLoadStateCommand* cmd) override; bool AllocateMemorySaveState(System::MemorySaveState& mss, Error* error) override; void DoMemoryState(StateWrapper& sw, System::MemorySaveState& mss) override; private: static constexpr GPUTexture::Format FORMAT_FOR_24BIT = GPUTexture::Format::RGBA8; // RGBA8 always supported. template bool CopyOut15Bit(u32 src_x, u32 src_y, u32 width, u32 height, u32 line_skip); bool CopyOut24Bit(u32 src_x, u32 src_y, u32 skip_x, u32 width, u32 height, u32 line_skip); bool CopyOut(u32 src_x, u32 src_y, u32 skip_x, u32 width, u32 height, u32 line_skip, bool is_24bit); GPUTexture* GetDisplayTexture(u32 width, u32 height, GPUTexture::Format format); FixedHeapArray m_upload_buffer; GPUTexture::Format m_16bit_display_format = GPUTexture::Format::Unknown; std::unique_ptr m_upload_texture; };