mirror of
https://git.eden-emu.dev/eden-emu/eden
synced 2026-06-06 06:57:21 +02:00
[vk, renderdoc] fixed zero-sized streambuffer bug on old heap-absent GPUs (#4052)
This fix a bug in which eden crashes when renderdoc is attached to vulkan. that kept me away from renderdoc for around a year now. the bug: in video_core\renderer_vulkan\vk_staging_buffer_pool.cpp in GetStreamBufferSize(...) if device.HasDebuggingToolAttached() but heap is empty/unavailable <-- Case in my old nvidia kepler gpu the original method returns size 0, right? the change honors same original behavior, while covers my case properly, returning MAX_STREAM_BUFFER_SIZE. addl some log tip and some minimal doc. fully safe. let it rip. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4052 Reviewed-by: MaranBr <maranbr@eden-emu.dev> Reviewed-by: Lizzie <lizzie@eden-emu.dev>
This commit is contained in:
parent
5027aecf77
commit
ec2b9b0400
5 changed files with 73 additions and 30 deletions
|
|
@ -1,4 +1,4 @@
|
|||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
|
||||
|
|
@ -31,11 +31,18 @@ constexpr VkDeviceSize MAX_ALIGNMENT = 256;
|
|||
constexpr VkDeviceSize MAX_STREAM_BUFFER_SIZE = 128_MiB;
|
||||
|
||||
size_t GetStreamBufferSize(const Device& device) {
|
||||
if (!device.HasDebuggingToolAttached()) {
|
||||
return MAX_STREAM_BUFFER_SIZE;
|
||||
}
|
||||
|
||||
VkDeviceSize size{0};
|
||||
if (device.HasDebuggingToolAttached()) {
|
||||
ForEachDeviceLocalHostVisibleHeap(device, [&size](size_t index, VkMemoryHeap& heap) {
|
||||
size = (std::max)(size, heap.size);
|
||||
});
|
||||
bool has_device_local_host_visible_heap{};
|
||||
ForEachDeviceLocalHostVisibleHeap(device, [&size, &has_device_local_host_visible_heap](
|
||||
size_t index, VkMemoryHeap& heap) {
|
||||
has_device_local_host_visible_heap = true;
|
||||
size = (std::max)(size, heap.size);
|
||||
});
|
||||
if (has_device_local_host_visible_heap) {
|
||||
// If rebar is not supported, cut the max heap size to 40%. This will allow 2 captures to be
|
||||
// loaded at the same time in RenderDoc. If rebar is supported, this shouldn't be an issue
|
||||
// as the heap will be much larger.
|
||||
|
|
|
|||
|
|
@ -1481,6 +1481,12 @@ void Device::CollectToolingInfo() {
|
|||
has_nsight_graphics = has_nsight_graphics || name == "NVIDIA Nsight Graphics";
|
||||
has_radeon_gpu_profiler = has_radeon_gpu_profiler || name == "Radeon GPU Profiler";
|
||||
}
|
||||
#ifdef _WIN32
|
||||
if (has_renderdoc) {
|
||||
LOG_INFO(Render_Vulkan,
|
||||
"Windows default RenderDoc output folder: %LOCALAPPDATA%\\Temp\\RenderDoc");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
std::vector<VkDeviceQueueCreateInfo> Device::GetDeviceQueueCreateInfos() const {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue