feat(RHI): 添加 RHIFactory 工厂类
- 新增 RHIFactory 头文件和实现,支持通过 RHIType 或字符串创建设备 - 修复 D3D12Buffer 缺失的 Map/Unmap/SetData 实现 - 添加 RHI 工厂测试用例 - 更新 CMakeLists.txt 添加新文件
This commit is contained in:
@@ -155,5 +155,24 @@ void D3D12Buffer::UpdateData(const void* data, uint64_t size) {
|
||||
m_resource->Unmap(0, nullptr);
|
||||
}
|
||||
|
||||
void* D3D12Buffer::Map() {
|
||||
D3D12_RANGE readRange = { 0, 0 };
|
||||
void* data = nullptr;
|
||||
m_resource->Map(0, &readRange, &data);
|
||||
return data;
|
||||
}
|
||||
|
||||
void D3D12Buffer::Unmap() {
|
||||
m_resource->Unmap(0, nullptr);
|
||||
}
|
||||
|
||||
void D3D12Buffer::SetData(const void* data, size_t size, size_t offset) {
|
||||
D3D12_RANGE writeRange = { offset, offset + size };
|
||||
unsigned char* pBuffer = nullptr;
|
||||
m_resource->Map(0, &writeRange, reinterpret_cast<void**>(&pBuffer));
|
||||
memcpy(pBuffer + offset, data, size);
|
||||
m_resource->Unmap(0, nullptr);
|
||||
}
|
||||
|
||||
} // namespace RHI
|
||||
} // namespace XCEngine
|
||||
|
||||
42
engine/src/RHI/RHIFactory.cpp
Normal file
42
engine/src/RHI/RHIFactory.cpp
Normal file
@@ -0,0 +1,42 @@
|
||||
#include "XCEngine/RHI/RHIFactory.h"
|
||||
#include "XCEngine/RHI/D3D12/D3D12Device.h"
|
||||
|
||||
namespace XCEngine {
|
||||
namespace RHI {
|
||||
|
||||
RHIDevice* RHIFactory::CreateRHIDevice(RHIType type) {
|
||||
switch (type) {
|
||||
case RHIType::D3D12:
|
||||
return new D3D12Device();
|
||||
case RHIType::OpenGL:
|
||||
#ifdef XCENGINE_SUPPORT_OPENGL
|
||||
{
|
||||
#include "XCEngine/RHI/OpenGL/OpenGLDevice.h"
|
||||
return new OpenGLDevice();
|
||||
}
|
||||
#else
|
||||
return nullptr;
|
||||
#endif
|
||||
case RHIType::Vulkan:
|
||||
case RHIType::Metal:
|
||||
default:
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
RHIDevice* RHIFactory::CreateRHIDevice(const std::string& typeName) {
|
||||
if (typeName == "D3D12" || typeName == "d3d12") {
|
||||
return new D3D12Device();
|
||||
} else if (typeName == "OpenGL" || typeName == "opengl" || typeName == "GL") {
|
||||
#ifdef XCENGINE_SUPPORT_OPENGL
|
||||
#include "XCEngine/RHI/OpenGL/OpenGLDevice.h"
|
||||
return new OpenGLDevice();
|
||||
#else
|
||||
return nullptr;
|
||||
#endif
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
} // namespace RHI
|
||||
} // namespace XCEngine
|
||||
Reference in New Issue
Block a user