summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/Vulkan/VKVertexManager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core/VideoBackends/Vulkan/VKVertexManager.cpp')
-rw-r--r--Source/Core/VideoBackends/Vulkan/VKVertexManager.cpp66
1 files changed, 53 insertions, 13 deletions
diff --git a/Source/Core/VideoBackends/Vulkan/VKVertexManager.cpp b/Source/Core/VideoBackends/Vulkan/VKVertexManager.cpp
index 5069d3e6d0..73c9dfde59 100644
--- a/Source/Core/VideoBackends/Vulkan/VKVertexManager.cpp
+++ b/Source/Core/VideoBackends/Vulkan/VKVertexManager.cpp
@@ -243,22 +243,43 @@ void VertexManager::UpdatePixelShaderConstants()
auto& system = Core::System::GetInstance();
auto& pixel_shader_manager = system.GetPixelShaderManager();
- if (!pixel_shader_manager.dirty || !ReserveConstantStorage())
+ if (!ReserveConstantStorage())
return;
- StateTracker::GetInstance()->SetGXUniformBuffer(
- UBO_DESCRIPTOR_SET_BINDING_PS, m_uniform_stream_buffer->GetBuffer(),
- m_uniform_stream_buffer->GetCurrentOffset(), sizeof(PixelShaderConstants));
- std::memcpy(m_uniform_stream_buffer->GetCurrentHostPointer(), &pixel_shader_manager.constants,
- sizeof(PixelShaderConstants));
- m_uniform_stream_buffer->CommitMemory(sizeof(PixelShaderConstants));
- ADDSTAT(g_stats.this_frame.bytes_uniform_streamed, sizeof(PixelShaderConstants));
- pixel_shader_manager.dirty = false;
+ if (pixel_shader_manager.dirty)
+ {
+ StateTracker::GetInstance()->SetGXUniformBuffer(
+ UBO_DESCRIPTOR_SET_BINDING_PS, m_uniform_stream_buffer->GetBuffer(),
+ m_uniform_stream_buffer->GetCurrentOffset(), sizeof(PixelShaderConstants));
+ std::memcpy(m_uniform_stream_buffer->GetCurrentHostPointer(), &pixel_shader_manager.constants,
+ sizeof(PixelShaderConstants));
+ m_uniform_stream_buffer->CommitMemory(sizeof(PixelShaderConstants));
+ ADDSTAT(g_stats.this_frame.bytes_uniform_streamed, sizeof(PixelShaderConstants));
+ pixel_shader_manager.dirty = false;
+ }
+
+ if (pixel_shader_manager.custom_constants_dirty)
+ {
+ StateTracker::GetInstance()->SetGXUniformBuffer(
+ UBO_DESCRIPTOR_SET_BINDING_PS_CUST, m_uniform_stream_buffer->GetBuffer(),
+ m_uniform_stream_buffer->GetCurrentOffset(),
+ static_cast<u32>(pixel_shader_manager.custom_constants.size()));
+ std::memcpy(m_uniform_stream_buffer->GetCurrentHostPointer(),
+ pixel_shader_manager.custom_constants.data(),
+ pixel_shader_manager.custom_constants.size());
+ m_uniform_stream_buffer->CommitMemory(
+ static_cast<u32>(pixel_shader_manager.custom_constants.size()));
+ pixel_shader_manager.custom_constants_dirty = false;
+ }
}
bool VertexManager::ReserveConstantStorage()
{
- if (m_uniform_stream_buffer->ReserveMemory(m_uniform_buffer_reserve_size,
+ auto& system = Core::System::GetInstance();
+ auto& pixel_shader_manager = system.GetPixelShaderManager();
+ const u32 custom_constants_size = static_cast<u32>(pixel_shader_manager.custom_constants.size());
+
+ if (m_uniform_stream_buffer->ReserveMemory(m_uniform_buffer_reserve_size + custom_constants_size,
g_vulkan_context->GetUniformBufferAlignment()))
{
return true;
@@ -276,6 +297,11 @@ bool VertexManager::ReserveConstantStorage()
void VertexManager::UploadAllConstants()
{
+ auto& system = Core::System::GetInstance();
+ auto& pixel_shader_manager = system.GetPixelShaderManager();
+
+ const u32 custom_constants_size = static_cast<u32>(pixel_shader_manager.custom_constants.size());
+
// We are free to re-use parts of the buffer now since we're uploading all constants.
const u32 ub_alignment = static_cast<u32>(g_vulkan_context->GetUniformBufferAlignment());
const u32 pixel_constants_offset = 0;
@@ -283,7 +309,9 @@ void VertexManager::UploadAllConstants()
Common::AlignUp(pixel_constants_offset + sizeof(PixelShaderConstants), ub_alignment);
const u32 geometry_constants_offset =
Common::AlignUp(vertex_constants_offset + sizeof(VertexShaderConstants), ub_alignment);
- const u32 allocation_size = geometry_constants_offset + sizeof(GeometryShaderConstants);
+ const u32 custom_pixel_constants_offset =
+ Common::AlignUp(geometry_constants_offset + sizeof(GeometryShaderConstants), ub_alignment);
+ const u32 allocation_size = custom_pixel_constants_offset + custom_constants_size;
// Allocate everything at once.
// We should only be here if the buffer was full and a command buffer was submitted anyway.
@@ -293,8 +321,6 @@ void VertexManager::UploadAllConstants()
return;
}
- auto& system = Core::System::GetInstance();
- auto& pixel_shader_manager = system.GetPixelShaderManager();
auto& vertex_shader_manager = system.GetVertexShaderManager();
auto& geometry_shader_manager = system.GetGeometryShaderManager();
@@ -307,6 +333,14 @@ void VertexManager::UploadAllConstants()
UBO_DESCRIPTOR_SET_BINDING_VS, m_uniform_stream_buffer->GetBuffer(),
m_uniform_stream_buffer->GetCurrentOffset() + vertex_constants_offset,
sizeof(VertexShaderConstants));
+
+ if (!pixel_shader_manager.custom_constants.empty())
+ {
+ StateTracker::GetInstance()->SetGXUniformBuffer(
+ UBO_DESCRIPTOR_SET_BINDING_PS_CUST, m_uniform_stream_buffer->GetBuffer(),
+ m_uniform_stream_buffer->GetCurrentOffset() + custom_pixel_constants_offset,
+ custom_constants_size);
+ }
StateTracker::GetInstance()->SetGXUniformBuffer(
UBO_DESCRIPTOR_SET_BINDING_GS, m_uniform_stream_buffer->GetBuffer(),
m_uniform_stream_buffer->GetCurrentOffset() + geometry_constants_offset,
@@ -319,6 +353,12 @@ void VertexManager::UploadAllConstants()
&vertex_shader_manager.constants, sizeof(VertexShaderConstants));
std::memcpy(m_uniform_stream_buffer->GetCurrentHostPointer() + geometry_constants_offset,
&geometry_shader_manager.constants, sizeof(GeometryShaderConstants));
+ if (!pixel_shader_manager.custom_constants.empty())
+ {
+ std::memcpy(m_uniform_stream_buffer->GetCurrentHostPointer() + custom_pixel_constants_offset,
+ pixel_shader_manager.custom_constants.data(),
+ pixel_shader_manager.custom_constants.size());
+ }
// Finally, flush buffer memory after copying
m_uniform_stream_buffer->CommitMemory(allocation_size);