mirror of
https://git.eden-emu.dev/eden-emu/eden.git
synced 2025-07-20 07:05:46 +00:00
[vk] Add some dynamic handling in the pipeline (#142)
Co-authored-by: crueter <swurl@swurl.xyz> Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/142 Co-authored-by: Aleksandr Popovich <alekpopo@pm.me> Co-committed-by: Aleksandr Popovich <alekpopo@pm.me>
This commit is contained in:
parent
eae819f0d6
commit
6aeba9de66
9 changed files with 173 additions and 36 deletions
|
@ -7,7 +7,6 @@
|
||||||
|
|
||||||
#include <catch2/catch_test_macros.hpp>
|
#include <catch2/catch_test_macros.hpp>
|
||||||
|
|
||||||
#include "common/alignment.h"
|
|
||||||
#include "common/common_types.h"
|
#include "common/common_types.h"
|
||||||
#include "video_core/buffer_cache/memory_tracker_base.h"
|
#include "video_core/buffer_cache/memory_tracker_base.h"
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
@ -928,6 +931,7 @@ bool AccelerateDMA::BufferToImage(const Tegra::DMA::ImageCopy& copy_info,
|
||||||
|
|
||||||
void RasterizerVulkan::UpdateDynamicStates() {
|
void RasterizerVulkan::UpdateDynamicStates() {
|
||||||
auto& regs = maxwell3d->regs;
|
auto& regs = maxwell3d->regs;
|
||||||
|
|
||||||
UpdateViewportsState(regs);
|
UpdateViewportsState(regs);
|
||||||
UpdateScissorsState(regs);
|
UpdateScissorsState(regs);
|
||||||
UpdateDepthBias(regs);
|
UpdateDepthBias(regs);
|
||||||
|
@ -935,7 +939,24 @@ void RasterizerVulkan::UpdateDynamicStates() {
|
||||||
UpdateDepthBounds(regs);
|
UpdateDepthBounds(regs);
|
||||||
UpdateStencilFaces(regs);
|
UpdateStencilFaces(regs);
|
||||||
UpdateLineWidth(regs);
|
UpdateLineWidth(regs);
|
||||||
if (device.IsExtExtendedDynamicStateSupported()) {
|
|
||||||
|
const u8 dynamic_state = Settings::values.dyna_state.GetValue();
|
||||||
|
|
||||||
|
auto features = DynamicFeatures{
|
||||||
|
.has_extended_dynamic_state = device.IsExtExtendedDynamicStateSupported()
|
||||||
|
&& dynamic_state > 0,
|
||||||
|
.has_extended_dynamic_state_2 = device.IsExtExtendedDynamicState2Supported()
|
||||||
|
&& dynamic_state > 1,
|
||||||
|
.has_extended_dynamic_state_2_extra = device.IsExtExtendedDynamicState2ExtrasSupported()
|
||||||
|
&& dynamic_state > 1,
|
||||||
|
.has_extended_dynamic_state_3_blend = device.IsExtExtendedDynamicState3BlendingSupported()
|
||||||
|
&& dynamic_state > 2,
|
||||||
|
.has_extended_dynamic_state_3_enables = device.IsExtExtendedDynamicState3EnablesSupported()
|
||||||
|
&& dynamic_state > 2,
|
||||||
|
.has_dynamic_vertex_input = device.IsExtVertexInputDynamicStateSupported(),
|
||||||
|
};
|
||||||
|
|
||||||
|
if (features.has_extended_dynamic_state) {
|
||||||
UpdateCullMode(regs);
|
UpdateCullMode(regs);
|
||||||
UpdateDepthCompareOp(regs);
|
UpdateDepthCompareOp(regs);
|
||||||
UpdateFrontFace(regs);
|
UpdateFrontFace(regs);
|
||||||
|
@ -946,45 +967,54 @@ void RasterizerVulkan::UpdateDynamicStates() {
|
||||||
UpdateDepthTestEnable(regs);
|
UpdateDepthTestEnable(regs);
|
||||||
UpdateDepthWriteEnable(regs);
|
UpdateDepthWriteEnable(regs);
|
||||||
UpdateStencilTestEnable(regs);
|
UpdateStencilTestEnable(regs);
|
||||||
if (device.IsExtExtendedDynamicState2Supported()) {
|
|
||||||
|
if (features.has_extended_dynamic_state_2) {
|
||||||
UpdatePrimitiveRestartEnable(regs);
|
UpdatePrimitiveRestartEnable(regs);
|
||||||
UpdateRasterizerDiscardEnable(regs);
|
UpdateRasterizerDiscardEnable(regs);
|
||||||
UpdateDepthBiasEnable(regs);
|
UpdateDepthBiasEnable(regs);
|
||||||
}
|
}
|
||||||
if (device.IsExtExtendedDynamicState3EnablesSupported()) {
|
|
||||||
|
if (features.has_extended_dynamic_state_3_enables) {
|
||||||
using namespace Tegra::Engines;
|
using namespace Tegra::Engines;
|
||||||
|
|
||||||
if (device.GetDriverID() == VkDriverIdKHR::VK_DRIVER_ID_AMD_OPEN_SOURCE
|
if (device.GetDriverID() == VkDriverIdKHR::VK_DRIVER_ID_AMD_OPEN_SOURCE
|
||||||
|| device.GetDriverID() == VkDriverIdKHR::VK_DRIVER_ID_AMD_PROPRIETARY) {
|
|| device.GetDriverID() == VkDriverIdKHR::VK_DRIVER_ID_AMD_PROPRIETARY) {
|
||||||
struct In {
|
struct In
|
||||||
|
{
|
||||||
const Maxwell3D::Regs::VertexAttribute::Type d;
|
const Maxwell3D::Regs::VertexAttribute::Type d;
|
||||||
In(Maxwell3D::Regs::VertexAttribute::Type n) : d(n) {}
|
In(Maxwell3D::Regs::VertexAttribute::Type n)
|
||||||
bool operator()(Maxwell3D::Regs::VertexAttribute n) const {
|
: d(n)
|
||||||
|
{}
|
||||||
|
bool operator()(Maxwell3D::Regs::VertexAttribute n) const
|
||||||
|
{
|
||||||
return n.type == d;
|
return n.type == d;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
auto has_float = std::any_of(
|
auto has_float = std::any_of(regs.vertex_attrib_format.begin(),
|
||||||
regs.vertex_attrib_format.begin(), regs.vertex_attrib_format.end(),
|
regs.vertex_attrib_format.end(),
|
||||||
In(Maxwell3D::Regs::VertexAttribute::Type::Float));
|
In(Maxwell3D::Regs::VertexAttribute::Type::Float));
|
||||||
|
|
||||||
if (regs.logic_op.enable)
|
if (regs.logic_op.enable)
|
||||||
regs.logic_op.enable = static_cast<u32>(!has_float);
|
regs.logic_op.enable = static_cast<u32>(!has_float);
|
||||||
|
|
||||||
UpdateLogicOpEnable(regs);
|
UpdateLogicOpEnable(regs);
|
||||||
} else
|
} else {
|
||||||
UpdateLogicOpEnable(regs);
|
UpdateLogicOpEnable(regs);
|
||||||
|
}
|
||||||
UpdateDepthClampEnable(regs);
|
UpdateDepthClampEnable(regs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (device.IsExtExtendedDynamicState2ExtrasSupported()) {
|
if (features.has_extended_dynamic_state_2_extra) {
|
||||||
UpdateLogicOp(regs);
|
UpdateLogicOp(regs);
|
||||||
}
|
}
|
||||||
if (device.IsExtExtendedDynamicState3Supported()) {
|
if (features.has_extended_dynamic_state_3_enables) {
|
||||||
UpdateBlending(regs);
|
UpdateBlending(regs);
|
||||||
|
UpdateLineStippleEnable(regs);
|
||||||
|
UpdateConservativeRasterizationMode(regs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (device.IsExtVertexInputDynamicStateSupported()) {
|
if (features.has_dynamic_vertex_input) {
|
||||||
UpdateVertexInput(regs);
|
UpdateVertexInput(regs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1104,25 +1134,39 @@ void RasterizerVulkan::UpdateDepthBias(Tegra::Engines::Maxwell3D::Regs& regs) {
|
||||||
regs.zeta.format == Tegra::DepthFormat::S8Z24_UNORM ||
|
regs.zeta.format == Tegra::DepthFormat::S8Z24_UNORM ||
|
||||||
regs.zeta.format == Tegra::DepthFormat::V8Z24_UNORM;
|
regs.zeta.format == Tegra::DepthFormat::V8Z24_UNORM;
|
||||||
|
|
||||||
size_t length = sizeof(NEEDS_D24) / sizeof(u64);
|
if (is_d24 && !device.SupportsD24DepthBuffer()) {
|
||||||
bool needs_convert = false;
|
static constexpr const size_t length = sizeof(NEEDS_D24) / sizeof(NEEDS_D24[0]);
|
||||||
for (size_t i = 0; i < length; ++i) {
|
|
||||||
if (NEEDS_D24[i] == program_id) {
|
static constexpr const u64 *start = NEEDS_D24;
|
||||||
needs_convert = true;
|
static constexpr const u64 *end = NEEDS_D24 + length;
|
||||||
break;
|
|
||||||
|
const size_t *it = std::find(start, end, program_id);
|
||||||
|
|
||||||
|
if (it != end) {
|
||||||
|
// the base formulas can be obtained from here:
|
||||||
|
// https://docs.microsoft.com/en-us/windows/win32/direct3d11/d3d10-graphics-programming-guide-output-merger-stage-depth-bias
|
||||||
|
const double rescale_factor = static_cast<double>(1ULL << (32 - 24))
|
||||||
|
/ (static_cast<double>(0x1.ep+127));
|
||||||
|
units = static_cast<float>(static_cast<double>(units) * rescale_factor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_d24 && !device.SupportsD24DepthBuffer() && needs_convert) {
|
scheduler.Record(
|
||||||
// the base formulas can be obtained from here:
|
[constant = units, clamp = regs.depth_bias_clamp, factor = regs.slope_scale_depth_bias, this](
|
||||||
// https://docs.microsoft.com/en-us/windows/win32/direct3d11/d3d10-graphics-programming-guide-output-merger-stage-depth-bias
|
vk::CommandBuffer cmdbuf) {
|
||||||
const double rescale_factor = static_cast<double>(1ULL << (32 - 24))
|
if (device.IsExtDepthBiasControlSupported()) {
|
||||||
/ (static_cast<double>(0x1.ep+127));
|
static VkDepthBiasRepresentationInfoEXT bias_info{
|
||||||
units = static_cast<float>(static_cast<double>(units) * rescale_factor);
|
.sType = VK_STRUCTURE_TYPE_DEPTH_BIAS_REPRESENTATION_INFO_EXT,
|
||||||
} scheduler.Record([constant = units, clamp = regs.depth_bias_clamp,
|
.pNext = nullptr,
|
||||||
factor = regs.slope_scale_depth_bias](vk::CommandBuffer cmdbuf) {
|
.depthBiasRepresentation = VK_DEPTH_BIAS_REPRESENTATION_LEAST_REPRESENTABLE_VALUE_FORCE_UNORM_EXT,
|
||||||
cmdbuf.SetDepthBias(constant, clamp, factor);
|
.depthBiasExact = VK_FALSE,
|
||||||
});
|
};
|
||||||
|
|
||||||
|
cmdbuf.SetDepthBias(constant, clamp, factor, &bias_info);
|
||||||
|
} else {
|
||||||
|
cmdbuf.SetDepthBias(constant, clamp, factor);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void RasterizerVulkan::UpdateBlendConstants(Tegra::Engines::Maxwell3D::Regs& regs) {
|
void RasterizerVulkan::UpdateBlendConstants(Tegra::Engines::Maxwell3D::Regs& regs) {
|
||||||
|
@ -1304,6 +1348,45 @@ void RasterizerVulkan::UpdateRasterizerDiscardEnable(Tegra::Engines::Maxwell3D::
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RasterizerVulkan::UpdateConservativeRasterizationMode(Tegra::Engines::Maxwell3D::Regs& regs)
|
||||||
|
{
|
||||||
|
if (!state_tracker.TouchConservativeRasterizationMode()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
scheduler.Record([enable = regs.conservative_raster_enable](vk::CommandBuffer cmdbuf) {
|
||||||
|
cmdbuf.SetConservativeRasterizationModeEXT(
|
||||||
|
enable ? VK_CONSERVATIVE_RASTERIZATION_MODE_UNDERESTIMATE_EXT
|
||||||
|
: VK_CONSERVATIVE_RASTERIZATION_MODE_DISABLED_EXT);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void RasterizerVulkan::UpdateLineStippleEnable(Tegra::Engines::Maxwell3D::Regs& regs)
|
||||||
|
{
|
||||||
|
if (!state_tracker.TouchLineStippleEnable()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
scheduler.Record([enable = regs.line_stipple_enable](vk::CommandBuffer cmdbuf) {
|
||||||
|
cmdbuf.SetLineStippleEnableEXT(enable);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void RasterizerVulkan::UpdateLineRasterizationMode(Tegra::Engines::Maxwell3D::Regs& regs)
|
||||||
|
{
|
||||||
|
// if (!state_tracker.TouchLi()) {
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// TODO: The maxwell emulator does not capture line rasters
|
||||||
|
|
||||||
|
// scheduler.Record([enable = regs.line](vk::CommandBuffer cmdbuf) {
|
||||||
|
// cmdbuf.SetConservativeRasterizationModeEXT(
|
||||||
|
// enable ? VK_CONSERVATIVE_RASTERIZATION_MODE_UNDERESTIMATE_EXT
|
||||||
|
// : VK_CONSERVATIVE_RASTERIZATION_MODE_DISABLED_EXT);
|
||||||
|
// });
|
||||||
|
}
|
||||||
|
|
||||||
void RasterizerVulkan::UpdateDepthBiasEnable(Tegra::Engines::Maxwell3D::Regs& regs) {
|
void RasterizerVulkan::UpdateDepthBiasEnable(Tegra::Engines::Maxwell3D::Regs& regs) {
|
||||||
if (!state_tracker.TouchDepthBiasEnable()) {
|
if (!state_tracker.TouchDepthBiasEnable()) {
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
@ -139,7 +142,7 @@ public:
|
||||||
u32 pixel_stride);
|
u32 pixel_stride);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static constexpr u64 NEEDS_D24[] = {
|
static constexpr const u64 NEEDS_D24[] = {
|
||||||
0x01006A800016E000ULL, // SSBU
|
0x01006A800016E000ULL, // SSBU
|
||||||
0x0100E95004038000ULL, // XC2
|
0x0100E95004038000ULL, // XC2
|
||||||
0x0100A6301214E000ULL, // FE:Engage
|
0x0100A6301214E000ULL, // FE:Engage
|
||||||
|
@ -175,6 +178,9 @@ private:
|
||||||
void UpdateDepthCompareOp(Tegra::Engines::Maxwell3D::Regs& regs);
|
void UpdateDepthCompareOp(Tegra::Engines::Maxwell3D::Regs& regs);
|
||||||
void UpdatePrimitiveRestartEnable(Tegra::Engines::Maxwell3D::Regs& regs);
|
void UpdatePrimitiveRestartEnable(Tegra::Engines::Maxwell3D::Regs& regs);
|
||||||
void UpdateRasterizerDiscardEnable(Tegra::Engines::Maxwell3D::Regs& regs);
|
void UpdateRasterizerDiscardEnable(Tegra::Engines::Maxwell3D::Regs& regs);
|
||||||
|
void UpdateConservativeRasterizationMode(Tegra::Engines::Maxwell3D::Regs& regs);
|
||||||
|
void UpdateLineStippleEnable(Tegra::Engines::Maxwell3D::Regs& regs);
|
||||||
|
void UpdateLineRasterizationMode(Tegra::Engines::Maxwell3D::Regs& regs);
|
||||||
void UpdateDepthBiasEnable(Tegra::Engines::Maxwell3D::Regs& regs);
|
void UpdateDepthBiasEnable(Tegra::Engines::Maxwell3D::Regs& regs);
|
||||||
void UpdateLogicOpEnable(Tegra::Engines::Maxwell3D::Regs& regs);
|
void UpdateLogicOpEnable(Tegra::Engines::Maxwell3D::Regs& regs);
|
||||||
void UpdateDepthClampEnable(Tegra::Engines::Maxwell3D::Regs& regs);
|
void UpdateDepthClampEnable(Tegra::Engines::Maxwell3D::Regs& regs);
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
@ -50,6 +53,8 @@ Flags MakeInvalidationFlags() {
|
||||||
StateEnable,
|
StateEnable,
|
||||||
PrimitiveRestartEnable,
|
PrimitiveRestartEnable,
|
||||||
RasterizerDiscardEnable,
|
RasterizerDiscardEnable,
|
||||||
|
ConservativeRasterizationMode,
|
||||||
|
LineStippleEnable,
|
||||||
DepthBiasEnable,
|
DepthBiasEnable,
|
||||||
LogicOpEnable,
|
LogicOpEnable,
|
||||||
DepthClampEnable,
|
DepthClampEnable,
|
||||||
|
@ -137,6 +142,8 @@ void SetupDirtyStateEnable(Tables& tables) {
|
||||||
setup(OFF(stencil_enable), StencilTestEnable);
|
setup(OFF(stencil_enable), StencilTestEnable);
|
||||||
setup(OFF(primitive_restart.enabled), PrimitiveRestartEnable);
|
setup(OFF(primitive_restart.enabled), PrimitiveRestartEnable);
|
||||||
setup(OFF(rasterize_enable), RasterizerDiscardEnable);
|
setup(OFF(rasterize_enable), RasterizerDiscardEnable);
|
||||||
|
setup(OFF(conservative_raster_enable), ConservativeRasterizationMode);
|
||||||
|
setup(OFF(line_stipple_enable), LineStippleEnable);
|
||||||
setup(OFF(polygon_offset_point_enable), DepthBiasEnable);
|
setup(OFF(polygon_offset_point_enable), DepthBiasEnable);
|
||||||
setup(OFF(polygon_offset_line_enable), DepthBiasEnable);
|
setup(OFF(polygon_offset_line_enable), DepthBiasEnable);
|
||||||
setup(OFF(polygon_offset_fill_enable), DepthBiasEnable);
|
setup(OFF(polygon_offset_fill_enable), DepthBiasEnable);
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
@ -50,6 +53,8 @@ enum : u8 {
|
||||||
StencilTestEnable,
|
StencilTestEnable,
|
||||||
PrimitiveRestartEnable,
|
PrimitiveRestartEnable,
|
||||||
RasterizerDiscardEnable,
|
RasterizerDiscardEnable,
|
||||||
|
ConservativeRasterizationMode,
|
||||||
|
LineStippleEnable,
|
||||||
DepthBiasEnable,
|
DepthBiasEnable,
|
||||||
StateEnable,
|
StateEnable,
|
||||||
LogicOp,
|
LogicOp,
|
||||||
|
@ -200,10 +205,15 @@ public:
|
||||||
return Exchange(Dirty::RasterizerDiscardEnable, false);
|
return Exchange(Dirty::RasterizerDiscardEnable, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TouchDepthBiasEnable() {
|
bool TouchConservativeRasterizationMode()
|
||||||
return Exchange(Dirty::DepthBiasEnable, false);
|
{
|
||||||
|
return Exchange(Dirty::ConservativeRasterizationMode, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool TouchLineStippleEnable() { return Exchange(Dirty::ConservativeRasterizationMode, false); }
|
||||||
|
|
||||||
|
bool TouchDepthBiasEnable() { return Exchange(Dirty::DepthBiasEnable, false); }
|
||||||
|
|
||||||
bool TouchLogicOpEnable() {
|
bool TouchLogicOpEnable() {
|
||||||
return Exchange(Dirty::LogicOpEnable, false);
|
return Exchange(Dirty::LogicOpEnable, false);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
@ -141,6 +144,9 @@ void Load(VkDevice device, DeviceDispatch& dld) noexcept {
|
||||||
X(vkCmdSetDepthWriteEnableEXT);
|
X(vkCmdSetDepthWriteEnableEXT);
|
||||||
X(vkCmdSetPrimitiveRestartEnableEXT);
|
X(vkCmdSetPrimitiveRestartEnableEXT);
|
||||||
X(vkCmdSetRasterizerDiscardEnableEXT);
|
X(vkCmdSetRasterizerDiscardEnableEXT);
|
||||||
|
X(vkCmdSetConservativeRasterizationModeEXT);
|
||||||
|
X(vkCmdSetLineRasterizationModeEXT);
|
||||||
|
X(vkCmdSetLineStippleEnableEXT);
|
||||||
X(vkCmdSetDepthBiasEnableEXT);
|
X(vkCmdSetDepthBiasEnableEXT);
|
||||||
X(vkCmdSetLogicOpEnableEXT);
|
X(vkCmdSetLogicOpEnableEXT);
|
||||||
X(vkCmdSetDepthClampEnableEXT);
|
X(vkCmdSetDepthClampEnableEXT);
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
@ -234,6 +237,9 @@ struct DeviceDispatch : InstanceDispatch {
|
||||||
PFN_vkCmdSetDepthWriteEnableEXT vkCmdSetDepthWriteEnableEXT{};
|
PFN_vkCmdSetDepthWriteEnableEXT vkCmdSetDepthWriteEnableEXT{};
|
||||||
PFN_vkCmdSetPrimitiveRestartEnableEXT vkCmdSetPrimitiveRestartEnableEXT{};
|
PFN_vkCmdSetPrimitiveRestartEnableEXT vkCmdSetPrimitiveRestartEnableEXT{};
|
||||||
PFN_vkCmdSetRasterizerDiscardEnableEXT vkCmdSetRasterizerDiscardEnableEXT{};
|
PFN_vkCmdSetRasterizerDiscardEnableEXT vkCmdSetRasterizerDiscardEnableEXT{};
|
||||||
|
PFN_vkCmdSetConservativeRasterizationModeEXT vkCmdSetConservativeRasterizationModeEXT{};
|
||||||
|
PFN_vkCmdSetLineRasterizationModeEXT vkCmdSetLineRasterizationModeEXT{};
|
||||||
|
PFN_vkCmdSetLineStippleEnableEXT vkCmdSetLineStippleEnableEXT{};
|
||||||
PFN_vkCmdSetDepthBiasEnableEXT vkCmdSetDepthBiasEnableEXT{};
|
PFN_vkCmdSetDepthBiasEnableEXT vkCmdSetDepthBiasEnableEXT{};
|
||||||
PFN_vkCmdSetLogicOpEnableEXT vkCmdSetLogicOpEnableEXT{};
|
PFN_vkCmdSetLogicOpEnableEXT vkCmdSetLogicOpEnableEXT{};
|
||||||
PFN_vkCmdSetDepthClampEnableEXT vkCmdSetDepthClampEnableEXT{};
|
PFN_vkCmdSetDepthClampEnableEXT vkCmdSetDepthClampEnableEXT{};
|
||||||
|
@ -1431,6 +1437,21 @@ public:
|
||||||
dld->vkCmdSetRasterizerDiscardEnableEXT(handle, enable ? VK_TRUE : VK_FALSE);
|
dld->vkCmdSetRasterizerDiscardEnableEXT(handle, enable ? VK_TRUE : VK_FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SetConservativeRasterizationModeEXT(VkConservativeRasterizationModeEXT mode) const noexcept
|
||||||
|
{
|
||||||
|
dld->vkCmdSetConservativeRasterizationModeEXT(handle, mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetLineRasterizationModeEXT(VkLineRasterizationModeEXT mode) const noexcept
|
||||||
|
{
|
||||||
|
dld->vkCmdSetLineRasterizationModeEXT(handle, mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetLineStippleEnableEXT(bool enable) const noexcept
|
||||||
|
{
|
||||||
|
dld->vkCmdSetLineStippleEnableEXT(handle, enable ? VK_TRUE : VK_FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
void SetDepthBiasEnableEXT(bool enable) const noexcept {
|
void SetDepthBiasEnableEXT(bool enable) const noexcept {
|
||||||
dld->vkCmdSetDepthBiasEnableEXT(handle, enable ? VK_TRUE : VK_FALSE);
|
dld->vkCmdSetDepthBiasEnableEXT(handle, enable ? VK_TRUE : VK_FALSE);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,10 @@
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: 2016 Citra Emulator Project
|
// SPDX-FileCopyrightText: 2016 Citra Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
#include <algorithm>
|
#include "yuzu/configuration/configure_profile_manager.h"
|
||||||
#include <functional>
|
|
||||||
#include <QDialog>
|
#include <QDialog>
|
||||||
#include <QDialogButtonBox>
|
#include <QDialogButtonBox>
|
||||||
#include <QFileDialog>
|
#include <QFileDialog>
|
||||||
|
@ -18,8 +20,10 @@
|
||||||
#include "core/core.h"
|
#include "core/core.h"
|
||||||
#include "core/hle/service/acc/profile_manager.h"
|
#include "core/hle/service/acc/profile_manager.h"
|
||||||
#include "ui_configure_profile_manager.h"
|
#include "ui_configure_profile_manager.h"
|
||||||
#include "yuzu/configuration/configure_profile_manager.h"
|
|
||||||
#include "yuzu/util/limitable_input_dialog.h"
|
#include "yuzu/util/limitable_input_dialog.h"
|
||||||
|
#include <algorithm>
|
||||||
|
#include <functional>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
// Same backup JPEG used by acc IProfile::GetImage if no jpeg found
|
// Same backup JPEG used by acc IProfile::GetImage if no jpeg found
|
||||||
|
|
|
@ -2407,6 +2407,7 @@ void GMainWindow::OnGameListOpenFolder(u64 program_id, GameListOpenTarget target
|
||||||
|
|
||||||
ASSERT_MSG(has_user_save != has_device_save, "Game uses both user and device savedata?");
|
ASSERT_MSG(has_user_save != has_device_save, "Game uses both user and device savedata?");
|
||||||
|
|
||||||
|
// TODO(alekpop): It returns the wrong user
|
||||||
switch (target) {
|
switch (target) {
|
||||||
case GameListOpenTarget::SaveData: {
|
case GameListOpenTarget::SaveData: {
|
||||||
open_target = tr("Save Data");
|
open_target = tr("Save Data");
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue