New upstream version 0-1335+ds
This commit is contained in:
parent
9dd4c3ae86
commit
cc724f4b4c
11 changed files with 129 additions and 48 deletions
|
@ -203,23 +203,23 @@ Result KCapabilities::ProcessMapRegionCapability(const u32 cap, F f) {
|
||||||
|
|
||||||
Result KCapabilities::MapRegion_(const u32 cap, KPageTable* page_table) {
|
Result KCapabilities::MapRegion_(const u32 cap, KPageTable* page_table) {
|
||||||
// Map each region into the process's page table.
|
// Map each region into the process's page table.
|
||||||
R_RETURN(ProcessMapRegionCapability(
|
return ProcessMapRegionCapability(
|
||||||
cap, [](KMemoryRegionType region_type, KMemoryPermission perm) -> Result {
|
cap, [](KMemoryRegionType region_type, KMemoryPermission perm) -> Result {
|
||||||
// R_RETURN(page_table->MapRegion(region_type, perm));
|
// R_RETURN(page_table->MapRegion(region_type, perm));
|
||||||
UNIMPLEMENTED();
|
UNIMPLEMENTED();
|
||||||
R_SUCCEED();
|
R_SUCCEED();
|
||||||
}));
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Result KCapabilities::CheckMapRegion(KernelCore& kernel, const u32 cap) {
|
Result KCapabilities::CheckMapRegion(KernelCore& kernel, const u32 cap) {
|
||||||
// Check that each region has a physical backing store.
|
// Check that each region has a physical backing store.
|
||||||
R_RETURN(ProcessMapRegionCapability(
|
return ProcessMapRegionCapability(
|
||||||
cap, [&](KMemoryRegionType region_type, KMemoryPermission perm) -> Result {
|
cap, [&](KMemoryRegionType region_type, KMemoryPermission perm) -> Result {
|
||||||
R_UNLESS(kernel.MemoryLayout().GetPhysicalMemoryRegionTree().FindFirstDerived(
|
R_UNLESS(kernel.MemoryLayout().GetPhysicalMemoryRegionTree().FindFirstDerived(
|
||||||
region_type) != nullptr,
|
region_type) != nullptr,
|
||||||
ResultOutOfRange);
|
ResultOutOfRange);
|
||||||
R_SUCCEED();
|
R_SUCCEED();
|
||||||
}));
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Result KCapabilities::SetInterruptPairCapability(const u32 cap) {
|
Result KCapabilities::SetInterruptPairCapability(const u32 cap) {
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <condition_variable>
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
|
|
|
@ -758,12 +758,20 @@ Core::HID::NpadStyleTag Controller_NPad::GetSupportedStyleSet() const {
|
||||||
return hid_core.GetSupportedStyleTag();
|
return hid_core.GetSupportedStyleTag();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Controller_NPad::SetSupportedNpadIdTypes(std::span<const u8> data) {
|
Result Controller_NPad::SetSupportedNpadIdTypes(std::span<const u8> data) {
|
||||||
|
constexpr std::size_t max_number_npad_ids = 0xa;
|
||||||
const auto length = data.size();
|
const auto length = data.size();
|
||||||
ASSERT(length > 0 && (length % sizeof(u32)) == 0);
|
ASSERT(length > 0 && (length % sizeof(u32)) == 0);
|
||||||
|
const std::size_t elements = length / sizeof(u32);
|
||||||
|
|
||||||
|
if (elements > max_number_npad_ids) {
|
||||||
|
return InvalidArraySize;
|
||||||
|
}
|
||||||
|
|
||||||
supported_npad_id_types.clear();
|
supported_npad_id_types.clear();
|
||||||
supported_npad_id_types.resize(length / sizeof(u32));
|
supported_npad_id_types.resize(elements);
|
||||||
std::memcpy(supported_npad_id_types.data(), data.data(), length);
|
std::memcpy(supported_npad_id_types.data(), data.data(), length);
|
||||||
|
return ResultSuccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Controller_NPad::GetSupportedNpadIdTypes(u32* data, std::size_t max_length) {
|
void Controller_NPad::GetSupportedNpadIdTypes(u32* data, std::size_t max_length) {
|
||||||
|
|
|
@ -96,7 +96,7 @@ public:
|
||||||
void SetSupportedStyleSet(Core::HID::NpadStyleTag style_set);
|
void SetSupportedStyleSet(Core::HID::NpadStyleTag style_set);
|
||||||
Core::HID::NpadStyleTag GetSupportedStyleSet() const;
|
Core::HID::NpadStyleTag GetSupportedStyleSet() const;
|
||||||
|
|
||||||
void SetSupportedNpadIdTypes(std::span<const u8> data);
|
Result SetSupportedNpadIdTypes(std::span<const u8> data);
|
||||||
void GetSupportedNpadIdTypes(u32* data, std::size_t max_length);
|
void GetSupportedNpadIdTypes(u32* data, std::size_t max_length);
|
||||||
std::size_t GetSupportedNpadIdTypesSize() const;
|
std::size_t GetSupportedNpadIdTypesSize() const;
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,7 @@ constexpr Result NpadIsDualJoycon{ErrorModule::HID, 601};
|
||||||
constexpr Result NpadIsSameType{ErrorModule::HID, 602};
|
constexpr Result NpadIsSameType{ErrorModule::HID, 602};
|
||||||
constexpr Result InvalidNpadId{ErrorModule::HID, 709};
|
constexpr Result InvalidNpadId{ErrorModule::HID, 709};
|
||||||
constexpr Result NpadNotConnected{ErrorModule::HID, 710};
|
constexpr Result NpadNotConnected{ErrorModule::HID, 710};
|
||||||
|
constexpr Result InvalidArraySize{ErrorModule::HID, 715};
|
||||||
constexpr Result InvalidPalmaHandle{ErrorModule::HID, 3302};
|
constexpr Result InvalidPalmaHandle{ErrorModule::HID, 3302};
|
||||||
|
|
||||||
} // namespace Service::HID
|
} // namespace Service::HID
|
||||||
|
|
|
@ -1025,13 +1025,13 @@ void Hid::SetSupportedNpadIdType(Kernel::HLERequestContext& ctx) {
|
||||||
IPC::RequestParser rp{ctx};
|
IPC::RequestParser rp{ctx};
|
||||||
const auto applet_resource_user_id{rp.Pop<u64>()};
|
const auto applet_resource_user_id{rp.Pop<u64>()};
|
||||||
|
|
||||||
applet_resource->GetController<Controller_NPad>(HidController::NPad)
|
const auto result = applet_resource->GetController<Controller_NPad>(HidController::NPad)
|
||||||
.SetSupportedNpadIdTypes(ctx.ReadBuffer());
|
.SetSupportedNpadIdTypes(ctx.ReadBuffer());
|
||||||
|
|
||||||
LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
|
LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2};
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
rb.Push(ResultSuccess);
|
rb.Push(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Hid::ActivateNpad(Kernel::HLERequestContext& ctx) {
|
void Hid::ActivateNpad(Kernel::HLERequestContext& ctx) {
|
||||||
|
|
|
@ -538,7 +538,7 @@ TEST_CASE("BufferBase: Cached write downloads") {
|
||||||
int num = 0;
|
int num = 0;
|
||||||
buffer.ForEachDownloadRangeAndClear(c, WORD, [&](u64 offset, u64 size) { ++num; });
|
buffer.ForEachDownloadRangeAndClear(c, WORD, [&](u64 offset, u64 size) { ++num; });
|
||||||
buffer.ForEachUploadRange(c, WORD, [&](u64 offset, u64 size) { ++num; });
|
buffer.ForEachUploadRange(c, WORD, [&](u64 offset, u64 size) { ++num; });
|
||||||
REQUIRE(num == 1);
|
REQUIRE(num == 0);
|
||||||
REQUIRE(!buffer.IsRegionCpuModified(c + PAGE, PAGE));
|
REQUIRE(!buffer.IsRegionCpuModified(c + PAGE, PAGE));
|
||||||
REQUIRE(!buffer.IsRegionGpuModified(c + PAGE, PAGE));
|
REQUIRE(!buffer.IsRegionGpuModified(c + PAGE, PAGE));
|
||||||
buffer.FlushCachedWrites();
|
buffer.FlushCachedWrites();
|
||||||
|
|
|
@ -430,7 +430,7 @@ private:
|
||||||
if (query_begin >= SizeBytes() || size < 0) {
|
if (query_begin >= SizeBytes() || size < 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
[[maybe_unused]] u64* const untracked_words = Array<Type::Untracked>();
|
u64* const untracked_words = Array<Type::Untracked>();
|
||||||
u64* const state_words = Array<type>();
|
u64* const state_words = Array<type>();
|
||||||
const u64 query_end = query_begin + std::min(static_cast<u64>(size), SizeBytes());
|
const u64 query_end = query_begin + std::min(static_cast<u64>(size), SizeBytes());
|
||||||
u64* const words_begin = state_words + query_begin / BYTES_PER_WORD;
|
u64* const words_begin = state_words + query_begin / BYTES_PER_WORD;
|
||||||
|
@ -483,7 +483,7 @@ private:
|
||||||
NotifyRasterizer<true>(word_index, current_bits, ~u64{0});
|
NotifyRasterizer<true>(word_index, current_bits, ~u64{0});
|
||||||
}
|
}
|
||||||
// Exclude CPU modified pages when visiting GPU pages
|
// Exclude CPU modified pages when visiting GPU pages
|
||||||
const u64 word = current_word;
|
const u64 word = current_word & ~(type == Type::GPU ? untracked_words[word_index] : 0);
|
||||||
u64 page = page_begin;
|
u64 page = page_begin;
|
||||||
page_begin = 0;
|
page_begin = 0;
|
||||||
|
|
||||||
|
@ -531,7 +531,7 @@ private:
|
||||||
[[nodiscard]] bool IsRegionModified(u64 offset, u64 size) const noexcept {
|
[[nodiscard]] bool IsRegionModified(u64 offset, u64 size) const noexcept {
|
||||||
static_assert(type != Type::Untracked);
|
static_assert(type != Type::Untracked);
|
||||||
|
|
||||||
[[maybe_unused]] const u64* const untracked_words = Array<Type::Untracked>();
|
const u64* const untracked_words = Array<Type::Untracked>();
|
||||||
const u64* const state_words = Array<type>();
|
const u64* const state_words = Array<type>();
|
||||||
const u64 num_query_words = size / BYTES_PER_WORD + 1;
|
const u64 num_query_words = size / BYTES_PER_WORD + 1;
|
||||||
const u64 word_begin = offset / BYTES_PER_WORD;
|
const u64 word_begin = offset / BYTES_PER_WORD;
|
||||||
|
@ -539,7 +539,8 @@ private:
|
||||||
const u64 page_limit = Common::DivCeil(offset + size, BYTES_PER_PAGE);
|
const u64 page_limit = Common::DivCeil(offset + size, BYTES_PER_PAGE);
|
||||||
u64 page_index = (offset / BYTES_PER_PAGE) % PAGES_PER_WORD;
|
u64 page_index = (offset / BYTES_PER_PAGE) % PAGES_PER_WORD;
|
||||||
for (u64 word_index = word_begin; word_index < word_end; ++word_index, page_index = 0) {
|
for (u64 word_index = word_begin; word_index < word_end; ++word_index, page_index = 0) {
|
||||||
const u64 word = state_words[word_index];
|
const u64 off_word = type == Type::GPU ? untracked_words[word_index] : 0;
|
||||||
|
const u64 word = state_words[word_index] & ~off_word;
|
||||||
if (word == 0) {
|
if (word == 0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -563,7 +564,7 @@ private:
|
||||||
[[nodiscard]] std::pair<u64, u64> ModifiedRegion(u64 offset, u64 size) const noexcept {
|
[[nodiscard]] std::pair<u64, u64> ModifiedRegion(u64 offset, u64 size) const noexcept {
|
||||||
static_assert(type != Type::Untracked);
|
static_assert(type != Type::Untracked);
|
||||||
|
|
||||||
[[maybe_unused]] const u64* const untracked_words = Array<Type::Untracked>();
|
const u64* const untracked_words = Array<Type::Untracked>();
|
||||||
const u64* const state_words = Array<type>();
|
const u64* const state_words = Array<type>();
|
||||||
const u64 num_query_words = size / BYTES_PER_WORD + 1;
|
const u64 num_query_words = size / BYTES_PER_WORD + 1;
|
||||||
const u64 word_begin = offset / BYTES_PER_WORD;
|
const u64 word_begin = offset / BYTES_PER_WORD;
|
||||||
|
@ -573,7 +574,8 @@ private:
|
||||||
u64 begin = std::numeric_limits<u64>::max();
|
u64 begin = std::numeric_limits<u64>::max();
|
||||||
u64 end = 0;
|
u64 end = 0;
|
||||||
for (u64 word_index = word_begin; word_index < word_end; ++word_index) {
|
for (u64 word_index = word_begin; word_index < word_end; ++word_index) {
|
||||||
const u64 word = state_words[word_index];
|
const u64 off_word = type == Type::GPU ? untracked_words[word_index] : 0;
|
||||||
|
const u64 word = state_words[word_index] & ~off_word;
|
||||||
if (word == 0) {
|
if (word == 0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
|
@ -961,6 +961,38 @@ void GMainWindow::InitializeWidgets() {
|
||||||
tas_label->setFocusPolicy(Qt::NoFocus);
|
tas_label->setFocusPolicy(Qt::NoFocus);
|
||||||
statusBar()->insertPermanentWidget(0, tas_label);
|
statusBar()->insertPermanentWidget(0, tas_label);
|
||||||
|
|
||||||
|
volume_popup = new QWidget(this);
|
||||||
|
volume_popup->setWindowFlags(Qt::FramelessWindowHint | Qt::NoDropShadowWindowHint | Qt::Popup);
|
||||||
|
volume_popup->setLayout(new QVBoxLayout());
|
||||||
|
volume_popup->setMinimumWidth(200);
|
||||||
|
|
||||||
|
volume_slider = new QSlider(Qt::Horizontal);
|
||||||
|
volume_slider->setObjectName(QStringLiteral("volume_slider"));
|
||||||
|
volume_slider->setMaximum(200);
|
||||||
|
volume_slider->setPageStep(5);
|
||||||
|
connect(volume_slider, &QSlider::valueChanged, this, [this](int percentage) {
|
||||||
|
Settings::values.audio_muted = false;
|
||||||
|
const auto volume = static_cast<u8>(percentage);
|
||||||
|
Settings::values.volume.SetValue(volume);
|
||||||
|
UpdateVolumeUI();
|
||||||
|
});
|
||||||
|
volume_popup->layout()->addWidget(volume_slider);
|
||||||
|
|
||||||
|
volume_button = new QPushButton();
|
||||||
|
volume_button->setObjectName(QStringLiteral("TogglableStatusBarButton"));
|
||||||
|
volume_button->setFocusPolicy(Qt::NoFocus);
|
||||||
|
volume_button->setCheckable(true);
|
||||||
|
UpdateVolumeUI();
|
||||||
|
connect(volume_button, &QPushButton::clicked, this, [&] {
|
||||||
|
UpdateVolumeUI();
|
||||||
|
volume_popup->setVisible(!volume_popup->isVisible());
|
||||||
|
QRect rect = volume_button->geometry();
|
||||||
|
QPoint bottomLeft = statusBar()->mapToGlobal(rect.topLeft());
|
||||||
|
bottomLeft.setY(bottomLeft.y() - volume_popup->geometry().height());
|
||||||
|
volume_popup->setGeometry(QRect(bottomLeft, QSize(rect.width(), rect.height())));
|
||||||
|
});
|
||||||
|
statusBar()->insertPermanentWidget(0, volume_button);
|
||||||
|
|
||||||
// setup AA button
|
// setup AA button
|
||||||
aa_status_button = new QPushButton();
|
aa_status_button = new QPushButton();
|
||||||
aa_status_button->setObjectName(QStringLiteral("TogglableStatusBarButton"));
|
aa_status_button->setObjectName(QStringLiteral("TogglableStatusBarButton"));
|
||||||
|
@ -1123,30 +1155,9 @@ void GMainWindow::InitializeHotkeys() {
|
||||||
&GMainWindow::OnToggleAdaptingFilter);
|
&GMainWindow::OnToggleAdaptingFilter);
|
||||||
connect_shortcut(QStringLiteral("Change Docked Mode"), &GMainWindow::OnToggleDockedMode);
|
connect_shortcut(QStringLiteral("Change Docked Mode"), &GMainWindow::OnToggleDockedMode);
|
||||||
connect_shortcut(QStringLiteral("Change GPU Accuracy"), &GMainWindow::OnToggleGpuAccuracy);
|
connect_shortcut(QStringLiteral("Change GPU Accuracy"), &GMainWindow::OnToggleGpuAccuracy);
|
||||||
connect_shortcut(QStringLiteral("Audio Mute/Unmute"),
|
connect_shortcut(QStringLiteral("Audio Mute/Unmute"), &GMainWindow::OnMute);
|
||||||
[] { Settings::values.audio_muted = !Settings::values.audio_muted; });
|
connect_shortcut(QStringLiteral("Audio Volume Down"), &GMainWindow::OnDecreaseVolume);
|
||||||
connect_shortcut(QStringLiteral("Audio Volume Down"), [] {
|
connect_shortcut(QStringLiteral("Audio Volume Up"), &GMainWindow::OnIncreaseVolume);
|
||||||
const auto current_volume = static_cast<s32>(Settings::values.volume.GetValue());
|
|
||||||
int step = 5;
|
|
||||||
if (current_volume <= 30) {
|
|
||||||
step = 2;
|
|
||||||
}
|
|
||||||
if (current_volume <= 6) {
|
|
||||||
step = 1;
|
|
||||||
}
|
|
||||||
Settings::values.volume.SetValue(std::max(current_volume - step, 0));
|
|
||||||
});
|
|
||||||
connect_shortcut(QStringLiteral("Audio Volume Up"), [] {
|
|
||||||
const auto current_volume = static_cast<s32>(Settings::values.volume.GetValue());
|
|
||||||
int step = 5;
|
|
||||||
if (current_volume < 30) {
|
|
||||||
step = 2;
|
|
||||||
}
|
|
||||||
if (current_volume < 6) {
|
|
||||||
step = 1;
|
|
||||||
}
|
|
||||||
Settings::values.volume.SetValue(current_volume + step);
|
|
||||||
});
|
|
||||||
connect_shortcut(QStringLiteral("Toggle Framerate Limit"), [] {
|
connect_shortcut(QStringLiteral("Toggle Framerate Limit"), [] {
|
||||||
Settings::values.use_speed_limit.SetValue(!Settings::values.use_speed_limit.GetValue());
|
Settings::values.use_speed_limit.SetValue(!Settings::values.use_speed_limit.GetValue());
|
||||||
});
|
});
|
||||||
|
@ -3460,6 +3471,39 @@ void GMainWindow::OnToggleGpuAccuracy() {
|
||||||
UpdateGPUAccuracyButton();
|
UpdateGPUAccuracyButton();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GMainWindow::OnMute() {
|
||||||
|
Settings::values.audio_muted = !Settings::values.audio_muted;
|
||||||
|
UpdateVolumeUI();
|
||||||
|
}
|
||||||
|
|
||||||
|
void GMainWindow::OnDecreaseVolume() {
|
||||||
|
Settings::values.audio_muted = false;
|
||||||
|
const auto current_volume = static_cast<s32>(Settings::values.volume.GetValue());
|
||||||
|
int step = 5;
|
||||||
|
if (current_volume <= 30) {
|
||||||
|
step = 2;
|
||||||
|
}
|
||||||
|
if (current_volume <= 6) {
|
||||||
|
step = 1;
|
||||||
|
}
|
||||||
|
Settings::values.volume.SetValue(std::max(current_volume - step, 0));
|
||||||
|
UpdateVolumeUI();
|
||||||
|
}
|
||||||
|
|
||||||
|
void GMainWindow::OnIncreaseVolume() {
|
||||||
|
Settings::values.audio_muted = false;
|
||||||
|
const auto current_volume = static_cast<s32>(Settings::values.volume.GetValue());
|
||||||
|
int step = 5;
|
||||||
|
if (current_volume < 30) {
|
||||||
|
step = 2;
|
||||||
|
}
|
||||||
|
if (current_volume < 6) {
|
||||||
|
step = 1;
|
||||||
|
}
|
||||||
|
Settings::values.volume.SetValue(current_volume + step);
|
||||||
|
UpdateVolumeUI();
|
||||||
|
}
|
||||||
|
|
||||||
void GMainWindow::OnToggleAdaptingFilter() {
|
void GMainWindow::OnToggleAdaptingFilter() {
|
||||||
auto filter = Settings::values.scaling_filter.GetValue();
|
auto filter = Settings::values.scaling_filter.GetValue();
|
||||||
if (filter == Settings::ScalingFilter::LastFilter) {
|
if (filter == Settings::ScalingFilter::LastFilter) {
|
||||||
|
@ -3918,6 +3962,18 @@ void GMainWindow::UpdateAAText() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GMainWindow::UpdateVolumeUI() {
|
||||||
|
const auto volume_value = static_cast<int>(Settings::values.volume.GetValue());
|
||||||
|
volume_slider->setValue(volume_value);
|
||||||
|
if (Settings::values.audio_muted) {
|
||||||
|
volume_button->setChecked(false);
|
||||||
|
volume_button->setText(tr("VOLUME: MUTE"));
|
||||||
|
} else {
|
||||||
|
volume_button->setChecked(true);
|
||||||
|
volume_button->setText(tr("VOLUME: %1%", "Volume percentage (e.g. 50%)").arg(volume_value));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void GMainWindow::UpdateStatusButtons() {
|
void GMainWindow::UpdateStatusButtons() {
|
||||||
renderer_status_button->setChecked(Settings::values.renderer_backend.GetValue() ==
|
renderer_status_button->setChecked(Settings::values.renderer_backend.GetValue() ==
|
||||||
Settings::RendererBackend::Vulkan);
|
Settings::RendererBackend::Vulkan);
|
||||||
|
@ -3926,6 +3982,7 @@ void GMainWindow::UpdateStatusButtons() {
|
||||||
UpdateDockedButton();
|
UpdateDockedButton();
|
||||||
UpdateFilterText();
|
UpdateFilterText();
|
||||||
UpdateAAText();
|
UpdateAAText();
|
||||||
|
UpdateVolumeUI();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GMainWindow::UpdateUISettings() {
|
void GMainWindow::UpdateUISettings() {
|
||||||
|
|
|
@ -37,6 +37,8 @@ class QLabel;
|
||||||
class MultiplayerState;
|
class MultiplayerState;
|
||||||
class QPushButton;
|
class QPushButton;
|
||||||
class QProgressDialog;
|
class QProgressDialog;
|
||||||
|
class QSlider;
|
||||||
|
class QHBoxLayout;
|
||||||
class WaitTreeWidget;
|
class WaitTreeWidget;
|
||||||
enum class GameListOpenTarget;
|
enum class GameListOpenTarget;
|
||||||
enum class GameListRemoveTarget;
|
enum class GameListRemoveTarget;
|
||||||
|
@ -312,6 +314,9 @@ private slots:
|
||||||
void OnMenuRecentFile();
|
void OnMenuRecentFile();
|
||||||
void OnConfigure();
|
void OnConfigure();
|
||||||
void OnConfigureTas();
|
void OnConfigureTas();
|
||||||
|
void OnDecreaseVolume();
|
||||||
|
void OnIncreaseVolume();
|
||||||
|
void OnMute();
|
||||||
void OnTasStartStop();
|
void OnTasStartStop();
|
||||||
void OnTasRecord();
|
void OnTasRecord();
|
||||||
void OnTasReset();
|
void OnTasReset();
|
||||||
|
@ -364,6 +369,7 @@ private:
|
||||||
void UpdateAPIText();
|
void UpdateAPIText();
|
||||||
void UpdateFilterText();
|
void UpdateFilterText();
|
||||||
void UpdateAAText();
|
void UpdateAAText();
|
||||||
|
void UpdateVolumeUI();
|
||||||
void UpdateStatusBar();
|
void UpdateStatusBar();
|
||||||
void UpdateGPUAccuracyButton();
|
void UpdateGPUAccuracyButton();
|
||||||
void UpdateStatusButtons();
|
void UpdateStatusButtons();
|
||||||
|
@ -412,6 +418,9 @@ private:
|
||||||
QPushButton* dock_status_button = nullptr;
|
QPushButton* dock_status_button = nullptr;
|
||||||
QPushButton* filter_status_button = nullptr;
|
QPushButton* filter_status_button = nullptr;
|
||||||
QPushButton* aa_status_button = nullptr;
|
QPushButton* aa_status_button = nullptr;
|
||||||
|
QPushButton* volume_button = nullptr;
|
||||||
|
QWidget* volume_popup = nullptr;
|
||||||
|
QSlider* volume_slider = nullptr;
|
||||||
QTimer status_bar_update_timer;
|
QTimer status_bar_update_timer;
|
||||||
|
|
||||||
std::unique_ptr<Config> config;
|
std::unique_ptr<Config> config;
|
||||||
|
|
|
@ -286,11 +286,14 @@ vulkan_device =
|
||||||
# 0: 0.5x (360p/540p) [EXPERIMENTAL]
|
# 0: 0.5x (360p/540p) [EXPERIMENTAL]
|
||||||
# 1: 0.75x (540p/810p) [EXPERIMENTAL]
|
# 1: 0.75x (540p/810p) [EXPERIMENTAL]
|
||||||
# 2 (default): 1x (720p/1080p)
|
# 2 (default): 1x (720p/1080p)
|
||||||
# 3: 2x (1440p/2160p)
|
# 3: 1.5x (1080p/1620p) [EXPERIMENTAL]
|
||||||
# 4: 3x (2160p/3240p)
|
# 4: 2x (1440p/2160p)
|
||||||
# 5: 4x (2880p/4320p)
|
# 5: 3x (2160p/3240p)
|
||||||
# 6: 5x (3600p/5400p)
|
# 6: 4x (2880p/4320p)
|
||||||
# 7: 6x (4320p/6480p)
|
# 7: 5x (3600p/5400p)
|
||||||
|
# 8: 6x (4320p/6480p)
|
||||||
|
# 9: 7x (5040p/7560p)
|
||||||
|
# 10: 8x (5760/8640p)
|
||||||
resolution_setup =
|
resolution_setup =
|
||||||
|
|
||||||
# Pixel filter to use when up- or down-sampling rendered frames.
|
# Pixel filter to use when up- or down-sampling rendered frames.
|
||||||
|
@ -299,11 +302,11 @@ resolution_setup =
|
||||||
# 2: Bicubic
|
# 2: Bicubic
|
||||||
# 3: Gaussian
|
# 3: Gaussian
|
||||||
# 4: ScaleForce
|
# 4: ScaleForce
|
||||||
# 5: AMD FidelityFX™️ Super Resolution [Vulkan Only]
|
# 5: AMD FidelityFX™️ Super Resolution
|
||||||
scaling_filter =
|
scaling_filter =
|
||||||
|
|
||||||
# Anti-Aliasing (AA)
|
# Anti-Aliasing (AA)
|
||||||
# 0 (default): None, 1: FXAA
|
# 0 (default): None, 1: FXAA, 2: SMAA
|
||||||
anti_aliasing =
|
anti_aliasing =
|
||||||
|
|
||||||
# Whether to use fullscreen or borderless window mode
|
# Whether to use fullscreen or borderless window mode
|
||||||
|
|
Loading…
Reference in a new issue