mirror of
https://github.com/ZDoom/qzdoom.git
synced 2024-11-11 15:22:16 +00:00
- use the uniform buffer alignment as returned by the vulkan device
This commit is contained in:
parent
95116e8580
commit
e06f8f172d
4 changed files with 13 additions and 16 deletions
|
@ -479,16 +479,6 @@ void VkRenderState::ApplyPushConstants()
|
|||
mCommandBuffer->pushConstants(passManager->PipelineLayout.get(), VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, (uint32_t)sizeof(PushConstants), &mPushConstants);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
static void CopyToBuffer(uint32_t &offset, const T &data, VKDataBuffer *buffer)
|
||||
{
|
||||
if (offset + (UniformBufferAlignment<T>() << 1) < buffer->Size())
|
||||
{
|
||||
offset += UniformBufferAlignment<T>();
|
||||
memcpy(static_cast<uint8_t*>(buffer->Memory()) + offset, &data, sizeof(T));
|
||||
}
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
static void BufferedSet(bool &modified, T &dst, const T &src)
|
||||
{
|
||||
|
@ -533,7 +523,12 @@ void VkRenderState::ApplyMatrices()
|
|||
if (modified)
|
||||
{
|
||||
auto fb = GetVulkanFrameBuffer();
|
||||
CopyToBuffer(mMatricesOffset, mMatrices, fb->MatricesUBO);
|
||||
|
||||
if (mMatricesOffset + (fb->UniformBufferAlignedSize<MatricesUBO>() << 1) < fb->MatricesUBO->Size())
|
||||
{
|
||||
mMatricesOffset += fb->UniformBufferAlignedSize<MatricesUBO>();
|
||||
memcpy(static_cast<uint8_t*>(fb->MatricesUBO->Memory()) + mMatricesOffset, &mMatrices, sizeof(MatricesUBO));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -11,9 +11,6 @@
|
|||
class VulkanDevice;
|
||||
class VulkanShader;
|
||||
|
||||
// To do: we need to read this from the card - or maybe merge ColorsUBO with GlowingWallsUBO since we have to use 256 bytes anyway
|
||||
template<typename T> int UniformBufferAlignment() { return (sizeof(T) + 255) / 256 * 256; }
|
||||
|
||||
struct MatricesUBO
|
||||
{
|
||||
VSMatrix ModelMatrix;
|
||||
|
|
|
@ -99,6 +99,8 @@ void VulkanFrameBuffer::InitializeState()
|
|||
|
||||
gl_vendorstring = "Vulkan";
|
||||
hwcaps = RFL_SHADER_STORAGE_BUFFER | RFL_BUFFER_STORAGE;
|
||||
uniformblockalignment = (unsigned int)device->deviceProperties.limits.minUniformBufferOffsetAlignment;
|
||||
maxuniformblock = device->deviceProperties.limits.maxUniformBufferRange;
|
||||
|
||||
mUploadSemaphore.reset(new VulkanSemaphore(device));
|
||||
mGraphicsCommandPool.reset(new VulkanCommandPool(device, device->graphicsFamily));
|
||||
|
@ -113,8 +115,8 @@ void VulkanFrameBuffer::InitializeState()
|
|||
// To do: move this to HW renderer interface maybe?
|
||||
MatricesUBO = (VKDataBuffer*)CreateDataBuffer(-1, false);
|
||||
StreamUBO = (VKDataBuffer*)CreateDataBuffer(-1, false);
|
||||
MatricesUBO->SetData(UniformBufferAlignment<::MatricesUBO>() * 50000, nullptr, false);
|
||||
StreamUBO->SetData(UniformBufferAlignment<::StreamUBO>() * 200, nullptr, false);
|
||||
MatricesUBO->SetData(UniformBufferAlignedSize<::MatricesUBO>() * 50000, nullptr, false);
|
||||
StreamUBO->SetData(UniformBufferAlignedSize<::StreamUBO>() * 200, nullptr, false);
|
||||
|
||||
mShaderManager.reset(new VkShaderManager(device));
|
||||
mSamplerManager.reset(new VkSamplerManager(device));
|
||||
|
|
|
@ -30,6 +30,9 @@ public:
|
|||
|
||||
unsigned int GetLightBufferBlockSize() const;
|
||||
|
||||
template<typename T>
|
||||
int UniformBufferAlignedSize() const { return (sizeof(T) + uniformblockalignment - 1) / uniformblockalignment * uniformblockalignment; }
|
||||
|
||||
VKDataBuffer *ViewpointUBO = nullptr;
|
||||
VKDataBuffer *LightBufferSSO = nullptr;
|
||||
VKDataBuffer *MatricesUBO = nullptr;
|
||||
|
|
Loading…
Reference in a new issue