early-access version 3943
This commit is contained in:
parent
53383d21aa
commit
afa5ea6074
5 changed files with 31 additions and 17 deletions
|
@ -1,7 +1,7 @@
|
||||||
yuzu emulator early access
|
yuzu emulator early access
|
||||||
=============
|
=============
|
||||||
|
|
||||||
This is the source code for early-access 3942.
|
This is the source code for early-access 3943.
|
||||||
|
|
||||||
## Legal Notice
|
## Legal Notice
|
||||||
|
|
||||||
|
|
|
@ -19,16 +19,23 @@ namespace Core::Memory {
|
||||||
namespace {
|
namespace {
|
||||||
constexpr auto CHEAT_ENGINE_NS = std::chrono::nanoseconds{1000000000 / 12};
|
constexpr auto CHEAT_ENGINE_NS = std::chrono::nanoseconds{1000000000 / 12};
|
||||||
|
|
||||||
std::string_view ExtractName(std::string_view data, std::size_t start_index, char match) {
|
std::string_view ExtractName(std::size_t& out_name_size, std::string_view data,
|
||||||
|
std::size_t start_index, char match) {
|
||||||
auto end_index = start_index;
|
auto end_index = start_index;
|
||||||
while (data[end_index] != match) {
|
while (data[end_index] != match) {
|
||||||
++end_index;
|
++end_index;
|
||||||
if (end_index > data.size() ||
|
if (end_index > data.size()) {
|
||||||
(end_index - start_index - 1) > sizeof(CheatDefinition::readable_name)) {
|
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
out_name_size = end_index - start_index;
|
||||||
|
|
||||||
|
// Clamp name if it's too big
|
||||||
|
if (out_name_size > sizeof(CheatDefinition::readable_name)) {
|
||||||
|
end_index = start_index + sizeof(CheatDefinition::readable_name);
|
||||||
|
}
|
||||||
|
|
||||||
return data.substr(start_index, end_index - start_index);
|
return data.substr(start_index, end_index - start_index);
|
||||||
}
|
}
|
||||||
} // Anonymous namespace
|
} // Anonymous namespace
|
||||||
|
@ -113,7 +120,8 @@ std::vector<CheatEntry> TextCheatParser::Parse(std::string_view data) const {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto name = ExtractName(data, i + 1, '}');
|
std::size_t name_size{};
|
||||||
|
const auto name = ExtractName(name_size, data, i + 1, '}');
|
||||||
if (name.empty()) {
|
if (name.empty()) {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
@ -125,12 +133,13 @@ std::vector<CheatEntry> TextCheatParser::Parse(std::string_view data) const {
|
||||||
.definition.readable_name[out[*current_entry].definition.readable_name.size() - 1] =
|
.definition.readable_name[out[*current_entry].definition.readable_name.size() - 1] =
|
||||||
'\0';
|
'\0';
|
||||||
|
|
||||||
i += name.length() + 1;
|
i += name_size + 1;
|
||||||
} else if (data[i] == '[') {
|
} else if (data[i] == '[') {
|
||||||
current_entry = out.size();
|
current_entry = out.size();
|
||||||
out.emplace_back();
|
out.emplace_back();
|
||||||
|
|
||||||
const auto name = ExtractName(data, i + 1, ']');
|
std::size_t name_size{};
|
||||||
|
const auto name = ExtractName(name_size, data, i + 1, ']');
|
||||||
if (name.empty()) {
|
if (name.empty()) {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
@ -142,7 +151,7 @@ std::vector<CheatEntry> TextCheatParser::Parse(std::string_view data) const {
|
||||||
.definition.readable_name[out[*current_entry].definition.readable_name.size() - 1] =
|
.definition.readable_name[out[*current_entry].definition.readable_name.size() - 1] =
|
||||||
'\0';
|
'\0';
|
||||||
|
|
||||||
i += name.length() + 1;
|
i += name_size + 1;
|
||||||
} else if (::isxdigit(data[i])) {
|
} else if (::isxdigit(data[i])) {
|
||||||
if (!current_entry || out[*current_entry].definition.num_opcodes >=
|
if (!current_entry || out[*current_entry].definition.num_opcodes >=
|
||||||
out[*current_entry].definition.opcodes.size()) {
|
out[*current_entry].definition.opcodes.size()) {
|
||||||
|
|
|
@ -242,6 +242,7 @@ std::string EmitGLSL(const Profile& profile, const RuntimeInfo& runtime_info, IR
|
||||||
}
|
}
|
||||||
if (program.info.uses_subgroup_shuffles) {
|
if (program.info.uses_subgroup_shuffles) {
|
||||||
ctx.header += "bool shfl_in_bounds;";
|
ctx.header += "bool shfl_in_bounds;";
|
||||||
|
ctx.header += "uint shfl_result;";
|
||||||
}
|
}
|
||||||
ctx.code.insert(0, ctx.header);
|
ctx.code.insert(0, ctx.header);
|
||||||
ctx.code += '}';
|
ctx.code += '}';
|
||||||
|
|
|
@ -141,7 +141,8 @@ void EmitShuffleIndex(EmitContext& ctx, IR::Inst& inst, std::string_view value,
|
||||||
const auto src_thread_id{fmt::format("({})|({})", lhs, min_thread_id)};
|
const auto src_thread_id{fmt::format("({})|({})", lhs, min_thread_id)};
|
||||||
ctx.Add("shfl_in_bounds=int({})<=int({});", src_thread_id, max_thread_id);
|
ctx.Add("shfl_in_bounds=int({})<=int({});", src_thread_id, max_thread_id);
|
||||||
SetInBoundsFlag(ctx, inst);
|
SetInBoundsFlag(ctx, inst);
|
||||||
ctx.AddU32("{}=shfl_in_bounds?readInvocationARB({},{}):{};", inst, value, src_thread_id, value);
|
ctx.Add("shfl_result=readInvocationARB({},{});", value, src_thread_id);
|
||||||
|
ctx.AddU32("{}=shfl_in_bounds?shfl_result:{};", inst, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EmitShuffleUp(EmitContext& ctx, IR::Inst& inst, std::string_view value, std::string_view index,
|
void EmitShuffleUp(EmitContext& ctx, IR::Inst& inst, std::string_view value, std::string_view index,
|
||||||
|
@ -158,7 +159,8 @@ void EmitShuffleUp(EmitContext& ctx, IR::Inst& inst, std::string_view value, std
|
||||||
const auto src_thread_id{fmt::format("({}-{})", THREAD_ID, index)};
|
const auto src_thread_id{fmt::format("({}-{})", THREAD_ID, index)};
|
||||||
ctx.Add("shfl_in_bounds=int({})>=int({});", src_thread_id, max_thread_id);
|
ctx.Add("shfl_in_bounds=int({})>=int({});", src_thread_id, max_thread_id);
|
||||||
SetInBoundsFlag(ctx, inst);
|
SetInBoundsFlag(ctx, inst);
|
||||||
ctx.AddU32("{}=shfl_in_bounds?readInvocationARB({},{}):{};", inst, value, src_thread_id, value);
|
ctx.Add("shfl_result=readInvocationARB({},{});", value, src_thread_id);
|
||||||
|
ctx.AddU32("{}=shfl_in_bounds?shfl_result:{};", inst, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EmitShuffleDown(EmitContext& ctx, IR::Inst& inst, std::string_view value,
|
void EmitShuffleDown(EmitContext& ctx, IR::Inst& inst, std::string_view value,
|
||||||
|
@ -175,7 +177,8 @@ void EmitShuffleDown(EmitContext& ctx, IR::Inst& inst, std::string_view value,
|
||||||
const auto src_thread_id{fmt::format("({}+{})", THREAD_ID, index)};
|
const auto src_thread_id{fmt::format("({}+{})", THREAD_ID, index)};
|
||||||
ctx.Add("shfl_in_bounds=int({})<=int({});", src_thread_id, max_thread_id);
|
ctx.Add("shfl_in_bounds=int({})<=int({});", src_thread_id, max_thread_id);
|
||||||
SetInBoundsFlag(ctx, inst);
|
SetInBoundsFlag(ctx, inst);
|
||||||
ctx.AddU32("{}=shfl_in_bounds?readInvocationARB({},{}):{};", inst, value, src_thread_id, value);
|
ctx.Add("shfl_result=readInvocationARB({},{});", value, src_thread_id);
|
||||||
|
ctx.AddU32("{}=shfl_in_bounds?shfl_result:{};", inst, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EmitShuffleButterfly(EmitContext& ctx, IR::Inst& inst, std::string_view value,
|
void EmitShuffleButterfly(EmitContext& ctx, IR::Inst& inst, std::string_view value,
|
||||||
|
@ -193,7 +196,8 @@ void EmitShuffleButterfly(EmitContext& ctx, IR::Inst& inst, std::string_view val
|
||||||
const auto src_thread_id{fmt::format("({}^{})", THREAD_ID, index)};
|
const auto src_thread_id{fmt::format("({}^{})", THREAD_ID, index)};
|
||||||
ctx.Add("shfl_in_bounds=int({})<=int({});", src_thread_id, max_thread_id);
|
ctx.Add("shfl_in_bounds=int({})<=int({});", src_thread_id, max_thread_id);
|
||||||
SetInBoundsFlag(ctx, inst);
|
SetInBoundsFlag(ctx, inst);
|
||||||
ctx.AddU32("{}=shfl_in_bounds?readInvocationARB({},{}):{};", inst, value, src_thread_id, value);
|
ctx.Add("shfl_result=readInvocationARB({},{});", value, src_thread_id);
|
||||||
|
ctx.AddU32("{}=shfl_in_bounds?shfl_result:{};", inst, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EmitFSwizzleAdd(EmitContext& ctx, IR::Inst& inst, std::string_view op_a, std::string_view op_b,
|
void EmitFSwizzleAdd(EmitContext& ctx, IR::Inst& inst, std::string_view op_a, std::string_view op_b,
|
||||||
|
|
|
@ -89,7 +89,7 @@ void ConfigureVibration::VibrateController(Core::HID::ControllerTriggerType type
|
||||||
|
|
||||||
auto& player = Settings::values.players.GetValue()[player_index];
|
auto& player = Settings::values.players.GetValue()[player_index];
|
||||||
auto controller = hid_core.GetEmulatedControllerByIndex(player_index);
|
auto controller = hid_core.GetEmulatedControllerByIndex(player_index);
|
||||||
const int vibration_strenght = vibration_spinboxes[player_index]->value();
|
const int vibration_strength = vibration_spinboxes[player_index]->value();
|
||||||
const auto& buttons = controller->GetButtonsValues();
|
const auto& buttons = controller->GetButtonsValues();
|
||||||
|
|
||||||
bool button_is_pressed = false;
|
bool button_is_pressed = false;
|
||||||
|
@ -105,10 +105,10 @@ void ConfigureVibration::VibrateController(Core::HID::ControllerTriggerType type
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const int old_vibration_enabled = player.vibration_enabled;
|
const bool old_vibration_enabled = player.vibration_enabled;
|
||||||
const bool old_vibration_strenght = player.vibration_strength;
|
const int old_vibration_strength = player.vibration_strength;
|
||||||
player.vibration_enabled = true;
|
player.vibration_enabled = true;
|
||||||
player.vibration_strength = vibration_strenght;
|
player.vibration_strength = vibration_strength;
|
||||||
|
|
||||||
const Core::HID::VibrationValue vibration{
|
const Core::HID::VibrationValue vibration{
|
||||||
.low_amplitude = 1.0f,
|
.low_amplitude = 1.0f,
|
||||||
|
@ -121,7 +121,7 @@ void ConfigureVibration::VibrateController(Core::HID::ControllerTriggerType type
|
||||||
|
|
||||||
// Restore previous values
|
// Restore previous values
|
||||||
player.vibration_enabled = old_vibration_enabled;
|
player.vibration_enabled = old_vibration_enabled;
|
||||||
player.vibration_strength = old_vibration_strenght;
|
player.vibration_strength = old_vibration_strength;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConfigureVibration::StopVibrations() {
|
void ConfigureVibration::StopVibrations() {
|
||||||
|
|
Loading…
Reference in a new issue