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:
111
EngineTest/TestRenderer.cpp
Normal file
111
EngineTest/TestRenderer.cpp
Normal 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
15
EngineTest/TestRenderer.h
Normal 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;
|
||||
};
|
||||
Reference in New Issue
Block a user