Add RHI vertex and index buffer views

This commit is contained in:
2026-03-25 23:07:22 +08:00
parent 268daf7bc9
commit aaf9cce418
14 changed files with 342 additions and 19 deletions

View File

@@ -19,6 +19,7 @@
#include "XCEngine/RHI/D3D12/D3D12Framebuffer.h"
#include <stdio.h>
#include <memory>
#include <string>
#ifdef _DEBUG
#include <dxgidebug.h>
@@ -27,6 +28,19 @@
namespace XCEngine {
namespace RHI {
namespace {
std::string NarrowAscii(const std::wstring& value) {
std::string result;
result.reserve(value.size());
for (wchar_t ch : value) {
result.push_back(static_cast<char>(ch));
}
return result;
}
} // namespace
D3D12Device::D3D12Device()
: m_isDeviceRemoved(false)
, m_initialized(false)
@@ -293,14 +307,16 @@ RHITexture* D3D12Device::CreateTexture(const TextureDesc& desc) {
RHIShader* D3D12Device::CreateShader(const ShaderCompileDesc& desc) {
auto* shader = new D3D12Shader();
const char* entryPoint = desc.entryPoint.empty() ? nullptr : reinterpret_cast<const char*>(desc.entryPoint.c_str());
const char* profile = desc.profile.empty() ? nullptr : reinterpret_cast<const char*>(desc.profile.c_str());
const std::string entryPoint = NarrowAscii(desc.entryPoint);
const std::string profile = NarrowAscii(desc.profile);
const char* entryPointPtr = entryPoint.empty() ? nullptr : entryPoint.c_str();
const char* profilePtr = profile.empty() ? nullptr : profile.c_str();
bool success = false;
if (!desc.source.empty()) {
success = shader->Compile(desc.source.data(), desc.source.size(), entryPoint, profile);
success = shader->Compile(desc.source.data(), desc.source.size(), entryPointPtr, profilePtr);
} else if (!desc.fileName.empty()) {
success = shader->CompileFromFile(desc.fileName.c_str(), entryPoint, profile);
success = shader->CompileFromFile(desc.fileName.c_str(), entryPointPtr, profilePtr);
}
if (success) {
@@ -386,6 +402,36 @@ RHIFence* D3D12Device::CreateFence(const FenceDesc& desc) {
return nullptr;
}
RHIResourceView* D3D12Device::CreateVertexBufferView(RHIBuffer* buffer, const ResourceViewDesc& desc) {
if (!buffer) {
return nullptr;
}
auto* view = new D3D12ResourceView();
view->InitializeAsVertexBuffer(static_cast<D3D12Buffer*>(buffer), desc);
if (!view->IsValid()) {
delete view;
return nullptr;
}
return view;
}
RHIResourceView* D3D12Device::CreateIndexBufferView(RHIBuffer* buffer, const ResourceViewDesc& desc) {
if (!buffer) {
return nullptr;
}
auto* view = new D3D12ResourceView();
view->InitializeAsIndexBuffer(static_cast<D3D12Buffer*>(buffer), desc);
if (!view->IsValid()) {
delete view;
return nullptr;
}
return view;
}
RHISwapChain* D3D12Device::CreateSwapChain(const SwapChainDesc& desc, RHICommandQueue* presentQueue) {
if (presentQueue == nullptr) {
return nullptr;