2018-02-12 05:44:12 +01:00
|
|
|
// Copyright 2018 yuzu Emulator Project
|
|
|
|
// Licensed under GPLv2 or any later version
|
|
|
|
// Refer to the license.txt file included.
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
2018-09-04 13:54:50 +02:00
|
|
|
#include <array>
|
2018-02-12 05:44:12 +01:00
|
|
|
#include <memory>
|
2018-09-06 15:48:08 +02:00
|
|
|
#include <vector>
|
2018-02-12 05:44:12 +01:00
|
|
|
#include "common/common_types.h"
|
2018-03-23 19:58:27 +01:00
|
|
|
#include "core/hle/service/nvflinger/buffer_queue.h"
|
2018-02-12 05:44:12 +01:00
|
|
|
#include "video_core/memory_manager.h"
|
|
|
|
|
2018-08-03 18:55:58 +02:00
|
|
|
namespace VideoCore {
|
|
|
|
class RasterizerInterface;
|
|
|
|
}
|
|
|
|
|
2018-02-12 05:44:12 +01:00
|
|
|
namespace Tegra {
|
|
|
|
|
2018-03-24 05:45:24 +01:00
|
|
|
enum class RenderTargetFormat : u32 {
|
2018-03-25 23:57:53 +02:00
|
|
|
NONE = 0x0,
|
2018-06-06 04:07:40 +02:00
|
|
|
RGBA32_FLOAT = 0xC0,
|
2018-06-30 21:23:13 +02:00
|
|
|
RGBA32_UINT = 0xC2,
|
2018-08-13 06:34:20 +02:00
|
|
|
RGBA16_UNORM = 0xC6,
|
2018-08-13 06:04:52 +02:00
|
|
|
RGBA16_UINT = 0xC9,
|
2018-04-16 02:41:02 +02:00
|
|
|
RGBA16_FLOAT = 0xCA,
|
2018-07-24 01:10:00 +02:00
|
|
|
RG32_FLOAT = 0xCB,
|
2018-08-13 14:55:16 +02:00
|
|
|
RG32_UINT = 0xCD,
|
2018-07-23 22:56:52 +02:00
|
|
|
BGRA8_UNORM = 0xCF,
|
2018-09-10 05:41:37 +02:00
|
|
|
BGRA8_SRGB = 0xD0,
|
2018-04-16 02:41:02 +02:00
|
|
|
RGB10_A2_UNORM = 0xD1,
|
2018-03-22 22:40:11 +01:00
|
|
|
RGBA8_UNORM = 0xD5,
|
2018-04-16 02:41:02 +02:00
|
|
|
RGBA8_SRGB = 0xD6,
|
2018-08-10 17:44:43 +02:00
|
|
|
RGBA8_SNORM = 0xD7,
|
2018-08-20 14:26:54 +02:00
|
|
|
RGBA8_UINT = 0xD9,
|
2018-07-26 02:01:29 +02:00
|
|
|
RG16_UNORM = 0xDA,
|
|
|
|
RG16_SNORM = 0xDB,
|
|
|
|
RG16_SINT = 0xDC,
|
|
|
|
RG16_UINT = 0xDD,
|
|
|
|
RG16_FLOAT = 0xDE,
|
2018-06-06 04:57:16 +02:00
|
|
|
R11G11B10_FLOAT = 0xE0,
|
2018-08-13 14:55:16 +02:00
|
|
|
R32_UINT = 0xE4,
|
2018-08-01 15:31:42 +02:00
|
|
|
R32_FLOAT = 0xE5,
|
2018-08-08 07:22:48 +02:00
|
|
|
B5G6R5_UNORM = 0xE8,
|
2018-09-15 17:48:02 +02:00
|
|
|
BGR5A1_UNORM = 0xE9,
|
2018-08-13 05:02:34 +02:00
|
|
|
RG8_UNORM = 0xEA,
|
2018-08-10 18:07:37 +02:00
|
|
|
RG8_SNORM = 0xEB,
|
2018-08-11 20:01:50 +02:00
|
|
|
R16_UNORM = 0xEE,
|
|
|
|
R16_SNORM = 0xEF,
|
|
|
|
R16_SINT = 0xF0,
|
|
|
|
R16_UINT = 0xF1,
|
2018-07-26 06:19:15 +02:00
|
|
|
R16_FLOAT = 0xF2,
|
2018-07-24 23:47:50 +02:00
|
|
|
R8_UNORM = 0xF3,
|
2018-08-12 03:44:42 +02:00
|
|
|
R8_UINT = 0xF6,
|
2018-03-22 22:40:11 +01:00
|
|
|
};
|
|
|
|
|
2018-07-02 19:42:04 +02:00
|
|
|
enum class DepthFormat : u32 {
|
|
|
|
Z32_FLOAT = 0xA,
|
|
|
|
Z16_UNORM = 0x13,
|
|
|
|
S8_Z24_UNORM = 0x14,
|
|
|
|
Z24_X8_UNORM = 0x15,
|
|
|
|
Z24_S8_UNORM = 0x16,
|
|
|
|
Z24_C8_UNORM = 0x18,
|
2018-07-25 03:41:40 +02:00
|
|
|
Z32_S8_X24_FLOAT = 0x19,
|
2018-07-02 19:42:04 +02:00
|
|
|
};
|
|
|
|
|
2018-04-25 04:57:10 +02:00
|
|
|
/// Returns the number of bytes per pixel of each rendertarget format.
|
|
|
|
u32 RenderTargetBytesPerPixel(RenderTargetFormat format);
|
|
|
|
|
2018-08-11 20:01:50 +02:00
|
|
|
/// Returns the number of bytes per pixel of each depth format.
|
|
|
|
u32 DepthFormatBytesPerPixel(DepthFormat format);
|
|
|
|
|
2018-09-06 15:48:08 +02:00
|
|
|
struct CommandListHeader;
|
2018-03-22 21:19:35 +01:00
|
|
|
class DebugContext;
|
|
|
|
|
2018-03-23 02:04:30 +01:00
|
|
|
/**
|
|
|
|
* Struct describing framebuffer configuration
|
|
|
|
*/
|
|
|
|
struct FramebufferConfig {
|
|
|
|
enum class PixelFormat : u32 {
|
|
|
|
ABGR8 = 1,
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the number of bytes per pixel.
|
|
|
|
*/
|
2018-08-11 00:39:37 +02:00
|
|
|
static u32 BytesPerPixel(PixelFormat format);
|
2018-03-23 02:04:30 +01:00
|
|
|
|
|
|
|
VAddr address;
|
|
|
|
u32 offset;
|
|
|
|
u32 width;
|
|
|
|
u32 height;
|
|
|
|
u32 stride;
|
|
|
|
PixelFormat pixel_format;
|
2018-03-23 19:58:27 +01:00
|
|
|
|
|
|
|
using TransformFlags = Service::NVFlinger::BufferQueue::BufferTransformFlags;
|
|
|
|
TransformFlags transform_flags;
|
2018-07-18 02:11:41 +02:00
|
|
|
MathUtil::Rectangle<int> crop_rect;
|
2018-03-23 02:04:30 +01:00
|
|
|
};
|
|
|
|
|
2018-03-18 21:15:05 +01:00
|
|
|
namespace Engines {
|
|
|
|
class Fermi2D;
|
|
|
|
class Maxwell3D;
|
|
|
|
class MaxwellCompute;
|
2018-06-11 00:02:33 +02:00
|
|
|
class MaxwellDMA;
|
2018-03-18 21:15:05 +01:00
|
|
|
} // namespace Engines
|
|
|
|
|
2018-02-12 05:44:12 +01:00
|
|
|
enum class EngineID {
|
|
|
|
FERMI_TWOD_A = 0x902D, // 2D Engine
|
|
|
|
MAXWELL_B = 0xB197, // 3D Engine
|
|
|
|
MAXWELL_COMPUTE_B = 0xB1C0,
|
|
|
|
KEPLER_INLINE_TO_MEMORY_B = 0xA140,
|
|
|
|
MAXWELL_DMA_COPY_A = 0xB0B5,
|
|
|
|
};
|
|
|
|
|
|
|
|
class GPU final {
|
|
|
|
public:
|
2018-08-03 18:55:58 +02:00
|
|
|
explicit GPU(VideoCore::RasterizerInterface& rasterizer);
|
2018-03-18 21:15:05 +01:00
|
|
|
~GPU();
|
2018-02-12 05:44:12 +01:00
|
|
|
|
|
|
|
/// Processes a command list stored at the specified address in GPU memory.
|
2018-09-06 15:48:08 +02:00
|
|
|
void ProcessCommandLists(const std::vector<CommandListHeader>& commands);
|
2018-02-12 05:44:12 +01:00
|
|
|
|
2018-08-28 16:57:56 +02:00
|
|
|
/// Returns a reference to the Maxwell3D GPU engine.
|
|
|
|
Engines::Maxwell3D& Maxwell3D();
|
|
|
|
|
2018-07-21 00:31:36 +02:00
|
|
|
/// Returns a const reference to the Maxwell3D GPU engine.
|
|
|
|
const Engines::Maxwell3D& Maxwell3D() const;
|
|
|
|
|
2018-08-28 16:57:56 +02:00
|
|
|
/// Returns a reference to the GPU memory manager.
|
|
|
|
Tegra::MemoryManager& MemoryManager();
|
2018-03-22 21:19:35 +01:00
|
|
|
|
2018-08-28 16:57:56 +02:00
|
|
|
/// Returns a const reference to the GPU memory manager.
|
|
|
|
const Tegra::MemoryManager& MemoryManager() const;
|
2018-02-12 05:44:12 +01:00
|
|
|
|
|
|
|
private:
|
2018-08-28 16:57:56 +02:00
|
|
|
std::unique_ptr<Tegra::MemoryManager> memory_manager;
|
|
|
|
|
2018-02-12 05:44:12 +01:00
|
|
|
/// Mapping of command subchannels to their bound engine ids.
|
2018-09-04 13:54:50 +02:00
|
|
|
std::array<EngineID, 8> bound_engines = {};
|
2018-02-12 05:44:12 +01:00
|
|
|
|
|
|
|
/// 3D engine
|
|
|
|
std::unique_ptr<Engines::Maxwell3D> maxwell_3d;
|
|
|
|
/// 2D engine
|
|
|
|
std::unique_ptr<Engines::Fermi2D> fermi_2d;
|
|
|
|
/// Compute engine
|
|
|
|
std::unique_ptr<Engines::MaxwellCompute> maxwell_compute;
|
2018-06-11 00:02:33 +02:00
|
|
|
/// DMA engine
|
|
|
|
std::unique_ptr<Engines::MaxwellDMA> maxwell_dma;
|
2018-02-12 05:44:12 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace Tegra
|