Add Vulkan triangle integration path

This commit is contained in:
2026-03-27 12:40:17 +08:00
parent fd0b19fd11
commit 79e7452245
15 changed files with 1260 additions and 40 deletions

View File

@@ -1,5 +1,8 @@
#include "XCEngine/RHI/Vulkan/VulkanResourceView.h"
#include "XCEngine/RHI/Vulkan/VulkanBuffer.h"
#include "XCEngine/RHI/Vulkan/VulkanTexture.h"
namespace XCEngine {
namespace RHI {
@@ -32,6 +35,61 @@ bool VulkanResourceView::InitializeAsRenderTarget(VkDevice device, VulkanTexture
return vkCreateImageView(device, &viewInfo, nullptr, &m_imageView) == VK_SUCCESS;
}
bool VulkanResourceView::InitializeAsVertexBuffer(VulkanBuffer* buffer, const ResourceViewDesc& desc) {
if (buffer == nullptr || buffer->GetBuffer() == VK_NULL_HANDLE) {
return false;
}
m_viewType = ResourceViewType::VertexBuffer;
m_dimension = ResourceViewDimension::Buffer;
m_format = Format::Unknown;
m_buffer = buffer;
m_bufferOffset = desc.bufferLocation;
m_bufferSize = static_cast<uint32_t>(buffer->GetSize());
m_bufferStride = desc.structureByteStride > 0 ? desc.structureByteStride : buffer->GetStride();
return true;
}
bool VulkanResourceView::InitializeAsIndexBuffer(VulkanBuffer* buffer, const ResourceViewDesc& desc) {
if (buffer == nullptr || buffer->GetBuffer() == VK_NULL_HANDLE) {
return false;
}
m_viewType = ResourceViewType::IndexBuffer;
m_dimension = ResourceViewDimension::Buffer;
m_format = desc.format != 0 ? static_cast<Format>(desc.format) : Format::R32_UInt;
m_buffer = buffer;
m_bufferOffset = desc.bufferLocation;
m_bufferSize = static_cast<uint32_t>(buffer->GetSize());
m_bufferStride = buffer->GetStride();
return true;
}
void* VulkanResourceView::GetNativeHandle() {
if (m_imageView != VK_NULL_HANDLE) {
return m_imageView;
}
return m_buffer != nullptr ? m_buffer->GetNativeHandle() : nullptr;
}
bool VulkanResourceView::IsValid() const {
switch (m_viewType) {
case ResourceViewType::VertexBuffer:
case ResourceViewType::IndexBuffer:
return m_buffer != nullptr && m_buffer->GetBuffer() != VK_NULL_HANDLE;
case ResourceViewType::RenderTarget:
case ResourceViewType::DepthStencil:
return m_imageView != VK_NULL_HANDLE;
default:
return false;
}
}
VkBuffer VulkanResourceView::GetBuffer() const {
return m_buffer != nullptr ? m_buffer->GetBuffer() : VK_NULL_HANDLE;
}
void VulkanResourceView::Shutdown() {
if (m_imageView != VK_NULL_HANDLE && m_device != VK_NULL_HANDLE) {
vkDestroyImageView(m_device, m_imageView, nullptr);
@@ -39,8 +97,12 @@ void VulkanResourceView::Shutdown() {
m_imageView = VK_NULL_HANDLE;
m_device = VK_NULL_HANDLE;
m_texture = nullptr;
m_buffer = nullptr;
m_format = Format::Unknown;
m_dimension = ResourceViewDimension::Unknown;
m_bufferOffset = 0;
m_bufferSize = 0;
m_bufferStride = 0;
}
} // namespace RHI