mirror of
https://gitlab.com/suyu-emu/suyu.git
synced 2024-03-15 23:15:44 +00:00
45fb74d262
Makes the class interface consistent and provides accessors for obtaining a reference to the memory manager instance. Given we also return references, this makes our more flimsy uses of const apparent, given const doesn't propagate through pointers in the way one would typically expect. This makes our mutable state more apparent in some places.
112 lines
3.3 KiB
C++
112 lines
3.3 KiB
C++
// Copyright 2018 yuzu Emulator Project
|
|
// Licensed under GPLv2 or any later version
|
|
// Refer to the license.txt file included.
|
|
|
|
#include "common/assert.h"
|
|
#include "video_core/engines/fermi_2d.h"
|
|
#include "video_core/engines/maxwell_3d.h"
|
|
#include "video_core/engines/maxwell_compute.h"
|
|
#include "video_core/engines/maxwell_dma.h"
|
|
#include "video_core/gpu.h"
|
|
#include "video_core/rasterizer_interface.h"
|
|
|
|
namespace Tegra {
|
|
|
|
u32 FramebufferConfig::BytesPerPixel(PixelFormat format) {
|
|
switch (format) {
|
|
case PixelFormat::ABGR8:
|
|
return 4;
|
|
}
|
|
|
|
UNREACHABLE();
|
|
}
|
|
|
|
GPU::GPU(VideoCore::RasterizerInterface& rasterizer) {
|
|
memory_manager = std::make_unique<Tegra::MemoryManager>();
|
|
maxwell_3d = std::make_unique<Engines::Maxwell3D>(rasterizer, *memory_manager);
|
|
fermi_2d = std::make_unique<Engines::Fermi2D>(*memory_manager);
|
|
maxwell_compute = std::make_unique<Engines::MaxwellCompute>();
|
|
maxwell_dma = std::make_unique<Engines::MaxwellDMA>(*memory_manager);
|
|
}
|
|
|
|
GPU::~GPU() = default;
|
|
|
|
Engines::Maxwell3D& GPU::Maxwell3D() {
|
|
return *maxwell_3d;
|
|
}
|
|
|
|
const Engines::Maxwell3D& GPU::Maxwell3D() const {
|
|
return *maxwell_3d;
|
|
}
|
|
|
|
MemoryManager& GPU::MemoryManager() {
|
|
return *memory_manager;
|
|
}
|
|
|
|
const MemoryManager& GPU::MemoryManager() const {
|
|
return *memory_manager;
|
|
}
|
|
|
|
u32 RenderTargetBytesPerPixel(RenderTargetFormat format) {
|
|
ASSERT(format != RenderTargetFormat::NONE);
|
|
|
|
switch (format) {
|
|
case RenderTargetFormat::RGBA32_FLOAT:
|
|
case RenderTargetFormat::RGBA32_UINT:
|
|
return 16;
|
|
case RenderTargetFormat::RGBA16_UINT:
|
|
case RenderTargetFormat::RGBA16_UNORM:
|
|
case RenderTargetFormat::RGBA16_FLOAT:
|
|
case RenderTargetFormat::RG32_FLOAT:
|
|
case RenderTargetFormat::RG32_UINT:
|
|
return 8;
|
|
case RenderTargetFormat::RGBA8_UNORM:
|
|
case RenderTargetFormat::RGBA8_SNORM:
|
|
case RenderTargetFormat::RGBA8_SRGB:
|
|
case RenderTargetFormat::RGBA8_UINT:
|
|
case RenderTargetFormat::RGB10_A2_UNORM:
|
|
case RenderTargetFormat::BGRA8_UNORM:
|
|
case RenderTargetFormat::RG16_UNORM:
|
|
case RenderTargetFormat::RG16_SNORM:
|
|
case RenderTargetFormat::RG16_UINT:
|
|
case RenderTargetFormat::RG16_SINT:
|
|
case RenderTargetFormat::RG16_FLOAT:
|
|
case RenderTargetFormat::R32_FLOAT:
|
|
case RenderTargetFormat::R11G11B10_FLOAT:
|
|
case RenderTargetFormat::R32_UINT:
|
|
return 4;
|
|
case RenderTargetFormat::R16_UNORM:
|
|
case RenderTargetFormat::R16_SNORM:
|
|
case RenderTargetFormat::R16_UINT:
|
|
case RenderTargetFormat::R16_SINT:
|
|
case RenderTargetFormat::R16_FLOAT:
|
|
case RenderTargetFormat::RG8_UNORM:
|
|
case RenderTargetFormat::RG8_SNORM:
|
|
return 2;
|
|
case RenderTargetFormat::R8_UNORM:
|
|
case RenderTargetFormat::R8_UINT:
|
|
return 1;
|
|
default:
|
|
UNIMPLEMENTED_MSG("Unimplemented render target format {}", static_cast<u32>(format));
|
|
}
|
|
}
|
|
|
|
u32 DepthFormatBytesPerPixel(DepthFormat format) {
|
|
switch (format) {
|
|
case DepthFormat::Z32_S8_X24_FLOAT:
|
|
return 8;
|
|
case DepthFormat::Z32_FLOAT:
|
|
case DepthFormat::S8_Z24_UNORM:
|
|
case DepthFormat::Z24_X8_UNORM:
|
|
case DepthFormat::Z24_S8_UNORM:
|
|
case DepthFormat::Z24_C8_UNORM:
|
|
return 4;
|
|
case DepthFormat::Z16_UNORM:
|
|
return 2;
|
|
default:
|
|
UNIMPLEMENTED_MSG("Unimplemented Depth format {}", static_cast<u32>(format));
|
|
}
|
|
}
|
|
|
|
} // namespace Tegra
|