[vulkan] Quick adjustments due to recent regressions

This commit is contained in:
CamilleLaVey
2026-02-01 14:02:07 -04:00
parent dd6c303ae1
commit 0cdd5d3362
6 changed files with 2 additions and 74 deletions

View File

@@ -1667,20 +1667,7 @@ void RasterizerVulkan::UpdateBlending(Tegra::Engines::Maxwell3D::Regs& regs) {
}
if (state_tracker.TouchColorMask()) {
// Use VK_EXT_color_write_enable if available and EDS3 is not active
if (device.IsExtColorWriteEnableSupported()) {
// With color_write_enable, we set enable/disable per attachment
std::array<VkBool32, Maxwell::NumRenderTargets> setup_enables{};
for (size_t index = 0; index < Maxwell::NumRenderTargets; index++) {
const auto& mask = regs.color_mask[regs.color_mask_common ? 0 : index];
// Enable writing only if at least one component is enabled
setup_enables[index] = (mask.R || mask.G || mask.B || mask.A) ? VK_TRUE : VK_FALSE;
}
scheduler.Record([setup_enables](vk::CommandBuffer cmdbuf) {
cmdbuf.SetColorWriteEnableEXT(setup_enables);
});
} else {
// Fallback: Use ColorWriteMask from EDS3
if (device.IsExtExtendedDynamicState3BlendingSupported()) {
std::array<VkColorComponentFlags, Maxwell::NumRenderTargets> setup_masks{};
for (size_t index = 0; index < Maxwell::NumRenderTargets; index++) {
const auto& mask = regs.color_mask[regs.color_mask_common ? 0 : index];

View File

@@ -2122,24 +2122,7 @@ ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewI
.usage = ImageUsageFlags(format_info, format),
};
VkImageViewASTCDecodeModeEXT astc_decode_mode{
.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT,
.pNext = nullptr,
.decodeMode = VK_FORMAT_UNDEFINED,
};
const void* view_pNext = &image_view_usage;
if (device->IsExtASTCDecodeModeSupported() &&
VideoCore::Surface::IsPixelFormatASTC(image.info.format) &&
VideoCore::Surface::IsPixelFormatASTC(format)) {
const bool view_is_srgb = VideoCore::Surface::IsPixelFormatSRGB(format);
astc_decode_mode.decodeMode = view_is_srgb ? VK_FORMAT_A8B8G8R8_SRGB_PACK32
: VK_FORMAT_A8B8G8R8_UNORM_PACK32;
astc_decode_mode.pNext = view_pNext;
view_pNext = &astc_decode_mode;
}
const VkImageViewCreateInfo create_info{
.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,

View File

@@ -1321,30 +1321,6 @@ void Device::RemoveUnsuitableExtensions() {
features.extended_dynamic_state3,
VK_EXT_EXTENDED_DYNAMIC_STATE_3_EXTENSION_NAME);
// VK_EXT_color_write_enable
if (extensions.extended_dynamic_state3 && dynamic_state3_blending) {
LOG_INFO(Render_Vulkan, "VK_EXT_color_write_enable disabled: VK_EXT_extended_dynamic_state3 provides ColorWriteMask functionality");
RemoveExtensionFeature(extensions.color_write_enable, features.color_write_enable,
VK_EXT_COLOR_WRITE_ENABLE_EXTENSION_NAME);
} else {
extensions.color_write_enable = features.color_write_enable.colorWriteEnable;
RemoveExtensionFeatureIfUnsuitable(extensions.color_write_enable,
features.color_write_enable,
VK_EXT_COLOR_WRITE_ENABLE_EXTENSION_NAME);
}
// VK_EXT_astc_decode_mode
if (is_optimal_astc_supported && loaded_extensions.contains(VK_EXT_ASTC_DECODE_MODE_EXTENSION_NAME)) {
extensions.astc_decode_mode = true;
LOG_INFO(Render_Vulkan, "VK_EXT_astc_decode_mode enabled");
} else {
extensions.astc_decode_mode = false;
if (loaded_extensions.contains(VK_EXT_ASTC_DECODE_MODE_EXTENSION_NAME) && !is_optimal_astc_supported) {
LOG_INFO(Render_Vulkan, "VK_EXT_astc_decode_mode disabled: Requires native ASTC support");
loaded_extensions.erase(VK_EXT_ASTC_DECODE_MODE_EXTENSION_NAME);
}
}
// VK_EXT_robustness2
extensions.robustness_2 = features.robustness2.robustBufferAccess2 ||
features.robustness2.robustImageAccess2 ||

View File

@@ -48,7 +48,6 @@ VK_DEFINE_HANDLE(VmaAllocator)
// Define all features which may be used by the implementation and require an extension here.
#define FOR_EACH_VK_FEATURE_EXT(FEATURE) \
FEATURE(EXT, ColorWriteEnable, COLOR_WRITE_ENABLE, color_write_enable) \
FEATURE(EXT, CustomBorderColor, CUSTOM_BORDER_COLOR, custom_border_color) \
FEATURE(EXT, DepthBiasControl, DEPTH_BIAS_CONTROL, depth_bias_control) \
FEATURE(EXT, DepthClipControl, DEPTH_CLIP_CONTROL, depth_clip_control) \
@@ -75,7 +74,6 @@ VK_DEFINE_HANDLE(VmaAllocator)
// Define miscellaneous extensions which may be used by the implementation here.
#define FOR_EACH_VK_EXTENSION(EXTENSION) \
EXTENSION(EXT, ASTC_DECODE_MODE, astc_decode_mode) \
EXTENSION(EXT, CONDITIONAL_RENDERING, conditional_rendering) \
EXTENSION(EXT, CONSERVATIVE_RASTERIZATION, conservative_rasterization) \
EXTENSION(EXT, DEPTH_RANGE_UNRESTRICTED, depth_range_unrestricted) \
@@ -559,16 +557,6 @@ public:
return extensions.custom_border_color;
}
/// Returns true if the device supports VK_EXT_color_write_enable.
bool IsExtColorWriteEnableSupported() const {
return extensions.color_write_enable;
}
/// Returns true if the device supports VK_EXT_astc_decode_mode.
bool IsExtASTCDecodeModeSupported() const {
return extensions.astc_decode_mode;
}
/// Returns true if the device supports VK_EXT_image_robustness.
bool IsExtImageRobustnessSupported() const {
return extensions.image_robustness;

View File

@@ -165,7 +165,6 @@ void Load(VkDevice device, DeviceDispatch& dld) noexcept {
X(vkCmdSetColorWriteMaskEXT);
X(vkCmdSetColorBlendEnableEXT);
X(vkCmdSetColorBlendEquationEXT);
X(vkCmdSetColorWriteEnableEXT);
X(vkCmdResolveImage);
X(vkCreateBuffer);
X(vkCreateBufferView);

View File

@@ -265,8 +265,7 @@ struct DeviceDispatch : InstanceDispatch {
PFN_vkCmdSetColorWriteMaskEXT vkCmdSetColorWriteMaskEXT{};
PFN_vkCmdSetColorBlendEnableEXT vkCmdSetColorBlendEnableEXT{};
PFN_vkCmdSetColorBlendEquationEXT vkCmdSetColorBlendEquationEXT{};
PFN_vkCmdSetColorWriteEnableEXT vkCmdSetColorWriteEnableEXT{};
PFN_vkCmdWaitEvents vkCmdWaitEvents{};
PFN_vkCmdWaitEvents vkCmdWaitEvents{}
PFN_vkCreateBuffer vkCreateBuffer{};
PFN_vkCreateBufferView vkCreateBufferView{};
PFN_vkCreateCommandPool vkCreateCommandPool{};
@@ -1522,10 +1521,6 @@ public:
dld->vkCmdSetColorBlendEquationEXT(handle, first, equations.size(), equations.data());
}
void SetColorWriteEnableEXT(Span<VkBool32> enables) const noexcept {
dld->vkCmdSetColorWriteEnableEXT(handle, enables.size(), enables.data());
}
void SetLineWidth(float line_width) const noexcept {
dld->vkCmdSetLineWidth(handle, line_width);
}