Accounted for Shaders with no SHShaderBlockInterface
This commit is contained in:
parent
23fe51b483
commit
8070b2dafa
|
@ -107,18 +107,20 @@ namespace SHADE
|
||||||
transformData.reserve(numTotalElements);
|
transformData.reserve(numTotalElements);
|
||||||
transformData.clear();
|
transformData.clear();
|
||||||
// - Material Properties Data
|
// - Material Properties Data
|
||||||
const Byte SINGLE_MAT_PROPS_SIZE = pipeline->GetPipelineLayout()->GetShaderBlockInterface
|
const Handle<SHShaderBlockInterface> SHADER_INFO = pipeline->GetPipelineLayout()->GetShaderBlockInterface
|
||||||
(
|
(
|
||||||
SHGraphicsConstants::DescriptorSetIndex::PER_INSTANCE,
|
SHGraphicsConstants::DescriptorSetIndex::PER_INSTANCE,
|
||||||
SHGraphicsConstants::DescriptorSetBindings::BATCHED_PER_INST_DATA,
|
SHGraphicsConstants::DescriptorSetBindings::BATCHED_PER_INST_DATA,
|
||||||
vk::ShaderStageFlagBits::eFragment
|
vk::ShaderStageFlagBits::eFragment
|
||||||
)->GetBytesRequired();
|
);
|
||||||
|
const Byte SINGLE_MAT_PROPS_SIZE = SHADER_INFO->GetBytesRequired();
|
||||||
const Byte MATPROPS_TOTAL_BYTES = drawData.size() * SINGLE_MAT_PROPS_SIZE;
|
const Byte MATPROPS_TOTAL_BYTES = drawData.size() * SINGLE_MAT_PROPS_SIZE;
|
||||||
if (matPropsDataSize < MATPROPS_TOTAL_BYTES)
|
if (matPropsDataSize < MATPROPS_TOTAL_BYTES)
|
||||||
{
|
{
|
||||||
matPropsData.reset(new char[MATPROPS_TOTAL_BYTES]);
|
matPropsData.reset(new char[MATPROPS_TOTAL_BYTES]);
|
||||||
matPropsDataSize = MATPROPS_TOTAL_BYTES;
|
matPropsDataSize = MATPROPS_TOTAL_BYTES;
|
||||||
}
|
}
|
||||||
|
const bool EMPTY_MAT_PROPS = MATPROPS_TOTAL_BYTES <= 0;
|
||||||
|
|
||||||
// Build Sub Batches
|
// Build Sub Batches
|
||||||
uint32_t nextInstanceIndex = 0;
|
uint32_t nextInstanceIndex = 0;
|
||||||
|
@ -141,10 +143,13 @@ namespace SHADE
|
||||||
// Transform
|
// Transform
|
||||||
transformData.emplace_back(renderable->TransformMatrix);
|
transformData.emplace_back(renderable->TransformMatrix);
|
||||||
// Material Properties
|
// Material Properties
|
||||||
|
if (!EMPTY_MAT_PROPS)
|
||||||
|
{
|
||||||
renderable->GetMaterial()->ExportProperties(propsCurrPtr);
|
renderable->GetMaterial()->ExportProperties(propsCurrPtr);
|
||||||
propsCurrPtr += SINGLE_MAT_PROPS_SIZE;
|
propsCurrPtr += SINGLE_MAT_PROPS_SIZE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Send all buffered data to the GPU buffers
|
// Send all buffered data to the GPU buffers
|
||||||
using BuffUsage = vk::BufferUsageFlagBits;
|
using BuffUsage = vk::BufferUsageFlagBits;
|
||||||
|
@ -177,6 +182,7 @@ namespace SHADE
|
||||||
/*---------------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------------*/
|
||||||
void SHBatch::Draw(Handle<SHVkCommandBuffer> cmdBuffer)
|
void SHBatch::Draw(Handle<SHVkCommandBuffer> cmdBuffer)
|
||||||
{
|
{
|
||||||
|
cmdBuffer->BindVertexBuffer(SHGraphicsConstants::VertexBufferBindings::TRANSFORM, transformDataBuffer, 0);
|
||||||
cmdBuffer->DrawMultiIndirect(drawDataBuffer, static_cast<uint32_t>(drawData.size()));
|
cmdBuffer->DrawMultiIndirect(drawDataBuffer, static_cast<uint32_t>(drawData.size()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -71,6 +71,17 @@ namespace SHADE
|
||||||
static constexpr uint32_t BATCHED_PER_INST_DATA = 0;
|
static constexpr uint32_t BATCHED_PER_INST_DATA = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct VertexBufferBindings
|
||||||
|
{
|
||||||
|
/***************************************************************************/
|
||||||
|
/*!
|
||||||
|
\brief
|
||||||
|
Vertex buffer bindings for the transform matrix buffer.
|
||||||
|
*/
|
||||||
|
/***************************************************************************/
|
||||||
|
static constexpr uint32_t TRANSFORM = 4;
|
||||||
|
};
|
||||||
|
|
||||||
/*******************************************************************************/
|
/*******************************************************************************/
|
||||||
/*!
|
/*!
|
||||||
\brief
|
\brief
|
||||||
|
|
|
@ -23,8 +23,16 @@ namespace SHADE
|
||||||
}
|
}
|
||||||
|
|
||||||
// Allocate memory for properties
|
// Allocate memory for properties
|
||||||
propMemorySize = getShaderBlockInterface()->GetBytesRequired();
|
const Handle<SHShaderBlockInterface> SHADER_INFO = getShaderBlockInterface();
|
||||||
|
propMemorySize = SHADER_INFO ? SHADER_INFO->GetBytesRequired() : 0;
|
||||||
|
if (propMemorySize <= 0)
|
||||||
|
{
|
||||||
|
propMemory.reset();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
propMemory.reset(new char[propMemorySize]);
|
propMemory.reset(new char[propMemorySize]);
|
||||||
|
}
|
||||||
ResetProperties();
|
ResetProperties();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -39,17 +47,20 @@ namespace SHADE
|
||||||
void SHMaterial::ResetProperties()
|
void SHMaterial::ResetProperties()
|
||||||
{
|
{
|
||||||
// Reset all the properties to default values
|
// Reset all the properties to default values
|
||||||
|
if (propMemory)
|
||||||
memset(propMemory.get(), 0, propMemorySize);
|
memset(propMemory.get(), 0, propMemorySize);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHMaterial::ExportProperties(void* dest) const noexcept
|
void SHMaterial::ExportProperties(void* dest) const noexcept
|
||||||
{
|
{
|
||||||
|
if (propMemory)
|
||||||
memcpy(dest, propMemory.get(), propMemorySize);
|
memcpy(dest, propMemory.get(), propMemorySize);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t SHMaterial::GetPropertiesMemorySize() const noexcept
|
size_t SHMaterial::GetPropertiesMemorySize() const noexcept
|
||||||
{
|
{
|
||||||
return getShaderBlockInterface()->GetBytesRequired();
|
const Handle<SHShaderBlockInterface> SHADER_INFO = getShaderBlockInterface();
|
||||||
|
return SHADER_INFO ? SHADER_INFO->GetBytesRequired() : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
|
Loading…
Reference in New Issue