aboutsummaryrefslogtreecommitdiff
path: root/src/video_core/renderer_vulkan/vk_rasterizer.cpp
diff options
context:
space:
mode:
authorMaranBr <maranbr@outlook.com>2025-11-21 02:00:24 +0100
committercrueter <crueter@eden-emu.dev>2025-11-21 02:00:24 +0100
commitf7f6a4cde4d4355cb11bf43ed29787949e08e624 (patch)
treef509009534b4c05b6dc2f321c009092075dd7e4f /src/video_core/renderer_vulkan/vk_rasterizer.cpp
parent65fa1a37e27579db54b14904a732dab785eebf99 (diff)
[video_core] Improve EDS logic and fix a lot of inconsistencies (#3042)
Improves EDS logic and fix some inconsistencies. Removes a lot of unneeded code. Adds an option to control the `Vertex Input Dynamic State` extension. Fixes issues in Pokémon Legends: Z-A on any EDS level. Co-authored-by: JPikachu <jpikachu.eden@gmail.com> Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3042 Reviewed-by: crueter <crueter@eden-emu.dev> Reviewed-by: Caio Oliveira <caiooliveirafarias0@gmail.com> Reviewed-by: Lizzie <lizzie@eden-emu.dev> Co-authored-by: MaranBr <maranbr@outlook.com> Co-committed-by: MaranBr <maranbr@outlook.com>
Diffstat (limited to 'src/video_core/renderer_vulkan/vk_rasterizer.cpp')
-rw-r--r--src/video_core/renderer_vulkan/vk_rasterizer.cpp33
1 files changed, 15 insertions, 18 deletions
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp
index 59af3f33b6..c1a105ef36 100644
--- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp
+++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp
@@ -945,7 +945,6 @@ bool AccelerateDMA::BufferToImage(const Tegra::DMA::ImageCopy& copy_info,
void RasterizerVulkan::UpdateDynamicStates() {
auto& regs = maxwell3d->regs;
-
UpdateViewportsState(regs);
UpdateScissorsState(regs);
UpdateDepthBias(regs);
@@ -953,10 +952,7 @@ void RasterizerVulkan::UpdateDynamicStates() {
UpdateDepthBounds(regs);
UpdateStencilFaces(regs);
UpdateLineWidth(regs);
-
- const u8 dynamic_state = Settings::values.dyna_state.GetValue();
-
- if (device.IsExtExtendedDynamicStateSupported() && dynamic_state > 0) {
+ if (device.IsExtExtendedDynamicStateSupported()) {
UpdateCullMode(regs);
UpdateDepthCompareOp(regs);
UpdateFrontFace(regs);
@@ -966,22 +962,21 @@ void RasterizerVulkan::UpdateDynamicStates() {
UpdateDepthTestEnable(regs);
UpdateDepthWriteEnable(regs);
UpdateStencilTestEnable(regs);
- if (device.IsExtExtendedDynamicState2Supported() && dynamic_state > 1) {
+ if (device.IsExtExtendedDynamicState2Supported()) {
UpdatePrimitiveRestartEnable(regs);
UpdateRasterizerDiscardEnable(regs);
UpdateDepthBiasEnable(regs);
}
- if (device.IsExtExtendedDynamicState3EnablesSupported() && dynamic_state > 2) {
+ if (device.IsExtExtendedDynamicState3EnablesSupported()) {
using namespace Tegra::Engines;
if (device.GetDriverID() == VkDriverIdKHR::VK_DRIVER_ID_AMD_OPEN_SOURCE || device.GetDriverID() == VkDriverIdKHR::VK_DRIVER_ID_AMD_PROPRIETARY) {
- struct In {
- const Maxwell3D::Regs::VertexAttribute::Type d;
- In(Maxwell3D::Regs::VertexAttribute::Type n) : d(n) {}
- bool operator()(Maxwell3D::Regs::VertexAttribute n) const {
- return n.type == d;
+ const auto has_float = std::any_of(
+ regs.vertex_attrib_format.begin(),
+ regs.vertex_attrib_format.end(),
+ [](const auto& attrib) {
+ return attrib.type == Maxwell3D::Regs::VertexAttribute::Type::Float;
}
- };
- auto has_float = std::any_of(regs.vertex_attrib_format.begin(), regs.vertex_attrib_format.end(), In(Maxwell3D::Regs::VertexAttribute::Type::Float));
+ );
if (regs.logic_op.enable) {
regs.logic_op.enable = static_cast<u32>(!has_float);
}
@@ -992,16 +987,18 @@ void RasterizerVulkan::UpdateDynamicStates() {
UpdateConservativeRasterizationMode(regs);
}
}
- if (device.IsExtExtendedDynamicState2ExtrasSupported() && dynamic_state > 1) {
+ if (device.IsExtExtendedDynamicState2ExtrasSupported()) {
UpdateLogicOp(regs);
}
- if (device.IsExtExtendedDynamicState3BlendingSupported() && dynamic_state > 2) {
+ if (device.IsExtExtendedDynamicState3BlendingSupported()) {
UpdateBlending(regs);
}
}
- if (device.IsExtVertexInputDynamicStateSupported() && dynamic_state > 0)
- if (auto* gp = pipeline_cache.CurrentGraphicsPipeline(); gp && gp->HasDynamicVertexInput())
+ if (device.IsExtVertexInputDynamicStateSupported()) {
+ if (auto* gp = pipeline_cache.CurrentGraphicsPipeline(); gp && gp->HasDynamicVertexInput()) {
UpdateVertexInput(regs);
+ }
+ }
}
void RasterizerVulkan::HandleTransformFeedback() {