2018-02-12 04:44:12 +00:00
|
|
|
// Copyright 2018 yuzu Emulator Project
|
|
|
|
// Licensed under GPLv2 or any later version
|
|
|
|
// Refer to the license.txt file included.
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <memory>
|
|
|
|
#include <unordered_map>
|
2018-03-18 09:17:10 +00:00
|
|
|
#include <vector>
|
2018-02-12 04:44:12 +00:00
|
|
|
#include "common/common_types.h"
|
2018-03-23 18:58:27 +00:00
|
|
|
#include "core/hle/service/nvflinger/buffer_queue.h"
|
2018-02-12 04:44:12 +00:00
|
|
|
#include "video_core/memory_manager.h"
|
|
|
|
|
|
|
|
namespace Tegra {
|
|
|
|
|
2018-03-24 04:45:24 +00:00
|
|
|
enum class RenderTargetFormat : u32 {
|
2018-03-25 22:57:53 +01:00
|
|
|
NONE = 0x0,
|
2018-04-16 01:41:02 +01:00
|
|
|
RGBA16_FLOAT = 0xCA,
|
|
|
|
RGB10_A2_UNORM = 0xD1,
|
2018-03-22 21:40:11 +00:00
|
|
|
RGBA8_UNORM = 0xD5,
|
2018-04-16 01:41:02 +01:00
|
|
|
RGBA8_SRGB = 0xD6,
|
2018-03-22 21:40:11 +00:00
|
|
|
};
|
|
|
|
|
2018-04-25 03:57:10 +01:00
|
|
|
/// Returns the number of bytes per pixel of each rendertarget format.
|
|
|
|
u32 RenderTargetBytesPerPixel(RenderTargetFormat format);
|
|
|
|
|
2018-03-22 20:19:35 +00:00
|
|
|
class DebugContext;
|
|
|
|
|
2018-03-23 01:04:30 +00:00
|
|
|
/**
|
|
|
|
* Struct describing framebuffer configuration
|
|
|
|
*/
|
|
|
|
struct FramebufferConfig {
|
|
|
|
enum class PixelFormat : u32 {
|
|
|
|
ABGR8 = 1,
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the number of bytes per pixel.
|
|
|
|
*/
|
|
|
|
static u32 BytesPerPixel(PixelFormat format) {
|
|
|
|
switch (format) {
|
|
|
|
case PixelFormat::ABGR8:
|
|
|
|
return 4;
|
|
|
|
}
|
|
|
|
|
|
|
|
UNREACHABLE();
|
|
|
|
}
|
|
|
|
|
|
|
|
VAddr address;
|
|
|
|
u32 offset;
|
|
|
|
u32 width;
|
|
|
|
u32 height;
|
|
|
|
u32 stride;
|
|
|
|
PixelFormat pixel_format;
|
2018-03-23 18:58:27 +00:00
|
|
|
|
|
|
|
using TransformFlags = Service::NVFlinger::BufferQueue::BufferTransformFlags;
|
|
|
|
TransformFlags transform_flags;
|
2018-03-23 01:04:30 +00:00
|
|
|
};
|
|
|
|
|
2018-03-18 20:15:05 +00:00
|
|
|
namespace Engines {
|
|
|
|
class Fermi2D;
|
|
|
|
class Maxwell3D;
|
|
|
|
class MaxwellCompute;
|
|
|
|
} // namespace Engines
|
|
|
|
|
2018-02-12 04:44:12 +00: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-03-18 20:15:05 +00:00
|
|
|
GPU();
|
|
|
|
~GPU();
|
2018-02-12 04:44:12 +00:00
|
|
|
|
|
|
|
/// Processes a command list stored at the specified address in GPU memory.
|
|
|
|
void ProcessCommandList(GPUVAddr address, u32 size);
|
|
|
|
|
2018-03-22 20:19:35 +00:00
|
|
|
/// Returns a reference to the Maxwell3D GPU engine.
|
|
|
|
const Engines::Maxwell3D& Get3DEngine() const;
|
|
|
|
|
2018-02-12 04:44:12 +00:00
|
|
|
std::unique_ptr<MemoryManager> memory_manager;
|
|
|
|
|
2018-03-22 23:48:20 +00:00
|
|
|
Engines::Maxwell3D& Maxwell3D() {
|
|
|
|
return *maxwell_3d;
|
|
|
|
}
|
|
|
|
|
2018-02-12 04:44:12 +00:00
|
|
|
private:
|
|
|
|
/// Writes a single register in the engine bound to the specified subchannel
|
2018-03-18 09:17:10 +00:00
|
|
|
void WriteReg(u32 method, u32 subchannel, u32 value, u32 remaining_params);
|
2018-02-12 04:44:12 +00:00
|
|
|
|
|
|
|
/// Mapping of command subchannels to their bound engine ids.
|
|
|
|
std::unordered_map<u32, EngineID> bound_engines;
|
|
|
|
|
|
|
|
/// 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;
|
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace Tegra
|