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

@@ -0,0 +1,57 @@
#pragma once
#include "XCEngine/RHI/RHIBuffer.h"
#include "XCEngine/RHI/Vulkan/VulkanCommon.h"
#include <string>
namespace XCEngine {
namespace RHI {
class VulkanDevice;
class VulkanBuffer : public RHIBuffer {
public:
VulkanBuffer() = default;
~VulkanBuffer() override;
bool Initialize(VulkanDevice* device, const BufferDesc& desc, VkBufferUsageFlags usageFlags, VkMemoryPropertyFlags memoryProperties);
void Shutdown() override;
void* Map() override;
void Unmap() override;
void SetData(const void* data, size_t size, size_t offset = 0) override;
uint64_t GetSize() const override { return m_size; }
BufferType GetBufferType() const override { return m_bufferType; }
void SetBufferType(BufferType type) override { m_bufferType = type; }
uint32_t GetStride() const override { return m_stride; }
void SetStride(uint32_t stride) override { m_stride = stride; }
void* GetNativeHandle() override { return m_buffer; }
ResourceStates GetState() const override { return m_state; }
void SetState(ResourceStates state) override { m_state = state; }
const std::string& GetName() const override { return m_name; }
void SetName(const std::string& name) override { m_name = name; }
VkBuffer GetBuffer() const { return m_buffer; }
VkDeviceMemory GetMemory() const { return m_memory; }
private:
VulkanDevice* m_deviceOwner = nullptr;
VkDevice m_device = VK_NULL_HANDLE;
VkBuffer m_buffer = VK_NULL_HANDLE;
VkDeviceMemory m_memory = VK_NULL_HANDLE;
void* m_mappedData = nullptr;
uint64_t m_size = 0;
BufferType m_bufferType = BufferType::Vertex;
uint32_t m_stride = 0;
ResourceStates m_state = ResourceStates::Common;
std::string m_name;
};
} // namespace RHI
} // namespace XCEngine

View File

