GS/VK: Detect max supported framebuffer dimensions for null framebuffer.

This commit is contained in:
TJnotJT
2026-06-28 12:13:38 -04:00
committed by Ty
parent 166c4491c2
commit dba432639e
4 changed files with 8 additions and 4 deletions
+3 -1
View File
@@ -2119,7 +2119,7 @@ bool GSDeviceVK::Create(GSVSyncMode vsync_mode, bool allow_present_throttle)
return false; return false;
} }
if ((m_null_framebuffer = GSTextureVK::CreateNullFramebuffer()) == VK_NULL_HANDLE) if ((m_null_framebuffer = GSTextureVK::CreateNullFramebuffer(m_max_framebuffer_width, m_max_framebuffer_height)) == VK_NULL_HANDLE)
{ {
Host::ReportErrorAsync("GS", "Failed to create dummy framebuffer"); Host::ReportErrorAsync("GS", "Failed to create dummy framebuffer");
return false; return false;
@@ -2774,6 +2774,8 @@ bool GSDeviceVK::CheckFeatures()
} }
m_max_texture_size = m_device_properties.limits.maxImageDimension2D; m_max_texture_size = m_device_properties.limits.maxImageDimension2D;
m_max_framebuffer_width = m_device_properties.limits.maxFramebufferWidth;
m_max_framebuffer_height = m_device_properties.limits.maxFramebufferHeight;
m_features.rov = m_optional_extensions.vk_ext_fragment_shader_interlock && m_features.rov = m_optional_extensions.vk_ext_fragment_shader_interlock &&
m_device_features.fragmentStoresAndAtomics && m_device_features.fragmentStoresAndAtomics &&
+2
View File
@@ -293,6 +293,8 @@ private:
VkPhysicalDeviceDriverPropertiesKHR m_device_driver_properties = {}; VkPhysicalDeviceDriverPropertiesKHR m_device_driver_properties = {};
OptionalExtensions m_optional_extensions = {}; OptionalExtensions m_optional_extensions = {};
u32 m_max_framebuffer_width = 0;
u32 m_max_framebuffer_height = 0;
public: public:
enum FeedbackLoopFlag : u8 enum FeedbackLoopFlag : u8
{ {
+2 -2
View File
@@ -11,7 +11,7 @@
#include "common/Console.h" #include "common/Console.h"
#include "common/BitUtils.h" #include "common/BitUtils.h"
VkFramebuffer GSTextureVK::CreateNullFramebuffer() VkFramebuffer GSTextureVK::CreateNullFramebuffer(u32 w, u32 h)
{ {
const VkRenderPass rp = GSDeviceVK::GetInstance()->GetRenderPass( const VkRenderPass rp = GSDeviceVK::GetInstance()->GetRenderPass(
VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED,
@@ -23,7 +23,7 @@ VkFramebuffer GSTextureVK::CreateNullFramebuffer()
return VK_NULL_HANDLE; return VK_NULL_HANDLE;
Vulkan::FramebufferBuilder fbb; Vulkan::FramebufferBuilder fbb;
fbb.SetSize(16384, 16384, 1); fbb.SetSize(w, h, 1);
fbb.SetRenderPass(rp); fbb.SetRenderPass(rp);
return fbb.Create(GSDeviceVK::GetInstance()->GetDevice()); return fbb.Create(GSDeviceVK::GetInstance()->GetDevice());
+1 -1
View File
@@ -72,7 +72,7 @@ public:
void TransitionSubresourcesToLayout( void TransitionSubresourcesToLayout(
VkCommandBuffer command_buffer, int start_level, int num_levels, Layout old_layout, Layout new_layout); VkCommandBuffer command_buffer, int start_level, int num_levels, Layout old_layout, Layout new_layout);
static VkFramebuffer CreateNullFramebuffer(); static VkFramebuffer CreateNullFramebuffer(u32 w, u32 h);
/// Framebuffers are lazily allocated. /// Framebuffers are lazily allocated.
VkFramebuffer GetFramebuffer(bool feedback_loop); VkFramebuffer GetFramebuffer(bool feedback_loop);