Skip to content

Commit

Permalink
resource descriptor added
Browse files Browse the repository at this point in the history
  • Loading branch information
beaumanvienna committed Jun 8, 2024
1 parent 51899fc commit ea39e15
Show file tree
Hide file tree
Showing 27 changed files with 571 additions and 240 deletions.
1 change: 1 addition & 0 deletions engine/platform/Vulkan/VKdescriptor.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ namespace GfxRenderEngine
Builder& AddBinding(uint binding, VkDescriptorType descriptorType, VkShaderStageFlags stageFlags,
uint count = 1);

size_t Size() const { return m_Bindings.size(); }
std::unique_ptr<VK_DescriptorSetLayout> Build() const;

private:
Expand Down
71 changes: 19 additions & 52 deletions engine/platform/Vulkan/VKmaterialDescriptor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,19 +25,18 @@
#include "VKrenderer.h"
#include "VKtexture.h"
#include "VKcubemap.h"
#include "VKbuffer.h"

namespace GfxRenderEngine
{
extern std::shared_ptr<Texture> gTextureSpritesheet;
VK_MaterialDescriptor::VK_MaterialDescriptor(MaterialDescriptor::MaterialTypes materialType,
Material::MaterialTextures& textures, Material::MaterialBuffers& buffers)
VK_MaterialDescriptor::VK_MaterialDescriptor(MaterialDescriptor::MaterialType materialType,
Material::MaterialTextures& textures)

: m_MaterialType{materialType}
{
switch (materialType)
{
case MaterialDescriptor::MaterialTypes::MtPbr:
case MaterialDescriptor::MaterialType::MtPbr:
{
// textures
std::shared_ptr<Texture> diffuseMap;
Expand All @@ -57,33 +56,14 @@ namespace GfxRenderEngine
roughnessMap = textures[Material::ROUGHNESS_MAP_INDEX] ? textures[Material::ROUGHNESS_MAP_INDEX] : dummy;
metallicMap = textures[Material::METALLIC_MAP_INDEX] ? textures[Material::METALLIC_MAP_INDEX] : dummy;

// buffers
std::shared_ptr<Buffer>& instanceUbo = buffers[Material::INSTANCE_BUFFER_INDEX];
auto instanceBuffer = static_cast<VK_Buffer*>(instanceUbo.get());
VkDescriptorBufferInfo instanceBufferInfo = instanceBuffer->DescriptorInfo();

std::shared_ptr<Buffer>& skeletalAnimationUbo = buffers[Material::SKELETAL_ANIMATION_BUFFER_INDEX];
VK_Buffer* skeletalAnimationBuffer = nullptr;
VkDescriptorBufferInfo skeletalAnimationBufferInfo;
if (skeletalAnimationUbo)
{
skeletalAnimationBuffer = static_cast<VK_Buffer*>(skeletalAnimationUbo.get());
skeletalAnimationBufferInfo = skeletalAnimationBuffer->DescriptorInfo();
}

{
VK_DescriptorSetLayout::Builder builder{};
builder.AddBinding(0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_SHADER_STAGE_FRAGMENT_BIT)
.AddBinding(1, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_SHADER_STAGE_FRAGMENT_BIT)
.AddBinding(2, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_SHADER_STAGE_FRAGMENT_BIT)
.AddBinding(3, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_SHADER_STAGE_FRAGMENT_BIT)
.AddBinding(4, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_SHADER_STAGE_FRAGMENT_BIT)
.AddBinding(5, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_SHADER_STAGE_FRAGMENT_BIT)
.AddBinding(6, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_VERTEX_BIT);
if (skeletalAnimationUbo)
{
builder.AddBinding(7, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_VERTEX_BIT);
}
.AddBinding(5, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_SHADER_STAGE_FRAGMENT_BIT);
std::unique_ptr<VK_DescriptorSetLayout> localDescriptorSetLayout = builder.Build();

auto& imageInfo0 = static_cast<VK_Texture*>(diffuseMap.get())->GetDescriptorImageInfo();
Expand All @@ -99,32 +79,9 @@ namespace GfxRenderEngine
.WriteImage(2, imageInfo2)
.WriteImage(3, imageInfo3)
.WriteImage(4, imageInfo4)
.WriteImage(5, imageInfo5)
.WriteBuffer(6, instanceBufferInfo);
if (skeletalAnimationBuffer)
{
descriptorWriter.WriteBuffer(7, skeletalAnimationBufferInfo);
}
.WriteImage(5, imageInfo5);
descriptorWriter.Build(m_DescriptorSet);
}

{
VK_DescriptorSetLayout::Builder builder{};
builder.AddBinding(0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_VERTEX_BIT);
if (skeletalAnimationUbo)
{
builder.AddBinding(1, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_VERTEX_BIT);
}
std::unique_ptr<VK_DescriptorSetLayout> localDescriptorSetLayout = builder.Build();

VK_DescriptorWriter descriptorWriter(*localDescriptorSetLayout, *VK_Renderer::m_DescriptorPool);
descriptorWriter.WriteBuffer(0, instanceBufferInfo);
if (skeletalAnimationBuffer)
{
descriptorWriter.WriteBuffer(1, skeletalAnimationBufferInfo);
}
descriptorWriter.Build(m_ShadowDescriptorSet);
}
break;
}
default:
Expand All @@ -135,13 +92,13 @@ namespace GfxRenderEngine
}
}

VK_MaterialDescriptor::VK_MaterialDescriptor(MaterialDescriptor::MaterialTypes materialType,
VK_MaterialDescriptor::VK_MaterialDescriptor(MaterialDescriptor::MaterialType materialType,
std::shared_ptr<Cubemap> const& cubemap)
: m_MaterialType{materialType}
{
switch (materialType)
{
case MaterialDescriptor::MaterialTypes::MtCubemap:
case MaterialDescriptor::MaterialType::MtCubemap:
{
std::unique_ptr<VK_DescriptorSetLayout> localDescriptorSetLayout =
VK_DescriptorSetLayout::Builder()
Expand Down Expand Up @@ -170,11 +127,21 @@ namespace GfxRenderEngine
m_ShadowDescriptorSet = other.m_ShadowDescriptorSet;
}

VK_MaterialDescriptor::VK_MaterialDescriptor(std::shared_ptr<MaterialDescriptor> const& materialDescriptor)
{
if (materialDescriptor)
{
VK_MaterialDescriptor* other = static_cast<VK_MaterialDescriptor*>(materialDescriptor.get());
m_MaterialType = other->m_MaterialType;
m_DescriptorSet = other->m_DescriptorSet;
m_ShadowDescriptorSet = other->m_ShadowDescriptorSet;
}
}

VK_MaterialDescriptor::~VK_MaterialDescriptor() {}

MaterialDescriptor::MaterialTypes VK_MaterialDescriptor::GetMaterialType() const { return m_MaterialType; }
MaterialDescriptor::MaterialType VK_MaterialDescriptor::GetMaterialType() const { return m_MaterialType; }

const VkDescriptorSet& VK_MaterialDescriptor::GetDescriptorSet() const { return m_DescriptorSet; }

const VkDescriptorSet& VK_MaterialDescriptor::GetShadowDescriptorSet() const { return m_ShadowDescriptorSet; }
} // namespace GfxRenderEngine
11 changes: 5 additions & 6 deletions engine/platform/Vulkan/VKmaterialDescriptor.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,21 +32,20 @@ namespace GfxRenderEngine
{

public:
VK_MaterialDescriptor(MaterialDescriptor::MaterialTypes materialType, Material::MaterialTextures& textures,
Material::MaterialBuffers& buffers);
VK_MaterialDescriptor(MaterialDescriptor::MaterialTypes materialType, std::shared_ptr<Cubemap> const& cubemap);
VK_MaterialDescriptor(MaterialDescriptor::MaterialType materialType, Material::MaterialTextures& textures);
VK_MaterialDescriptor(MaterialDescriptor::MaterialType materialType, std::shared_ptr<Cubemap> const& cubemap);

VK_MaterialDescriptor(VK_MaterialDescriptor const& other);
VK_MaterialDescriptor(std::shared_ptr<MaterialDescriptor> const& materialDescriptor);

virtual ~VK_MaterialDescriptor();

public:
virtual MaterialDescriptor::MaterialTypes GetMaterialType() const override;
virtual MaterialDescriptor::MaterialType GetMaterialType() const override;
const VkDescriptorSet& GetDescriptorSet() const;
const VkDescriptorSet& GetShadowDescriptorSet() const;

private:
MaterialDescriptor::MaterialTypes m_MaterialType;
MaterialDescriptor::MaterialType m_MaterialType;
VkDescriptorSet m_DescriptorSet;
VkDescriptorSet m_ShadowDescriptorSet;
};
Expand Down
41 changes: 30 additions & 11 deletions engine/platform/Vulkan/VKmodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -103,9 +103,10 @@ namespace GfxRenderEngine
VK_Model::~VK_Model() {}

VK_Submesh::VK_Submesh(Submesh const& submesh)
: Submesh{submesh.m_FirstIndex, submesh.m_FirstVertex, submesh.m_IndexCount,
submesh.m_VertexCount, submesh.m_InstanceCount, submesh.m_Material},
m_MaterialDescriptor(*(static_cast<VK_MaterialDescriptor*>(submesh.m_Material.m_MaterialDescriptor.get())))
: Submesh{submesh.m_FirstIndex, submesh.m_FirstVertex, submesh.m_IndexCount, submesh.m_VertexCount,
submesh.m_InstanceCount, submesh.m_Material, submesh.m_Resources},
m_MaterialDescriptor(submesh.m_Material.m_MaterialDescriptor),
m_ResourceDescriptor(submesh.m_Resources.m_ResourceDescriptor)
{
}

Expand All @@ -115,16 +116,16 @@ namespace GfxRenderEngine
{
VK_Submesh vkSubmesh(submesh);

MaterialDescriptor::MaterialTypes materialType = vkSubmesh.m_MaterialDescriptor.GetMaterialType();
MaterialDescriptor::MaterialType materialType = vkSubmesh.m_MaterialDescriptor.GetMaterialType();

switch (materialType)
{
case MaterialDescriptor::MaterialTypes::MtPbr:
case MaterialDescriptor::MaterialType::MtPbr:
{
m_SubmeshesPbrMap.push_back(vkSubmesh);
break;
}
case MaterialDescriptor::MaterialTypes::MtCubemap:
case MaterialDescriptor::MaterialType::MtCubemap:
{
m_SubmeshesCubemap.push_back(vkSubmesh);
break;
Expand Down Expand Up @@ -189,13 +190,31 @@ namespace GfxRenderEngine
void VK_Model::BindDescriptors(const VK_FrameInfo& frameInfo, const VkPipelineLayout& pipelineLayout,
VK_Submesh const& submesh)
{
auto& localDescriptorSet = submesh.m_MaterialDescriptor.GetDescriptorSet();
std::vector<VkDescriptorSet> descriptorSets = {frameInfo.m_GlobalDescriptorSet, localDescriptorSet};
const VkDescriptorSet& materialDescriptorSet = submesh.m_MaterialDescriptor.GetDescriptorSet();
std::vector<VkDescriptorSet> descriptorSets = {frameInfo.m_GlobalDescriptorSet, materialDescriptorSet};
vkCmdBindDescriptorSets(frameInfo.m_CommandBuffer, // VkCommandBuffer commandBuffer,
VK_PIPELINE_BIND_POINT_GRAPHICS, // VkPipelineBindPoint pipelineBindPoint,
pipelineLayout, // VkPipelineLayout layout,
0, // uint32_t firstSet,
2, // uint32_t descriptorSetCount,
descriptorSets.size(), // uint32_t descriptorSetCount,
descriptorSets.data(), // const VkDescriptorSet* pDescriptorSets,
0, // uint32_t dynamicOffsetCount,
nullptr // const uint32_t* pDynamicOffsets);
);
}

void VK_Model::BindDescriptors(const VK_FrameInfo& frameInfo, const VkPipelineLayout& pipelineLayout,
VK_Submesh const& submesh, bool bindResources)
{
const VkDescriptorSet& materialDescriptorSet = submesh.m_MaterialDescriptor.GetDescriptorSet();
const VkDescriptorSet& resourceDescriptorSet = submesh.m_ResourceDescriptor.GetDescriptorSet();
std::vector<VkDescriptorSet> descriptorSets = {frameInfo.m_GlobalDescriptorSet, materialDescriptorSet,
resourceDescriptorSet};
vkCmdBindDescriptorSets(frameInfo.m_CommandBuffer, // VkCommandBuffer commandBuffer,
VK_PIPELINE_BIND_POINT_GRAPHICS, // VkPipelineBindPoint pipelineBindPoint,
pipelineLayout, // VkPipelineLayout layout,
0, // uint32_t firstSet,
descriptorSets.size(), // uint32_t descriptorSetCount,
descriptorSets.data(), // const VkDescriptorSet* pDescriptorSets,
0, // uint32_t dynamicOffsetCount,
nullptr // const uint32_t* pDynamicOffsets);
Expand Down Expand Up @@ -260,7 +279,7 @@ namespace GfxRenderEngine
{
for (auto& submesh : m_SubmeshesPbrMap)
{
BindDescriptors(frameInfo, pipelineLayout, submesh);
BindDescriptors(frameInfo, pipelineLayout, submesh, true /*bind resources*/);
PushConstantsPbr(frameInfo, pipelineLayout, submesh);
DrawSubmesh(frameInfo.m_CommandBuffer, submesh);
}
Expand All @@ -278,7 +297,7 @@ namespace GfxRenderEngine
void VK_Model::DrawShadowInstancedInternal(VK_FrameInfo const& frameInfo, VkPipelineLayout const& pipelineLayout,
VK_Submesh const& submesh, VkDescriptorSet const& shadowDescriptorSet)
{
VkDescriptorSet localDescriptorSet = submesh.m_MaterialDescriptor.GetShadowDescriptorSet();
VkDescriptorSet localDescriptorSet = submesh.m_ResourceDescriptor.GetDescriptorSet();
std::vector<VkDescriptorSet> descriptorSets = {shadowDescriptorSet, localDescriptorSet};
vkCmdBindDescriptorSets(frameInfo.m_CommandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 2,
descriptorSets.data(), 0, nullptr);
Expand Down
4 changes: 4 additions & 0 deletions engine/platform/Vulkan/VKmodel.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
#include "VKtexture.h"
#include "VKcubemap.h"
#include "VKmaterialDescriptor.h"
#include "VKresourceDescriptor.h"

namespace GfxRenderEngine
{
Expand All @@ -51,6 +52,7 @@ namespace GfxRenderEngine
{
VK_Submesh(Submesh const& submesh);
VK_MaterialDescriptor m_MaterialDescriptor;
VK_ResourceDescriptor m_ResourceDescriptor;
};

class VK_Model : public Model
Expand Down Expand Up @@ -103,6 +105,8 @@ namespace GfxRenderEngine
VK_Submesh const& submesh);
void BindDescriptors(const VK_FrameInfo& frameInfo, const VkPipelineLayout& pipelineLayout,
VK_Submesh const& submesh);
void BindDescriptors(const VK_FrameInfo& frameInfo, const VkPipelineLayout& pipelineLayout,
VK_Submesh const& submesh, bool bindResources);

void Draw(VkCommandBuffer commandBuffer);
void DrawSubmesh(VkCommandBuffer commandBuffer, Submesh const& submesh);
Expand Down
39 changes: 17 additions & 22 deletions engine/platform/Vulkan/VKrenderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ namespace GfxRenderEngine
.AddBinding(0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_SHADER_STAGE_FRAGMENT_BIT) // color map
.Build();

std::unique_ptr<VK_DescriptorSetLayout> pbrDescriptorSetLayout =
std::unique_ptr<VK_DescriptorSetLayout> pbrMaterialDescriptorSetLayout =
VK_DescriptorSetLayout::Builder()
.AddBinding(0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
VK_SHADER_STAGE_FRAGMENT_BIT) // diffuse color map
Expand All @@ -134,26 +134,18 @@ namespace GfxRenderEngine
.AddBinding(4, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
VK_SHADER_STAGE_FRAGMENT_BIT) // roughness map
.AddBinding(5, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
VK_SHADER_STAGE_FRAGMENT_BIT) // metallic map
.AddBinding(6, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_VERTEX_BIT) // shader data for instances
VK_SHADER_STAGE_FRAGMENT_BIT) // metallic map
.Build();

std::unique_ptr<VK_DescriptorSetLayout> pbrSADescriptorSetLayout =
std::unique_ptr<VK_DescriptorSetLayout> pbrResourceDescriptorSetLayout =
VK_DescriptorSetLayout::Builder()
.AddBinding(0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
VK_SHADER_STAGE_FRAGMENT_BIT) // diffuse color map
.AddBinding(1, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
VK_SHADER_STAGE_FRAGMENT_BIT) // normal map
.AddBinding(2, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
VK_SHADER_STAGE_FRAGMENT_BIT) // roughness metallic map
.AddBinding(3, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
VK_SHADER_STAGE_FRAGMENT_BIT) // emissive map
.AddBinding(4, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
VK_SHADER_STAGE_FRAGMENT_BIT) // roughness map
.AddBinding(5, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
VK_SHADER_STAGE_FRAGMENT_BIT) // metallic map
.AddBinding(6, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_VERTEX_BIT) // shader data for instances
.AddBinding(7, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_VERTEX_BIT) // shader data for animation
.AddBinding(0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_VERTEX_BIT) // shader data for instances
.Build();

std::unique_ptr<VK_DescriptorSetLayout> pbrSAResourceDescriptorSetLayout =
VK_DescriptorSetLayout::Builder()
.AddBinding(0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_VERTEX_BIT) // shader data for instances
.AddBinding(1, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_VERTEX_BIT) // shader data for animation
.Build();

std::unique_ptr<VK_DescriptorSetLayout> instanceDescriptorSetLayout =
Expand Down Expand Up @@ -197,10 +189,13 @@ namespace GfxRenderEngine
std::vector<VkDescriptorSetLayout> descriptorSetLayoutsDiffuse = {
m_GlobalDescriptorSetLayout, diffuseDescriptorSetLayout->GetDescriptorSetLayout()};

std::vector<VkDescriptorSetLayout> descriptorSetLayoutsPbr = {m_GlobalDescriptorSetLayout,
pbrDescriptorSetLayout->GetDescriptorSetLayout()};
std::vector<VkDescriptorSetLayout> descriptorSetLayoutsPbrSA = {m_GlobalDescriptorSetLayout,
pbrSADescriptorSetLayout->GetDescriptorSetLayout()};
std::vector<VkDescriptorSetLayout> descriptorSetLayoutsPbr = {
m_GlobalDescriptorSetLayout, pbrMaterialDescriptorSetLayout->GetDescriptorSetLayout(),
pbrResourceDescriptorSetLayout->GetDescriptorSetLayout()};

std::vector<VkDescriptorSetLayout> descriptorSetLayoutsPbrSA = {
m_GlobalDescriptorSetLayout, pbrMaterialDescriptorSetLayout->GetDescriptorSetLayout(),
pbrSAResourceDescriptorSetLayout->GetDescriptorSetLayout()};

std::vector<VkDescriptorSetLayout> descriptorSetLayoutsLighting = {
m_GlobalDescriptorSetLayout, m_LightingDescriptorSetLayout->GetDescriptorSetLayout(),
Expand Down
Loading

0 comments on commit ea39e15

Please sign in to comment.