feat: add Graphics module with D3D12 backend and documentation

Graphics Module:
- Add platform abstraction layer (GraphicsPlatformInterface)
- Add unified renderer entry point (Renderer)
- Add D3D12 backend implementation (D3D12Core, D3D12Interface)
- Add TestRenderer for multi-window rendering tests

Documentation:
- Add Graphics渲染架构分析.md
- Add D3D12学习Wiki.md
- Add changelogs directory with per-commit documentation
- Add 20260326-dx12-initial.md for initial framework
- Add 20260326-d3d12-foundation.md for Graphics module

Fixes:
- Resolve header include issues and type redefinition errors
This commit is contained in:
SpecialX
2026-03-26 16:53:09 +08:00
parent 6ca6970e34
commit b7eebc11b2
18 changed files with 937 additions and 2 deletions

111
EngineTest/TestRenderer.cpp Normal file
View File

@@ -0,0 +1,111 @@
/**
* @file TestRenderer.cpp
* @brief 渲染功能综合测试实现。
*/
#include "TestRenderer.h"
#include "Graphics/Renderer.h"
#include "Platform/Platform.h"
#include "Platform/PlatformTypes.h"
#include <filesystem>
#include <fstream>
#if TEST_RENDERER
using namespace XEngine;
graphics::render_surface _surfaces[4];
LRESULT win_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
bool toggle_fullscreen{ false };
switch (msg)
{
case WM_DESTROY:
{
bool all_closed{ true };
for (u32 i{ 0 }; i < _countof(_surfaces); ++i)
{
if(!_surfaces[i].window.is_closed())
{
all_closed = false;
}
}
if (all_closed)
{
PostQuitMessage(0);
return 0;
}
break;
}
case WM_SYSCHAR:
{
if(wparam == VK_RETURN && (HIWORD(lparam) & KF_ALTDOWN))
{
platform::window win{ platform::window_id{(id::id_type)GetWindowLongPtr(hwnd, GWLP_USERDATA)} };
win.set_fullscreen(!win.is_fullscreen());
return 0;
}
break;
}
}
return DefWindowProc(hwnd, msg, wparam, lparam);
}
void
create_render_surface(graphics::render_surface& surface, const platform::window_init_info info)
{
surface.window = platform::create_window(&info);
}
void
_destroy_render_surface(graphics::render_surface& surface)
{
platform::remove_window(surface.window.get_id());
}
bool
engine_test::initialize()
{
bool result{ graphics::initialize(graphics::graphics_platform::direct3d12) };
if (!result)
{
return result;
}
platform::window_init_info info[]
{
{&win_proc, nullptr, L"Test Window 1", 200, 100,400,400},
{&win_proc, nullptr, L"Test Window 2", 700, 100,400,400},
{&win_proc, nullptr, L"Test Window 2", 700, 100,400,400},
{&win_proc, nullptr, L"Test Window 3", 1200,100,400,400},
};
static_assert(_countof(info) == _countof(_surfaces));
for (u32 i{ 0 }; i < _countof(_surfaces); ++i)
{
create_render_surface(_surfaces[i], info[i]);
}
return result;
}
void
engine_test::run()
{
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
bool
engine_test::shutdown()
{
for (u32 i{ 0 }; i < _countof(_surfaces); ++i)
{
_destroy_render_surface(_surfaces[i]);
}
graphics::shutdown();
return true;
}
#endif

15
EngineTest/TestRenderer.h Normal file
View File

@@ -0,0 +1,15 @@
/**
* @file TestRenderer.h
* @brief 渲染测试用例类声明。
*/
#pragma once
#include "Test.h"
class engine_test : public Test
{
public :
bool initialize() override;
void run() override;
bool shutdown() override;
};