@@ -3,10 +3,13 @@
#include "XCEngine/RHI/RHICommandList.h"
#include "XCEngine/RHI/Vulkan/VulkanCommon.h"
#include <vector>
namespace XCEngine {
namespace RHI {
class VulkanDevice;
class VulkanPipelineState;
class VulkanTexture;
class VulkanCommandList : public RHICommandList {
@@ -58,6 +61,9 @@ public:
VkCommandBuffer GetCommandBuffer() const { return m_commandBuffer; }
private:
bool EnsureGraphicsRenderPass();
void EndActiveRenderPass();
void DestroyTransientFramebuffers();
void TransitionTexture(VulkanTexture* texture, ResourceStates newState);
VulkanDevice* m_device = nullptr;
@@ -65,6 +71,14 @@ private:
VkCommandBuffer m_commandBuffer = VK_NULL_HANDLE;
RHIResourceView* m_currentColorTarget = nullptr;
RHIResourceView* m_currentDepthTarget = nullptr;
VulkanPipelineState* m_currentPipelineState = nullptr;
PrimitiveTopology m_currentPrimitiveTopology = PrimitiveTopology::TriangleList;
bool m_renderPassActive = false;
bool m_hasViewport = false;
bool m_hasScissor = false;
VkViewport m_viewport = {};
VkRect2D m_scissor = {};
std::vector<VkFramebuffer> m_transientFramebuffers;
};
} // namespace RHI

View File

@@ -41,6 +41,31 @@ inline VkFormat ToVulkanFormat(Format format) {
}
}
inline uint32_t GetFormatSize(Format format) {
switch (format) {
case Format::R8_UNorm:
return 1;
case Format::R8G8_UNorm:
return 2;
case Format::R8G8B8A8_UNorm:
return 4;
case Format::R16_UInt:
case Format::R16_Float:
return 2;
case Format::R16G16B16A16_Float:
return 8;
case Format::R32_Float:
case Format::R32_UInt:
return 4;
case Format::R32G32_Float:
return 8;
case Format::R32G32B32A32_Float:
return 16;
default:
return 0;
}
}
inline Format ToRHIFormat(VkFormat format) {
switch (format) {
case VK_FORMAT_R8G8B8A8_UNORM:
@@ -73,6 +98,153 @@ inline VkImageAspectFlags GetImageAspectMask(Format format) {
}
}
inline VkPrimitiveTopology ToVulkanPrimitiveTopology(PrimitiveTopologyType topologyType) {
switch (topologyType) {
case PrimitiveTopologyType::Point:
return VK_PRIMITIVE_TOPOLOGY_POINT_LIST;
case PrimitiveTopologyType::Line:
return VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
case PrimitiveTopologyType::Triangle:
return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
case PrimitiveTopologyType::Patch:
return VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
case PrimitiveTopologyType::Undefined:
default:
return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
}
}
inline VkPrimitiveTopology ToVulkanPrimitiveTopology(PrimitiveTopology topology) {
switch (topology) {
case PrimitiveTopology::PointList:
return VK_PRIMITIVE_TOPOLOGY_POINT_LIST;
case PrimitiveTopology::LineList:
return VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
case PrimitiveTopology::LineStrip:
return VK_PRIMITIVE_TOPOLOGY_LINE_STRIP;
case PrimitiveTopology::TriangleStrip:
return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
case PrimitiveTopology::TriangleList:
default:
return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
}
}
inline VkPolygonMode ToVulkanPolygonMode(FillMode mode) {
switch (mode) {
case FillMode::Wireframe:
return VK_POLYGON_MODE_LINE;
case FillMode::Solid:
default:
return VK_POLYGON_MODE_FILL;
}
}
inline VkCullModeFlags ToVulkanCullMode(CullMode mode) {
switch (mode) {
case CullMode::Front:
return VK_CULL_MODE_FRONT_BIT;
case CullMode::Back:
return VK_CULL_MODE_BACK_BIT;
case CullMode::None:
default:
return VK_CULL_MODE_NONE;
}
}
inline VkFrontFace ToVulkanFrontFace(FrontFace frontFace) {
return frontFace == FrontFace::Clockwise ? VK_FRONT_FACE_CLOCKWISE : VK_FRONT_FACE_COUNTER_CLOCKWISE;
}
inline VkCompareOp ToVulkanCompareOp(ComparisonFunc func) {
switch (func) {
case ComparisonFunc::Never:
return VK_COMPARE_OP_NEVER;
case ComparisonFunc::Less:
return VK_COMPARE_OP_LESS;
case ComparisonFunc::Equal:
return VK_COMPARE_OP_EQUAL;
case ComparisonFunc::LessEqual:
return VK_COMPARE_OP_LESS_OR_EQUAL;
case ComparisonFunc::Greater:
return VK_COMPARE_OP_GREATER;
case ComparisonFunc::NotEqual:
return VK_COMPARE_OP_NOT_EQUAL;
case ComparisonFunc::GreaterEqual:
return VK_COMPARE_OP_GREATER_OR_EQUAL;
case ComparisonFunc::Always:
default:
return VK_COMPARE_OP_ALWAYS;
}
}
inline VkBlendFactor ToVulkanBlendFactor(BlendFactor factor) {
switch (factor) {
case BlendFactor::Zero:
return VK_BLEND_FACTOR_ZERO;
case BlendFactor::One:
return VK_BLEND_FACTOR_ONE;
case BlendFactor::SrcColor:
return VK_BLEND_FACTOR_SRC_COLOR;
case BlendFactor::InvSrcColor:
return VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR;
case BlendFactor::SrcAlpha:
return VK_BLEND_FACTOR_SRC_ALPHA;
case BlendFactor::InvSrcAlpha:
return VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
case BlendFactor::DstAlpha:
return VK_BLEND_FACTOR_DST_ALPHA;
case BlendFactor::InvDstAlpha:
return VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA;
case BlendFactor::DstColor:
return VK_BLEND_FACTOR_DST_COLOR;
case BlendFactor::InvDstColor:
return VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR;
default:
return VK_BLEND_FACTOR_ONE;
}
}
inline VkBlendOp ToVulkanBlendOp(BlendOp op) {
switch (op) {
case BlendOp::Subtract:
return VK_BLEND_OP_SUBTRACT;
case BlendOp::ReverseSubtract:
return VK_BLEND_OP_REVERSE_SUBTRACT;
case BlendOp::Min:
return VK_BLEND_OP_MIN;
case BlendOp::Max:
return VK_BLEND_OP_MAX;
case BlendOp::Add:
default:
return VK_BLEND_OP_ADD;
}
}
inline VkIndexType ToVulkanIndexType(Format format) {
switch (format) {
case Format::R16_UInt:
return VK_INDEX_TYPE_UINT16;
case Format::R32_UInt:
case Format::Unknown:
default:
return VK_INDEX_TYPE_UINT32;
}
}
inline VkSampleCountFlagBits ToVulkanSampleCount(uint32_t sampleCount) {
switch (sampleCount) {
case 2:
return VK_SAMPLE_COUNT_2_BIT;
case 4:
return VK_SAMPLE_COUNT_4_BIT;
case 8:
return VK_SAMPLE_COUNT_8_BIT;
default:
return VK_SAMPLE_COUNT_1_BIT;
}
}
inline uint32_t ResolveVulkanApiMajor(uint32_t apiVersion) {
return VK_API_VERSION_MAJOR(apiVersion);
}

View File

@@ -0,0 +1,66 @@
#pragma once
#include "XCEngine/RHI/RHIPipelineState.h"
#include "XCEngine/RHI/Vulkan/VulkanCommon.h"
namespace XCEngine {
namespace RHI {
class VulkanDevice;
class VulkanPipelineState : public RHIPipelineState {
public:
VulkanPipelineState() = default;
~VulkanPipelineState() override;
bool Initialize(VulkanDevice* device, const GraphicsPipelineDesc& desc);
void SetInputLayout(const InputLayoutDesc& layout) override;
void SetRasterizerState(const RasterizerDesc& state) override;
void SetBlendState(const BlendDesc& state) override;
void SetDepthStencilState(const DepthStencilStateDesc& state) override;
void SetTopology(uint32_t topologyType) override;
void SetRenderTargetFormats(uint32_t count, const uint32_t* formats, uint32_t depthFormat) override;
void SetSampleCount(uint32_t count) override;
void SetComputeShader(RHIShader* shader) override;
const RasterizerDesc& GetRasterizerState() const override { return m_rasterizerDesc; }
const BlendDesc& GetBlendState() const override { return m_blendDesc; }
const DepthStencilStateDesc& GetDepthStencilState() const override { return m_depthStencilDesc; }
const InputLayoutDesc& GetInputLayout() const override { return m_inputLayoutDesc; }
PipelineStateHash GetHash() const override;
RHIShader* GetComputeShader() const override { return nullptr; }
bool HasComputeShader() const override { return false; }
bool IsValid() const override { return m_pipeline != VK_NULL_HANDLE; }
void EnsureValid() override {}
void Shutdown() override;
void Bind() override {}
void Unbind() override {}
void* GetNativeHandle() override { return m_pipeline; }
PipelineType GetType() const override { return PipelineType::Graphics; }
VkPipeline GetPipeline() const { return m_pipeline; }
VkPipelineLayout GetPipelineLayout() const { return m_pipelineLayout; }
VkRenderPass GetRenderPass() const { return m_renderPass; }
private:
VulkanDevice* m_deviceOwner = nullptr;
VkDevice m_device = VK_NULL_HANDLE;
VkPipeline m_pipeline = VK_NULL_HANDLE;
VkPipelineLayout m_pipelineLayout = VK_NULL_HANDLE;
VkRenderPass m_renderPass = VK_NULL_HANDLE;
InputLayoutDesc m_inputLayoutDesc = {};
RasterizerDesc m_rasterizerDesc = {};
BlendDesc m_blendDesc = {};
DepthStencilStateDesc m_depthStencilDesc = {};
uint32_t m_topologyType = static_cast<uint32_t>(PrimitiveTopologyType::Triangle);
uint32_t m_renderTargetCount = 1;
uint32_t m_renderTargetFormats[8] = { 0 };
uint32_t m_depthStencilFormat = 0;
uint32_t m_sampleCount = 1;
};
} // namespace RHI
} // namespace XCEngine

View File

@@ -2,21 +2,25 @@
#include "XCEngine/RHI/RHIResourceView.h"
#include "XCEngine/RHI/Vulkan/VulkanCommon.h"
#include "XCEngine/RHI/Vulkan/VulkanTexture.h"
namespace XCEngine {
namespace RHI {
class VulkanBuffer;
class VulkanTexture;
class VulkanResourceView : public RHIResourceView {
public:
VulkanResourceView() = default;
~VulkanResourceView() override;
bool InitializeAsRenderTarget(VkDevice device, VulkanTexture* texture, const ResourceViewDesc& desc);
bool InitializeAsVertexBuffer(VulkanBuffer* buffer, const ResourceViewDesc& desc);
bool InitializeAsIndexBuffer(VulkanBuffer* buffer, const ResourceViewDesc& desc);
void Shutdown() override;
void* GetNativeHandle() override { return m_imageView; }
bool IsValid() const override { return m_imageView != VK_NULL_HANDLE; }
void* GetNativeHandle() override;
bool IsValid() const override;
ResourceViewType GetViewType() const override { return m_viewType; }
ResourceViewDimension GetDimension() const override { return m_dimension; }
@@ -24,14 +28,23 @@ public:
VulkanTexture* GetTexture() const { return m_texture; }
VkImageView GetImageView() const { return m_imageView; }
VulkanBuffer* GetBufferResource() const { return m_buffer; }
VkBuffer GetBuffer() const;
uint64_t GetBufferOffset() const { return m_bufferOffset; }
uint32_t GetBufferSize() const { return m_bufferSize; }
uint32_t GetBufferStride() const { return m_bufferStride; }
private:
VkDevice m_device = VK_NULL_HANDLE;
VkImageView m_imageView = VK_NULL_HANDLE;
VulkanTexture* m_texture = nullptr;
VulkanBuffer* m_buffer = nullptr;
ResourceViewType m_viewType = ResourceViewType::RenderTarget;
ResourceViewDimension m_dimension = ResourceViewDimension::Texture2D;
Format m_format = Format::Unknown;
uint64_t m_bufferOffset = 0;
uint32_t m_bufferSize = 0;
uint32_t m_bufferStride = 0;
};
} // namespace RHI