Add Vulkan triangle integration path
This commit is contained in:
57
engine/include/XCEngine/RHI/Vulkan/VulkanBuffer.h
Normal file
57
engine/include/XCEngine/RHI/Vulkan/VulkanBuffer.h
Normal 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
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
66
engine/include/XCEngine/RHI/Vulkan/VulkanPipelineState.h
Normal file
66
engine/include/XCEngine/RHI/Vulkan/VulkanPipelineState.h
Normal 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
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user