mirror of
https://git.eden-emu.dev/eden-emu/eden
synced 2026-05-17 08:07:01 +02:00
[vk, qcom] UniformBufferAlignment set by hardware capabilities
This commit is contained in:
parent
79f6a6096f
commit
c14175e481
4 changed files with 49 additions and 5 deletions
|
|
@ -841,9 +841,23 @@ void BufferCache<P>::BindHostGraphicsUniformBuffer(size_t stage, u32 index, u32
|
||||||
const u32 size = (std::min)(binding.size, (*channel_state->uniform_buffer_sizes)[stage][index]);
|
const u32 size = (std::min)(binding.size, (*channel_state->uniform_buffer_sizes)[stage][index]);
|
||||||
Buffer& buffer = slot_buffers[binding.buffer_id];
|
Buffer& buffer = slot_buffers[binding.buffer_id];
|
||||||
TouchBuffer(buffer, binding.buffer_id);
|
TouchBuffer(buffer, binding.buffer_id);
|
||||||
const bool use_fast_buffer = binding.buffer_id != NULL_BUFFER_ID &&
|
const bool has_host_buffer = binding.buffer_id != NULL_BUFFER_ID;
|
||||||
size <= channel_state->uniform_buffer_skip_cache_size &&
|
const u32 offset = has_host_buffer ? buffer.Offset(device_addr) : 0;
|
||||||
!memory_tracker.IsRegionGpuModified(device_addr, size);
|
const bool needs_alignment_stream = [&]() {
|
||||||
|
if constexpr (IS_OPENGL) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
if (!has_host_buffer) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
const u32 alignment = runtime.GetUniformBufferAlignment();
|
||||||
|
return alignment > 1 && (offset % alignment) != 0;
|
||||||
|
}
|
||||||
|
}();
|
||||||
|
const bool use_fast_buffer = needs_alignment_stream ||
|
||||||
|
(has_host_buffer &&
|
||||||
|
size <= channel_state->uniform_buffer_skip_cache_size &&
|
||||||
|
!memory_tracker.IsRegionGpuModified(device_addr, size));
|
||||||
if (use_fast_buffer) {
|
if (use_fast_buffer) {
|
||||||
if constexpr (IS_OPENGL) {
|
if constexpr (IS_OPENGL) {
|
||||||
if (runtime.HasFastBufferSubData()) {
|
if (runtime.HasFastBufferSubData()) {
|
||||||
|
|
@ -882,7 +896,6 @@ void BufferCache<P>::BindHostGraphicsUniformBuffer(size_t stage, u32 index, u32
|
||||||
if (!needs_bind) {
|
if (!needs_bind) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const u32 offset = buffer.Offset(device_addr);
|
|
||||||
if constexpr (IS_OPENGL) {
|
if constexpr (IS_OPENGL) {
|
||||||
// Mark the index as dirty if offset doesn't match
|
// Mark the index as dirty if offset doesn't match
|
||||||
const bool is_copy_bind = offset != 0 && !runtime.SupportsNonZeroUniformOffset();
|
const bool is_copy_bind = offset != 0 && !runtime.SupportsNonZeroUniformOffset();
|
||||||
|
|
@ -999,9 +1012,30 @@ void BufferCache<P>::BindHostComputeUniformBuffers() {
|
||||||
TouchBuffer(buffer, binding.buffer_id);
|
TouchBuffer(buffer, binding.buffer_id);
|
||||||
const u32 size =
|
const u32 size =
|
||||||
(std::min)(binding.size, (*channel_state->compute_uniform_buffer_sizes)[index]);
|
(std::min)(binding.size, (*channel_state->compute_uniform_buffer_sizes)[index]);
|
||||||
|
const bool has_host_buffer = binding.buffer_id != NULL_BUFFER_ID;
|
||||||
|
const u32 offset = has_host_buffer ? buffer.Offset(binding.device_addr) : 0;
|
||||||
|
const bool needs_alignment_stream = [&]() {
|
||||||
|
if constexpr (IS_OPENGL) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
if (!has_host_buffer) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
const u32 alignment = runtime.GetUniformBufferAlignment();
|
||||||
|
return alignment > 1 && (offset % alignment) != 0;
|
||||||
|
}
|
||||||
|
}();
|
||||||
|
if constexpr (!IS_OPENGL) {
|
||||||
|
if (needs_alignment_stream) {
|
||||||
|
const std::span<u8> span =
|
||||||
|
runtime.BindMappedUniformBuffer(0, binding_index, size);
|
||||||
|
device_memory.ReadBlockUnsafe(binding.device_addr, span.data(), size);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
SynchronizeBuffer(buffer, binding.device_addr, size);
|
SynchronizeBuffer(buffer, binding.device_addr, size);
|
||||||
|
|
||||||
const u32 offset = buffer.Offset(binding.device_addr);
|
|
||||||
buffer.MarkUsage(offset, size);
|
buffer.MarkUsage(offset, size);
|
||||||
if constexpr (NEEDS_BIND_UNIFORM_INDEX) {
|
if constexpr (NEEDS_BIND_UNIFORM_INDEX) {
|
||||||
runtime.BindComputeUniformBuffer(binding_index, buffer, offset, size);
|
runtime.BindComputeUniformBuffer(binding_index, buffer, offset, size);
|
||||||
|
|
|
||||||
|
|
@ -198,6 +198,10 @@ public:
|
||||||
return device.CanReportMemoryUsage();
|
return device.CanReportMemoryUsage();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
u32 GetUniformBufferAlignment() const {
|
||||||
|
return static_cast<u32>(device.GetUniformBufferAlignment());
|
||||||
|
}
|
||||||
|
|
||||||
u32 GetStorageBufferAlignment() const {
|
u32 GetStorageBufferAlignment() const {
|
||||||
return static_cast<u32>(device.GetShaderStorageBufferAlignment());
|
return static_cast<u32>(device.GetShaderStorageBufferAlignment());
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -415,6 +415,10 @@ bool BufferCacheRuntime::CanReportMemoryUsage() const {
|
||||||
return device.CanReportMemoryUsage();
|
return device.CanReportMemoryUsage();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
u32 BufferCacheRuntime::GetUniformBufferAlignment() const {
|
||||||
|
return static_cast<u32>(device.GetUniformBufferAlignment());
|
||||||
|
}
|
||||||
|
|
||||||
u32 BufferCacheRuntime::GetStorageBufferAlignment() const {
|
u32 BufferCacheRuntime::GetStorageBufferAlignment() const {
|
||||||
return static_cast<u32>(device.GetStorageBufferAlignment());
|
return static_cast<u32>(device.GetStorageBufferAlignment());
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -96,6 +96,8 @@ public:
|
||||||
|
|
||||||
bool CanReportMemoryUsage() const;
|
bool CanReportMemoryUsage() const;
|
||||||
|
|
||||||
|
u32 GetUniformBufferAlignment() const;
|
||||||
|
|
||||||
u32 GetStorageBufferAlignment() const;
|
u32 GetStorageBufferAlignment() const;
|
||||||
|
|
||||||
[[nodiscard]] StagingBufferRef UploadStagingBuffer(size_t size);
|
[[nodiscard]] StagingBufferRef UploadStagingBuffer(size_t size);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue