mirror of https://github.com/PCSX2/pcsx2.git
GS/Vulkan: Make line rasterization optional on MacOS
MoltenVK does not support VK_EXT_line_rasterization. We want it for other platforms, but on Mac, the implicit line rasterization apparently matches Bresenham anyway.
This commit is contained in:
parent
8a022f877e
commit
affa091ccb
|
@ -105,7 +105,6 @@ jobs:
|
||||||
cmake -DCMAKE_PREFIX_PATH="$HOME/deps" \
|
cmake -DCMAKE_PREFIX_PATH="$HOME/deps" \
|
||||||
-DCMAKE_BUILD_TYPE=Release \
|
-DCMAKE_BUILD_TYPE=Release \
|
||||||
-DUSE_OPENGL=OFF \
|
-DUSE_OPENGL=OFF \
|
||||||
-DUSE_VULKAN=OFF \
|
|
||||||
-DDISABLE_ADVANCE_SIMD=ON \
|
-DDISABLE_ADVANCE_SIMD=ON \
|
||||||
-DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON \
|
-DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON \
|
||||||
-DUSE_SYSTEM_LIBS=OFF \
|
-DUSE_SYSTEM_LIBS=OFF \
|
||||||
|
|
|
@ -320,12 +320,19 @@ bool GSDeviceVK::SelectDeviceExtensions(ExtensionList* extension_list, bool enab
|
||||||
|
|
||||||
// Required extensions.
|
// Required extensions.
|
||||||
if (!SupportsExtension(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME, true) ||
|
if (!SupportsExtension(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME, true) ||
|
||||||
!SupportsExtension(VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME, true) ||
|
|
||||||
!SupportsExtension(VK_KHR_SHADER_DRAW_PARAMETERS_EXTENSION_NAME, true))
|
!SupportsExtension(VK_KHR_SHADER_DRAW_PARAMETERS_EXTENSION_NAME, true))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MoltenVK does not support VK_EXT_line_rasterization. We want it for other platforms,
|
||||||
|
// but on Mac, the implicit line rasterization apparently matches Bresenham anyway.
|
||||||
|
#ifdef __APPLE__
|
||||||
|
static constexpr bool require_line_rasterization = false;
|
||||||
|
#else
|
||||||
|
static constexpr bool require_line_rasterization = true;
|
||||||
|
#endif
|
||||||
|
|
||||||
m_optional_extensions.vk_ext_provoking_vertex = SupportsExtension(VK_EXT_PROVOKING_VERTEX_EXTENSION_NAME, false);
|
m_optional_extensions.vk_ext_provoking_vertex = SupportsExtension(VK_EXT_PROVOKING_VERTEX_EXTENSION_NAME, false);
|
||||||
m_optional_extensions.vk_ext_memory_budget = SupportsExtension(VK_EXT_MEMORY_BUDGET_EXTENSION_NAME, false);
|
m_optional_extensions.vk_ext_memory_budget = SupportsExtension(VK_EXT_MEMORY_BUDGET_EXTENSION_NAME, false);
|
||||||
m_optional_extensions.vk_ext_calibrated_timestamps =
|
m_optional_extensions.vk_ext_calibrated_timestamps =
|
||||||
|
@ -333,9 +340,11 @@ bool GSDeviceVK::SelectDeviceExtensions(ExtensionList* extension_list, bool enab
|
||||||
m_optional_extensions.vk_ext_rasterization_order_attachment_access =
|
m_optional_extensions.vk_ext_rasterization_order_attachment_access =
|
||||||
SupportsExtension(VK_EXT_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_EXTENSION_NAME, false) ||
|
SupportsExtension(VK_EXT_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_EXTENSION_NAME, false) ||
|
||||||
SupportsExtension(VK_ARM_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_EXTENSION_NAME, false);
|
SupportsExtension(VK_ARM_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_EXTENSION_NAME, false);
|
||||||
m_optional_extensions.vk_khr_driver_properties = SupportsExtension(VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME, false);
|
|
||||||
m_optional_extensions.vk_ext_attachment_feedback_loop_layout =
|
m_optional_extensions.vk_ext_attachment_feedback_loop_layout =
|
||||||
SupportsExtension(VK_EXT_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_EXTENSION_NAME, false);
|
SupportsExtension(VK_EXT_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_EXTENSION_NAME, false);
|
||||||
|
m_optional_extensions.vk_ext_line_rasterization = SupportsExtension(VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME,
|
||||||
|
require_line_rasterization);
|
||||||
|
m_optional_extensions.vk_khr_driver_properties = SupportsExtension(VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME, false);
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
m_optional_extensions.vk_ext_full_screen_exclusive =
|
m_optional_extensions.vk_ext_full_screen_exclusive =
|
||||||
|
@ -530,8 +539,11 @@ bool GSDeviceVK::CreateDevice(VkSurfaceKHR surface, bool enable_validation_layer
|
||||||
provoking_vertex_feature.provokingVertexLast = VK_TRUE;
|
provoking_vertex_feature.provokingVertexLast = VK_TRUE;
|
||||||
Vulkan::AddPointerToChain(&device_info, &provoking_vertex_feature);
|
Vulkan::AddPointerToChain(&device_info, &provoking_vertex_feature);
|
||||||
}
|
}
|
||||||
line_rasterization_feature.bresenhamLines = VK_TRUE;
|
if (m_optional_extensions.vk_ext_line_rasterization)
|
||||||
Vulkan::AddPointerToChain(&device_info, &line_rasterization_feature);
|
{
|
||||||
|
line_rasterization_feature.bresenhamLines = VK_TRUE;
|
||||||
|
Vulkan::AddPointerToChain(&device_info, &line_rasterization_feature);
|
||||||
|
}
|
||||||
if (m_optional_extensions.vk_ext_rasterization_order_attachment_access)
|
if (m_optional_extensions.vk_ext_rasterization_order_attachment_access)
|
||||||
{
|
{
|
||||||
rasterization_order_access_feature.rasterizationOrderColorAttachmentAccess = VK_TRUE;
|
rasterization_order_access_feature.rasterizationOrderColorAttachmentAccess = VK_TRUE;
|
||||||
|
@ -613,7 +625,8 @@ bool GSDeviceVK::ProcessDeviceExtensions()
|
||||||
// add in optional feature structs
|
// add in optional feature structs
|
||||||
if (m_optional_extensions.vk_ext_provoking_vertex)
|
if (m_optional_extensions.vk_ext_provoking_vertex)
|
||||||
Vulkan::AddPointerToChain(&features2, &provoking_vertex_features);
|
Vulkan::AddPointerToChain(&features2, &provoking_vertex_features);
|
||||||
Vulkan::AddPointerToChain(&features2, &line_rasterization_feature);
|
if (m_optional_extensions.vk_ext_line_rasterization)
|
||||||
|
Vulkan::AddPointerToChain(&features2, &line_rasterization_feature);
|
||||||
if (m_optional_extensions.vk_ext_rasterization_order_attachment_access)
|
if (m_optional_extensions.vk_ext_rasterization_order_attachment_access)
|
||||||
Vulkan::AddPointerToChain(&features2, &rasterization_order_access_feature);
|
Vulkan::AddPointerToChain(&features2, &rasterization_order_access_feature);
|
||||||
if (m_optional_extensions.vk_ext_attachment_feedback_loop_layout)
|
if (m_optional_extensions.vk_ext_attachment_feedback_loop_layout)
|
||||||
|
@ -651,10 +664,16 @@ bool GSDeviceVK::ProcessDeviceExtensions()
|
||||||
NUM_TFX_TEXTURES);
|
NUM_TFX_TEXTURES);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!line_rasterization_feature.bresenhamLines)
|
if (!line_rasterization_feature.bresenhamLines)
|
||||||
{
|
{
|
||||||
|
// See note in SelectDeviceExtensions().
|
||||||
Console.Error("bresenhamLines is not supported.");
|
Console.Error("bresenhamLines is not supported.");
|
||||||
|
#ifndef __APPLE__
|
||||||
return false;
|
return false;
|
||||||
|
#else
|
||||||
|
m_optional_extensions.vk_ext_line_rasterization = false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// VK_EXT_calibrated_timestamps checking
|
// VK_EXT_calibrated_timestamps checking
|
||||||
|
@ -4737,8 +4756,11 @@ VkPipeline GSDeviceVK::CreateTFXPipeline(const PipelineSelector& p)
|
||||||
}
|
}
|
||||||
gpb.SetPrimitiveTopology(topology_lookup[p.topology]);
|
gpb.SetPrimitiveTopology(topology_lookup[p.topology]);
|
||||||
gpb.SetRasterizationState(VK_POLYGON_MODE_FILL, VK_CULL_MODE_NONE, VK_FRONT_FACE_CLOCKWISE);
|
gpb.SetRasterizationState(VK_POLYGON_MODE_FILL, VK_CULL_MODE_NONE, VK_FRONT_FACE_CLOCKWISE);
|
||||||
if (p.topology == static_cast<u8>(GSHWDrawConfig::Topology::Line))
|
if (m_optional_extensions.vk_ext_line_rasterization &&
|
||||||
|
p.topology == static_cast<u8>(GSHWDrawConfig::Topology::Line))
|
||||||
|
{
|
||||||
gpb.SetLineRasterizationMode(VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT);
|
gpb.SetLineRasterizationMode(VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT);
|
||||||
|
}
|
||||||
gpb.SetDynamicViewportAndScissorState();
|
gpb.SetDynamicViewportAndScissorState();
|
||||||
gpb.AddDynamicState(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
|
gpb.AddDynamicState(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
|
||||||
gpb.AddDynamicState(VK_DYNAMIC_STATE_LINE_WIDTH);
|
gpb.AddDynamicState(VK_DYNAMIC_STATE_LINE_WIDTH);
|
||||||
|
|
|
@ -53,6 +53,7 @@ public:
|
||||||
bool vk_ext_rasterization_order_attachment_access : 1;
|
bool vk_ext_rasterization_order_attachment_access : 1;
|
||||||
bool vk_ext_attachment_feedback_loop_layout : 1;
|
bool vk_ext_attachment_feedback_loop_layout : 1;
|
||||||
bool vk_ext_full_screen_exclusive : 1;
|
bool vk_ext_full_screen_exclusive : 1;
|
||||||
|
bool vk_ext_line_rasterization : 1;
|
||||||
bool vk_khr_driver_properties : 1;
|
bool vk_khr_driver_properties : 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue