diff --git a/src/xenia/app/xenia_main.cc b/src/xenia/app/xenia_main.cc index def29b7c5..60b682122 100644 --- a/src/xenia/app/xenia_main.cc +++ b/src/xenia/app/xenia_main.cc @@ -29,6 +29,9 @@ // Available graphics systems: #include "xenia/gpu/null/null_graphics_system.h" #include "xenia/gpu/vulkan/vulkan_graphics_system.h" +#if XE_PLATFORM_WIN32 +#include "xenia/gpu/d3d12/d3d12_graphics_system.h" +#endif // XE_PLATFORM_WIN32 // Available input drivers: #include "xenia/hid/nop/nop_hid.h" @@ -77,6 +80,11 @@ std::unique_ptr CreateGraphicsSystem() { if (FLAGS_gpu.compare("vulkan") == 0) { return std::unique_ptr( new xe::gpu::vulkan::VulkanGraphicsSystem()); +#if XE_PLATFORM_WIN32 + } else if (FLAGS_gpu.compare("d3d12") == 0) { + return std::unique_ptr( + new xe::gpu::d3d12::D3D12GraphicsSystem()); +#endif // XE_PLATFORM_WIN32 } else if (FLAGS_gpu.compare("null") == 0) { return std::unique_ptr( new xe::gpu::null::NullGraphicsSystem()); diff --git a/src/xenia/gpu/d3d12/d3d12_command_processor.cc b/src/xenia/gpu/d3d12/d3d12_command_processor.cc new file mode 100644 index 000000000..04fc5415f --- /dev/null +++ b/src/xenia/gpu/d3d12/d3d12_command_processor.cc @@ -0,0 +1,50 @@ +/** + ****************************************************************************** + * Xenia : Xbox 360 Emulator Research Project * + ****************************************************************************** + * Copyright 2018 Ben Vanik. All rights reserved. * + * Released under the BSD license - see LICENSE in the root for more details. * + ****************************************************************************** + */ + +#include "xenia/gpu/d3d12/d3d12_command_processor.h" + +namespace xe { +namespace gpu { +namespace d3d12 { + +D3D12CommandProcessor::D3D12CommandProcessor( + D3D12GraphicsSystem* graphics_system, kernel::KernelState* kernel_state) + : CommandProcessor(graphics_system, kernel_state) {} +D3D12CommandProcessor::~D3D12CommandProcessor() = default; + +bool D3D12CommandProcessor::SetupContext() { + return CommandProcessor::SetupContext(); +} + +void D3D12CommandProcessor::ShutdownContext() { + return CommandProcessor::ShutdownContext(); +} + +void D3D12CommandProcessor::PerformSwap(uint32_t frontbuffer_ptr, + uint32_t frontbuffer_width, + uint32_t frontbuffer_height) {} + +Shader* D3D12CommandProcessor::LoadShader(ShaderType shader_type, + uint32_t guest_address, + const uint32_t* host_address, + uint32_t dword_count) { + return nullptr; +} + +bool D3D12CommandProcessor::IssueDraw(PrimitiveType prim_type, + uint32_t index_count, + IndexBufferInfo* index_buffer_info) { + return true; +} + +bool D3D12CommandProcessor::IssueCopy() { return true; } + +} // namespace d3d12 +} // namespace gpu +} // namespace xe diff --git a/src/xenia/gpu/d3d12/d3d12_command_processor.h b/src/xenia/gpu/d3d12/d3d12_command_processor.h new file mode 100644 index 000000000..736c4a999 --- /dev/null +++ b/src/xenia/gpu/d3d12/d3d12_command_processor.h @@ -0,0 +1,48 @@ +/** + ****************************************************************************** + * Xenia : Xbox 360 Emulator Research Project * + ****************************************************************************** + * Copyright 2018 Ben Vanik. All rights reserved. * + * Released under the BSD license - see LICENSE in the root for more details. * + ****************************************************************************** + */ + +#ifndef XENIA_GPU_D3D12_D3D12_COMMAND_PROCESSOR_H_ +#define XENIA_GPU_D3D12_D3D12_COMMAND_PROCESSOR_H_ + +#include "xenia/gpu/command_processor.h" +#include "xenia/gpu/d3d12/d3d12_graphics_system.h" +#include "xenia/gpu/xenos.h" +#include "xenia/kernel/kernel_state.h" + +namespace xe { +namespace gpu { +namespace d3d12 { + +class D3D12CommandProcessor : public CommandProcessor { + public: + D3D12CommandProcessor(D3D12GraphicsSystem* graphics_system, + kernel::KernelState* kernel_state); + ~D3D12CommandProcessor(); + + private: + bool SetupContext() override; + void ShutdownContext() override; + + void PerformSwap(uint32_t frontbuffer_ptr, uint32_t frontbuffer_width, + uint32_t frontbuffer_height) override; + + Shader* LoadShader(ShaderType shader_type, uint32_t guest_address, + const uint32_t* host_address, + uint32_t dword_count) override; + + bool IssueDraw(PrimitiveType prim_type, uint32_t index_count, + IndexBufferInfo* index_buffer_info) override; + bool IssueCopy() override; +}; + +} // namespace d3d12 +} // namespace gpu +} // namespace xe + +#endif // XENIA_GPU_D3D12_D3D12_COMMAND_PROCESSOR_H_ diff --git a/src/xenia/gpu/d3d12/d3d12_graphics_system.cc b/src/xenia/gpu/d3d12/d3d12_graphics_system.cc new file mode 100644 index 000000000..e0223ba64 --- /dev/null +++ b/src/xenia/gpu/d3d12/d3d12_graphics_system.cc @@ -0,0 +1,54 @@ +/** + ****************************************************************************** + * Xenia : Xbox 360 Emulator Research Project * + ****************************************************************************** + * Copyright 2018 Ben Vanik. All rights reserved. * + * Released under the BSD license - see LICENSE in the root for more details. * + ****************************************************************************** + */ + +#include "xenia/gpu/d3d12/d3d12_graphics_system.h" + +#include "xenia/gpu/d3d12/d3d12_command_processor.h" +#include "xenia/ui/vulkan/vulkan_provider.h" +#include "xenia/xbox.h" + +namespace xe { +namespace gpu { +namespace d3d12 { + +D3D12GraphicsSystem::D3D12GraphicsSystem() {} + +D3D12GraphicsSystem::~D3D12GraphicsSystem() {} + +X_STATUS D3D12GraphicsSystem::Setup(cpu::Processor* processor, + kernel::KernelState* kernel_state, + ui::Window* target_window) { + // This is a null graphics system, but we still setup vulkan because UI needs + // it through us :| + provider_ = xe::ui::vulkan::VulkanProvider::Create(target_window); + + return GraphicsSystem::Setup(processor, kernel_state, target_window); +} + +void D3D12GraphicsSystem::Shutdown() { GraphicsSystem::Shutdown(); } + +std::unique_ptr +D3D12GraphicsSystem::CreateCommandProcessor() { + return std::unique_ptr( + new D3D12CommandProcessor(this, kernel_state_)); +} + +void D3D12GraphicsSystem::Swap(xe::ui::UIEvent* e) { + if (!command_processor_) { + return; + } + + auto& swap_state = command_processor_->swap_state(); + std::lock_guard lock(swap_state.mutex); + swap_state.pending = false; +} + +} // namespace d3d12 +} // namespace gpu +} // namespace xe diff --git a/src/xenia/gpu/d3d12/d3d12_graphics_system.h b/src/xenia/gpu/d3d12/d3d12_graphics_system.h new file mode 100644 index 000000000..a8e6c711a --- /dev/null +++ b/src/xenia/gpu/d3d12/d3d12_graphics_system.h @@ -0,0 +1,43 @@ +/** + ****************************************************************************** + * Xenia : Xbox 360 Emulator Research Project * + ****************************************************************************** + * Copyright 2018 Ben Vanik. All rights reserved. * + * Released under the BSD license - see LICENSE in the root for more details. * + ****************************************************************************** + */ + +#ifndef XENIA_GPU_D3D12_D3D12_GRAPHICS_SYSTEM_H_ +#define XENIA_GPU_D3D12_D3D12_GRAPHICS_SYSTEM_H_ + +#include + +#include "xenia/gpu/command_processor.h" +#include "xenia/gpu/graphics_system.h" + +namespace xe { +namespace gpu { +namespace d3d12 { + +class D3D12GraphicsSystem : public GraphicsSystem { + public: + D3D12GraphicsSystem(); + ~D3D12GraphicsSystem() override; + + std::wstring name() const override { return L"Direct3D 12"; } + + X_STATUS Setup(cpu::Processor* processor, kernel::KernelState* kernel_state, + ui::Window* target_window) override; + void Shutdown() override; + + private: + std::unique_ptr CreateCommandProcessor() override; + + void Swap(xe::ui::UIEvent* e) override; +}; + +} // namespace d3d12 +} // namespace gpu +} // namespace xe + +#endif // XENIA_GPU_D3D12_D3D12_GRAPHICS_SYSTEM_H_