Merge branch 'shadps4-emu:main' into fs-cleanup

This commit is contained in:
Stephen Miller 2025-02-25 20:11:23 -06:00 committed by GitHub
commit 4d71e6bb68
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
111 changed files with 3752 additions and 23094 deletions

View File

@ -76,7 +76,7 @@ jobs:
${{ env.cache-name }}-
- name: Cache CMake Build
uses: hendrikmuhs/ccache-action@v1.2.14
uses: hendrikmuhs/ccache-action@v1.2.17
env:
cache-name: ${{ runner.os }}-sdl-cache-cmake-build
with:
@ -111,7 +111,7 @@ jobs:
- name: Setup Qt
uses: jurplel/install-qt-action@v4
with:
version: 6.8.2
version: 6.9.0
host: windows
target: desktop
arch: win64_msvc2022_64
@ -130,7 +130,7 @@ jobs:
${{ env.cache-name }}-
- name: Cache CMake Build
uses: hendrikmuhs/ccache-action@v1.2.14
uses: hendrikmuhs/ccache-action@v1.2.17
env:
cache-name: ${{ runner.os }}-qt-cache-cmake-build
with:
@ -186,7 +186,7 @@ jobs:
${{ env.cache-name }}-
- name: Cache CMake Build
uses: hendrikmuhs/ccache-action@v1.2.14
uses: hendrikmuhs/ccache-action@v1.2.17
env:
cache-name: ${{runner.os}}-sdl-cache-cmake-build
with:
@ -228,7 +228,7 @@ jobs:
- name: Setup Qt
uses: jurplel/install-qt-action@v4
with:
version: 6.8.2
version: 6.9.0
host: mac
target: desktop
arch: clang_64
@ -247,7 +247,7 @@ jobs:
${{ env.cache-name }}-
- name: Cache CMake Build
uses: hendrikmuhs/ccache-action@v1.2.14
uses: hendrikmuhs/ccache-action@v1.2.17
env:
cache-name: ${{runner.os}}-qt-cache-cmake-build
with:
@ -296,7 +296,7 @@ jobs:
${{ env.cache-name }}-
- name: Cache CMake Build
uses: hendrikmuhs/ccache-action@v1.2.14
uses: hendrikmuhs/ccache-action@v1.2.17
env:
cache-name: ${{ runner.os }}-sdl-cache-cmake-build
with:
@ -352,7 +352,7 @@ jobs:
${{ env.cache-name }}-
- name: Cache CMake Build
uses: hendrikmuhs/ccache-action@v1.2.14
uses: hendrikmuhs/ccache-action@v1.2.17
env:
cache-name: ${{ runner.os }}-qt-cache-cmake-build
with:
@ -399,7 +399,7 @@ jobs:
${{ env.cache-name }}-
- name: Cache CMake Build
uses: hendrikmuhs/ccache-action@v1.2.14
uses: hendrikmuhs/ccache-action@v1.2.17
env:
cache-name: ${{ runner.os }}-sdl-gcc-cache-cmake-build
with:
@ -435,7 +435,7 @@ jobs:
${{ env.cache-name }}-
- name: Cache CMake Build
uses: hendrikmuhs/ccache-action@v1.2.14
uses: hendrikmuhs/ccache-action@v1.2.17
env:
cache-name: ${{ runner.os }}-qt-gcc-cache-cmake-build
with:

View File

@ -8,7 +8,7 @@ set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED True)
if(APPLE)
enable_language(OBJC)
list(APPEND ADDITIONAL_LANGUAGES OBJC)
set(CMAKE_OSX_DEPLOYMENT_TARGET 14)
endif()
@ -16,7 +16,7 @@ if (NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release)
endif()
project(shadPS4 CXX C ASM)
project(shadPS4 CXX C ASM ${ADDITIONAL_LANGUAGES})
# Forcing PIE makes sure that the base address is high enough so that it doesn't clash with the PS4 memory.
if(UNIX AND NOT APPLE)
@ -195,6 +195,7 @@ endif()
add_subdirectory(externals)
include_directories(src)
include_directories(Resources)
if(ENABLE_QT_GUI)
find_package(Qt6 REQUIRED COMPONENTS Widgets Concurrent LinguistTools Network Multimedia)
@ -397,20 +398,17 @@ set(VIDEOOUT_LIB src/core/libraries/videoout/buffer.h
src/core/libraries/videoout/videoout_error.h
)
set(LIBC_SOURCES src/core/libraries/libc_internal/libc_internal.cpp
set(HLE_LIBC_INTERNAL_LIB src/core/libraries/libc_internal/libc_internal.cpp
src/core/libraries/libc_internal/libc_internal.h
src/core/libraries/libc_internal/libc_internal_mspace.cpp
src/core/libraries/libc_internal/libc_internal_mspace.h
src/core/libraries/libc_internal/libc_internal_io.cpp
src/core/libraries/libc_internal/libc_internal_io.h
src/core/libraries/libc_internal/libc_internal_memory.cpp
src/core/libraries/libc_internal/libc_internal_memory.h
src/core/libraries/libc_internal/libc_internal_str.cpp
src/core/libraries/libc_internal/libc_internal_str.h
src/core/libraries/libc_internal/libc_internal_stream.cpp
src/core/libraries/libc_internal/libc_internal_stream.h
src/core/libraries/libc_internal/libc_internal_math.cpp
src/core/libraries/libc_internal/libc_internal_math.h
src/core/libraries/libc_internal/printf.h
)
set(IME_LIB src/core/libraries/ime/error_dialog.cpp
@ -665,7 +663,7 @@ set(CORE src/core/aerolib/stubs.cpp
${KERNEL_LIB}
${NETWORK_LIBS}
${SYSTEM_LIBS}
${LIBC_SOURCES}
${HLE_LIBC_INTERNAL_LIB}
${PAD_LIB}
${VIDEOOUT_LIB}
${NP_LIBS}
@ -1105,6 +1103,19 @@ add_subdirectory(${HOST_SHADERS_INCLUDE})
add_dependencies(shadps4 host_shaders)
target_include_directories(shadps4 PRIVATE ${HOST_SHADERS_INCLUDE})
# embed resources
include(CMakeRC)
cmrc_add_resource_library(embedded-resources
ALIAS res::embedded
NAMESPACE res
src/images/bronze.png
src/images/gold.png
src/images/platinum.png
src/images/silver.png)
target_link_libraries(shadps4 PRIVATE res::embedded)
# ImGui resources
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/src/imgui/renderer)
add_dependencies(shadps4 ImGui_Resources)

View File

@ -163,7 +163,7 @@ A few noteworthy teams/projects who've helped us along the way are:
- **yuzu**: Our shader compiler has been designed with yuzu's Hades compiler as a blueprint. This allowed us to focus on the challenges of emulating a modern AMD GPU while having a high-quality optimizing shader compiler implementation as a base.
- [**hydra**](https://github.com/hydra-emu/hydra): A multisystem, multiplatform emulator (chip-8, GB, NES, N64) from Paris.
- [**felix86**](https://github.com/OFFTKP/felix86): A new x86-64 → RISC-V Linux userspace emulator
# License

View File

@ -20,6 +20,10 @@ path = [
"documents/Screenshots/Linux/*",
"externals/MoltenVK/MoltenVK_icd.json",
"scripts/ps4_names.txt",
"src/images/bronze.png",
"src/images/gold.png",
"src/images/platinum.png",
"src/images/silver.png",
"src/images/about_icon.png",
"src/images/controller_icon.png",
"src/images/discord.png",
@ -103,3 +107,7 @@ path = "externals/gcn/include/**"
SPDX-FileCopyrightText = "NONE"
SPDX-License-Identifier = "CC0-1.0"
[[annotations]]
path = "cmake/CMakeRC.cmake"
SPDX-FileCopyrightText = "Copyright (c) 2017 vector-of-bool <vectorofbool@gmail.com>"
SPDX-License-Identifier = "MIT"

666
cmake/CMakeRC.cmake Normal file
View File

@ -0,0 +1,666 @@
# MIT License
#
# Copyright (c) 2017 vector-of-bool <vectorofbool@gmail.com>
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
# This block is executed when generating an intermediate resource file, not when
# running in CMake configure mode
if(_CMRC_GENERATE_MODE)
# Read in the digits
file(READ "${INPUT_FILE}" bytes HEX)
# Format each pair into a character literal. Heuristics seem to favor doing
# the conversion in groups of five for fastest conversion
string(REGEX REPLACE "(..)(..)(..)(..)(..)" "'\\\\x\\1','\\\\x\\2','\\\\x\\3','\\\\x\\4','\\\\x\\5'," chars "${bytes}")
# Since we did this in groups, we have some leftovers to clean up
string(LENGTH "${bytes}" n_bytes2)
math(EXPR n_bytes "${n_bytes2} / 2")
math(EXPR remainder "${n_bytes} % 5") # <-- '5' is the grouping count from above
set(cleanup_re "$")
set(cleanup_sub )
while(remainder)
set(cleanup_re "(..)${cleanup_re}")
set(cleanup_sub "'\\\\x\\${remainder}',${cleanup_sub}")
math(EXPR remainder "${remainder} - 1")
endwhile()
if(NOT cleanup_re STREQUAL "$")
string(REGEX REPLACE "${cleanup_re}" "${cleanup_sub}" chars "${chars}")
endif()
string(CONFIGURE [[
namespace { const char file_array[] = { @chars@ 0 }; }
namespace cmrc { namespace @NAMESPACE@ { namespace res_chars {
extern const char* const @SYMBOL@_begin = file_array;
extern const char* const @SYMBOL@_end = file_array + @n_bytes@;
}}}
]] code)
file(WRITE "${OUTPUT_FILE}" "${code}")
# Exit from the script. Nothing else needs to be processed
return()
endif()
set(_version 2.0.0)
cmake_minimum_required(VERSION 3.12)
include(CMakeParseArguments)
if(COMMAND cmrc_add_resource_library)
if(NOT DEFINED _CMRC_VERSION OR NOT (_version STREQUAL _CMRC_VERSION))
message(WARNING "More than one CMakeRC version has been included in this project.")
endif()
# CMakeRC has already been included! Don't do anything
return()
endif()
set(_CMRC_VERSION "${_version}" CACHE INTERNAL "CMakeRC version. Used for checking for conflicts")
set(_CMRC_SCRIPT "${CMAKE_CURRENT_LIST_FILE}" CACHE INTERNAL "Path to CMakeRC script")
function(_cmrc_normalize_path var)
set(path "${${var}}")
file(TO_CMAKE_PATH "${path}" path)
while(path MATCHES "//")
string(REPLACE "//" "/" path "${path}")
endwhile()
string(REGEX REPLACE "/+$" "" path "${path}")
set("${var}" "${path}" PARENT_SCOPE)
endfunction()
get_filename_component(_inc_dir "${CMAKE_BINARY_DIR}/_cmrc/include" ABSOLUTE)
set(CMRC_INCLUDE_DIR "${_inc_dir}" CACHE INTERNAL "Directory for CMakeRC include files")
# Let's generate the primary include file
file(MAKE_DIRECTORY "${CMRC_INCLUDE_DIR}/cmrc")
set(hpp_content [==[
#ifndef CMRC_CMRC_HPP_INCLUDED
#define CMRC_CMRC_HPP_INCLUDED
#include <cassert>
#include <functional>
#include <iterator>
#include <list>
#include <map>
#include <mutex>
#include <string>
#include <system_error>
#include <type_traits>
#if !(defined(__EXCEPTIONS) || defined(__cpp_exceptions) || defined(_CPPUNWIND) || defined(CMRC_NO_EXCEPTIONS))
#define CMRC_NO_EXCEPTIONS 1
#endif
namespace cmrc { namespace detail { struct dummy; } }
#define CMRC_DECLARE(libid) \
namespace cmrc { namespace detail { \
struct dummy; \
static_assert(std::is_same<dummy, ::cmrc::detail::dummy>::value, "CMRC_DECLARE() must only appear at the global namespace"); \
} } \
namespace cmrc { namespace libid { \
cmrc::embedded_filesystem get_filesystem(); \
} } static_assert(true, "")
namespace cmrc {
class file {
const char* _begin = nullptr;
const char* _end = nullptr;
public:
using iterator = const char*;
using const_iterator = iterator;
iterator begin() const noexcept { return _begin; }
iterator cbegin() const noexcept { return _begin; }
iterator end() const noexcept { return _end; }
iterator cend() const noexcept { return _end; }
std::size_t size() const { return static_cast<std::size_t>(std::distance(begin(), end())); }
file() = default;
file(iterator beg, iterator end) noexcept : _begin(beg), _end(end) {}
};
class directory_entry;
namespace detail {
class directory;
class file_data;
class file_or_directory {
union _data_t {
class file_data* file_data;
class directory* directory;
} _data;
bool _is_file = true;
public:
explicit file_or_directory(file_data& f) {
_data.file_data = &f;
}
explicit file_or_directory(directory& d) {
_data.directory = &d;
_is_file = false;
}
bool is_file() const noexcept {
return _is_file;
}
bool is_directory() const noexcept {
return !is_file();
}
const directory& as_directory() const noexcept {
assert(!is_file());
return *_data.directory;
}
const file_data& as_file() const noexcept {
assert(is_file());
return *_data.file_data;
}
};
class file_data {
public:
const char* begin_ptr;
const char* end_ptr;
file_data(const file_data&) = delete;
file_data(const char* b, const char* e) : begin_ptr(b), end_ptr(e) {}
};
inline std::pair<std::string, std::string> split_path(const std::string& path) {
auto first_sep = path.find("/");
if (first_sep == path.npos) {
return std::make_pair(path, "");
} else {
return std::make_pair(path.substr(0, first_sep), path.substr(first_sep + 1));
}
}
struct created_subdirectory {
class directory& directory;
class file_or_directory& index_entry;
};
class directory {
std::list<file_data> _files;
std::list<directory> _dirs;
std::map<std::string, file_or_directory> _index;
using base_iterator = std::map<std::string, file_or_directory>::const_iterator;
public:
directory() = default;
directory(const directory&) = delete;
created_subdirectory add_subdir(std::string name) & {
_dirs.emplace_back();
auto& back = _dirs.back();
auto& fod = _index.emplace(name, file_or_directory{back}).first->second;
return created_subdirectory{back, fod};
}
file_or_directory* add_file(std::string name, const char* begin, const char* end) & {
assert(_index.find(name) == _index.end());
_files.emplace_back(begin, end);
return &_index.emplace(name, file_or_directory{_files.back()}).first->second;
}
const file_or_directory* get(const std::string& path) const {
auto pair = split_path(path);
auto child = _index.find(pair.first);
if (child == _index.end()) {
return nullptr;
}
auto& entry = child->second;
if (pair.second.empty()) {
// We're at the end of the path
return &entry;
}
if (entry.is_file()) {
// We can't traverse into a file. Stop.
return nullptr;
}
// Keep going down
return entry.as_directory().get(pair.second);
}
class iterator {
base_iterator _base_iter;
base_iterator _end_iter;
public:
using value_type = directory_entry;
using difference_type = std::ptrdiff_t;
using pointer = const value_type*;
using reference = const value_type&;
using iterator_category = std::input_iterator_tag;
iterator() = default;
explicit iterator(base_iterator iter, base_iterator end) : _base_iter(iter), _end_iter(end) {}
iterator begin() const noexcept {
return *this;
}
iterator end() const noexcept {
return iterator(_end_iter, _end_iter);
}
inline value_type operator*() const noexcept;
bool operator==(const iterator& rhs) const noexcept {
return _base_iter == rhs._base_iter;
}
bool operator!=(const iterator& rhs) const noexcept {
return !(*this == rhs);
}
iterator& operator++() noexcept {
++_base_iter;
return *this;
}
iterator operator++(int) noexcept {
auto cp = *this;
++_base_iter;
return cp;
}
};
using const_iterator = iterator;
iterator begin() const noexcept {
return iterator(_index.begin(), _index.end());
}
iterator end() const noexcept {
return iterator();
}
};
inline std::string normalize_path(std::string path) {
while (path.find("/") == 0) {
path.erase(path.begin());
}
while (!path.empty() && (path.rfind("/") == path.size() - 1)) {
path.pop_back();
}
auto off = path.npos;
while ((off = path.find("//")) != path.npos) {
path.erase(path.begin() + static_cast<std::string::difference_type>(off));
}
return path;
}
using index_type = std::map<std::string, const cmrc::detail::file_or_directory*>;
} // detail
class directory_entry {
std::string _fname;
const detail::file_or_directory* _item;
public:
directory_entry() = delete;
explicit directory_entry(std::string filename, const detail::file_or_directory& item)
: _fname(filename)
, _item(&item)
{}
const std::string& filename() const & {
return _fname;
}
std::string filename() const && {
return std::move(_fname);
}
bool is_file() const {
return _item->is_file();
}
bool is_directory() const {
return _item->is_directory();
}
};
directory_entry detail::directory::iterator::operator*() const noexcept {
assert(begin() != end());
return directory_entry(_base_iter->first, _base_iter->second);
}
using directory_iterator = detail::directory::iterator;
class embedded_filesystem {
// Never-null:
const cmrc::detail::index_type* _index;
const detail::file_or_directory* _get(std::string path) const {
path = detail::normalize_path(path);
auto found = _index->find(path);
if (found == _index->end()) {
return nullptr;
} else {
return found->second;
}
}
public:
explicit embedded_filesystem(const detail::index_type& index)
: _index(&index)
{}
file open(const std::string& path) const {
auto entry_ptr = _get(path);
if (!entry_ptr || !entry_ptr->is_file()) {
#ifdef CMRC_NO_EXCEPTIONS
fprintf(stderr, "Error no such file or directory: %s\n", path.c_str());
abort();
#else
throw std::system_error(make_error_code(std::errc::no_such_file_or_directory), path);
#endif
}
auto& dat = entry_ptr->as_file();
return file{dat.begin_ptr, dat.end_ptr};
}
bool is_file(const std::string& path) const noexcept {
auto entry_ptr = _get(path);
return entry_ptr && entry_ptr->is_file();
}
bool is_directory(const std::string& path) const noexcept {
auto entry_ptr = _get(path);
return entry_ptr && entry_ptr->is_directory();
}
bool exists(const std::string& path) const noexcept {
return !!_get(path);
}
directory_iterator iterate_directory(const std::string& path) const {
auto entry_ptr = _get(path);
if (!entry_ptr) {
#ifdef CMRC_NO_EXCEPTIONS
fprintf(stderr, "Error no such file or directory: %s\n", path.c_str());
abort();
#else
throw std::system_error(make_error_code(std::errc::no_such_file_or_directory), path);
#endif
}
if (!entry_ptr->is_directory()) {
#ifdef CMRC_NO_EXCEPTIONS
fprintf(stderr, "Error not a directory: %s\n", path.c_str());
abort();
#else
throw std::system_error(make_error_code(std::errc::not_a_directory), path);
#endif
}
return entry_ptr->as_directory().begin();
}
};
}
#endif // CMRC_CMRC_HPP_INCLUDED
]==])
set(cmrc_hpp "${CMRC_INCLUDE_DIR}/cmrc/cmrc.hpp" CACHE INTERNAL "")
set(_generate 1)
if(EXISTS "${cmrc_hpp}")
file(READ "${cmrc_hpp}" _current)
if(_current STREQUAL hpp_content)
set(_generate 0)
endif()
endif()
file(GENERATE OUTPUT "${cmrc_hpp}" CONTENT "${hpp_content}" CONDITION ${_generate})
add_library(cmrc-base INTERFACE)
target_include_directories(cmrc-base INTERFACE $<BUILD_INTERFACE:${CMRC_INCLUDE_DIR}>)
# Signal a basic C++11 feature to require C++11.
target_compile_features(cmrc-base INTERFACE cxx_nullptr)
set_property(TARGET cmrc-base PROPERTY INTERFACE_CXX_EXTENSIONS OFF)
add_library(cmrc::base ALIAS cmrc-base)
function(cmrc_add_resource_library name)
set(args ALIAS NAMESPACE TYPE)
cmake_parse_arguments(ARG "" "${args}" "" "${ARGN}")
# Generate the identifier for the resource library's namespace
set(ns_re "[a-zA-Z_][a-zA-Z0-9_]*")
if(NOT DEFINED ARG_NAMESPACE)
# Check that the library name is also a valid namespace
if(NOT name MATCHES "${ns_re}")
message(SEND_ERROR "Library name is not a valid namespace. Specify the NAMESPACE argument")
endif()
set(ARG_NAMESPACE "${name}")
else()
if(NOT ARG_NAMESPACE MATCHES "${ns_re}")
message(SEND_ERROR "NAMESPACE for ${name} is not a valid C++ namespace identifier (${ARG_NAMESPACE})")
endif()
endif()
set(libname "${name}")
# Check that type is either "STATIC" or "OBJECT", or default to "STATIC" if
# not set
if(NOT DEFINED ARG_TYPE)
set(ARG_TYPE STATIC)
elseif(NOT "${ARG_TYPE}" MATCHES "^(STATIC|OBJECT)$")
message(SEND_ERROR "${ARG_TYPE} is not a valid TYPE (STATIC and OBJECT are acceptable)")
set(ARG_TYPE STATIC)
endif()
# Generate a library with the compiled in character arrays.
string(CONFIGURE [=[
#include <cmrc/cmrc.hpp>
#include <map>
#include <utility>
namespace cmrc {
namespace @ARG_NAMESPACE@ {
namespace res_chars {
// These are the files which are available in this resource library
$<JOIN:$<TARGET_PROPERTY:@libname@,CMRC_EXTERN_DECLS>,
>
}
namespace {
const cmrc::detail::index_type&
get_root_index() {
static cmrc::detail::directory root_directory_;
static cmrc::detail::file_or_directory root_directory_fod{root_directory_};
static cmrc::detail::index_type root_index;
root_index.emplace("", &root_directory_fod);
struct dir_inl {
class cmrc::detail::directory& directory;
};
dir_inl root_directory_dir{root_directory_};
(void)root_directory_dir;
$<JOIN:$<TARGET_PROPERTY:@libname@,CMRC_MAKE_DIRS>,
>
$<JOIN:$<TARGET_PROPERTY:@libname@,CMRC_MAKE_FILES>,
>
return root_index;
}
}
cmrc::embedded_filesystem get_filesystem() {
static auto& index = get_root_index();
return cmrc::embedded_filesystem{index};
}
} // @ARG_NAMESPACE@
} // cmrc
]=] cpp_content @ONLY)
get_filename_component(libdir "${CMAKE_CURRENT_BINARY_DIR}/__cmrc_${name}" ABSOLUTE)
get_filename_component(lib_tmp_cpp "${libdir}/lib_.cpp" ABSOLUTE)
string(REPLACE "\n " "\n" cpp_content "${cpp_content}")
file(GENERATE OUTPUT "${lib_tmp_cpp}" CONTENT "${cpp_content}")
get_filename_component(libcpp "${libdir}/lib.cpp" ABSOLUTE)
add_custom_command(OUTPUT "${libcpp}"
DEPENDS "${lib_tmp_cpp}" "${cmrc_hpp}"
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${lib_tmp_cpp}" "${libcpp}"
COMMENT "Generating ${name} resource loader"
)
# Generate the actual static library. Each source file is just a single file
# with a character array compiled in containing the contents of the
# corresponding resource file.
add_library(${name} ${ARG_TYPE} ${libcpp})
set_property(TARGET ${name} PROPERTY CMRC_LIBDIR "${libdir}")
set_property(TARGET ${name} PROPERTY CMRC_NAMESPACE "${ARG_NAMESPACE}")
target_link_libraries(${name} PUBLIC cmrc::base)
set_property(TARGET ${name} PROPERTY CMRC_IS_RESOURCE_LIBRARY TRUE)
if(ARG_ALIAS)
add_library("${ARG_ALIAS}" ALIAS ${name})
endif()
cmrc_add_resources(${name} ${ARG_UNPARSED_ARGUMENTS})
endfunction()
function(_cmrc_register_dirs name dirpath)
if(dirpath STREQUAL "")
return()
endif()
# Skip this dir if we have already registered it
get_target_property(registered "${name}" _CMRC_REGISTERED_DIRS)
if(dirpath IN_LIST registered)
return()
endif()
# Register the parent directory first
get_filename_component(parent "${dirpath}" DIRECTORY)
if(NOT parent STREQUAL "")
_cmrc_register_dirs("${name}" "${parent}")
endif()
# Now generate the registration
set_property(TARGET "${name}" APPEND PROPERTY _CMRC_REGISTERED_DIRS "${dirpath}")
_cm_encode_fpath(sym "${dirpath}")
if(parent STREQUAL "")
set(parent_sym root_directory)
else()
_cm_encode_fpath(parent_sym "${parent}")
endif()
get_filename_component(leaf "${dirpath}" NAME)
set_property(
TARGET "${name}"
APPEND PROPERTY CMRC_MAKE_DIRS
"static auto ${sym}_dir = ${parent_sym}_dir.directory.add_subdir(\"${leaf}\")\;"
"root_index.emplace(\"${dirpath}\", &${sym}_dir.index_entry)\;"
)
endfunction()
function(cmrc_add_resources name)
get_target_property(is_reslib ${name} CMRC_IS_RESOURCE_LIBRARY)
if(NOT TARGET ${name} OR NOT is_reslib)
message(SEND_ERROR "cmrc_add_resources called on target '${name}' which is not an existing resource library")
return()
endif()
set(options)
set(args WHENCE PREFIX)
set(list_args)
cmake_parse_arguments(ARG "${options}" "${args}" "${list_args}" "${ARGN}")
if(NOT ARG_WHENCE)
set(ARG_WHENCE ${CMAKE_CURRENT_SOURCE_DIR})
endif()
_cmrc_normalize_path(ARG_WHENCE)
get_filename_component(ARG_WHENCE "${ARG_WHENCE}" ABSOLUTE)
# Generate the identifier for the resource library's namespace
get_target_property(lib_ns "${name}" CMRC_NAMESPACE)
get_target_property(libdir ${name} CMRC_LIBDIR)
get_target_property(target_dir ${name} SOURCE_DIR)
file(RELATIVE_PATH reldir "${target_dir}" "${CMAKE_CURRENT_SOURCE_DIR}")
if(reldir MATCHES "^\\.\\.")
message(SEND_ERROR "Cannot call cmrc_add_resources in a parent directory from the resource library target")
return()
endif()
foreach(input IN LISTS ARG_UNPARSED_ARGUMENTS)
_cmrc_normalize_path(input)
get_filename_component(abs_in "${input}" ABSOLUTE)
# Generate a filename based on the input filename that we can put in
# the intermediate directory.
file(RELATIVE_PATH relpath "${ARG_WHENCE}" "${abs_in}")
if(relpath MATCHES "^\\.\\.")
# For now we just error on files that exist outside of the soure dir.
message(SEND_ERROR "Cannot add file '${input}': File must be in a subdirectory of ${ARG_WHENCE}")
continue()
endif()
if(DEFINED ARG_PREFIX)
_cmrc_normalize_path(ARG_PREFIX)
endif()
if(ARG_PREFIX AND NOT ARG_PREFIX MATCHES "/$")
set(ARG_PREFIX "${ARG_PREFIX}/")
endif()
get_filename_component(dirpath "${ARG_PREFIX}${relpath}" DIRECTORY)
_cmrc_register_dirs("${name}" "${dirpath}")
get_filename_component(abs_out "${libdir}/intermediate/${ARG_PREFIX}${relpath}.cpp" ABSOLUTE)
# Generate a symbol name relpath the file's character array
_cm_encode_fpath(sym "${relpath}")
# Get the symbol name for the parent directory
if(dirpath STREQUAL "")
set(parent_sym root_directory)
else()
_cm_encode_fpath(parent_sym "${dirpath}")
endif()
# Generate the rule for the intermediate source file
_cmrc_generate_intermediate_cpp(${lib_ns} ${sym} "${abs_out}" "${abs_in}")
target_sources(${name} PRIVATE "${abs_out}")
set_property(TARGET ${name} APPEND PROPERTY CMRC_EXTERN_DECLS
"// Pointers to ${input}"
"extern const char* const ${sym}_begin\;"
"extern const char* const ${sym}_end\;"
)
get_filename_component(leaf "${relpath}" NAME)
set_property(
TARGET ${name}
APPEND PROPERTY CMRC_MAKE_FILES
"root_index.emplace("
" \"${ARG_PREFIX}${relpath}\","
" ${parent_sym}_dir.directory.add_file("
" \"${leaf}\","
" res_chars::${sym}_begin,"
" res_chars::${sym}_end"
" )"
")\;"
)
endforeach()
endfunction()
function(_cmrc_generate_intermediate_cpp lib_ns symbol outfile infile)
add_custom_command(
# This is the file we will generate
OUTPUT "${outfile}"
# These are the primary files that affect the output
DEPENDS "${infile}" "${_CMRC_SCRIPT}"
COMMAND
"${CMAKE_COMMAND}"
-D_CMRC_GENERATE_MODE=TRUE
-DNAMESPACE=${lib_ns}
-DSYMBOL=${symbol}
"-DINPUT_FILE=${infile}"
"-DOUTPUT_FILE=${outfile}"
-P "${_CMRC_SCRIPT}"
COMMENT "Generating intermediate file for ${infile}"
)
endfunction()
function(_cm_encode_fpath var fpath)
string(MAKE_C_IDENTIFIER "${fpath}" ident)
string(MD5 hash "${fpath}")
string(SUBSTRING "${hash}" 0 4 hash)
set(${var} f_${hash}_${ident} PARENT_SCOPE)
endfunction()

View File

@ -36,7 +36,7 @@ sudo dnf install clang git cmake libatomic alsa-lib-devel \
```bash
sudo pacman -S base-devel clang git cmake sndio jack2 openal \
qt6-base qt6-declarative qt6-multimedia sdl2 \
qt6-base qt6-declarative qt6-multimedia qt6-tools sdl2 \
vulkan-validation-layers libpng
```

View File

@ -18,8 +18,6 @@ endif()
# Boost
if (NOT TARGET Boost::headers)
set(BOOST_ROOT "${CMAKE_SOURCE_DIR}/externals/ext-boost" CACHE STRING "")
set(Boost_NO_SYSTEM_PATHS ON CACHE BOOL "")
add_subdirectory(ext-boost)
endif()
@ -77,6 +75,7 @@ endif()
# SDL3
if (NOT TARGET SDL3::SDL3)
set(SDL_TEST_LIBRARY OFF)
set(SDL_PIPEWIRE OFF)
add_subdirectory(sdl3)
endif()
@ -131,6 +130,14 @@ endif()
# Toml11
if (NOT TARGET toml11::toml11)
add_subdirectory(toml11)
if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
if (CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC")
get_target_property(_toml11_compile_options toml11 INTERFACE_COMPILE_OPTIONS)
list(REMOVE_ITEM _toml11_compile_options "/Zc:preprocessor")
set_target_properties(toml11 PROPERTIES INTERFACE_COMPILE_OPTIONS ${_toml11_compile_options})
endif()
endif()
endif()
# xxHash

2
externals/LibAtrac9 vendored

@ -1 +1 @@
Subproject commit 9640129dc6f2afbca6ceeca3019856e8653a5fb2
Subproject commit ec8899dadf393f655f2871a94e0fe4b3d6220c9a

@ -1 +1 @@
Subproject commit 0c090001cb42997031cfe43914340e2639944972
Subproject commit 2048427e50f9eb20f2b8f98d316ecaee398c9b91

@ -1 +1 @@
Subproject commit 1a7b7ef6de02cf6767e42b10ddad217c45e90d47
Subproject commit 2c32b6bf86f3c4a5539aa1f0bacbd59fe61759cf

View File

@ -3,6 +3,10 @@
project(gcn LANGUAGES CXX)
add_library(gcn dummy.cpp)
add_library(gcn INTERFACE)
target_sources(gcn PRIVATE
"include/gcn/si_ci_vi_merged_offset.h"
"include/gcn/si_ci_vi_merged_pm4_it_opcodes.h"
)
target_include_directories(gcn INTERFACE include)

View File

@ -1,2 +0,0 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later

View File

@ -31,10 +31,7 @@ std::filesystem::path find_fs_path_or(const basic_value<TC>& v, const K& ky,
namespace Config {
static bool isHDRAllowed = false;
static bool isNeo = false;
static bool isFullscreen = false;
static std::string fullscreenMode = "borderless";
static bool playBGM = false;
static bool isTrophyPopupDisabled = false;
static int BGMvolume = 50;
@ -69,6 +66,7 @@ static bool vkHostMarkers = false;
static bool vkGuestMarkers = false;
static bool rdocEnable = false;
static bool isFpsColor = true;
static bool isSeparateLogFilesEnabled = false;
static s16 cursorState = HideCursorState::Idle;
static int cursorHideTimeout = 5; // 5 seconds (default)
static bool useUnifiedInputConfig = true;
@ -102,6 +100,9 @@ std::vector<std::string> m_recent_files;
std::string emulator_language = "en_US";
static int backgroundImageOpacity = 50;
static bool showBackgroundImage = true;
static bool isFullscreen = false;
static std::string fullscreenMode = "Windowed";
static bool isHDRAllowed = false;
// Language
u32 m_language = 1; // english
@ -451,6 +452,10 @@ void setLogFilter(const std::string& type) {
logFilter = type;
}
void setSeparateLogFilesEnabled(bool enabled) {
isSeparateLogFilesEnabled = enabled;
}
void setUserName(const std::string& type) {
userName = type;
}
@ -656,6 +661,10 @@ u32 GetLanguage() {
return m_language;
}
bool getSeparateLogFilesEnabled() {
return isSeparateLogFilesEnabled;
}
int getBackgroundImageOpacity() {
return backgroundImageOpacity;
}
@ -694,10 +703,7 @@ void load(const std::filesystem::path& path) {
if (data.contains("General")) {
const toml::value& general = data.at("General");
isHDRAllowed = toml::find_or<bool>(general, "allowHDR", false);
isNeo = toml::find_or<bool>(general, "isPS4Pro", false);
isFullscreen = toml::find_or<bool>(general, "Fullscreen", false);
fullscreenMode = toml::find_or<std::string>(general, "FullscreenMode", "borderless");
playBGM = toml::find_or<bool>(general, "playBGM", false);
isTrophyPopupDisabled = toml::find_or<bool>(general, "isTrophyPopupDisabled", false);
BGMvolume = toml::find_or<int>(general, "BGMvolume", 50);
@ -742,6 +748,9 @@ void load(const std::filesystem::path& path) {
shouldDumpShaders = toml::find_or<bool>(gpu, "dumpShaders", false);
shouldPatchShaders = toml::find_or<bool>(gpu, "patchShaders", true);
vblankDivider = toml::find_or<int>(gpu, "vblankDivider", 1);
isFullscreen = toml::find_or<bool>(gpu, "Fullscreen", false);
fullscreenMode = toml::find_or<std::string>(gpu, "FullscreenMode", "Windowed");
isHDRAllowed = toml::find_or<bool>(gpu, "allowHDR", false);
}
if (data.contains("Vulkan")) {
@ -761,6 +770,7 @@ void load(const std::filesystem::path& path) {
const toml::value& debug = data.at("Debug");
isDebugDump = toml::find_or<bool>(debug, "DebugDump", false);
isSeparateLogFilesEnabled = toml::find_or<bool>(debug, "isSeparateLogFilesEnabled", false);
isShaderDebug = toml::find_or<bool>(debug, "CollectShader", false);
isFpsColor = toml::find_or<bool>(debug, "FPSColor", true);
}
@ -824,7 +834,7 @@ void load(const std::filesystem::path& path) {
}
void save(const std::filesystem::path& path) {
toml::value data;
toml::ordered_value data;
std::error_code error;
if (std::filesystem::exists(path, error)) {
@ -832,7 +842,8 @@ void save(const std::filesystem::path& path) {
std::ifstream ifs;
ifs.exceptions(std::ifstream::failbit | std::ifstream::badbit);
ifs.open(path, std::ios_base::binary);
data = toml::parse(ifs, std::string{fmt::UTF(path.filename().u8string()).data});
data = toml::parse<toml::ordered_type_config>(
ifs, std::string{fmt::UTF(path.filename().u8string()).data});
} catch (const std::exception& ex) {
fmt::print("Exception trying to parse config file. Exception: {}\n", ex.what());
return;
@ -844,10 +855,7 @@ void save(const std::filesystem::path& path) {
fmt::print("Saving new configuration file {}\n", fmt::UTF(path.u8string()));
}
data["General"]["allowHDR"] = isHDRAllowed;
data["General"]["isPS4Pro"] = isNeo;
data["General"]["Fullscreen"] = isFullscreen;
data["General"]["FullscreenMode"] = fullscreenMode;
data["General"]["isTrophyPopupDisabled"] = isTrophyPopupDisabled;
data["General"]["playBGM"] = playBGM;
data["General"]["BGMvolume"] = BGMvolume;
@ -877,6 +885,9 @@ void save(const std::filesystem::path& path) {
data["GPU"]["dumpShaders"] = shouldDumpShaders;
data["GPU"]["patchShaders"] = shouldPatchShaders;
data["GPU"]["vblankDivider"] = vblankDivider;
data["GPU"]["Fullscreen"] = isFullscreen;
data["GPU"]["FullscreenMode"] = fullscreenMode;
data["GPU"]["allowHDR"] = isHDRAllowed;
data["Vulkan"]["gpuId"] = gpuId;
data["Vulkan"]["validation"] = vkValidation;
data["Vulkan"]["validation_sync"] = vkValidationSync;
@ -887,6 +898,7 @@ void save(const std::filesystem::path& path) {
data["Vulkan"]["rdocEnable"] = rdocEnable;
data["Debug"]["DebugDump"] = isDebugDump;
data["Debug"]["CollectShader"] = isShaderDebug;
data["Debug"]["isSeparateLogFilesEnabled"] = isSeparateLogFilesEnabled;
data["Debug"]["FPSColor"] = isFpsColor;
data["Keys"]["TrophyKey"] = trophyKey;
@ -913,7 +925,7 @@ void save(const std::filesystem::path& path) {
}
void saveMainWindow(const std::filesystem::path& path) {
toml::value data;
toml::ordered_value data;
std::error_code error;
if (std::filesystem::exists(path, error)) {
@ -921,7 +933,8 @@ void saveMainWindow(const std::filesystem::path& path) {
std::ifstream ifs;
ifs.exceptions(std::ifstream::failbit | std::ifstream::badbit);
ifs.open(path, std::ios_base::binary);
data = toml::parse(ifs, std::string{fmt::UTF(path.filename().u8string()).data});
data = toml::parse<toml::ordered_type_config>(
ifs, std::string{fmt::UTF(path.filename().u8string()).data});
} catch (const std::exception& ex) {
fmt::print("Exception trying to parse config file. Exception: {}\n", ex.what());
return;

View File

@ -111,7 +111,8 @@ void setIsMotionControlsEnabled(bool use);
void setLogType(const std::string& type);
void setLogFilter(const std::string& type);
void setSeparateLogFilesEnabled(bool enabled);
bool getSeparateLogFilesEnabled();
void setVkValidation(bool enable);
void setVkSyncValidation(bool enable);
void setRdocEnabled(bool enable);

View File

@ -139,8 +139,9 @@ public:
std::filesystem::create_directory(log_dir);
Filter filter;
filter.ParseFilterString(Config::getLogFilter());
instance = std::unique_ptr<Impl, decltype(&Deleter)>(new Impl(log_dir / LOG_FILE, filter),
Deleter);
const auto& log_file_path = log_file.empty() ? LOG_FILE : log_file;
instance = std::unique_ptr<Impl, decltype(&Deleter)>(
new Impl(log_dir / log_file_path, filter), Deleter);
initialization_in_progress_suppress_logging = false;
}

View File

@ -148,7 +148,6 @@ void OnGameLoaded() {
std::string targetStr = "";
std::string sizeStr = "";
if (type == "mask_jump32") {
std::string patchValue = patchLineIt->attribute("Value").value();
targetStr = patchLineIt->attribute("Target").value();
sizeStr = patchLineIt->attribute("Size").value();
} else {
@ -301,8 +300,7 @@ void OnGameLoaded() {
QString targetStr;
QString sizeStr;
if (type == "mask_jump32") {
QString valueAttributeStr = lineObject["Value"].toString();
targetStr = lineObject["Value"].toString();
targetStr = lineObject["Target"].toString();
sizeStr = lineObject["Size"].toString();
} else {
patchValue = QString::fromStdString(convertValueToHex(

View File

@ -225,9 +225,9 @@ static void SaveContext(Xbyak::CodeGenerator& c, bool save_flags = false) {
for (int reg = Xbyak::Operand::RAX; reg <= Xbyak::Operand::R15; reg++) {
c.push(Xbyak::Reg64(reg));
}
for (int reg = 0; reg <= 7; reg++) {
c.lea(rsp, ptr[rsp - 32]);
c.vmovdqu(ptr[rsp], Xbyak::Ymm(reg));
c.lea(rsp, ptr[rsp - 32 * 16]);
for (int reg = 0; reg <= 15; reg++) {
c.vmovdqu(ptr[rsp + 32 * reg], Xbyak::Ymm(reg));
}
if (save_flags) {
c.pushfq();
@ -241,12 +241,12 @@ static void RestoreContext(Xbyak::CodeGenerator& c, const Xbyak::Operand& dst,
if (restore_flags) {
c.popfq();
}
for (int reg = 7; reg >= 0; reg--) {
for (int reg = 15; reg >= 0; reg--) {
if ((!dst.isXMM() && !dst.isYMM()) || dst.getIdx() != reg) {
c.vmovdqu(Xbyak::Ymm(reg), ptr[rsp]);
c.vmovdqu(Xbyak::Ymm(reg), ptr[rsp + 32 * reg]);
}
c.lea(rsp, ptr[rsp + 32]);
}
c.lea(rsp, ptr[rsp + 32 * 16]);
for (int reg = Xbyak::Operand::R15; reg >= Xbyak::Operand::RAX; reg--) {
if (!dst.isREG() || dst.getIdx() != reg) {
c.pop(Xbyak::Reg64(reg));
@ -264,6 +264,26 @@ static void GenerateANDN(const ZydisDecodedOperand* operands, Xbyak::CodeGenerat
const auto src1 = ZydisToXbyakRegisterOperand(operands[1]);
const auto src2 = ZydisToXbyakOperand(operands[2]);
// Check if src2 is a memory operand or a register different to dst.
// In those cases, we don't need to use a temporary register and are free to modify dst.
// In cases where dst and src2 are the same register, a temporary needs to be used to avoid
// modifying src2.
bool src2_uses_dst = false;
if (src2->isMEM()) {
const auto base = src2->getAddress().getRegExp().getBase().getIdx();
const auto index = src2->getAddress().getRegExp().getIndex().getIdx();
src2_uses_dst = base == dst.getIdx() || index == dst.getIdx();
} else {
ASSERT(src2->isREG());
src2_uses_dst = src2->getReg() == dst;
}
if (!src2_uses_dst) {
if (dst != src1)
c.mov(dst, src1);
c.not_(dst);
c.and_(dst, *src2);
} else {
const auto scratch = AllocateScratchRegister({&dst, &src1, src2.get()}, dst.getBit());
SaveRegisters(c, {scratch});
@ -274,6 +294,7 @@ static void GenerateANDN(const ZydisDecodedOperand* operands, Xbyak::CodeGenerat
c.mov(dst, scratch);
RestoreRegisters(c, {scratch});
}
}
static void GenerateBEXTR(const ZydisDecodedOperand* operands, Xbyak::CodeGenerator& c) {

View File

@ -66,6 +66,7 @@ void AjmInstance::ExecuteJob(AjmJob& job) {
LOG_TRACE(Lib_Ajm, "Initializing instance {}", job.instance_id);
auto& params = job.input.init_params.value();
m_codec->Initialize(&params, sizeof(params));
is_initialized = true;
}
if (job.input.resample_parameters.has_value()) {
LOG_ERROR(Lib_Ajm, "Unimplemented: resample parameters");
@ -89,6 +90,10 @@ void AjmInstance::ExecuteJob(AjmJob& job) {
}
}
if (!is_initialized) {
return;
}
if (!job.input.buffer.empty() && !job.output.buffers.empty()) {
std::span<u8> in_buf(job.input.buffer);
SparseOutputBuffer out_buf(job.output.buffers);

View File

@ -96,6 +96,7 @@ private:
AjmSidebandResampleParameters m_resample_parameters{};
u32 m_total_samples{};
std::unique_ptr<AjmCodec> m_codec;
bool is_initialized = false;
};
} // namespace Libraries::Ajm

View File

@ -323,7 +323,7 @@ int PS4_SYSV_ABI sceAppContentTemporaryDataMount2(OrbisAppContentTemporaryDataOp
return ORBIS_APP_CONTENT_ERROR_PARAMETER;
}
static constexpr std::string_view TmpMount = "/temp0";
TmpMount.copy(mountPoint->data, sizeof(mountPoint->data));
TmpMount.copy(mountPoint->data, TmpMount.size());
LOG_INFO(Lib_AppContent, "sceAppContentTemporaryDataMount2: option = {}, mountPoint = {}",
option, mountPoint->data);
return ORBIS_OK;

File diff suppressed because it is too large Load Diff

View File

@ -4,469 +4,21 @@
#include <cstdarg>
#include <cstdio>
#include <common/va_ctx.h>
#include "common/assert.h"
#include "common/logging/log.h"
#include "core/libraries/error_codes.h"
#include "core/libraries/libs.h"
#include "libc_internal_io.h"
#include "printf.h"
namespace Libraries::LibcInternal {
s32 PS4_SYSV_ABI internal___vfprintf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
int PS4_SYSV_ABI internal_snprintf(char* s, size_t n, VA_ARGS) {
VA_CTX(ctx);
return snprintf_ctx(s, n, &ctx);
}
s32 PS4_SYSV_ABI internal__Printf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal__WPrintf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_asprintf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_fprintf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_fprintf_s() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_fwprintf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_fwprintf_s() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_printf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_printf_s() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_snprintf(char* s, size_t n, const char* format, ...) {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_snprintf_s() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_snwprintf_s() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_sprintf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_sprintf_s() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_swprintf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_swprintf_s() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_swscanf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_swscanf_s() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_vasprintf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_vfprintf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_vfprintf_s() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_vfscanf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_vfscanf_s() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_vfwprintf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_vfwprintf_s() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_vfwscanf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_vfwscanf_s() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_vprintf(const char* format, va_list args) {
// Copy the va_list because vsnprintf consumes it
va_list args_copy;
va_copy(args_copy, args);
// Calculate the required buffer size
int size = std::vsnprintf(nullptr, 0, format, args_copy);
va_end(args_copy);
if (size < 0) {
// Handle vsnprintf error
LOG_ERROR(Lib_LibcInternal, "vsnprintf failed to calculate size");
return size;
}
// Create a string with the required size
std::string buffer(size, '\0');
// Format the string into the buffer
int result =
std::vsnprintf(buffer.data(), buffer.size() + 1, format, args); // +1 for null terminator
if (result >= 0) {
// Log the formatted result
LOG_INFO(Lib_LibcInternal, "{}", buffer);
} else {
LOG_ERROR(Lib_LibcInternal, "vsnprintf failed during formatting");
}
return result;
}
s32 PS4_SYSV_ABI internal_vprintf_s() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_vscanf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_vscanf_s() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_vsnprintf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_vsnprintf_s() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_vsnwprintf_s() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_vsprintf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_vsprintf_s() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_vsscanf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_vsscanf_s() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_vswprintf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_vswprintf_s() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_vswscanf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_vswscanf_s() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_vwprintf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_vwprintf_s() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_vwscanf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_vwscanf_s() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_wprintf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_wprintf_s() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_wscanf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_wscanf_s() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal__Scanf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal__WScanf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_fscanf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_fscanf_s() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_fwscanf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_fwscanf_s() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_scanf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_scanf_s() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_sscanf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_sscanf_s() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
void RegisterlibSceLibcInternalIo(Core::Loader::SymbolsResolver* sym) {
LIB_FUNCTION("yAZ5vOpmBus", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal___vfprintf);
LIB_FUNCTION("FModQzwn1-4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal__Printf);
LIB_FUNCTION("kvEP5-KOG1U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal__WPrintf);
LIB_FUNCTION("cOYia2dE0Ik", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_asprintf);
LIB_FUNCTION("fffwELXNVFA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_fprintf);
LIB_FUNCTION("-e-F9HjUFp8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_fprintf_s);
LIB_FUNCTION("ZRAcn3dPVmA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_fwprintf);
LIB_FUNCTION("9kOFELic7Pk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_fwprintf_s);
LIB_FUNCTION("a6CYO8YOzfw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_fwscanf);
LIB_FUNCTION("Bo5wtXSj4kc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_fwscanf_s);
LIB_FUNCTION("hcuQgD53UxM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_printf);
LIB_FUNCTION("w1NxRBQqfmQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_printf_s);
LIB_FUNCTION("eLdDw6l0-bU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_snprintf);
LIB_FUNCTION("3BytPOQgVKc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_snprintf_s);
LIB_FUNCTION("jbj2wBoiCyg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_snwprintf_s);
LIB_FUNCTION("tcVi5SivF7Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_sprintf);
LIB_FUNCTION("xEszJVGpybs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_sprintf_s);
LIB_FUNCTION("1Pk0qZQGeWo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_sscanf);
LIB_FUNCTION("24m4Z4bUaoY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_sscanf_s);
LIB_FUNCTION("nJz16JE1txM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_swprintf);
LIB_FUNCTION("Im55VJ-Bekc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_swprintf_s);
LIB_FUNCTION("HNnWdT43ues", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_swscanf);
LIB_FUNCTION("tQNolUV1q5A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_swscanf_s);
LIB_FUNCTION("qjBlw2cVMAM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_vasprintf);
LIB_FUNCTION("pDBDcY6uLSA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_vfprintf);
LIB_FUNCTION("GhTZtaodo7o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_vfprintf_s);
LIB_FUNCTION("lckWSkHDBrY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_vfscanf);
LIB_FUNCTION("JjPXy-HX5dY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_vfscanf_s);
LIB_FUNCTION("M2bGWSqt764", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_vfwprintf);
LIB_FUNCTION("XX9KWzJvRf0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_vfwprintf_s);
LIB_FUNCTION("WF4fBmip+38", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_vfwscanf);
LIB_FUNCTION("Wvm90I-TGl0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_vfwscanf_s);
LIB_FUNCTION("GMpvxPFW924", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_vprintf);
LIB_FUNCTION("YfJUGNPkbK4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_vprintf_s);
LIB_FUNCTION("j7Jk3yd3yC8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_vscanf);
LIB_FUNCTION("fQYpcUzy3zo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_vscanf_s);
LIB_FUNCTION("Q2V+iqvjgC0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_vsnprintf);
LIB_FUNCTION("rWSuTWY2JN0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_vsnprintf_s);
LIB_FUNCTION("8SKVXgeK1wY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_vsnwprintf_s);
LIB_FUNCTION("jbz9I9vkqkk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_vsprintf);
LIB_FUNCTION("+qitMEbkSWk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_vsprintf_s);
LIB_FUNCTION("UTrpOVLcoOA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_vsscanf);
LIB_FUNCTION("tfNbpqL3D0M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_vsscanf_s);
LIB_FUNCTION("u0XOsuOmOzc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_vswprintf);
LIB_FUNCTION("oDoV9tyHTbA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_vswprintf_s);
LIB_FUNCTION("KGotca3AjYw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_vswscanf);
LIB_FUNCTION("39HHkIWrWNo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_vswscanf_s);
LIB_FUNCTION("QuF2rZGE-v8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_vwprintf);
LIB_FUNCTION("XPrliF5n-ww", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_vwprintf_s);
LIB_FUNCTION("QNwdOK7HfJU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_vwscanf);
LIB_FUNCTION("YgZ6qvFH3QI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_vwscanf_s);
LIB_FUNCTION("OGVdXU3E-xg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_wprintf);
LIB_FUNCTION("FEtOJURNey0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_wprintf_s);
LIB_FUNCTION("D8JBAR3RiZQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_wscanf);
LIB_FUNCTION("RV7X3FrWfTI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_wscanf_s);
LIB_FUNCTION("s+MeMHbB1Ro", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal__Scanf);
LIB_FUNCTION("fzgkSILqRHE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal__WScanf);
LIB_FUNCTION("npLpPTaSuHg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_fscanf);
LIB_FUNCTION("vj2WUi2LrfE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_fscanf_s);
LIB_FUNCTION("7XEv6NnznWw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_scanf);
LIB_FUNCTION("-B76wP6IeVA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_scanf_s);
}
} // namespace Libraries::LibcInternal

View File

@ -5,769 +5,152 @@
#include "common/logging/log.h"
#include "core/libraries/error_codes.h"
#include "core/libraries/libs.h"
#include "libc_internal_mspace.h"
namespace Libraries::LibcInternal {
s32 PS4_SYSV_ABI internal_abs() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
double PS4_SYSV_ABI internal_sin(double x) {
return std::sin(x);
}
double PS4_SYSV_ABI internal_acos(double x) {
LOG_DEBUG(Lib_LibcInternal, "called");
return std::acos(x);
}
float PS4_SYSV_ABI internal_acosf(float x) {
LOG_DEBUG(Lib_LibcInternal, "called");
return std::acosf(x);
}
float PS4_SYSV_ABI internal_acosh(float x) {
LOG_DEBUG(Lib_LibcInternal, "called");
return std::acosh(x);
}
float PS4_SYSV_ABI internal_acoshf(float x) {
LOG_DEBUG(Lib_LibcInternal, "called");
return std::acoshf(x);
}
float PS4_SYSV_ABI internal_acoshl(float x) {
LOG_DEBUG(Lib_LibcInternal, "called");
return std::acoshl(x);
}
float PS4_SYSV_ABI internal_acosl(float x) {
LOG_DEBUG(Lib_LibcInternal, "called");
return std::acosl(x);
}
double PS4_SYSV_ABI internal_asin(double x) {
LOG_DEBUG(Lib_LibcInternal, "called");
return std::asin(x);
}
float PS4_SYSV_ABI internal_asinf(float x) {
LOG_DEBUG(Lib_LibcInternal, "called");
return std::asinf(x);
}
float PS4_SYSV_ABI internal_asinh(float x) {
LOG_DEBUG(Lib_LibcInternal, "called");
return std::asinh(x);
}
float PS4_SYSV_ABI internal_asinhf(float x) {
LOG_DEBUG(Lib_LibcInternal, "called");
return std::asinhf(x);
}
float PS4_SYSV_ABI internal_asinhl(float x) {
LOG_DEBUG(Lib_LibcInternal, "called");
return std::asinhl(x);
}
float PS4_SYSV_ABI internal_asinl(float x) {
LOG_DEBUG(Lib_LibcInternal, "called");
return std::asinl(x);
}
double PS4_SYSV_ABI internal_atan(double x) {
LOG_DEBUG(Lib_LibcInternal, "called");
return std::atan(x);
}
double PS4_SYSV_ABI internal_atan2(double y, double x) {
LOG_DEBUG(Lib_LibcInternal, "called");
return std::atan2(y, x);
}
s32 PS4_SYSV_ABI internal_atan2f() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_atan2l() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_atanf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_atanh() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_atanhf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_atanhl() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_atanl() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_ceil() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_ceilf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_ceill() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
float PS4_SYSV_ABI internal_sinf(float x) {
return std::sinf(x);
}
double PS4_SYSV_ABI internal_cos(double x) {
LOG_DEBUG(Lib_LibcInternal, "called");
return std::cos(x);
}
float PS4_SYSV_ABI internal_cosf(float x) {
LOG_DEBUG(Lib_LibcInternal, "called");
return std::cosf(x);
}
s32 PS4_SYSV_ABI internal_cosh() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_coshf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_coshl() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_cosl() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
double PS4_SYSV_ABI internal_exp(double x) {
LOG_DEBUG(Lib_LibcInternal, "called");
return std::exp(x);
}
double PS4_SYSV_ABI internal_exp2(double x) {
LOG_DEBUG(Lib_LibcInternal, "called");
return std::exp2(x);
}
float PS4_SYSV_ABI internal_exp2f(float x) {
LOG_DEBUG(Lib_LibcInternal, "called");
return std::exp2f(x);
}
float PS4_SYSV_ABI internal_exp2l(float x) {
LOG_DEBUG(Lib_LibcInternal, "called");
return std::exp2l(x);
}
float PS4_SYSV_ABI internal_expf(float x) {
LOG_DEBUG(Lib_LibcInternal, "called");
return std::expf(x);
}
s32 PS4_SYSV_ABI internal_expl() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_expm1() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_expm1f() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_expm1l() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_fabs() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_fabsf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_fabsl() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_floor() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_floorf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_floorl() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_fmax() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_fmaxf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_fmaxl() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_fmin() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_fminf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_fminl() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_fmod() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_fmodf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_fmodl() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_frexp() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_frexpf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_frexpl() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_ilogb() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_ilogbf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_ilogbl() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_imaxabs() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_imaxdiv() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_isinf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_islower() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_isnan() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_isnanf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_isupper() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_log() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_log10() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
float PS4_SYSV_ABI internal_log10f(float x) {
LOG_DEBUG(Lib_LibcInternal, "called");
return std::log10f(x);
}
s32 PS4_SYSV_ABI internal_log10l() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_log1p() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_log1pf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_log1pl() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_log2() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_log2f() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_log2l() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_logb() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_logbf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_logbl() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_logf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_logl() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_lround() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_lroundf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_lroundl() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_nan() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_nanf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_nanl() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
double PS4_SYSV_ABI internal_pow(double x, double y) {
LOG_DEBUG(Lib_LibcInternal, "called");
return std::pow(x, y);
}
float PS4_SYSV_ABI internal_powf(float x, float y) {
LOG_DEBUG(Lib_LibcInternal, "called");
return std::powf(x, y);
}
s32 PS4_SYSV_ABI internal_powl() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_remainder() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
double PS4_SYSV_ABI internal_sin(double x) {
LOG_DEBUG(Lib_LibcInternal, "called");
return std::sin(x);
}
void PS4_SYSV_ABI internal_sincos(double x, double* sinp, double* cosp) {
LOG_DEBUG(Lib_LibcInternal, "called");
*sinp = std::sin(x);
*cosp = std::cos(x);
}
void PS4_SYSV_ABI internal_sincosf(double x, double* sinp, double* cosp) {
LOG_DEBUG(Lib_LibcInternal, "called");
void PS4_SYSV_ABI internal_sincosf(float x, float* sinp, float* cosp) {
*sinp = std::sinf(x);
*cosp = std::cosf(x);
}
float PS4_SYSV_ABI internal_sinf(float x) {
LOG_DEBUG(Lib_LibcInternal, "called");
return std::sinf(x);
double PS4_SYSV_ABI internal_tan(double x) {
return std::tan(x);
}
float PS4_SYSV_ABI internal_sinh(float x) {
LOG_DEBUG(Lib_LibcInternal, "called");
return std::sinh(x);
float PS4_SYSV_ABI internal_tanf(float x) {
return std::tanf(x);
}
float PS4_SYSV_ABI internal_sinhf(float x) {
LOG_DEBUG(Lib_LibcInternal, "called");
return std::sinhf(x);
double PS4_SYSV_ABI internal_asin(double x) {
return std::asin(x);
}
float PS4_SYSV_ABI internal_sinhl(float x) {
LOG_DEBUG(Lib_LibcInternal, "called");
return std::sinhl(x);
float PS4_SYSV_ABI internal_asinf(float x) {
return std::asinf(x);
}
float PS4_SYSV_ABI internal_sinl(float x) {
LOG_DEBUG(Lib_LibcInternal, "called");
return std::sinl(x);
double PS4_SYSV_ABI internal_acos(double x) {
return std::acos(x);
}
s32 PS4_SYSV_ABI internal_sqrt() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
float PS4_SYSV_ABI internal_acosf(float x) {
return std::acosf(x);
}
s32 PS4_SYSV_ABI internal_sqrtf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
double PS4_SYSV_ABI internal_atan(double x) {
return std::atan(x);
}
s32 PS4_SYSV_ABI internal_sqrtl() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
float PS4_SYSV_ABI internal_atanf(float x) {
return std::atanf(x);
}
s32 PS4_SYSV_ABI internal_srand() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
double PS4_SYSV_ABI internal_atan2(double y, double x) {
return std::atan2(y, x);
}
s32 PS4_SYSV_ABI internal_tan() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
float PS4_SYSV_ABI internal_atan2f(float y, float x) {
return std::atan2f(y, x);
}
s32 PS4_SYSV_ABI internal_tanf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
double PS4_SYSV_ABI internal_exp(double x) {
return std::exp(x);
}
s32 PS4_SYSV_ABI internal_tanh() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
float PS4_SYSV_ABI internal_expf(float x) {
return std::expf(x);
}
s32 PS4_SYSV_ABI internal_tanhf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
double PS4_SYSV_ABI internal_exp2(double x) {
return std::exp2(x);
}
s32 PS4_SYSV_ABI internal_tanhl() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
float PS4_SYSV_ABI internal_exp2f(float x) {
return std::exp2f(x);
}
s32 PS4_SYSV_ABI internal_tanl() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
double PS4_SYSV_ABI internal_pow(double x, double y) {
return std::pow(x, y);
}
float PS4_SYSV_ABI internal__FSin(float arg, unsigned int m, int n) {
ASSERT(n == 0);
if (m != 0) {
return cosf(arg);
} else {
return sinf(arg);
}
float PS4_SYSV_ABI internal_powf(float x, float y) {
return std::powf(x, y);
}
double PS4_SYSV_ABI internal__Sin(double x) {
return sin(x);
double PS4_SYSV_ABI internal_log(double x) {
return std::log(x);
}
float PS4_SYSV_ABI internal_logf(float x) {
return std::logf(x);
}
double PS4_SYSV_ABI internal_log10(double x) {
return std::log10(x);
}
float PS4_SYSV_ABI internal_log10f(float x) {
return std::log10f(x);
}
void RegisterlibSceLibcInternalMath(Core::Loader::SymbolsResolver* sym) {
LIB_FUNCTION("Ye20uNnlglA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_abs);
LIB_FUNCTION("JBcgYuW8lPU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_acos);
LIB_FUNCTION("QI-x0SL8jhw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_acosf);
LIB_FUNCTION("Fk7-KFKZi-8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_acosh);
LIB_FUNCTION("XJp2C-b0tRU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_acoshf);
LIB_FUNCTION("u14Y1HFh0uY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_acoshl);
LIB_FUNCTION("iH4YAIRcecA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_acosl);
LIB_FUNCTION("7Ly52zaL44Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_asin);
LIB_FUNCTION("GZWjF-YIFFk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_asinf);
LIB_FUNCTION("2eQpqTjJ5Y4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_asinh);
LIB_FUNCTION("yPPtp1RMihw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_asinhf);
LIB_FUNCTION("iCl-Z-g-uuA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_asinhl);
LIB_FUNCTION("Nx-F5v0-qU8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_asinl);
LIB_FUNCTION("OXmauLdQ8kY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_atan);
LIB_FUNCTION("HUbZmOnT-Dg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_atan2);
LIB_FUNCTION("EH-x713A99c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_atan2f);
LIB_FUNCTION("9VeY8wiqf8M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_atan2l);
LIB_FUNCTION("weDug8QD-lE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_atanf);
LIB_FUNCTION("YjbpxXpi6Zk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_atanh);
LIB_FUNCTION("cPGyc5FGjy0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_atanhf);
LIB_FUNCTION("a3BNqojL4LM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_atanhl);
LIB_FUNCTION("KvOHPTz595Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_atanl);
LIB_FUNCTION("gacfOmO8hNs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_ceil);
LIB_FUNCTION("GAUuLKGhsCw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_ceilf);
LIB_FUNCTION("aJKn6X+40Z8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_ceill);
LIB_FUNCTION("H8ya2H00jbI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_sin);
LIB_FUNCTION("Q4rRL34CEeE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_sinf);
LIB_FUNCTION("2WE3BTYVwKM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_cos);
LIB_FUNCTION("-P6FNMzk2Kc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_cosf);
LIB_FUNCTION("m7iLTaO9RMs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_cosh);
LIB_FUNCTION("RCQAffkEh9A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_coshf);
LIB_FUNCTION("XK2R46yx0jc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_coshl);
LIB_FUNCTION("x8dc5Y8zFgc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_cosl);
LIB_FUNCTION("NVadfnzQhHQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_exp);
LIB_FUNCTION("dnaeGXbjP6E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_exp2);
LIB_FUNCTION("wuAQt-j+p4o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_exp2f);
LIB_FUNCTION("9O1Xdko-wSo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_exp2l);
LIB_FUNCTION("8zsu04XNsZ4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_expf);
LIB_FUNCTION("qMp2fTDCyMo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_expl);
LIB_FUNCTION("gqKfOiJaCOo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_expm1);
LIB_FUNCTION("3EgxfDRefdw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_expm1f);
LIB_FUNCTION("jVS263HH1b0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_expm1l);
LIB_FUNCTION("388LcMWHRCA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_fabs);
LIB_FUNCTION("fmT2cjPoWBs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_fabsf);
LIB_FUNCTION("w-AryX51ObA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_fabsl);
LIB_FUNCTION("mpcTgMzhUY8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_floor);
LIB_FUNCTION("mKhVDmYciWA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_floorf);
LIB_FUNCTION("06QaR1Cpn-k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_floorl);
LIB_FUNCTION("fiOgmWkP+Xc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_fmax);
LIB_FUNCTION("Lyx2DzUL7Lc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_fmaxf);
LIB_FUNCTION("0H5TVprQSkA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_fmaxl);
LIB_FUNCTION("iU0z6SdUNbI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_fmin);
LIB_FUNCTION("uVRcM2yFdP4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_fminf);
LIB_FUNCTION("DQ7K6s8euWY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_fminl);
LIB_FUNCTION("pKwslsMUmSk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_fmod);
LIB_FUNCTION("88Vv-AzHVj8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_fmodf);
LIB_FUNCTION("A1R5T0xOyn8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_fmodl);
LIB_FUNCTION("kA-TdiOCsaY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_frexp);
LIB_FUNCTION("aaDMGGkXFxo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_frexpf);
LIB_FUNCTION("YZk9sHO0yNg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_frexpl);
LIB_FUNCTION("h6pVBKjcLiU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_ilogb);
LIB_FUNCTION("0dQrYWd7g94", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_ilogbf);
LIB_FUNCTION("wXs12eD3uvA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_ilogbl);
LIB_FUNCTION("UgZ7Rhk60cQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_imaxabs);
LIB_FUNCTION("V0X-mrfdM9E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_imaxdiv);
LIB_FUNCTION("2q5PPh7HsKE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_isinf);
LIB_FUNCTION("KqYTqtSfGos", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_islower);
LIB_FUNCTION("20qj+7O69XY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_isnan);
LIB_FUNCTION("3pF7bUSIH8o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_isnanf);
LIB_FUNCTION("GcFKlTJEMkI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_isupper);
LIB_FUNCTION("rtV7-jWC6Yg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_log);
LIB_FUNCTION("WuMbPBKN1TU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_log10);
LIB_FUNCTION("lhpd6Wk6ccs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_log10f);
LIB_FUNCTION("CT4aR0tBgkQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_log10l);
LIB_FUNCTION("VfsML+n9cDM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_log1p);
LIB_FUNCTION("MFe91s8apQk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_log1pf);
LIB_FUNCTION("77qd0ksTwdI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_log1pl);
LIB_FUNCTION("Y5DhuDKGlnQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_log2);
LIB_FUNCTION("hsi9drzHR2k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_log2f);
LIB_FUNCTION("CfOrGjBj-RY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_log2l);
LIB_FUNCTION("owKuegZU4ew", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_logb);
LIB_FUNCTION("RWqyr1OKuw4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_logbf);
LIB_FUNCTION("txJTOe0Db6M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_logbl);
LIB_FUNCTION("RQXLbdT2lc4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_logf);
LIB_FUNCTION("EiHf-aLDImI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_logl);
LIB_FUNCTION("J3XuGS-cC0Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_lround);
LIB_FUNCTION("C6gWCWJKM+U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_lroundf);
LIB_FUNCTION("4ITASgL50uc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_lroundl);
LIB_FUNCTION("zck+6bVj5pA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_nan);
LIB_FUNCTION("DZU+K1wozGI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_nanf);
LIB_FUNCTION("ZUvemFIkkhQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_nanl);
LIB_FUNCTION("9LCjpWyQ5Zc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_pow);
LIB_FUNCTION("1D0H2KNjshE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_powf);
LIB_FUNCTION("95V3PF0kUEA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_powl);
LIB_FUNCTION("pv2etu4pocs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_remainder);
LIB_FUNCTION("H8ya2H00jbI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_sin);
LIB_FUNCTION("jMB7EFyu30Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_sincos);
LIB_FUNCTION("pztV4AF18iI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_sincosf);
LIB_FUNCTION("Q4rRL34CEeE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_sinf);
LIB_FUNCTION("ZjtRqSMJwdw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_sinh);
LIB_FUNCTION("1t1-JoZ0sZQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_sinhf);
LIB_FUNCTION("lYdqBvDgeHU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_sinhl);
LIB_FUNCTION("vxgqrJxDPHo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_sinl);
LIB_FUNCTION("MXRNWnosNlM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_sqrt);
LIB_FUNCTION("Q+xU11-h0xQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_sqrtf);
LIB_FUNCTION("RIkUZRadZgc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_sqrtl);
LIB_FUNCTION("VPbJwTCgME0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_srand);
LIB_FUNCTION("T7uyNqP7vQA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_tan);
LIB_FUNCTION("ZE6RNL+eLbk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_tanf);
LIB_FUNCTION("JM4EBvWT9rc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_tanh);
LIB_FUNCTION("SAd0Z3wKwLA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_tanhf);
LIB_FUNCTION("JCmHsYVc2eo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_tanhl);
LIB_FUNCTION("QL+3q43NfEA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_tanl);
LIB_FUNCTION("ZtjspkJQ+vw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal__FSin);
LIB_FUNCTION("cCXjU72Z0Ow", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal__Sin);
LIB_FUNCTION("7Ly52zaL44Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_asin);
LIB_FUNCTION("GZWjF-YIFFk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_asinf);
LIB_FUNCTION("JBcgYuW8lPU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_acos);
LIB_FUNCTION("QI-x0SL8jhw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_acosf);
LIB_FUNCTION("OXmauLdQ8kY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_atan);
LIB_FUNCTION("weDug8QD-lE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_atanf);
LIB_FUNCTION("HUbZmOnT-Dg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_atan2);
LIB_FUNCTION("EH-x713A99c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_atan2f);
LIB_FUNCTION("NVadfnzQhHQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_exp);
LIB_FUNCTION("8zsu04XNsZ4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_expf);
LIB_FUNCTION("dnaeGXbjP6E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_exp2);
LIB_FUNCTION("wuAQt-j+p4o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_exp2f);
LIB_FUNCTION("9LCjpWyQ5Zc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_pow);
LIB_FUNCTION("1D0H2KNjshE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_powf);
LIB_FUNCTION("rtV7-jWC6Yg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_log);
LIB_FUNCTION("RQXLbdT2lc4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_logf);
LIB_FUNCTION("WuMbPBKN1TU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_log10);
LIB_FUNCTION("lhpd6Wk6ccs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_log10f);
}
} // namespace Libraries::LibcInternal

View File

@ -9,123 +9,15 @@
namespace Libraries::LibcInternal {
s32 PS4_SYSV_ABI internal__malloc_finalize_lv2() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal__malloc_fini() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal__malloc_init() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal__malloc_init_lv2() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal__malloc_postfork() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal__malloc_prefork() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal__malloc_thread_cleanup() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal__sceLibcGetMallocParam() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_operator_new(size_t size) {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_malloc(size_t size) {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_malloc_check_memory_bounds() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_malloc_finalize() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_malloc_get_footer_value() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_malloc_get_malloc_state() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_malloc_initialize() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_malloc_report_memory_blocks() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_malloc_stats() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_malloc_stats_fast() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_malloc_usable_size() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_memalign() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_memchr() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_memcmp(const void* s1, const void* s2, size_t n) {
LOG_DEBUG(Lib_LibcInternal, "called");
return std::memcmp(s1, s2, n);
void* PS4_SYSV_ABI internal_memset(void* s, int c, size_t n) {
return std::memset(s, c, n);
}
void* PS4_SYSV_ABI internal_memcpy(void* dest, const void* src, size_t n) {
LOG_DEBUG(Lib_LibcInternal, "called");
return std::memcpy(dest, src, n);
}
s32 PS4_SYSV_ABI internal_memcpy_s(void* dest, size_t destsz, const void* src, size_t count) {
LOG_DEBUG(Lib_LibcInternal, "called");
#ifdef _WIN64
return memcpy_s(dest, destsz, src, count);
#else
@ -134,181 +26,20 @@ s32 PS4_SYSV_ABI internal_memcpy_s(void* dest, size_t destsz, const void* src, s
#endif
}
s32 PS4_SYSV_ABI internal_memmove(void* d, void* s, size_t n) {
LOG_DEBUG(Lib_LibcInternal, "called");
std::memmove(d, s, n);
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_memmove_s() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_memrchr() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
void* PS4_SYSV_ABI internal_memset(void* s, int c, size_t n) {
LOG_DEBUG(Lib_LibcInternal, "called");
return std::memset(s, c, n);
}
s32 PS4_SYSV_ABI internal_memset_s() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_posix_memalign() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_realloc() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_reallocalign() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_reallocf() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_wmemchr() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_wmemcmp() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_wmemcpy() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_wmemcpy_s() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_wmemmove() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_wmemmove_s() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_wmemset() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
void PS4_SYSV_ABI internal_operator_delete(void* ptr) {
if (ptr) {
std::free(ptr);
}
}
void PS4_SYSV_ABI internal_free(void* ptr) {
std::free(ptr);
s32 PS4_SYSV_ABI internal_memcmp(const void* s1, const void* s2, size_t n) {
return std::memcmp(s1, s2, n);
}
void RegisterlibSceLibcInternalMemory(Core::Loader::SymbolsResolver* sym) {
LIB_FUNCTION("RnqlvEmvkdw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal__malloc_finalize_lv2);
LIB_FUNCTION("21KFhEQDJ3s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal__malloc_fini);
LIB_FUNCTION("z8GPiQwaAEY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal__malloc_init);
LIB_FUNCTION("20cUk0qX9zo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal__malloc_init_lv2);
LIB_FUNCTION("V94pLruduLg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal__malloc_postfork);
LIB_FUNCTION("aLYyS4Kx6rQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal__malloc_prefork);
LIB_FUNCTION("Sopthb9ztZI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal__malloc_thread_cleanup);
LIB_FUNCTION("1nZ4Xfnyp38", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal__sceLibcGetMallocParam);
LIB_FUNCTION("fJnpuVVBbKk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_operator_new);
LIB_FUNCTION("cVSk9y8URbc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_posix_memalign);
LIB_FUNCTION("Ujf3KzMvRmI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_memalign);
LIB_FUNCTION("8u8lPzUEq+U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_memchr);
LIB_FUNCTION("DfivPArhucg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_memcmp);
LIB_FUNCTION("Q3VBxCXhUHs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_memcpy);
LIB_FUNCTION("NFLs+dRJGNg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_memcpy_s);
LIB_FUNCTION("+P6FRGH4LfA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_memmove);
LIB_FUNCTION("B59+zQQCcbU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_memmove_s);
LIB_FUNCTION("5G2ONUzRgjY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_memrchr);
LIB_FUNCTION("Q3VBxCXhUHs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_memcpy);
LIB_FUNCTION("8zTFvBIAIN8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_memset);
LIB_FUNCTION("h8GwqPFbu6I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_memset_s);
LIB_FUNCTION("Y7aJ1uydPMo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_realloc);
LIB_FUNCTION("OGybVuPAhAY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_reallocalign);
LIB_FUNCTION("YMZO9ChZb0E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_reallocf);
LIB_FUNCTION("fnUEjBCNRVU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_wmemchr);
LIB_FUNCTION("QJ5xVfKkni0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_wmemcmp);
LIB_FUNCTION("fL3O02ypZFE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_wmemcpy);
LIB_FUNCTION("BTsuaJ6FxKM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_wmemcpy_s);
LIB_FUNCTION("Noj9PsJrsa8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_wmemmove);
LIB_FUNCTION("F8b+Wb-YQVs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_wmemmove_s);
LIB_FUNCTION("Al8MZJh-4hM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_wmemset);
LIB_FUNCTION("gQX+4GDQjpM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_malloc);
LIB_FUNCTION("ECOPpUQEch0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_malloc_check_memory_bounds);
LIB_FUNCTION("J6FoFNydpFI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_malloc_finalize);
LIB_FUNCTION("SlG1FN-y0N0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_malloc_get_footer_value);
LIB_FUNCTION("Nmezc1Lh7TQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_malloc_get_malloc_state);
LIB_FUNCTION("owT6zLJxrTs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_malloc_initialize);
LIB_FUNCTION("0F08WOP8G3s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_malloc_report_memory_blocks);
LIB_FUNCTION("CC-BLMBu9-I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_malloc_stats);
LIB_FUNCTION("KuOuD58hqn4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_malloc_stats_fast);
LIB_FUNCTION("NDcSfcYZRC8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_malloc_usable_size);
LIB_FUNCTION("MLWl90SFWNE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_operator_delete);
LIB_FUNCTION("tIhsqj0qsFE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_free);
LIB_FUNCTION("DfivPArhucg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_memcmp);
}
} // namespace Libraries::LibcInternal

View File

@ -1,247 +0,0 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#include "common/assert.h"
#include "common/logging/log.h"
#include "core/libraries/error_codes.h"
#include "core/libraries/libs.h"
#include "libc_internal_mspace.h"
namespace Libraries::LibcInternal {
s32 PS4_SYSV_ABI sceLibcMspaceAlignedAlloc() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI sceLibcMspaceCalloc() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
void* PS4_SYSV_ABI sceLibcMspaceCreate(char* name, u64 param_2, u64 param_3, u32 param_4,
s8* param_5) {
UNREACHABLE_MSG("Missing sceLibcMspace impementation!");
return 0;
}
s32 PS4_SYSV_ABI sceLibcMspaceDestroy() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI sceLibcMspaceFree() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI sceLibcMspaceGetAddressRanges() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI sceLibcMspaceIsHeapEmpty() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI sceLibcMspaceMalloc() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI sceLibcMspaceMallocStats() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI sceLibcMspaceMallocStatsFast() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI sceLibcMspaceMallocUsableSize() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI sceLibcMspaceMemalign() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI sceLibcMspacePosixMemalign() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI sceLibcMspaceRealloc() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI sceLibcMspaceReallocalign() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI sceLibcMspaceSetMallocCallback() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI sceLibcPafMspaceCalloc() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI sceLibcPafMspaceCheckMemoryBounds() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI sceLibcPafMspaceCreate() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI sceLibcPafMspaceDestroy() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI sceLibcPafMspaceFree() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI sceLibcPafMspaceGetFooterValue() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI sceLibcPafMspaceIsHeapEmpty() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI sceLibcPafMspaceMalloc() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI sceLibcPafMspaceMallocStats() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI sceLibcPafMspaceMallocStatsFast() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI sceLibcPafMspaceMallocUsableSize() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI sceLibcPafMspaceMemalign() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI sceLibcPafMspacePosixMemalign() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI sceLibcPafMspaceRealloc() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI sceLibcPafMspaceReallocalign() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI sceLibcPafMspaceReportMemoryBlocks() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI sceLibcPafMspaceTrim() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
void RegisterlibSceLibcInternalMspace(Core::Loader::SymbolsResolver* sym) {
LIB_FUNCTION("ljkqMcC4-mk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
sceLibcMspaceAlignedAlloc);
LIB_FUNCTION("LYo3GhIlB38", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
sceLibcMspaceCalloc);
LIB_FUNCTION("-hn1tcVHq5Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
sceLibcMspaceCreate);
LIB_FUNCTION("W6SiVSiCDtI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
sceLibcMspaceDestroy);
LIB_FUNCTION("Vla-Z+eXlxo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
sceLibcMspaceFree);
LIB_FUNCTION("raRgiuQfvWk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
sceLibcMspaceGetAddressRanges);
LIB_FUNCTION("pzUa7KEoydw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
sceLibcMspaceIsHeapEmpty);
LIB_FUNCTION("OJjm-QOIHlI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
sceLibcMspaceMalloc);
LIB_FUNCTION("mfHdJTIvhuo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
sceLibcMspaceMallocStats);
LIB_FUNCTION("k04jLXu3+Ic", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
sceLibcMspaceMallocStatsFast);
LIB_FUNCTION("fEoW6BJsPt4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
sceLibcMspaceMallocUsableSize);
LIB_FUNCTION("iF1iQHzxBJU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
sceLibcMspaceMemalign);
LIB_FUNCTION("qWESlyXMI3E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
sceLibcMspacePosixMemalign);
LIB_FUNCTION("gigoVHZvVPE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
sceLibcMspaceRealloc);
LIB_FUNCTION("p6lrRW8-MLY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
sceLibcMspaceReallocalign);
LIB_FUNCTION("+CbwGRMnlfU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
sceLibcMspaceSetMallocCallback);
LIB_FUNCTION("-lZdT34nAAE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
sceLibcPafMspaceCalloc);
LIB_FUNCTION("Pcq7UoYAcFE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
sceLibcPafMspaceCheckMemoryBounds);
LIB_FUNCTION("6hdfGRKHefs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
sceLibcPafMspaceCreate);
LIB_FUNCTION("qB5nGjWa-bk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
sceLibcPafMspaceDestroy);
LIB_FUNCTION("9mMuuhXMwqQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
sceLibcPafMspaceFree);
LIB_FUNCTION("kv4kgdjswN0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
sceLibcPafMspaceGetFooterValue);
LIB_FUNCTION("htdTOnMxDbQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
sceLibcPafMspaceIsHeapEmpty);
LIB_FUNCTION("QuZzFJD5Hrw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
sceLibcPafMspaceMalloc);
LIB_FUNCTION("mO8NB8whKy8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
sceLibcPafMspaceMallocStats);
LIB_FUNCTION("OmG3YPCBLJs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
sceLibcPafMspaceMallocStatsFast);
LIB_FUNCTION("6JcY5RDA4jY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
sceLibcPafMspaceMallocUsableSize);
LIB_FUNCTION("PKJcFUfhKtw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
sceLibcPafMspaceMemalign);
LIB_FUNCTION("7hOUKGcT6jM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
sceLibcPafMspacePosixMemalign);
LIB_FUNCTION("u32UXVridxQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
sceLibcPafMspaceRealloc);
LIB_FUNCTION("4SvlEtd0j40", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
sceLibcPafMspaceReallocalign);
LIB_FUNCTION("0FnzR6qum90", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
sceLibcPafMspaceReportMemoryBlocks);
LIB_FUNCTION("AUYdq63RG3U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
sceLibcPafMspaceTrim);
}
} // namespace Libraries::LibcInternal

View File

@ -1,14 +0,0 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include "common/types.h"
namespace Core::Loader {
class SymbolsResolver;
}
namespace Libraries::LibcInternal {
void RegisterlibSceLibcInternalMspace(Core::Loader::SymbolsResolver* sym);
} // namespace Libraries::LibcInternal

View File

@ -9,244 +9,41 @@
namespace Libraries::LibcInternal {
s32 PS4_SYSV_ABI internal__CStrftime() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal__CStrxfrm() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal__Getstr() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal__Stod() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal__Stodx() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal__Stof() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal__Stoflt() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal__Stofx() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal__Stold() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal__Stoldx() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal__Stoll() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal__Stollx() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal__Stolx() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal__Stopfx() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal__Stoul() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal__Stoull() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal__Stoullx() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal__Stoulx() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal__Stoxflt() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal__Strcollx() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal__Strerror() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal__Strxfrmx() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_strcasecmp(const char* str1, const char* str2) {
LOG_DEBUG(Lib_LibcInternal, "called");
#ifdef _WIN32
return _stricmp(str1, str2);
s32 PS4_SYSV_ABI internal_strcpy_s(char* dest, size_t dest_size, const char* src) {
#ifdef _WIN64
return strcpy_s(dest, dest_size, src);
#else
return strcasecmp(str1, str2);
std::strcpy(dest, src);
return 0; // ALL OK
#endif
}
char* PS4_SYSV_ABI internal_strcat(char* dest, const char* src) {
LOG_DEBUG(Lib_LibcInternal, "called");
return std::strcat(dest, src);
}
s32 PS4_SYSV_ABI internal_strcat_s() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
const char* PS4_SYSV_ABI internal_strchr(const char* str, int c) {
LOG_DEBUG(Lib_LibcInternal, "called");
return std::strchr(str, c);
s32 PS4_SYSV_ABI internal_strcat_s(char* dest, size_t dest_size, const char* src) {
#ifdef _WIN64
return strcat_s(dest, dest_size, src);
#else
std::strcat(dest, src);
return 0; // ALL OK
#endif
}
s32 PS4_SYSV_ABI internal_strcmp(const char* str1, const char* str2) {
LOG_DEBUG(Lib_LibcInternal, "called");
return std::strcmp(str1, str2);
}
s32 PS4_SYSV_ABI internal_strcoll() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
char* PS4_SYSV_ABI internal_strcpy(char* dest, const char* src) {
LOG_DEBUG(Lib_LibcInternal, "called");
return std::strcpy(dest, src);
}
char* PS4_SYSV_ABI internal_strcpy_s(char* dest, u64 len, const char* src) {
LOG_DEBUG(Lib_LibcInternal, "called");
return std::strncpy(dest, src, len);
}
s32 PS4_SYSV_ABI internal_strcspn(const char* str1, const char* str2) {
LOG_DEBUG(Lib_LibcInternal, "called");
return std::strcspn(str1, str2);
}
char* PS4_SYSV_ABI internal_strdup(const char* str1) {
LOG_DEBUG(Lib_LibcInternal, "called");
char* dup = (char*)std::malloc(std::strlen(str1) + 1);
if (dup != NULL)
strcpy(dup, str1);
return dup;
}
s32 PS4_SYSV_ABI internal_strerror() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_strerror_r() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_strerror_s() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_strerrorlen_s() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_strftime() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_strlcat() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_strlcpy() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
size_t PS4_SYSV_ABI internal_strlen(const char* str) {
LOG_DEBUG(Lib_LibcInternal, "called");
return std::strlen(str);
}
s32 PS4_SYSV_ABI internal_strncasecmp(const char* str1, const char* str2, size_t num) {
LOG_DEBUG(Lib_LibcInternal, "called");
#ifdef _WIN32
return _strnicmp(str1, str2, num);
#else
return strncasecmp(str1, str2, num);
#endif
}
s32 PS4_SYSV_ABI internal_strncat() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_strncat_s() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_strncmp(const char* str1, const char* str2, size_t num) {
LOG_DEBUG(Lib_LibcInternal, "called");
return std::strncmp(str1, str2, num);
}
size_t PS4_SYSV_ABI internal_strlen(const char* str) {
return std::strlen(str);
}
char* PS4_SYSV_ABI internal_strncpy(char* dest, const char* src, std::size_t count) {
LOG_DEBUG(Lib_LibcInternal, "called");
return std::strncpy(dest, src, count);
}
s32 PS4_SYSV_ABI internal_strncpy_s(char* dest, size_t destsz, const char* src, size_t count) {
LOG_DEBUG(Lib_LibcInternal, "called");
#ifdef _WIN64
return strncpy_s(dest, destsz, src, count);
#else
@ -255,278 +52,33 @@ s32 PS4_SYSV_ABI internal_strncpy_s(char* dest, size_t destsz, const char* src,
#endif
}
s32 PS4_SYSV_ABI internal_strndup() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
char* PS4_SYSV_ABI internal_strcat(char* dest, const char* src) {
return std::strcat(dest, src);
}
s32 PS4_SYSV_ABI internal_strnlen(const char* str, size_t maxlen) {
LOG_DEBUG(Lib_LibcInternal, "called");
return std::min(std::strlen(str), maxlen);
}
s32 PS4_SYSV_ABI internal_strnlen_s() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_strnstr() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
const char* PS4_SYSV_ABI internal_strpbrk(const char* str1, const char* str2) {
LOG_DEBUG(Lib_LibcInternal, "called");
return std::strpbrk(str1, str2);
}
const char* PS4_SYSV_ABI internal_strrchr(const char* str, int c) {
LOG_DEBUG(Lib_LibcInternal, "called");
return std::strrchr(str, c);
}
char* PS4_SYSV_ABI internal_strsep(char** strp, const char* delim) {
LOG_DEBUG(Lib_LibcInternal, "called");
#ifdef _GNU_SOURCE
return strsep(strp, delim);
#else
if (!*strp)
return nullptr;
char* token = *strp;
*strp = std::strpbrk(token, delim);
if (*strp)
*(*strp)++ = '\0';
return token;
#endif
}
s32 PS4_SYSV_ABI internal_strspn(const char* str1, const char* str2) {
LOG_DEBUG(Lib_LibcInternal, "called");
return std::strspn(str1, str2);
}
char* PS4_SYSV_ABI internal_strstr(char* h, char* n) {
LOG_DEBUG(Lib_LibcInternal, "called");
return std::strstr(h, n);
}
double PS4_SYSV_ABI internal_strtod(const char* str, char** endptr) {
LOG_DEBUG(Lib_LibcInternal, "called");
return std::strtod(str, endptr);
}
float PS4_SYSV_ABI internal_strtof(const char* str, char** endptr) {
LOG_DEBUG(Lib_LibcInternal, "called");
return std::strtof(str, endptr);
}
s32 PS4_SYSV_ABI internal_strtoimax() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_strtok() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_strtok_r() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_strtok_s() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_strtol() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_strtold() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_strtoll() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_strtoul() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_strtoull() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_strtoumax() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_strtouq() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_strxfrm() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
}
s32 PS4_SYSV_ABI internal_wcsstr() {
LOG_ERROR(Lib_LibcInternal, "(STUBBED) called");
return ORBIS_OK;
const char* PS4_SYSV_ABI internal_strchr(const char* str, int c) {
return std::strchr(str, c);
}
void RegisterlibSceLibcInternalStr(Core::Loader::SymbolsResolver* sym) {
LIB_FUNCTION("ykNF6P3ZsdA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal__CStrftime);
LIB_FUNCTION("we-vQBAugV8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal__CStrxfrm);
LIB_FUNCTION("i2yN6xBwooo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal__Getstr);
LIB_FUNCTION("c41UEHVtiEA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal__Stod);
LIB_FUNCTION("QlcJbyd6jxM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal__Stodx);
LIB_FUNCTION("CpWcnrEZbLA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal__Stof);
LIB_FUNCTION("wO1-omboFjo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal__Stoflt);
LIB_FUNCTION("7dlAxeH-htg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal__Stofx);
LIB_FUNCTION("iNbtyJKM0iQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal__Stold);
LIB_FUNCTION("BKidCxmLC5w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal__Stoldx);
LIB_FUNCTION("7pNKcscKrf8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal__Stoll);
LIB_FUNCTION("mOnfZ5aNDQE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal__Stollx);
LIB_FUNCTION("Ecwid6wJMhY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal__Stolx);
LIB_FUNCTION("yhbF6MbVuYc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal__Stopfx);
LIB_FUNCTION("zlfEH8FmyUA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal__Stoul);
LIB_FUNCTION("q+9E0X3aWpU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal__Stoull);
LIB_FUNCTION("pSpDCDyxkaY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal__Stoullx);
LIB_FUNCTION("YDnLaav6W6Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal__Stoulx);
LIB_FUNCTION("Ouz5Q8+SUq4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal__Stoxflt);
LIB_FUNCTION("v6rXYSx-WGA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal__Strcollx);
LIB_FUNCTION("4F11tHMpJa0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal__Strerror);
LIB_FUNCTION("CpiD2ZXrhNo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal__Strxfrmx);
LIB_FUNCTION("AV6ipCNa4Rw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strcasecmp);
LIB_FUNCTION("Ls4tzzhimqQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strcat);
LIB_FUNCTION("K+gcnFFJKVc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strcat_s);
LIB_FUNCTION("ob5xAW4ln-0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strchr);
LIB_FUNCTION("Ovb2dSJOAuE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strcmp);
LIB_FUNCTION("gjbmYpP-XJQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strcoll);
LIB_FUNCTION("kiZSXIWd9vg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strcpy);
LIB_FUNCTION("5Xa2ACNECdo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strcpy_s);
LIB_FUNCTION("q0F6yS-rCms", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strcspn);
LIB_FUNCTION("g7zzzLDYGw0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strdup);
LIB_FUNCTION("RIa6GnWp+iU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strerror);
LIB_FUNCTION("RBcs3uut1TA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strerror_r);
LIB_FUNCTION("o+ok6Y+DtgY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strerror_s);
LIB_FUNCTION("-g26XITGVgE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strerrorlen_s);
LIB_FUNCTION("Av3zjWi64Kw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strftime);
LIB_FUNCTION("ByfjUZsWiyg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strlcat);
LIB_FUNCTION("SfQIZcqvvms", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strlcpy);
LIB_FUNCTION("K+gcnFFJKVc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strcat_s);
LIB_FUNCTION("aesyjrHVWy4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strcmp);
LIB_FUNCTION("Ovb2dSJOAuE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strncmp);
LIB_FUNCTION("j4ViWNHEgww", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strlen);
LIB_FUNCTION("pXvbDfchu6k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strncasecmp);
LIB_FUNCTION("kHg45qPC6f0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strncat);
LIB_FUNCTION("NC4MSB+BRQg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strncat_s);
LIB_FUNCTION("aesyjrHVWy4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strncmp);
LIB_FUNCTION("6sJWiWSRuqk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strncpy);
LIB_FUNCTION("YNzNkJzYqEg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strncpy_s);
LIB_FUNCTION("XGnuIBmEmyk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strndup);
LIB_FUNCTION("5jNubw4vlAA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strnlen);
LIB_FUNCTION("DQbtGaBKlaw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strnlen_s);
LIB_FUNCTION("Xnrfb2-WhVw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strnstr);
LIB_FUNCTION("kDZvoVssCgQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strpbrk);
LIB_FUNCTION("9yDWMxEFdJU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strrchr);
LIB_FUNCTION("cJWGxiQPmDQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strsep);
LIB_FUNCTION("-kU6bB4M-+k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strspn);
LIB_FUNCTION("viiwFMaNamA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strstr);
LIB_FUNCTION("2vDqwBlpF-o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strtod);
LIB_FUNCTION("xENtRue8dpI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strtof);
LIB_FUNCTION("q5MWYCDfu3c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strtoimax);
LIB_FUNCTION("oVkZ8W8-Q8A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strtok);
LIB_FUNCTION("enqPGLfmVNU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strtok_r);
LIB_FUNCTION("-vXEQdRADLI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strtok_s);
LIB_FUNCTION("mXlxhmLNMPg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strtol);
LIB_FUNCTION("nW9JRkciRk4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strtold);
LIB_FUNCTION("VOBg+iNwB-4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strtoll);
LIB_FUNCTION("QxmSHBCuKTk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strtoul);
LIB_FUNCTION("5OqszGpy7Mg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strtoull);
LIB_FUNCTION("QNyUWGXmXNc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strtoumax);
LIB_FUNCTION("g-McpZfseZo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strtouq);
LIB_FUNCTION("zogPrkd46DY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strxfrm);
LIB_FUNCTION("WDpobjImAb4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_wcsstr);
LIB_FUNCTION("Ls4tzzhimqQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strcat);
LIB_FUNCTION("ob5xAW4ln-0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1,
internal_strchr);
}
} // namespace Libraries::LibcInternal

File diff suppressed because it is too large Load Diff

View File

@ -1,14 +0,0 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include "common/types.h"
namespace Core::Loader {
class SymbolsResolver;
}
namespace Libraries::LibcInternal {
void RegisterlibSceLibcInternalStream(Core::Loader::SymbolsResolver* sym);
} // namespace Libraries::LibcInternal

View File

@ -0,0 +1,763 @@
// SPDX-FileCopyrightText: Copyright 2014-2018 Marco Paland (info@paland.com)
// SPDX-License-Identifier: MIT
///////////////////////////////////////////////////////////////////////////////
// \author (c) Marco Paland (info@paland.com)
// 2014-2018, PALANDesign Hannover, Germany
//
// \license The MIT License (MIT)
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
//
// \brief Tiny printf, sprintf and snprintf implementation, optimized for speed on
// embedded systems with a very limited resources.
// Use this instead of bloated standard/newlib printf.
// These routines are thread safe and reentrant!
//
///////////////////////////////////////////////////////////////////////////////
// Vita3K emulator project
// Copyright (C) 2023 Vita3K team
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along
// with this program; if not, write to the Free Software Foundation, Inc.,
// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
// copied from Vita3k project at 6/10/2023 (latest update 30/06/2023)
// modifications for adapting va_args parameters
#pragma once
#include <stdio.h>
#include <cstdarg>
#include <cstdbool>
#include <cstddef>
#include <cstdint>
#include <cstring>
#include <string>
#include "common/va_ctx.h"
namespace Libraries::LibcInternal {
// ntoa conversion buffer size, this must be big enough to hold
// one converted numeric number including padded zeros (dynamically created on stack)
// 32 byte is a good default
#define PRINTF_NTOA_BUFFER_SIZE 32U
// ftoa conversion buffer size, this must be big enough to hold
// one converted float number including padded zeros (dynamically created on stack)
// 32 byte is a good default
#define PRINTF_FTOA_BUFFER_SIZE 32U
// define this to support floating point (%f)
#define PRINTF_SUPPORT_FLOAT
// define this to support long long types (%llu or %p)
#define PRINTF_SUPPORT_LONG_LONG
// define this to support the ptrdiff_t type (%t)
// ptrdiff_t is normally defined in <stddef.h> as long or long long type
#define PRINTF_SUPPORT_PTRDIFF_T
///////////////////////////////////////////////////////////////////////////////
// internal flag definitions
#define FLAGS_ZEROPAD (1U << 0U)
#define FLAGS_LEFT (1U << 1U)
#define FLAGS_PLUS (1U << 2U)
#define FLAGS_SPACE (1U << 3U)
#define FLAGS_HASH (1U << 4U)
#define FLAGS_UPPERCASE (1U << 5U)
#define FLAGS_CHAR (1U << 6U)
#define FLAGS_SHORT (1U << 7U)
#define FLAGS_LONG (1U << 8U)
#define FLAGS_LONG_LONG (1U << 9U)
#define FLAGS_PRECISION (1U << 10U)
#define FLAGS_WIDTH (1U << 11U)
// output function type
typedef void (*out_fct_type)(char character, void* buffer, size_t idx, size_t maxlen);
// wrapper (used as buffer) for output function type
typedef struct {
void (*fct)(char character, void* arg);
void* arg;
} out_fct_wrap_type;
// internal buffer output
static inline void _out_buffer(char character, void* buffer, size_t idx, size_t maxlen) {
if (idx < maxlen) {
((char*)buffer)[idx] = character;
}
}
// internal null output
static inline void _out_null(char character, void* buffer, size_t idx, size_t maxlen) {
(void)character;
(void)buffer;
(void)idx;
(void)maxlen;
}
// internal output function wrapper
static inline void _out_fct(char character, void* buffer, size_t idx, size_t maxlen) {
(void)idx;
(void)maxlen;
// buffer is the output fct pointer
((out_fct_wrap_type*)buffer)->fct(character, ((out_fct_wrap_type*)buffer)->arg);
}
// internal strlen
// \return The length of the string (excluding the terminating 0)
static inline unsigned int _strlen(const char* str) {
const char* s;
for (s = str; *s; ++s)
;
return (unsigned int)(s - str);
}
// internal test if char is a digit (0-9)
// \return true if char is a digit
static inline bool _is_digit(char ch) {
return (ch >= '0') && (ch <= '9');
}
// internal ASCII string to unsigned int conversion
static inline unsigned int _atoi(const char** str) {
unsigned int i = 0U;
while (_is_digit(**str)) {
i = i * 10U + (unsigned int)(*((*str)++) - '0');
}
return i;
}
// internal itoa format
static inline size_t _ntoa_format(out_fct_type out, char* buffer, size_t idx, size_t maxlen,
char* buf, size_t len, bool negative, unsigned int base,
unsigned int prec, unsigned int width, unsigned int flags) {
const size_t start_idx = idx;
// pad leading zeros
while (!(flags & FLAGS_LEFT) && (len < prec) && (len < PRINTF_NTOA_BUFFER_SIZE)) {
buf[len++] = '0';
}
while (!(flags & FLAGS_LEFT) && (flags & FLAGS_ZEROPAD) && (len < width) &&
(len < PRINTF_NTOA_BUFFER_SIZE)) {
buf[len++] = '0';
}
// handle hash
if (flags & FLAGS_HASH) {
if (((len == prec) || (len == width)) && (len > 0U)) {
len--;
if ((base == 16U) && (len > 0U)) {
len--;
}
}
if ((base == 16U) && !(flags & FLAGS_UPPERCASE) && (len < PRINTF_NTOA_BUFFER_SIZE)) {
buf[len++] = 'x';
}
if ((base == 16U) && (flags & FLAGS_UPPERCASE) && (len < PRINTF_NTOA_BUFFER_SIZE)) {
buf[len++] = 'X';
}
if (len < PRINTF_NTOA_BUFFER_SIZE) {
buf[len++] = '0';
}
}
// handle sign
if ((len == width) && (negative || (flags & FLAGS_PLUS) || (flags & FLAGS_SPACE))) {
len--;
}
if (len < PRINTF_NTOA_BUFFER_SIZE) {
if (negative) {
buf[len++] = '-';
} else if (flags & FLAGS_PLUS) {
buf[len++] = '+'; // ignore the space if the '+' exists
} else if (flags & FLAGS_SPACE) {
buf[len++] = ' ';
}
}
// pad spaces up to given width
if (!(flags & FLAGS_LEFT) && !(flags & FLAGS_ZEROPAD)) {
for (size_t i = len; i < width; i++) {
out(' ', buffer, idx++, maxlen);
}
}
// reverse string
for (size_t i = 0U; i < len; i++) {
out(buf[len - i - 1U], buffer, idx++, maxlen);
}
// append pad spaces up to given width
if (flags & FLAGS_LEFT) {
while (idx - start_idx < width) {
out(' ', buffer, idx++, maxlen);
}
}
return idx;
}
// internal itoa for 'long' type
static inline size_t _ntoa_long(out_fct_type out, char* buffer, size_t idx, size_t maxlen,
unsigned long value, bool negative, unsigned long base,
unsigned int prec, unsigned int width, unsigned int flags) {
char buf[PRINTF_NTOA_BUFFER_SIZE];
size_t len = 0U;
// write if precision != 0 and value is != 0
if (!(flags & FLAGS_PRECISION) || value) {
do {
const char digit = (char)(value % base);
buf[len++] =
digit < 10 ? '0' + digit : (flags & FLAGS_UPPERCASE ? 'A' : 'a') + digit - 10;
value /= base;
} while (value && (len < PRINTF_NTOA_BUFFER_SIZE));
}
return _ntoa_format(out, buffer, idx, maxlen, buf, len, negative, (unsigned int)base, prec,
width, flags);
}
// internal itoa for 'long long' type
#if defined(PRINTF_SUPPORT_LONG_LONG)
static inline size_t _ntoa_long_long(out_fct_type out, char* buffer, size_t idx, size_t maxlen,
unsigned long long value, bool negative,
unsigned long long base, unsigned int prec, unsigned int width,
unsigned int flags) {
char buf[PRINTF_NTOA_BUFFER_SIZE];
size_t len = 0U;
// write if precision != 0 and value is != 0
if (!(flags & FLAGS_PRECISION) || value) {
do {
const char digit = (char)(value % base);
buf[len++] =
digit < 10 ? '0' + digit : (flags & FLAGS_UPPERCASE ? 'A' : 'a') + digit - 10;
value /= base;
} while (value && (len < PRINTF_NTOA_BUFFER_SIZE));
}
return _ntoa_format(out, buffer, idx, maxlen, buf, len, negative, (unsigned int)base, prec,
width, flags);
}
#endif // PRINTF_SUPPORT_LONG_LONG
#if defined(PRINTF_SUPPORT_FLOAT)
static inline size_t _ftoa(out_fct_type out, char* buffer, size_t idx, size_t maxlen, double value,
unsigned int prec, unsigned int width, unsigned int flags) {
char buf[PRINTF_FTOA_BUFFER_SIZE];
size_t len = 0U;
double diff = 0.0;
// if input is larger than thres_max, revert to exponential
const double thres_max = (double)0x7FFFFFFF;
// powers of 10
static const double pow10[] = {1, 10, 100, 1000, 10000,
100000, 1000000, 10000000, 100000000, 1000000000};
// test for negative
bool negative = false;
if (value < 0) {
negative = true;
value = 0 - value;
}
// set default precision to 6, if not set explicitly
if (!(flags & FLAGS_PRECISION)) {
prec = 6U;
}
// limit precision to 9, cause a prec >= 10 can lead to overflow errors
while ((len < PRINTF_FTOA_BUFFER_SIZE) && (prec > 9U)) {
buf[len++] = '0';
prec--;
}
int whole = (int)value;
double tmp = (value - whole) * pow10[prec];
unsigned long frac = (unsigned long)tmp;
diff = tmp - frac;
if (diff > 0.5) {
++frac;
// handle rollover, e.g. case 0.99 with prec 1 is 1.0
if (frac >= pow10[prec]) {
frac = 0;
++whole;
}
} else if ((diff == 0.5) && ((frac == 0U) || (frac & 1U))) {
// if halfway, round up if odd, OR if last digit is 0
++frac;
}
// TBD: for very large numbers switch back to native sprintf for exponentials. Anyone want to
// write code to replace this? Normal printf behavior is to print EVERY whole number digit which
// can be 100s of characters overflowing your buffers == bad
if (value > thres_max) {
return 0U;
}
if (prec == 0U) {
diff = value - (double)whole;
if (diff > 0.5) {
// greater than 0.5, round up, e.g. 1.6 -> 2
++whole;
} else if ((diff == 0.5) && (whole & 1)) {
// exactly 0.5 and ODD, then round up
// 1.5 -> 2, but 2.5 -> 2
++whole;
}
} else {
unsigned int count = prec;
// now do fractional part, as an unsigned number
while (len < PRINTF_FTOA_BUFFER_SIZE) {
--count;
buf[len++] = (char)(48U + (frac % 10U));
if (!(frac /= 10U)) {
break;
}
}
// add extra 0s
while ((len < PRINTF_FTOA_BUFFER_SIZE) && (count-- > 0U)) {
buf[len++] = '0';
}
if (len < PRINTF_FTOA_BUFFER_SIZE) {
// add decimal
buf[len++] = '.';
}
}
// do whole part, number is reversed
while (len < PRINTF_FTOA_BUFFER_SIZE) {
buf[len++] = (char)(48 + (whole % 10));
if (!(whole /= 10)) {
break;
}
}
// pad leading zeros
while (!(flags & FLAGS_LEFT) && (flags & FLAGS_ZEROPAD) && (len < width) &&
(len < PRINTF_FTOA_BUFFER_SIZE)) {
buf[len++] = '0';
}
// handle sign
if ((len == width) && (negative || (flags & FLAGS_PLUS) || (flags & FLAGS_SPACE))) {
len--;
}
if (len < PRINTF_FTOA_BUFFER_SIZE) {
if (negative) {
buf[len++] = '-';
} else if (flags & FLAGS_PLUS) {
buf[len++] = '+'; // ignore the space if the '+' exists
} else if (flags & FLAGS_SPACE) {
buf[len++] = ' ';
}
}
// pad spaces up to given width
if (!(flags & FLAGS_LEFT) && !(flags & FLAGS_ZEROPAD)) {
for (size_t i = len; i < width; i++) {
out(' ', buffer, idx++, maxlen);
}
}
// reverse string
for (size_t i = 0U; i < len; i++) {
out(buf[len - i - 1U], buffer, idx++, maxlen);
}
// append pad spaces up to given width
if (flags & FLAGS_LEFT) {
while (idx < width) {
out(' ', buffer, idx++, maxlen);
}
}
return idx;
}
#endif // PRINTF_SUPPORT_FLOAT
// internal vsnprintf
static inline int _vsnprintf(out_fct_type out, char* buffer, const char* format,
Common::VaList* va_list) {
unsigned int flags, width, precision, n;
size_t idx = 0U;
auto maxlen = static_cast<size_t>(-1);
if (!buffer) {
// use null output function
out = _out_null;
}
while (*format) {
// format specifier? %[flags][width][.precision][length]
if (*format != '%') {
// no
out(*format, buffer, idx++, maxlen);
format++;
continue;
} else {
// yes, evaluate it
format++;
}
// evaluate flags
flags = 0U;
do {
switch (*format) {
case '0':
flags |= FLAGS_ZEROPAD;
format++;
n = 1U;
break;
case '-':
flags |= FLAGS_LEFT;
format++;
n = 1U;
break;
case '+':
flags |= FLAGS_PLUS;
format++;
n = 1U;
break;
case ' ':
flags |= FLAGS_SPACE;
format++;
n = 1U;
break;
case '#':
flags |= FLAGS_HASH;
format++;
n = 1U;
break;
default:
n = 0U;
break;
}
} while (n);
// evaluate width field
width = 0U;
if (_is_digit(*format)) {
width = _atoi(&format);
} else if (*format == '*') {
const int w = vaArgInteger(va_list); // const int w = va.next<int>(cpu, mem);
if (w < 0) {
flags |= FLAGS_LEFT; // reverse padding
width = (unsigned int)-w;
} else {
width = (unsigned int)w;
}
format++;
}
// evaluate precision field
precision = 0U;
if (*format == '.') {
flags |= FLAGS_PRECISION;
format++;
if (_is_digit(*format)) {
precision = _atoi(&format);
} else if (*format == '*') {
precision =
vaArgInteger(va_list); // precision = (unsigned int)va.next<int>(cpu, mem);
format++;
}
}
// evaluate length field
switch (*format) {
case 'l':
flags |= FLAGS_LONG;
format++;
if (*format == 'l') {
flags |= FLAGS_LONG_LONG;
format++;
}
break;
case 'h':
flags |= FLAGS_SHORT;
format++;
if (*format == 'h') {
flags |= FLAGS_CHAR;
format++;
}
break;
#if defined(PRINTF_SUPPORT_PTRDIFF_T)
case 't':
flags |= (sizeof(ptrdiff_t) == sizeof(long) ? FLAGS_LONG : FLAGS_LONG_LONG);
format++;
break;
#endif
case 'j':
flags |= (sizeof(intmax_t) == sizeof(long) ? FLAGS_LONG : FLAGS_LONG_LONG);
format++;
break;
case 'z':
flags |= (sizeof(size_t) == sizeof(long) ? FLAGS_LONG : FLAGS_LONG_LONG);
format++;
break;
default:
break;
}
// evaluate specifier
switch (*format) {
case 'd':
case 'i':
case 'u':
case 'x':
case 'X':
case 'o':
case 'b': {
// set the base
unsigned int base;
if (*format == 'x' || *format == 'X') {
base = 16U;
} else if (*format == 'o') {
base = 8U;
} else if (*format == 'b') {
base = 2U;
flags &= ~FLAGS_HASH; // no hash for bin format
} else {
base = 10U;
flags &= ~FLAGS_HASH; // no hash for dec format
}
// uppercase
if (*format == 'X') {
flags |= FLAGS_UPPERCASE;
}
// no plus or space flag for u, x, X, o, b
if ((*format != 'i') && (*format != 'd')) {
flags &= ~(FLAGS_PLUS | FLAGS_SPACE);
}
// convert the integer
if ((*format == 'i') || (*format == 'd')) {
// signed
if (flags & FLAGS_LONG_LONG) {
#if defined(PRINTF_SUPPORT_LONG_LONG)
auto value = vaArgLongLong(
va_list); // const long long value = va.next<long long>(cpu, mem);
idx = _ntoa_long_long(out, buffer, idx, maxlen,
(unsigned long long)(value > 0 ? value : 0 - value),
value < 0, base, precision, width, flags);
#endif
} else if (flags & FLAGS_LONG) {
auto value = vaArgLong(va_list); // const long value = va.next<long>(cpu, mem);
idx = _ntoa_long(out, buffer, idx, maxlen,
(unsigned long)(value > 0 ? value : 0 - value), value < 0,
base, precision, width, flags);
} else {
// const int value = (flags & FLAGS_CHAR) ? (char)va.next<int>(cpu, mem) :
// (flags & FLAGS_SHORT) ? (short int)va.next<int>(cpu, mem): va.next<int>(cpu,
// mem);
const int value =
(flags & FLAGS_CHAR) ? static_cast<char>(vaArgInteger(va_list))
: (flags & FLAGS_SHORT) ? static_cast<int16_t>(vaArgInteger(va_list))
: vaArgInteger(va_list);
idx = _ntoa_long(out, buffer, idx, maxlen,
(unsigned int)(value > 0 ? value : 0 - value), value < 0, base,
precision, width, flags);
}
} else {
// unsigned
if (flags & FLAGS_LONG_LONG) {
#if defined(PRINTF_SUPPORT_LONG_LONG)
// idx = _ntoa_long_long(out, buffer, idx, maxlen, va.next<unsigned long
// long>(cpu, mem), false, base, precision, width, flags);
idx = _ntoa_long_long(out, buffer, idx, maxlen,
static_cast<u64>(vaArgLongLong(va_list)), false, base,
precision, width, flags);
#endif
} else if (flags & FLAGS_LONG) {
// idx = _ntoa_long(out, buffer, idx, maxlen, va.next<unsigned long>(cpu, mem),
// false, base, precision, width, flags);
idx = _ntoa_long(out, buffer, idx, maxlen, static_cast<u32>(vaArgLong(va_list)),
false, base, precision, width, flags);
} else {
// const unsigned int value = (flags & FLAGS_CHAR) ? (unsigned
// char)va.next<unsigned int>(cpu, mem) : (flags & FLAGS_SHORT) ?
// (unsigned short int)va.next<unsigned int>(cpu, mem) : va.next<unsigned
// int>(cpu, mem);
const unsigned int value =
(flags & FLAGS_CHAR) ? static_cast<u8>(vaArgInteger(va_list))
: (flags & FLAGS_SHORT) ? static_cast<u16>(vaArgInteger(va_list))
: static_cast<u32>(vaArgInteger(va_list));
idx = _ntoa_long(out, buffer, idx, maxlen, value, false, base, precision, width,
flags);
}
}
format++;
break;
}
#if defined(PRINTF_SUPPORT_FLOAT)
case 'f':
case 'F':
// idx = _ftoa(out, buffer, idx, maxlen, va.next<double>(cpu, mem), precision, width,
// flags);
idx = _ftoa(out, buffer, idx, maxlen, vaArgDouble(va_list), precision, width, flags);
format++;
break;
#endif // PRINTF_SUPPORT_FLOAT
case 'c': {
unsigned int l = 1U;
// pre padding
if (!(flags & FLAGS_LEFT)) {
while (l++ < width) {
out(' ', buffer, idx++, maxlen);
}
}
// char output
// out((char)va.next<int>(cpu, mem), buffer, idx++, maxlen);
out(static_cast<char>(vaArgInteger(va_list)), buffer, idx++, maxlen);
// post padding
if (flags & FLAGS_LEFT) {
while (l++ < width) {
out(' ', buffer, idx++, maxlen);
}
}
format++;
break;
}
case 's': {
const char* p = vaArgPtr<const char>(
va_list); // const char *p = va.next<Ptr<char>>(cpu, mem).get(mem);
p = p != nullptr ? p : "(null)";
unsigned int l = _strlen(p);
// pre padding
if (flags & FLAGS_PRECISION) {
l = (l < precision ? l : precision);
}
if (!(flags & FLAGS_LEFT)) {
while (l++ < width) {
out(' ', buffer, idx++, maxlen);
}
}
// string output
while ((*p != 0) && (!(flags & FLAGS_PRECISION) || precision--)) {
out(*(p++), buffer, idx++, maxlen);
}
// post padding
if (flags & FLAGS_LEFT) {
while (l++ < width) {
out(' ', buffer, idx++, maxlen);
}
}
format++;
break;
}
case 'p': {
width = sizeof(void*) * 2U;
flags |= FLAGS_ZEROPAD | FLAGS_UPPERCASE;
#if defined(PRINTF_SUPPORT_LONG_LONG)
const bool is_ll = sizeof(uintptr_t) == sizeof(long long);
if (is_ll) {
// idx = _ntoa_long_long(out, buffer, idx, maxlen,
// (uintptr_t)va.next<Ptr<void>>(cpu, mem).address(), false, 16U, precision, width,
// flags);
idx = _ntoa_long_long(out, buffer, idx, maxlen,
reinterpret_cast<uintptr_t>(vaArgPtr<void>(va_list)), false,
16U, precision, width, flags);
} else {
#endif
// idx = _ntoa_long(out, buffer, idx, maxlen, (unsigned
// long)((uintptr_t)va.next<Ptr<void>>(cpu, mem).address()), false, 16U, precision,
// width, flags);
idx = _ntoa_long(
out, buffer, idx, maxlen,
static_cast<uint32_t>(reinterpret_cast<uintptr_t>(vaArgPtr<void>(va_list))),
false, 16U, precision, width, flags);
#if defined(PRINTF_SUPPORT_LONG_LONG)
}
#endif
format++;
break;
}
case '%':
out('%', buffer, idx++, maxlen);
format++;
break;
default:
out(*format, buffer, idx++, maxlen);
format++;
break;
}
}
// termination
out((char)0, buffer, idx < maxlen ? idx : maxlen - 1U, maxlen);
// return written chars without terminating \0
return (int)idx;
}
static int printf_ctx(Common::VaCtx* ctx) {
const char* format = vaArgPtr<const char>(&ctx->va_list);
char buffer[256];
int result = _vsnprintf(_out_buffer, buffer, format, &ctx->va_list);
printf("%s", buffer);
return result;
}
static int fprintf_ctx(Common::VaCtx* ctx, char* buf) {
const char* format = vaArgPtr<const char>(&ctx->va_list);
char buffer[256];
int result = _vsnprintf(_out_buffer, buffer, format, &ctx->va_list);
std::strcpy(buf, buffer);
return result;
}
static int vsnprintf_ctx(char* s, size_t n, const char* format, Common::VaList* arg) {
char buffer[n];
int result = _vsnprintf(_out_buffer, buffer, format, arg);
std::strcpy(s, buffer);
return result;
}
static int snprintf_ctx(char* s, size_t n, Common::VaCtx* ctx) {
const char* format = vaArgPtr<const char>(&ctx->va_list);
char buffer[n];
int result = _vsnprintf(_out_buffer, buffer, format, &ctx->va_list);
std::strcpy(s, buffer);
return result;
}
} // namespace Libraries::LibcInternal

View File

@ -941,7 +941,7 @@ int PS4_SYSV_ABI sceNpTrophyUnlockTrophy(OrbisNpTrophyContext context, OrbisNpTr
std::filesystem::path current_icon_path =
trophy_dir / "trophy00" / "Icons" / trophy_icon_file;
AddTrophyToQueue(current_icon_path, current_trophy_name);
AddTrophyToQueue(current_icon_path, current_trophy_name, current_trophy_type);
}
}
}
@ -978,7 +978,7 @@ int PS4_SYSV_ABI sceNpTrophyUnlockTrophy(OrbisNpTrophyContext context, OrbisNpTr
trophy_dir / "trophy00" / "Icons" / platinum_icon_file;
*platinumId = platinum_trophy_id;
AddTrophyToQueue(platinum_icon_path, platinum_trophy_name);
AddTrophyToQueue(platinum_icon_path, platinum_trophy_name, "P");
}
}

View File

@ -3,6 +3,7 @@
#include <chrono>
#include <mutex>
#include <cmrc/cmrc.hpp>
#include <imgui.h>
#include "common/assert.h"
#include "common/config.h"
@ -10,6 +11,8 @@
#include "imgui/imgui_std.h"
#include "trophy_ui.h"
CMRC_DECLARE(res);
using namespace ImGui;
namespace Libraries::NpTrophy {
@ -17,14 +20,33 @@ std::optional<TrophyUI> current_trophy_ui;
std::queue<TrophyInfo> trophy_queue;
std::mutex queueMtx;
TrophyUI::TrophyUI(const std::filesystem::path& trophyIconPath, const std::string& trophyName)
: trophy_name(trophyName) {
TrophyUI::TrophyUI(const std::filesystem::path& trophyIconPath, const std::string& trophyName,
const std::string_view& rarity)
: trophy_name(trophyName), trophy_type(rarity) {
if (std::filesystem::exists(trophyIconPath)) {
trophy_icon = RefCountedTexture::DecodePngFile(trophyIconPath);
} else {
LOG_ERROR(Lib_NpTrophy, "Couldnt load trophy icon at {}",
fmt::UTF(trophyIconPath.u8string()));
}
std::string pathString;
if (trophy_type == "P") {
pathString = "src/images/platinum.png";
} else if (trophy_type == "G") {
pathString = "src/images/gold.png";
} else if (trophy_type == "S") {
pathString = "src/images/silver.png";
} else if (trophy_type == "B") {
pathString = "src/images/bronze.png";
}
auto resource = cmrc::res::get_filesystem();
auto file = resource.open(pathString);
std::vector<u8> imgdata(file.begin(), file.end());
trophy_type_icon = RefCountedTexture::DecodePngTexture(imgdata);
AddLayer(this);
}
@ -42,29 +64,59 @@ void TrophyUI::Draw() {
float AdjustWidth = io.DisplaySize.x / 1280;
float AdjustHeight = io.DisplaySize.y / 720;
const ImVec2 window_size{
std::min(io.DisplaySize.x, (300 * AdjustWidth)),
std::min(io.DisplaySize.x, (350 * AdjustWidth)),
std::min(io.DisplaySize.y, (70 * AdjustHeight)),
};
SetNextWindowSize(window_size);
SetNextWindowCollapsed(false);
SetNextWindowPos(ImVec2(io.DisplaySize.x - (300 * AdjustWidth), (50 * AdjustHeight)));
SetNextWindowPos(ImVec2(io.DisplaySize.x - (370 * AdjustWidth), (50 * AdjustHeight)));
KeepNavHighlight();
if (Begin("Trophy Window", nullptr,
ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoSavedSettings |
ImGuiWindowFlags_NoInputs)) {
if (trophy_icon) {
Image(trophy_icon.GetTexture().im_id, ImVec2((50 * AdjustWidth), (50 * AdjustHeight)));
if (trophy_type_icon) {
SetCursorPosY((window_size.y * 0.5f) - (25 * AdjustHeight));
Image(trophy_type_icon.GetTexture().im_id,
ImVec2((50 * AdjustWidth), (50 * AdjustHeight)));
ImGui::SameLine();
} else {
// placeholder
const auto pos = GetCursorScreenPos();
ImGui::GetWindowDrawList()->AddRectFilled(pos, pos + ImVec2{50.0f},
ImGui::GetWindowDrawList()->AddRectFilled(pos, pos + ImVec2{50.0f * AdjustHeight},
GetColorU32(ImVec4{0.7f}));
ImGui::Indent(60);
}
SetWindowFontScale((1.2 * AdjustHeight));
const std::string combinedString = "Trophy earned!\n%s" + trophy_name;
const float wrap_width =
CalcWrapWidthForPos(GetCursorScreenPos(), (window_size.x - (60 * AdjustWidth)));
SetWindowFontScale(1.2 * AdjustHeight);
// If trophy name exceeds 1 line
if (CalcTextSize(trophy_name.c_str()).x > wrap_width) {
SetCursorPosY(5 * AdjustHeight);
if (CalcTextSize(trophy_name.c_str()).x > (wrap_width * 2)) {
SetWindowFontScale(0.95 * AdjustHeight);
} else {
SetWindowFontScale(1.1 * AdjustHeight);
}
} else {
const float text_height = ImGui::CalcTextSize(combinedString.c_str()).y;
SetCursorPosY((window_size.y - text_height) * 0.5);
}
ImGui::PushTextWrapPos(window_size.x - (60 * AdjustWidth));
TextWrapped("Trophy earned!\n%s", trophy_name.c_str());
ImGui::SameLine(window_size.x - (60 * AdjustWidth));
if (trophy_icon) {
SetCursorPosY((window_size.y * 0.5f) - (25 * AdjustHeight));
Image(trophy_icon.GetTexture().im_id, ImVec2((50 * AdjustWidth), (50 * AdjustHeight)));
} else {
// placeholder
const auto pos = GetCursorScreenPos();
ImGui::GetWindowDrawList()->AddRectFilled(pos, pos + ImVec2{50.0f * AdjustHeight},
GetColorU32(ImVec4{0.7f}));
}
}
End();
@ -74,14 +126,16 @@ void TrophyUI::Draw() {
if (!trophy_queue.empty()) {
TrophyInfo next_trophy = trophy_queue.front();
trophy_queue.pop();
current_trophy_ui.emplace(next_trophy.trophy_icon_path, next_trophy.trophy_name);
current_trophy_ui.emplace(next_trophy.trophy_icon_path, next_trophy.trophy_name,
next_trophy.trophy_type);
} else {
current_trophy_ui.reset();
}
}
}
void AddTrophyToQueue(const std::filesystem::path& trophyIconPath, const std::string& trophyName) {
void AddTrophyToQueue(const std::filesystem::path& trophyIconPath, const std::string& trophyName,
const std::string_view& rarity) {
std::lock_guard<std::mutex> lock(queueMtx);
if (Config::getisTrophyPopupDisabled()) {
@ -90,9 +144,10 @@ void AddTrophyToQueue(const std::filesystem::path& trophyIconPath, const std::st
TrophyInfo new_trophy;
new_trophy.trophy_icon_path = trophyIconPath;
new_trophy.trophy_name = trophyName;
new_trophy.trophy_type = rarity;
trophy_queue.push(new_trophy);
} else {
current_trophy_ui.emplace(trophyIconPath, trophyName);
current_trophy_ui.emplace(trophyIconPath, trophyName, rarity);
}
}

View File

@ -17,7 +17,8 @@ namespace Libraries::NpTrophy {
class TrophyUI final : public ImGui::Layer {
public:
TrophyUI(const std::filesystem::path& trophyIconPath, const std::string& trophyName);
TrophyUI(const std::filesystem::path& trophyIconPath, const std::string& trophyName,
const std::string_view& rarity);
~TrophyUI() override;
void Finish();
@ -26,15 +27,19 @@ public:
private:
std::string trophy_name;
std::string_view trophy_type;
float trophy_timer = 5.0f;
ImGui::RefCountedTexture trophy_icon;
ImGui::RefCountedTexture trophy_type_icon;
};
struct TrophyInfo {
std::filesystem::path trophy_icon_path;
std::string trophy_name;
std::string_view trophy_type;
};
void AddTrophyToQueue(const std::filesystem::path& trophyIconPath, const std::string& trophyName);
void AddTrophyToQueue(const std::filesystem::path& trophyIconPath, const std::string& trophyName,
const std::string_view& rarity);
}; // namespace Libraries::NpTrophy

View File

@ -315,12 +315,13 @@ int PS4_SYSV_ABI scePadRead(s32 handle, OrbisPadData* pData, s32 num) {
pData[i].angularVelocity.x = states[i].angularVelocity.x;
pData[i].angularVelocity.y = states[i].angularVelocity.y;
pData[i].angularVelocity.z = states[i].angularVelocity.z;
pData[i].orientation = {0.0f, 0.0f, 0.0f, 1.0f};
if (engine) {
const auto accel_poll_rate = engine->GetAccelPollRate();
if (accel_poll_rate != 0.0f) {
const auto gyro_poll_rate = engine->GetAccelPollRate();
if (gyro_poll_rate != 0.0f) {
GameController::CalculateOrientation(pData[i].acceleration,
pData[i].angularVelocity,
1.0f / accel_poll_rate, pData[i].orientation);
1.0f / gyro_poll_rate, pData[i].orientation);
}
}
pData[i].touchData.touchNum =
@ -384,11 +385,12 @@ int PS4_SYSV_ABI scePadReadState(s32 handle, OrbisPadData* pData) {
pData->angularVelocity.x = state.angularVelocity.x;
pData->angularVelocity.y = state.angularVelocity.y;
pData->angularVelocity.z = state.angularVelocity.z;
pData->orientation = {0.0f, 0.0f, 0.0f, 1.0f};
if (engine) {
const auto accel_poll_rate = engine->GetAccelPollRate();
if (accel_poll_rate != 0.0f) {
const auto gyro_poll_rate = engine->GetAccelPollRate();
if (gyro_poll_rate != 0.0f) {
GameController::CalculateOrientation(pData->acceleration, pData->angularVelocity,
1.0f / accel_poll_rate, pData->orientation);
1.0f / gyro_poll_rate, pData->orientation);
}
}
pData->touchData.touchNum =

View File

@ -137,9 +137,6 @@ s32 PS4_SYSV_ABI scePlayGoGetLanguageMask(OrbisPlayGoHandle handle,
s32 PS4_SYSV_ABI scePlayGoGetLocus(OrbisPlayGoHandle handle, const OrbisPlayGoChunkId* chunkIds,
uint32_t numberOfEntries, OrbisPlayGoLocus* outLoci) {
LOG_DEBUG(Lib_PlayGo, "called handle = {}, chunkIds = {}, numberOfEntries = {}", handle,
*chunkIds, numberOfEntries);
if (handle != PlaygoHandle) {
return ORBIS_PLAYGO_ERROR_BAD_HANDLE;
}
@ -149,6 +146,10 @@ s32 PS4_SYSV_ABI scePlayGoGetLocus(OrbisPlayGoHandle handle, const OrbisPlayGoCh
if (numberOfEntries == 0) {
return ORBIS_PLAYGO_ERROR_BAD_SIZE;
}
LOG_DEBUG(Lib_PlayGo, "called handle = {}, chunkIds = {}, numberOfEntries = {}", handle,
*chunkIds, numberOfEntries);
if (!playgo) {
return ORBIS_PLAYGO_ERROR_NOT_INITIALIZED;
}

View File

@ -57,15 +57,25 @@ void MemoryManager::SetupMemoryRegions(u64 flexible_size, bool use_extended_mem1
}
u64 MemoryManager::ClampRangeSize(VAddr virtual_addr, u64 size) {
static constexpr u64 MinSizeToClamp = 1_GB;
static constexpr u64 MinSizeToClamp = 512_MB;
// Dont bother with clamping if the size is small so we dont pay a map lookup on every buffer.
if (size < MinSizeToClamp) {
return size;
}
const auto vma = FindVMA(virtual_addr);
// Clamp size to the remaining size of the current VMA.
auto vma = FindVMA(virtual_addr);
ASSERT_MSG(vma != vma_map.end(), "Attempted to access invalid GPU address {:#x}", virtual_addr);
const u64 clamped_size =
std::min<u64>(size, vma->second.base + vma->second.size - virtual_addr);
u64 clamped_size = vma->second.base + vma->second.size - virtual_addr;
++vma;
// Keep adding to the size while there is contigious virtual address space.
while (!vma->second.IsFree() && clamped_size < size) {
clamped_size += vma->second.size;
++vma;
}
clamped_size = std::min(clamped_size, size);
if (size != clamped_size) {
LOG_WARNING(Kernel_Vmm, "Clamped requested buffer range addr={:#x}, size={:#x} to {:#x}",
virtual_addr, size, clamped_size);
@ -481,19 +491,14 @@ int MemoryManager::QueryProtection(VAddr addr, void** start, void** end, u32* pr
return ORBIS_OK;
}
int MemoryManager::Protect(VAddr addr, size_t size, MemoryProt prot) {
std::scoped_lock lk{mutex};
s64 MemoryManager::ProtectBytes(VAddr addr, VirtualMemoryArea vma_base, size_t size,
MemoryProt prot) {
const auto start_in_vma = addr - vma_base.base;
const auto adjusted_size =
vma_base.size - start_in_vma < size ? vma_base.size - start_in_vma : size;
// Find the virtual memory area that contains the specified address range.
auto it = FindVMA(addr);
if (it == vma_map.end() || !it->second.Contains(addr, size)) {
LOG_ERROR(Core, "Address range not mapped");
return ORBIS_KERNEL_ERROR_EINVAL;
}
VirtualMemoryArea& vma = it->second;
if (vma.type == VMAType::Free) {
LOG_ERROR(Core, "Cannot change protection on free memory region");
if (vma_base.type == VMAType::Free) {
LOG_ERROR(Kernel_Vmm, "Cannot change protection on free memory region");
return ORBIS_KERNEL_ERROR_EINVAL;
}
@ -504,13 +509,13 @@ int MemoryManager::Protect(VAddr addr, size_t size, MemoryProt prot) {
MemoryProt invalid_flags = prot & ~valid_flags;
if (u32(invalid_flags) != 0 && u32(invalid_flags) != u32(MemoryProt::NoAccess)) {
LOG_ERROR(Core, "Invalid protection flags: prot = {:#x}, invalid flags = {:#x}", u32(prot),
u32(invalid_flags));
LOG_ERROR(Kernel_Vmm, "Invalid protection flags: prot = {:#x}, invalid flags = {:#x}",
u32(prot), u32(invalid_flags));
return ORBIS_KERNEL_ERROR_EINVAL;
}
// Change protection
vma.prot = prot;
vma_base.prot = prot;
// Set permissions
Core::MemoryPermission perms{};
@ -533,6 +538,24 @@ int MemoryManager::Protect(VAddr addr, size_t size, MemoryProt prot) {
impl.Protect(addr, size, perms);
return adjusted_size;
}
s32 MemoryManager::Protect(VAddr addr, size_t size, MemoryProt prot) {
std::scoped_lock lk{mutex};
s64 protected_bytes = 0;
do {
auto it = FindVMA(addr + protected_bytes);
auto& vma_base = it->second;
auto result = 0;
result = ProtectBytes(addr + protected_bytes, vma_base, size - protected_bytes, prot);
if (result < 0) {
// ProtectBytes returned an error, return it
return result;
}
protected_bytes += result;
} while (protected_bytes < size);
return ORBIS_OK;
}

View File

@ -198,7 +198,9 @@ public:
int QueryProtection(VAddr addr, void** start, void** end, u32* prot);
int Protect(VAddr addr, size_t size, MemoryProt prot);
s32 Protect(VAddr addr, size_t size, MemoryProt prot);
s64 ProtectBytes(VAddr addr, VirtualMemoryArea vma_base, size_t size, MemoryProt prot);
int VirtualQuery(VAddr addr, int flags, ::Libraries::Kernel::OrbisVirtualQueryInfo* info);

View File

@ -50,29 +50,6 @@ Emulator::Emulator() {
SetPriorityClass(GetCurrentProcess(), ABOVE_NORMAL_PRIORITY_CLASS);
#endif
// Start logger.
Common::Log::Initialize();
Common::Log::Start();
LOG_INFO(Loader, "Starting shadps4 emulator v{} ", Common::VERSION);
LOG_INFO(Loader, "Revision {}", Common::g_scm_rev);
LOG_INFO(Loader, "Branch {}", Common::g_scm_branch);
LOG_INFO(Loader, "Description {}", Common::g_scm_desc);
LOG_INFO(Loader, "Remote {}", Common::g_scm_remote_url);
LOG_INFO(Config, "General LogType: {}", Config::getLogType());
LOG_INFO(Config, "General isNeo: {}", Config::isNeoModeConsole());
LOG_INFO(Config, "GPU isNullGpu: {}", Config::nullGpu());
LOG_INFO(Config, "GPU shouldDumpShaders: {}", Config::dumpShaders());
LOG_INFO(Config, "GPU vblankDivider: {}", Config::vblankDiv());
LOG_INFO(Config, "Vulkan gpuId: {}", Config::getGpuId());
LOG_INFO(Config, "Vulkan vkValidation: {}", Config::vkValidationEnabled());
LOG_INFO(Config, "Vulkan vkValidationSync: {}", Config::vkValidationSyncEnabled());
LOG_INFO(Config, "Vulkan vkValidationGpu: {}", Config::vkValidationGpuEnabled());
LOG_INFO(Config, "Vulkan crashDiagnostics: {}", Config::getVkCrashDiagnosticEnabled());
LOG_INFO(Config, "Vulkan hostMarkers: {}", Config::getVkHostMarkersEnabled());
LOG_INFO(Config, "Vulkan guestMarkers: {}", Config::getVkGuestMarkersEnabled());
LOG_INFO(Config, "Vulkan rdocEnable: {}", Config::isRdocEnabled());
// Create stdin/stdout/stderr
Common::Singleton<FileSys::HandleTable>::Instance()->CreateStdHandles();
@ -90,9 +67,8 @@ Emulator::Emulator() {
const auto user_dir = Common::FS::GetUserPath(Common::FS::PathType::UserDir);
QString filePath = QString::fromStdString((user_dir / "play_time.txt").string());
QFile file(filePath);
if (!file.open(QIODevice::ReadWrite | QIODevice::Text)) {
LOG_INFO(Loader, "Error opening or creating play_time.txt");
}
ASSERT_MSG(file.open(QIODevice::ReadWrite | QIODevice::Text),
"Error opening or creating play_time.txt");
#endif
}
@ -138,6 +114,33 @@ void Emulator::Run(const std::filesystem::path& file, const std::vector<std::str
const auto content_id = param_sfo->GetString("CONTENT_ID");
ASSERT_MSG(content_id.has_value(), "Failed to get CONTENT_ID");
id = std::string(*content_id, 7, 9);
if (Config::getSeparateLogFilesEnabled()) {
Common::Log::Initialize(id + ".log");
} else {
Common::Log::Initialize();
}
Common::Log::Start();
LOG_INFO(Loader, "Starting shadps4 emulator v{} ", Common::VERSION);
LOG_INFO(Loader, "Revision {}", Common::g_scm_rev);
LOG_INFO(Loader, "Branch {}", Common::g_scm_branch);
LOG_INFO(Loader, "Description {}", Common::g_scm_desc);
LOG_INFO(Loader, "Remote {}", Common::g_scm_remote_url);
LOG_INFO(Config, "General LogType: {}", Config::getLogType());
LOG_INFO(Config, "General isNeo: {}", Config::isNeoModeConsole());
LOG_INFO(Config, "GPU isNullGpu: {}", Config::nullGpu());
LOG_INFO(Config, "GPU shouldDumpShaders: {}", Config::dumpShaders());
LOG_INFO(Config, "GPU vblankDivider: {}", Config::vblankDiv());
LOG_INFO(Config, "Vulkan gpuId: {}", Config::getGpuId());
LOG_INFO(Config, "Vulkan vkValidation: {}", Config::vkValidationEnabled());
LOG_INFO(Config, "Vulkan vkValidationSync: {}", Config::vkValidationSyncEnabled());
LOG_INFO(Config, "Vulkan vkValidationGpu: {}", Config::vkValidationGpuEnabled());
LOG_INFO(Config, "Vulkan crashDiagnostics: {}", Config::getVkCrashDiagnosticEnabled());
LOG_INFO(Config, "Vulkan hostMarkers: {}", Config::getVkHostMarkersEnabled());
LOG_INFO(Config, "Vulkan guestMarkers: {}", Config::getVkGuestMarkersEnabled());
LOG_INFO(Config, "Vulkan rdocEnable: {}", Config::isRdocEnabled());
Libraries::NpTrophy::game_serial = id;
const auto trophyDir =
Common::FS::GetUserPath(Common::FS::PathType::MetaDataDir) / id / "TrophyFiles";

BIN
src/images/bronze.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

BIN
src/images/gold.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

BIN
src/images/platinum.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

BIN
src/images/silver.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

View File

@ -182,7 +182,7 @@ void GameController::CalculateOrientation(Libraries::Pad::OrbisFVector3& acceler
// Normalize accelerometer measurement
float norm = std::sqrt(ax * ax + ay * ay + az * az);
if (norm == 0.0f)
if (norm == 0.0f || deltaTime == 0.0f)
return; // Handle NaN
norm = 1.0f / norm;
ax *= norm;

View File

@ -26,8 +26,10 @@
#include <QTextEdit>
#include <QVBoxLayout>
#include <QXmlStreamReader>
#include <common/logging/log.h>
#include "cheats_patches.h"
#include "common/config.h"
#include "common/logging/log.h"
#include "common/memory_patcher.h"
#include "common/path_util.h"
#include "core/module.h"
@ -92,7 +94,7 @@ void CheatsPatches::setupUI() {
gameVersionLabel->setAlignment(Qt::AlignLeft);
gameInfoLayout->addWidget(gameVersionLabel);
if (m_gameSize.left(4) != "0.00") {
if (Config::GetLoadGameSizeEnabled()) {
QLabel* gameSizeLabel = new QLabel(tr("Size: ") + m_gameSize);
gameSizeLabel->setAlignment(Qt::AlignLeft);
gameInfoLayout->addWidget(gameSizeLabel);

View File

@ -49,6 +49,9 @@ void GameInfoClass::GetGameInfo(QWidget* parent) {
return readGameInfo(Common::FS::PathFromQString(path));
}).results();
// used to retrieve values after performing a search
m_games_backup = m_games;
// Progress bar, please be patient :)
QProgressDialog dialog(tr("Loading game list, please wait :3"), tr("Cancel"), 0, 0, parent);
dialog.setWindowTitle(tr("Loading..."));

View File

@ -17,6 +17,7 @@ public:
~GameInfoClass();
void GetGameInfo(QWidget* parent = nullptr);
QVector<GameInfo> m_games;
QVector<GameInfo> m_games_backup;
static bool CompareStrings(GameInfo& a, GameInfo& b) {
std::string name_a = a.name, name_b = b.name;

View File

@ -69,8 +69,12 @@ public:
}
// Cache path
QFile size_cache_file(Common::FS::GetUserPath(Common::FS::PathType::MetaDataDir) /
game.serial / "size_cache.txt");
QDir cacheDir =
QDir(Common::FS::GetUserPath(Common::FS::PathType::MetaDataDir) / game.serial);
if (!cacheDir.exists()) {
cacheDir.mkpath(".");
}
QFile size_cache_file(cacheDir.absoluteFilePath("size_cache.txt"));
QFileInfo cacheInfo(size_cache_file);
QFileInfo dirInfo(dirPath);

View File

@ -84,7 +84,9 @@ public:
copyMenu->addAction(copyName);
copyMenu->addAction(copySerial);
copyMenu->addAction(copyVersion);
if (Config::GetLoadGameSizeEnabled()) {
copyMenu->addAction(copySize);
}
copyMenu->addAction(copyNameAll);
menu.addMenu(copyMenu);
@ -362,12 +364,18 @@ public:
}
if (selected == copyNameAll) {
QString GameSizeEnabled;
if (Config::GetLoadGameSizeEnabled()) {
GameSizeEnabled = " | Size:" + QString::fromStdString(m_games[itemID].size);
}
QClipboard* clipboard = QGuiApplication::clipboard();
QString combinedText = QString("Name:%1 | Serial:%2 | Version:%3 | Size:%4")
QString combinedText = QString("Name:%1 | Serial:%2 | Version:%3%4")
.arg(QString::fromStdString(m_games[itemID].name))
.arg(QString::fromStdString(m_games[itemID].serial))
.arg(QString::fromStdString(m_games[itemID].version))
.arg(QString::fromStdString(m_games[itemID].size));
.arg(GameSizeEnabled);
clipboard->setText(combinedText);
}

View File

@ -290,6 +290,27 @@ void MainWindow::CreateConnects() {
connect(settingsDialog, &SettingsDialog::CompatibilityChanged, this,
&MainWindow::RefreshGameTable);
connect(settingsDialog, &SettingsDialog::accepted, this, &MainWindow::RefreshGameTable);
connect(settingsDialog, &SettingsDialog::rejected, this, &MainWindow::RefreshGameTable);
connect(settingsDialog, &SettingsDialog::close, this, &MainWindow::RefreshGameTable);
connect(settingsDialog, &SettingsDialog::BackgroundOpacityChanged, this,
[this](int opacity) {
Config::setBackgroundImageOpacity(opacity);
if (m_game_list_frame) {
QTableWidgetItem* current = m_game_list_frame->GetCurrentItem();
if (current) {
m_game_list_frame->SetListBackgroundImage(current);
}
}
if (m_game_grid_frame) {
if (m_game_grid_frame->IsValidCellSelected()) {
m_game_grid_frame->SetGridBackgroundImage(m_game_grid_frame->crtRow,
m_game_grid_frame->crtColumn);
}
}
});
settingsDialog->exec();
});
@ -302,6 +323,10 @@ void MainWindow::CreateConnects() {
connect(settingsDialog, &SettingsDialog::CompatibilityChanged, this,
&MainWindow::RefreshGameTable);
connect(settingsDialog, &SettingsDialog::accepted, this, &MainWindow::RefreshGameTable);
connect(settingsDialog, &SettingsDialog::rejected, this, &MainWindow::RefreshGameTable);
connect(settingsDialog, &SettingsDialog::close, this, &MainWindow::RefreshGameTable);
connect(settingsDialog, &SettingsDialog::BackgroundOpacityChanged, this,
[this](int opacity) {
Config::setBackgroundImageOpacity(opacity);
@ -413,6 +438,7 @@ void MainWindow::CreateConnects() {
int slider_pos = Config::getSliderPosition();
ui->sizeSlider->setEnabled(true);
ui->sizeSlider->setSliderPosition(slider_pos);
ui->mw_searchbar->setText("");
});
// Grid
connect(ui->setlistModeGridAct, &QAction::triggered, m_dock_widget.data(), [this]() {
@ -430,6 +456,7 @@ void MainWindow::CreateConnects() {
int slider_pos_grid = Config::getSliderPositionGrid();
ui->sizeSlider->setEnabled(true);
ui->sizeSlider->setSliderPosition(slider_pos_grid);
ui->mw_searchbar->setText("");
});
// Elf Viewer
connect(ui->setlistElfAct, &QAction::triggered, m_dock_widget.data(), [this]() {
@ -658,14 +685,24 @@ void MainWindow::StartGame() {
}
}
bool isTable;
void MainWindow::SearchGameTable(const QString& text) {
if (isTableList) {
if (isTable != true) {
m_game_info->m_games = m_game_info->m_games_backup;
m_game_list_frame->PopulateGameList();
isTable = true;
}
for (int row = 0; row < m_game_list_frame->rowCount(); row++) {
QString game_name = QString::fromStdString(m_game_info->m_games[row].name);
bool match = (game_name.contains(text, Qt::CaseInsensitive)); // Check only in column 1
m_game_list_frame->setRowHidden(row, !match);
}
} else {
isTable = false;
m_game_info->m_games = m_game_info->m_games_backup;
m_game_grid_frame->PopulateGameGrid(m_game_info->m_games, false);
QVector<GameInfo> filteredGames;
for (const auto& gameInfo : m_game_info->m_games) {
QString game_name = QString::fromStdString(gameInfo.name);
@ -674,6 +711,7 @@ void MainWindow::SearchGameTable(const QString& text) {
}
}
std::sort(filteredGames.begin(), filteredGames.end(), m_game_info->CompareStrings);
m_game_info->m_games = filteredGames;
m_game_grid_frame->PopulateGameGrid(filteredGames, true);
}
}

View File

@ -60,9 +60,12 @@ const QVector<int> languageIndexes = {21, 23, 14, 6, 18, 1, 12, 22, 2, 4, 25, 2
15, 16, 17, 7, 26, 8, 11, 20, 3, 13, 27, 10, 19, 30, 28};
QMap<QString, QString> channelMap;
QMap<QString, QString> logTypeMap;
QMap<QString, QString> fullscreenModeMap;
QMap<QString, QString> screenModeMap;
QMap<QString, QString> chooseHomeTabMap;
int backgroundImageOpacitySlider_backup;
int bgm_volume_backup;
SettingsDialog::SettingsDialog(std::span<const QString> physical_devices,
std::shared_ptr<CompatibilityInfoClass> m_compat_info,
QWidget* parent)
@ -77,7 +80,9 @@ SettingsDialog::SettingsDialog(std::span<const QString> physical_devices,
channelMap = {{tr("Release"), "Release"}, {tr("Nightly"), "Nightly"}};
logTypeMap = {{tr("async"), "async"}, {tr("sync"), "sync"}};
fullscreenModeMap = {{tr("Borderless"), "Borderless"}, {tr("True"), "True"}};
screenModeMap = {{tr("Fullscreen (Borderless)"), "Fullscreen (Borderless)"},
{tr("Windowed"), "Windowed"},
{tr("Fullscreen"), "Fullscreen"}};
chooseHomeTabMap = {{tr("General"), "General"}, {tr("GUI"), "GUI"},
{tr("Graphics"), "Graphics"}, {tr("User"), "User"},
{tr("Input"), "Input"}, {tr("Paths"), "Paths"},
@ -115,6 +120,7 @@ SettingsDialog::SettingsDialog(std::span<const QString> physical_devices,
connect(ui->buttonBox, &QDialogButtonBox::clicked, this,
[this, config_dir](QAbstractButton* button) {
if (button == ui->buttonBox->button(QDialogButtonBox::Save)) {
is_saving = true;
UpdateSettings();
Config::save(config_dir / "config.toml");
QWidget::close();
@ -126,6 +132,10 @@ SettingsDialog::SettingsDialog(std::span<const QString> physical_devices,
Config::save(config_dir / "config.toml");
LoadValuesFromConfig();
} else if (button == ui->buttonBox->button(QDialogButtonBox::Close)) {
ui->backgroundImageOpacitySlider->setValue(backgroundImageOpacitySlider_backup);
emit BackgroundOpacityChanged(backgroundImageOpacitySlider_backup);
ui->BGMVolumeSlider->setValue(bgm_volume_backup);
BackgroundMusicPlayer::getInstance().setVolume(bgm_volume_backup);
ResetInstallFolders();
}
if (Common::Log::IsActive()) {
@ -197,6 +207,12 @@ SettingsDialog::SettingsDialog(std::span<const QString> physical_devices,
// Gui TAB
{
connect(ui->backgroundImageOpacitySlider, &QSlider::valueChanged, this,
[this](int value) { emit BackgroundOpacityChanged(value); });
connect(ui->BGMVolumeSlider, &QSlider::valueChanged, this,
[](int value) { BackgroundMusicPlayer::getInstance().setVolume(value); });
connect(ui->chooseHomeTabComboBox, &QComboBox::currentTextChanged, this,
[](const QString& hometab) { Config::setChooseHomeTab(hometab.toStdString()); });
@ -274,7 +290,6 @@ SettingsDialog::SettingsDialog(std::span<const QString> physical_devices,
// General
ui->consoleLanguageGroupBox->installEventFilter(this);
ui->emulatorLanguageGroupBox->installEventFilter(this);
ui->fullscreenCheckBox->installEventFilter(this);
ui->separateUpdatesCheckBox->installEventFilter(this);
ui->showSplashCheckBox->installEventFilter(this);
ui->discordRPCCheckbox->installEventFilter(this);
@ -300,8 +315,7 @@ SettingsDialog::SettingsDialog(std::span<const QString> physical_devices,
// Graphics
ui->graphicsAdapterGroupBox->installEventFilter(this);
ui->widthGroupBox->installEventFilter(this);
ui->heightGroupBox->installEventFilter(this);
ui->windowSizeGroupBox->installEventFilter(this);
ui->heightDivider->installEventFilter(this);
ui->dumpShadersCheckBox->installEventFilter(this);
ui->nullGpuCheckBox->installEventFilter(this);
@ -330,6 +344,16 @@ SettingsDialog::SettingsDialog(std::span<const QString> physical_devices,
}
}
void SettingsDialog::closeEvent(QCloseEvent* event) {
if (!is_saving) {
ui->backgroundImageOpacitySlider->setValue(backgroundImageOpacitySlider_backup);
emit BackgroundOpacityChanged(backgroundImageOpacitySlider_backup);
ui->BGMVolumeSlider->setValue(bgm_volume_backup);
BackgroundMusicPlayer::getInstance().setVolume(bgm_volume_backup);
}
QDialog::closeEvent(event);
}
void SettingsDialog::LoadValuesFromConfig() {
std::filesystem::path userdir = Common::FS::GetUserPath(Common::FS::PathType::UserDir);
@ -382,12 +406,9 @@ void SettingsDialog::LoadValuesFromConfig() {
ui->BGMVolumeSlider->setValue(toml::find_or<int>(data, "General", "BGMvolume", 50));
ui->discordRPCCheckbox->setChecked(
toml::find_or<bool>(data, "General", "enableDiscordRPC", true));
ui->fullscreenCheckBox->setChecked(toml::find_or<bool>(data, "General", "Fullscreen", false));
QString translatedText_FullscreenMode =
fullscreenModeMap.key(QString::fromStdString(Config::getFullscreenMode()));
if (!translatedText_FullscreenMode.isEmpty()) {
ui->fullscreenModeComboBox->setCurrentText(translatedText_FullscreenMode);
}
screenModeMap.key(QString::fromStdString(Config::getFullscreenMode()));
ui->displayModeComboBox->setCurrentText(translatedText_FullscreenMode);
ui->separateUpdatesCheckBox->setChecked(
toml::find_or<bool>(data, "General", "separateUpdateEnabled", false));
ui->gameSizeCheckBox->setChecked(toml::find_or<bool>(data, "GUI", "loadGameSizeEnabled", true));
@ -404,6 +425,8 @@ void SettingsDialog::LoadValuesFromConfig() {
QString::fromStdString(toml::find_or<std::string>(data, "Keys", "TrophyKey", "")));
ui->trophyKeyLineEdit->setEchoMode(QLineEdit::Password);
ui->debugDump->setChecked(toml::find_or<bool>(data, "Debug", "DebugDump", false));
ui->separateLogFilesCheckbox->setChecked(
toml::find_or<bool>(data, "Debug", "isSeparateLogFilesEnabled", false));
ui->vkValidationCheckBox->setChecked(toml::find_or<bool>(data, "Vulkan", "validation", false));
ui->vkSyncValidationCheckBox->setChecked(
toml::find_or<bool>(data, "Vulkan", "validation_sync", false));
@ -460,6 +483,9 @@ void SettingsDialog::LoadValuesFromConfig() {
ResetInstallFolders();
ui->backgroundImageOpacitySlider->setValue(Config::getBackgroundImageOpacity());
ui->showBackgroundImageCheckBox->setChecked(Config::getShowBackgroundImage());
backgroundImageOpacitySlider_backup = Config::getBackgroundImageOpacity();
bgm_volume_backup = Config::getBGMvolume();
}
void SettingsDialog::InitializeEmulatorLanguages() {
@ -533,8 +559,6 @@ void SettingsDialog::updateNoteTextEdit(const QString& elementName) {
text = tr("Console Language:\\nSets the language that the PS4 game uses.\\nIt's recommended to set this to a language the game supports, which will vary by region.");
} else if (elementName == "emulatorLanguageGroupBox") {
text = tr("Emulator Language:\\nSets the language of the emulator's user interface.");
} else if (elementName == "fullscreenCheckBox") {
text = tr("Enable Full Screen:\\nAutomatically puts the game window into full-screen mode.\\nThis can be toggled by pressing the F11 key.");
} else if (elementName == "separateUpdatesCheckBox") {
text = tr("Enable Separate Update Folder:\\nEnables installing game updates into a separate folder for easy management.\\nThis can be manually created by adding the extracted update to the game folder with the name \"CUSA00000-UPDATE\" where the CUSA ID matches the game's ID.");
} else if (elementName == "showSplashCheckBox") {
@ -581,7 +605,7 @@ void SettingsDialog::updateNoteTextEdit(const QString& elementName) {
// Graphics
if (elementName == "graphicsAdapterGroupBox") {
text = tr("Graphics Device:\\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\\nor select \"Auto Select\" to automatically determine it.");
} else if (elementName == "widthGroupBox" || elementName == "heightGroupBox") {
} else if (elementName == "windowSizeGroupBox") {
text = tr("Width/Height:\\nSets the size of the emulator window at launch, which can be resized during gameplay.\\nThis is different from the in-game resolution.");
} else if (elementName == "heightDivider") {
text = tr("Vblank Divider:\\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change!");
@ -626,7 +650,8 @@ void SettingsDialog::updateNoteTextEdit(const QString& elementName) {
text = tr("Copy GPU Buffers:\\nGets around race conditions involving GPU submits.\\nMay or may not help with PM4 type 0 crashes.");
} else if (elementName == "collectShaderCheckBox") {
text = tr("Collect Shaders:\\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10).");
}
} else if (elementName == "separateLogFilesCheckbox") {
text = tr("Separate Log Files:\\nWrites a separate logfile for each game.");}
// clang-format on
ui->descriptionText->setText(text.replace("\\n", "\n"));
}
@ -652,9 +677,10 @@ void SettingsDialog::UpdateSettings() {
const QVector<std::string> TouchPadIndex = {"left", "center", "right", "none"};
Config::setBackButtonBehavior(TouchPadIndex[ui->backButtonBehaviorComboBox->currentIndex()]);
Config::setIsFullscreen(ui->fullscreenCheckBox->isChecked());
Config::setIsFullscreen(screenModeMap.value(ui->displayModeComboBox->currentText()) !=
"Windowed");
Config::setFullscreenMode(
fullscreenModeMap.value(ui->fullscreenModeComboBox->currentText()).toStdString());
screenModeMap.value(ui->displayModeComboBox->currentText()).toStdString());
Config::setIsMotionControlsEnabled(ui->motionControlsCheckBox->isChecked());
Config::setisTrophyPopupDisabled(ui->disableTrophycheckBox->isChecked());
Config::setPlayBGM(ui->playBGMCheckBox->isChecked());
@ -678,6 +704,7 @@ void SettingsDialog::UpdateSettings() {
Config::setLoadGameSizeEnabled(ui->gameSizeCheckBox->isChecked());
Config::setShowSplash(ui->showSplashCheckBox->isChecked());
Config::setDebugDump(ui->debugDump->isChecked());
Config::setSeparateLogFilesEnabled(ui->separateLogFilesCheckbox->isChecked());
Config::setVkValidation(ui->vkValidationCheckBox->isChecked());
Config::setVkSyncValidation(ui->vkSyncValidationCheckBox->isChecked());
Config::setRdocEnabled(ui->rdocCheckBox->isChecked());

View File

@ -42,6 +42,7 @@ private:
void InitializeEmulatorLanguages();
void OnLanguageChanged(int index);
void OnCursorStateChanged(s16 index);
void closeEvent(QCloseEvent* event) override;
std::unique_ptr<Ui::SettingsDialog> ui;
@ -50,4 +51,6 @@ private:
QString defaultTextEdit;
int initialHeight;
bool is_saving = false;
};

View File

@ -59,7 +59,7 @@
</size>
</property>
<property name="currentIndex">
<number>0</number>
<number>6</number>
</property>
<widget class="QScrollArea" name="generalTab">
<property name="widgetResizable">
@ -73,8 +73,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>946</width>
<height>536</height>
<width>718</width>
<height>332</height>
</rect>
</property>
<layout class="QVBoxLayout" name="generalTabVLayout" stretch="0">
@ -130,54 +130,14 @@
<property name="bottomMargin">
<number>9</number>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop</set>
</property>
<item>
<layout class="QVBoxLayout" name="emulatorverticalLayout">
<property name="spacing">
<number>10</number>
</property>
<item>
<widget class="QCheckBox" name="fullscreenCheckBox">
<property name="text">
<string>Enable Fullscreen</string>
</property>
</widget>
</item>
<item>
<widget class="QGroupBox" name="fullscreenModeGroupBox">
<property name="title">
<string>Fullscreen Mode</string>
</property>
<layout class="QVBoxLayout" name="fullscreenModeLayout">
<item>
<widget class="QComboBox" name="fullscreenModeComboBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<item>
<property name="text">
<string>Borderless</string>
</property>
</item>
<item>
<property name="text">
<string>True</string>
</property>
</item>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QCheckBox" name="enableHDRCheckBox">
<property name="text">
<string>Enable HDR</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="separateUpdatesCheckBox">
<property name="text">
@ -494,8 +454,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>946</width>
<height>536</height>
<width>646</width>
<height>395</height>
</rect>
</property>
<layout class="QVBoxLayout" name="guiTabVLayout" stretch="0">
@ -943,8 +903,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>946</width>
<height>536</height>
<width>545</width>
<height>141</height>
</rect>
</property>
<layout class="QVBoxLayout" name="graphicsTabVLayout" stretch="0,0">
@ -1007,21 +967,66 @@
<item>
<layout class="QVBoxLayout" name="graphicsTabLayoutMiddle">
<item>
<widget class="QGroupBox" name="displayOptionsGroupBox">
<property name="title">
<string>Video</string>
</property>
<layout class="QVBoxLayout" name="layoutResolution">
<property name="spacing">
<number>6</number>
</property>
<property name="leftMargin">
<number>0</number>
<number>12</number>
</property>
<item>
<layout class="QHBoxLayout" name="resolutionLayout">
<item>
<widget class="QGroupBox" name="widthGroupBox">
<widget class="QGroupBox" name="displayModeGroupBox">
<property name="title">
<string>Width</string>
<string>Display Mode</string>
</property>
<layout class="QVBoxLayout" name="widthLayout">
<layout class="QVBoxLayout" name="displayModeLayout">
<item>
<widget class="QComboBox" name="displayModeComboBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<item>
<property name="text">
<string>Windowed</string>
</property>
</item>
<item>
<property name="text">
<string>Fullscreen</string>
</property>
</item>
<item>
<property name="text">
<string>Fullscreen (Borderless)</string>
</property>
</item>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="windowSizeLayout">
<item>
<widget class="QGroupBox" name="windowSizeGroupBox">
<property name="title">
<string>Window Size</string>
</property>
<layout class="QHBoxLayout" name="resLayout">
<item>
<widget class="QLabel" name="widthLabel">
<property name="text">
<string>W:</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="widthSpinBox">
<property name="accelerated">
@ -1044,15 +1049,13 @@
</property>
</widget>
</item>
</layout>
<item>
<widget class="QLabel" name="heightLabel">
<property name="text">
<string>H:</string>
</property>
</widget>
</item>
<item>
<widget class="QGroupBox" name="heightGroupBox">
<property name="title">
<string>Height</string>
</property>
<layout class="QVBoxLayout" name="heightLayout">
<item>
<widget class="QSpinBox" name="heightSpinBox">
<property name="frame">
@ -1117,7 +1120,15 @@
</item>
</layout>
</item>
<item>
<widget class="QCheckBox" name="enableHDRCheckBox">
<property name="text">
<string>Enable HDR</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
@ -1187,8 +1198,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>946</width>
<height>536</height>
<width>234</width>
<height>292</height>
</rect>
</property>
<layout class="QVBoxLayout" name="userTabVLayout" stretch="0,0,1">
@ -1331,8 +1342,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>946</width>
<height>536</height>
<width>455</width>
<height>252</height>
</rect>
</property>
<layout class="QVBoxLayout" name="inputTabVLayout" stretch="0,0">
@ -1615,8 +1626,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>946</width>
<height>536</height>
<width>216</width>
<height>254</height>
</rect>
</property>
<layout class="QVBoxLayout" name="pathsTabLayout">
@ -1877,40 +1888,51 @@
</property>
<layout class="QVBoxLayout" name="advancedLayout">
<item>
<widget class="QCheckBox" name="crashDiagnosticsCheckBox">
<property name="text">
<string>Enable Crash Diagnostics</string>
</property>
</widget>
</item>
<item>
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0">
<widget class="QCheckBox" name="collectShaderCheckBox">
<property name="text">
<string>Collect Shaders</string>
</property>
</widget>
</item>
<item>
<item row="2" column="0">
<widget class="QCheckBox" name="copyGPUBuffersCheckBox">
<property name="text">
<string>Copy GPU Buffers</string>
</property>
</widget>
</item>
<item>
<item row="1" column="0">
<widget class="QCheckBox" name="crashDiagnosticsCheckBox">
<property name="text">
<string>Enable Crash Diagnostics</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QCheckBox" name="hostMarkersCheckBox">
<property name="text">
<string>Host Debug Markers</string>
</property>
</widget>
</item>
<item>
<item row="4" column="0">
<widget class="QCheckBox" name="guestMarkersCheckBox">
<property name="text">
<string>Guest Debug Markers</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QCheckBox" name="separateLogFilesCheckbox">
<property name="text">
<string>Separate Log Files</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>

View File

@ -1279,14 +1279,6 @@
<source>Emulator</source>
<translation>المحاكي</translation>
</message>
<message>
<source>Enable Fullscreen</source>
<translation>تمكين ملء الشاشة</translation>
</message>
<message>
<source>Fullscreen Mode</source>
<translation>وضع ملء الشاشة</translation>
</message>
<message>
<source>Enable Separate Update Folder</source>
<translation type="unfinished">Enable Separate Update Folder</translation>
@ -1379,14 +1371,6 @@
<source>Graphics Device</source>
<translation>جهاز الرسومات</translation>
</message>
<message>
<source>Width</source>
<translation>العرض</translation>
</message>
<message>
<source>Height</source>
<translation>الارتفاع</translation>
</message>
<message>
<source>Vblank Divider</source>
<translation>Vblank مقسم</translation>
@ -1559,10 +1543,6 @@
<source>Emulator Language:\nSets the language of the emulator&apos;s user interface.</source>
<translation>لغة المحاكي:\nتحدد لغة واجهة المستخدم الخاصة بالمحاكي.</translation>
</message>
<message>
<source>Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key.</source>
<translation>تمكين وضع ملء الشاشة:\nيجعل نافذة اللعبة تنتقل تلقائيًا إلى وضع ملء الشاشة.\nيمكن التبديل بالضغط على المفتاح F11.</translation>
</message>
<message>
<source>Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name &quot;CUSA00000-UPDATE&quot; where the CUSA ID matches the game&apos;s ID.</source>
<translation>Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.</translation>
@ -1739,14 +1719,6 @@
<source>Browse:\nBrowse for a folder to set as the save data path.</source>
<translation type="unfinished">Browse:\nBrowse for a folder to set as the save data path.</translation>
</message>
<message>
<source>Borderless</source>
<translation type="unfinished">Borderless</translation>
</message>
<message>
<source>True</source>
<translation type="unfinished">True</translation>
</message>
<message>
<source>Release</source>
<translation type="unfinished">Release</translation>
@ -1791,6 +1763,46 @@
<source>Directory to save data</source>
<translation type="unfinished">Directory to save data</translation>
</message>
<message>
<source>Video</source>
<translation type="unfinished">Video</translation>
</message>
<message>
<source>Display Mode</source>
<translation type="unfinished">Display Mode</translation>
</message>
<message>
<source>Windowed</source>
<translation type="unfinished">Windowed</translation>
</message>
<message>
<source>Fullscreen</source>
<translation type="unfinished">Fullscreen</translation>
</message>
<message>
<source>Fullscreen (Borderless)</source>
<translation type="unfinished">Fullscreen (Borderless)</translation>
</message>
<message>
<source>Window Size</source>
<translation type="unfinished">Window Size</translation>
</message>
<message>
<source>W:</source>
<translation type="unfinished">W:</translation>
</message>
<message>
<source>H:</source>
<translation type="unfinished">H:</translation>
</message>
<message>
<source>Separate Log Files</source>
<translation type="unfinished">Separate Log Files</translation>
</message>
<message>
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation type="unfinished">Separate Log Files:\nWrites a separate logfile for each game.</translation>
</message>
</context>
<context>
<name>TrophyViewer</name>

View File

@ -1279,14 +1279,6 @@
<source>Emulator</source>
<translation type="unfinished">Emulator</translation>
</message>
<message>
<source>Enable Fullscreen</source>
<translation type="unfinished">Enable Fullscreen</translation>
</message>
<message>
<source>Fullscreen Mode</source>
<translation>Fuldskærmstilstand</translation>
</message>
<message>
<source>Enable Separate Update Folder</source>
<translation type="unfinished">Enable Separate Update Folder</translation>
@ -1379,14 +1371,6 @@
<source>Graphics Device</source>
<translation type="unfinished">Graphics Device</translation>
</message>
<message>
<source>Width</source>
<translation type="unfinished">Width</translation>
</message>
<message>
<source>Height</source>
<translation type="unfinished">Height</translation>
</message>
<message>
<source>Vblank Divider</source>
<translation type="unfinished">Vblank Divider</translation>
@ -1559,10 +1543,6 @@
<source>Emulator Language:\nSets the language of the emulator&apos;s user interface.</source>
<translation>Emulatorsprog:\nIndstiller sproget i emulatorens brugergrænseflade.</translation>
</message>
<message>
<source>Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key.</source>
<translation>Aktiver fuld skærm:\nSætter automatisk spilvinduet i fuld skærm.\nDette kan skiftes ved at trykke F11-tasten.</translation>
</message>
<message>
<source>Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name &quot;CUSA00000-UPDATE&quot; where the CUSA ID matches the game&apos;s ID.</source>
<translation>Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.</translation>
@ -1739,14 +1719,6 @@
<source>Browse:\nBrowse for a folder to set as the save data path.</source>
<translation type="unfinished">Browse:\nBrowse for a folder to set as the save data path.</translation>
</message>
<message>
<source>Borderless</source>
<translation type="unfinished">Borderless</translation>
</message>
<message>
<source>True</source>
<translation type="unfinished">True</translation>
</message>
<message>
<source>Release</source>
<translation type="unfinished">Release</translation>
@ -1791,6 +1763,46 @@
<source>Directory to save data</source>
<translation type="unfinished">Directory to save data</translation>
</message>
<message>
<source>Video</source>
<translation type="unfinished">Video</translation>
</message>
<message>
<source>Display Mode</source>
<translation type="unfinished">Display Mode</translation>
</message>
<message>
<source>Windowed</source>
<translation type="unfinished">Windowed</translation>
</message>
<message>
<source>Fullscreen</source>
<translation type="unfinished">Fullscreen</translation>
</message>
<message>
<source>Fullscreen (Borderless)</source>
<translation type="unfinished">Fullscreen (Borderless)</translation>
</message>
<message>
<source>Window Size</source>
<translation type="unfinished">Window Size</translation>
</message>
<message>
<source>W:</source>
<translation type="unfinished">W:</translation>
</message>
<message>
<source>H:</source>
<translation type="unfinished">H:</translation>
</message>
<message>
<source>Separate Log Files</source>
<translation type="unfinished">Separate Log Files</translation>
</message>
<message>
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation type="unfinished">Separate Log Files:\nWrites a separate logfile for each game.</translation>
</message>
</context>
<context>
<name>TrophyViewer</name>

View File

@ -1279,14 +1279,6 @@
<source>Emulator</source>
<translation type="unfinished">Emulator</translation>
</message>
<message>
<source>Enable Fullscreen</source>
<translation>Vollbild aktivieren</translation>
</message>
<message>
<source>Fullscreen Mode</source>
<translation>Vollbildmodus</translation>
</message>
<message>
<source>Enable Separate Update Folder</source>
<translation>Separaten Update-Ordner aktivieren</translation>
@ -1379,14 +1371,6 @@
<source>Graphics Device</source>
<translation>Grafikgerät</translation>
</message>
<message>
<source>Width</source>
<translation>Breite</translation>
</message>
<message>
<source>Height</source>
<translation>Höhe</translation>
</message>
<message>
<source>Vblank Divider</source>
<translation>Vblank-Teiler</translation>
@ -1559,10 +1543,6 @@
<source>Emulator Language:\nSets the language of the emulator&apos;s user interface.</source>
<translation>Emulatorsprache:\nLegt die Sprache der Emulator-Benutzeroberfläche fest.</translation>
</message>
<message>
<source>Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key.</source>
<translation>Vollbildmodus aktivieren:\nSchaltet das Spielfenster automatisch in den Vollbildmodus.\nKann durch Drücken der F11-Taste umgeschaltet werden.</translation>
</message>
<message>
<source>Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name &quot;CUSA00000-UPDATE&quot; where the CUSA ID matches the game&apos;s ID.</source>
<translation>Separaten Update-Ordner aktivieren:\nErmöglicht die Installation von Spielaktualiserungen in einem separaten Ordner zur einfachen Verwaltung.</translation>
@ -1739,14 +1719,6 @@
<source>Browse:\nBrowse for a folder to set as the save data path.</source>
<translation type="unfinished">Browse:\nBrowse for a folder to set as the save data path.</translation>
</message>
<message>
<source>Borderless</source>
<translation type="unfinished">Borderless</translation>
</message>
<message>
<source>True</source>
<translation type="unfinished">True</translation>
</message>
<message>
<source>Release</source>
<translation type="unfinished">Release</translation>
@ -1791,6 +1763,46 @@
<source>Directory to save data</source>
<translation type="unfinished">Directory to save data</translation>
</message>
<message>
<source>Video</source>
<translation type="unfinished">Video</translation>
</message>
<message>
<source>Display Mode</source>
<translation type="unfinished">Display Mode</translation>
</message>
<message>
<source>Windowed</source>
<translation type="unfinished">Windowed</translation>
</message>
<message>
<source>Fullscreen</source>
<translation type="unfinished">Fullscreen</translation>
</message>
<message>
<source>Fullscreen (Borderless)</source>
<translation type="unfinished">Fullscreen (Borderless)</translation>
</message>
<message>
<source>Window Size</source>
<translation type="unfinished">Window Size</translation>
</message>
<message>
<source>W:</source>
<translation type="unfinished">W:</translation>
</message>
<message>
<source>H:</source>
<translation type="unfinished">H:</translation>
</message>
<message>
<source>Separate Log Files</source>
<translation type="unfinished">Separate Log Files</translation>
</message>
<message>
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation type="unfinished">Separate Log Files:\nWrites a separate logfile for each game.</translation>
</message>
</context>
<context>
<name>TrophyViewer</name>

View File

@ -1279,14 +1279,6 @@
<source>Emulator</source>
<translation type="unfinished">Emulator</translation>
</message>
<message>
<source>Enable Fullscreen</source>
<translation type="unfinished">Enable Fullscreen</translation>
</message>
<message>
<source>Fullscreen Mode</source>
<translation>Λειτουργία Πλήρους Οθόνης</translation>
</message>
<message>
<source>Enable Separate Update Folder</source>
<translation type="unfinished">Enable Separate Update Folder</translation>
@ -1379,14 +1371,6 @@
<source>Graphics Device</source>
<translation type="unfinished">Graphics Device</translation>
</message>
<message>
<source>Width</source>
<translation type="unfinished">Width</translation>
</message>
<message>
<source>Height</source>
<translation type="unfinished">Height</translation>
</message>
<message>
<source>Vblank Divider</source>
<translation type="unfinished">Vblank Divider</translation>
@ -1559,10 +1543,6 @@
<source>Emulator Language:\nSets the language of the emulator&apos;s user interface.</source>
<translation>Γλώσσα Εξομοιωτή:\nΡυθμίζει τη γλώσσα του γραφικού περιβάλλοντος του εξομοιωτή.</translation>
</message>
<message>
<source>Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key.</source>
<translation>Ενεργοποίηση Πλήρους Οθόνης:\nΑυτόματα μετατρέπει το παράθυρο του παιχνιδιού σε λειτουργία πλήρους οθόνης.\nΜπορεί να ενεργοποιηθεί/απενεργοποιηθεί πατώντας το πλήκτρο F11.</translation>
</message>
<message>
<source>Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name &quot;CUSA00000-UPDATE&quot; where the CUSA ID matches the game&apos;s ID.</source>
<translation type="unfinished">Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name &quot;CUSA00000-UPDATE&quot; where the CUSA ID matches the game&apos;s ID.</translation>
@ -1739,14 +1719,6 @@
<source>Browse:\nBrowse for a folder to set as the save data path.</source>
<translation type="unfinished">Browse:\nBrowse for a folder to set as the save data path.</translation>
</message>
<message>
<source>Borderless</source>
<translation type="unfinished">Borderless</translation>
</message>
<message>
<source>True</source>
<translation type="unfinished">True</translation>
</message>
<message>
<source>Release</source>
<translation type="unfinished">Release</translation>
@ -1791,6 +1763,46 @@
<source>Directory to save data</source>
<translation type="unfinished">Directory to save data</translation>
</message>
<message>
<source>Video</source>
<translation type="unfinished">Video</translation>
</message>
<message>
<source>Display Mode</source>
<translation type="unfinished">Display Mode</translation>
</message>
<message>
<source>Windowed</source>
<translation type="unfinished">Windowed</translation>
</message>
<message>
<source>Fullscreen</source>
<translation type="unfinished">Fullscreen</translation>
</message>
<message>
<source>Fullscreen (Borderless)</source>
<translation type="unfinished">Fullscreen (Borderless)</translation>
</message>
<message>
<source>Window Size</source>
<translation type="unfinished">Window Size</translation>
</message>
<message>
<source>W:</source>
<translation type="unfinished">W:</translation>
</message>
<message>
<source>H:</source>
<translation type="unfinished">H:</translation>
</message>
<message>
<source>Separate Log Files</source>
<translation type="unfinished">Separate Log Files</translation>
</message>
<message>
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation type="unfinished">Separate Log Files:\nWrites a separate logfile for each game.</translation>
</message>
</context>
<context>
<name>TrophyViewer</name>

View File

@ -1279,14 +1279,6 @@
<source>Emulator</source>
<translation>Emulator</translation>
</message>
<message>
<source>Enable Fullscreen</source>
<translation>Enable Fullscreen</translation>
</message>
<message>
<source>Fullscreen Mode</source>
<translation>Fullscreen Mode</translation>
</message>
<message>
<source>Enable Separate Update Folder</source>
<translation>Enable Separate Update Folder</translation>
@ -1369,7 +1361,7 @@
</message>
<message>
<source>GUI</source>
<translation>Gui</translation>
<translation>GUI</translation>
</message>
<message>
<source>User</source>
@ -1379,14 +1371,6 @@
<source>Graphics Device</source>
<translation>Graphics Device</translation>
</message>
<message>
<source>Width</source>
<translation>Width</translation>
</message>
<message>
<source>Height</source>
<translation>Height</translation>
</message>
<message>
<source>Vblank Divider</source>
<translation>Vblank Divider</translation>
@ -1559,10 +1543,6 @@
<source>Emulator Language:\nSets the language of the emulator&apos;s user interface.</source>
<translation>Emulator Language:\nSets the language of the emulator&apos;s user interface.</translation>
</message>
<message>
<source>Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key.</source>
<translation>Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key.</translation>
</message>
<message>
<source>Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name &quot;CUSA00000-UPDATE&quot; where the CUSA ID matches the game&apos;s ID.</source>
<translation>Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name &quot;CUSA00000-UPDATE&quot; where the CUSA ID matches the game&apos;s ID.</translation>
@ -1739,14 +1719,6 @@
<source>Browse:\nBrowse for a folder to set as the save data path.</source>
<translation>Browse:\nBrowse for a folder to set as the save data path.</translation>
</message>
<message>
<source>Borderless</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>True</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Release</source>
<translation type="unfinished"></translation>
@ -1791,6 +1763,46 @@
<source>Directory to save data</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Video</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Windowed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fullscreen</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fullscreen (Borderless)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Window Size</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>W:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>H:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Separate Log Files</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TrophyViewer</name>

View File

@ -1279,14 +1279,6 @@
<source>Emulator</source>
<translation>Emulador</translation>
</message>
<message>
<source>Enable Fullscreen</source>
<translation>Habilitar pantalla completa</translation>
</message>
<message>
<source>Fullscreen Mode</source>
<translation>Modo de Pantalla Completa</translation>
</message>
<message>
<source>Enable Separate Update Folder</source>
<translation type="unfinished">Enable Separate Update Folder</translation>
@ -1379,14 +1371,6 @@
<source>Graphics Device</source>
<translation>Dispositivo gráfico</translation>
</message>
<message>
<source>Width</source>
<translation>Ancho</translation>
</message>
<message>
<source>Height</source>
<translation>Alto</translation>
</message>
<message>
<source>Vblank Divider</source>
<translation>Divisor de Vblank</translation>
@ -1559,10 +1543,6 @@
<source>Emulator Language:\nSets the language of the emulator&apos;s user interface.</source>
<translation>Idioma del Emulador:\nConfigura el idioma de la interfaz de usuario del emulador.</translation>
</message>
<message>
<source>Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key.</source>
<translation>Habilitar Pantalla Completa:\nColoca automáticamente la ventana del juego en modo de pantalla completa.\nEsto se puede alternar presionando la tecla F11.</translation>
</message>
<message>
<source>Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name &quot;CUSA00000-UPDATE&quot; where the CUSA ID matches the game&apos;s ID.</source>
<translation type="unfinished">Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name &quot;CUSA00000-UPDATE&quot; where the CUSA ID matches the game&apos;s ID.</translation>
@ -1739,14 +1719,6 @@
<source>Browse:\nBrowse for a folder to set as the save data path.</source>
<translation type="unfinished">Browse:\nBrowse for a folder to set as the save data path.</translation>
</message>
<message>
<source>Borderless</source>
<translation type="unfinished">Borderless</translation>
</message>
<message>
<source>True</source>
<translation type="unfinished">True</translation>
</message>
<message>
<source>Release</source>
<translation type="unfinished">Release</translation>
@ -1791,6 +1763,46 @@
<source>Directory to save data</source>
<translation type="unfinished">Directory to save data</translation>
</message>
<message>
<source>Video</source>
<translation type="unfinished">Video</translation>
</message>
<message>
<source>Display Mode</source>
<translation type="unfinished">Display Mode</translation>
</message>
<message>
<source>Windowed</source>
<translation type="unfinished">Windowed</translation>
</message>
<message>
<source>Fullscreen</source>
<translation type="unfinished">Fullscreen</translation>
</message>
<message>
<source>Fullscreen (Borderless)</source>
<translation type="unfinished">Fullscreen (Borderless)</translation>
</message>
<message>
<source>Window Size</source>
<translation type="unfinished">Window Size</translation>
</message>
<message>
<source>W:</source>
<translation type="unfinished">W:</translation>
</message>
<message>
<source>H:</source>
<translation type="unfinished">H:</translation>
</message>
<message>
<source>Separate Log Files</source>
<translation type="unfinished">Separate Log Files</translation>
</message>
<message>
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation type="unfinished">Separate Log Files:\nWrites a separate logfile for each game.</translation>
</message>
</context>
<context>
<name>TrophyViewer</name>

View File

@ -1279,14 +1279,6 @@
<source>Emulator</source>
<translation>شبیه ساز</translation>
</message>
<message>
<source>Enable Fullscreen</source>
<translation>تمام صفحه</translation>
</message>
<message>
<source>Fullscreen Mode</source>
<translation>حالت تمام صفحه</translation>
</message>
<message>
<source>Enable Separate Update Folder</source>
<translation>فعالسازی پوشه جداگانه برای بهروزرسانی</translation>
@ -1379,14 +1371,6 @@
<source>Graphics Device</source>
<translation>کارت گرافیک مورداستفاده</translation>
</message>
<message>
<source>Width</source>
<translation>عرض</translation>
</message>
<message>
<source>Height</source>
<translation>طول</translation>
</message>
<message>
<source>Vblank Divider</source>
<translation>تقسیمکننده Vblank</translation>
@ -1559,10 +1543,6 @@
<source>Emulator Language:\nSets the language of the emulator&apos;s user interface.</source>
<translation>زبان شبیهساز:\nزبان رابط کاربری شبیهساز را انتخاب میکند.</translation>
</message>
<message>
<source>Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key.</source>
<translation>فعالسازی تمام صفحه:\nپنجره بازی را بهطور خودکار به حالت تمام صفحه در میآورد.\nبرای تغییر این حالت میتوانید کلید F11 را فشار دهید.</translation>
</message>
<message>
<source>Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name &quot;CUSA00000-UPDATE&quot; where the CUSA ID matches the game&apos;s ID.</source>
<translation>فعالسازی پوشه جداگانه برای بهروزرسانی:\nامکان نصب بهروزرسانیهای بازی در یک پوشه جداگانه برای مدیریت راحتتر را فراهم میکند.</translation>
@ -1739,14 +1719,6 @@
<source>Browse:\nBrowse for a folder to set as the save data path.</source>
<translation type="unfinished">Browse:\nBrowse for a folder to set as the save data path.</translation>
</message>
<message>
<source>Borderless</source>
<translation type="unfinished">Borderless</translation>
</message>
<message>
<source>True</source>
<translation type="unfinished">True</translation>
</message>
<message>
<source>Release</source>
<translation type="unfinished">Release</translation>
@ -1791,6 +1763,46 @@
<source>Directory to save data</source>
<translation type="unfinished">Directory to save data</translation>
</message>
<message>
<source>Video</source>
<translation type="unfinished">Video</translation>
</message>
<message>
<source>Display Mode</source>
<translation type="unfinished">Display Mode</translation>
</message>
<message>
<source>Windowed</source>
<translation type="unfinished">Windowed</translation>
</message>
<message>
<source>Fullscreen</source>
<translation type="unfinished">Fullscreen</translation>
</message>
<message>
<source>Fullscreen (Borderless)</source>
<translation type="unfinished">Fullscreen (Borderless)</translation>
</message>
<message>
<source>Window Size</source>
<translation type="unfinished">Window Size</translation>
</message>
<message>
<source>W:</source>
<translation type="unfinished">W:</translation>
</message>
<message>
<source>H:</source>
<translation type="unfinished">H:</translation>
</message>
<message>
<source>Separate Log Files</source>
<translation type="unfinished">Separate Log Files</translation>
</message>
<message>
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation type="unfinished">Separate Log Files:\nWrites a separate logfile for each game.</translation>
</message>
</context>
<context>
<name>TrophyViewer</name>

View File

@ -1279,14 +1279,6 @@
<source>Emulator</source>
<translation>Emulaattori</translation>
</message>
<message>
<source>Enable Fullscreen</source>
<translation>Ota Käyttöön Koko Ruudun Tila</translation>
</message>
<message>
<source>Fullscreen Mode</source>
<translation>Koko näytön tila</translation>
</message>
<message>
<source>Enable Separate Update Folder</source>
<translation>Ota Käyttöön Erillinen Päivityshakemisto</translation>
@ -1379,14 +1371,6 @@
<source>Graphics Device</source>
<translation>Näytönohjain</translation>
</message>
<message>
<source>Width</source>
<translation>Leveys</translation>
</message>
<message>
<source>Height</source>
<translation>Korkeus</translation>
</message>
<message>
<source>Vblank Divider</source>
<translation>Vblank jakaja</translation>
@ -1559,10 +1543,6 @@
<source>Emulator Language:\nSets the language of the emulator&apos;s user interface.</source>
<translation>Emulaattorin Kieli:\nAsettaa emulaattorin käyttöliittymän kielen.</translation>
</message>
<message>
<source>Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key.</source>
<translation>Ota Koko Näytön Tila Käyttöön:\nAvaa pelin ikkunan automaattisesti koko näytön tilassa.\nTilaa voi vaihtaa painamalla F11-näppäintä.</translation>
</message>
<message>
<source>Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name &quot;CUSA00000-UPDATE&quot; where the CUSA ID matches the game&apos;s ID.</source>
<translation>Ota Käyttöön Erillinen Päivityskansio:\nOttaa käyttöön päivitysten asennuksen erilliseen kansioon helpottamaan niiden hallintaa.\nTämä on tehtävissä manuaalisesti lisäämällä puretun päivityksen pelikansioon &quot;CUSA00000-UPDATE&quot; nimellä, missä CUSA ID vastaa pelin ID:tä.</translation>
@ -1739,14 +1719,6 @@
<source>Browse:\nBrowse for a folder to set as the save data path.</source>
<translation type="unfinished">Browse:\nBrowse for a folder to set as the save data path.</translation>
</message>
<message>
<source>Borderless</source>
<translation type="unfinished">Borderless</translation>
</message>
<message>
<source>True</source>
<translation type="unfinished">True</translation>
</message>
<message>
<source>Release</source>
<translation type="unfinished">Release</translation>
@ -1791,6 +1763,46 @@
<source>Directory to save data</source>
<translation type="unfinished">Directory to save data</translation>
</message>
<message>
<source>Video</source>
<translation type="unfinished">Video</translation>
</message>
<message>
<source>Display Mode</source>
<translation type="unfinished">Display Mode</translation>
</message>
<message>
<source>Windowed</source>
<translation type="unfinished">Windowed</translation>
</message>
<message>
<source>Fullscreen</source>
<translation type="unfinished">Fullscreen</translation>
</message>
<message>
<source>Fullscreen (Borderless)</source>
<translation type="unfinished">Fullscreen (Borderless)</translation>
</message>
<message>
<source>Window Size</source>
<translation type="unfinished">Window Size</translation>
</message>
<message>
<source>W:</source>
<translation type="unfinished">W:</translation>
</message>
<message>
<source>H:</source>
<translation type="unfinished">H:</translation>
</message>
<message>
<source>Separate Log Files</source>
<translation type="unfinished">Separate Log Files</translation>
</message>
<message>
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation type="unfinished">Separate Log Files:\nWrites a separate logfile for each game.</translation>
</message>
</context>
<context>
<name>TrophyViewer</name>

View File

@ -1279,14 +1279,6 @@
<source>Emulator</source>
<translation>Émulateur</translation>
</message>
<message>
<source>Enable Fullscreen</source>
<translation>Plein écran</translation>
</message>
<message>
<source>Fullscreen Mode</source>
<translation>Mode Plein Écran</translation>
</message>
<message>
<source>Enable Separate Update Folder</source>
<translation>Dossier séparé pour les mises à jour</translation>
@ -1379,14 +1371,6 @@
<source>Graphics Device</source>
<translation>Carte graphique</translation>
</message>
<message>
<source>Width</source>
<translation>Largeur</translation>
</message>
<message>
<source>Height</source>
<translation>Hauteur</translation>
</message>
<message>
<source>Vblank Divider</source>
<translation>Vblank</translation>
@ -1559,10 +1543,6 @@
<source>Emulator Language:\nSets the language of the emulator&apos;s user interface.</source>
<translation>Langue de l&apos;émulateur:\nDéfinit la langue de l&apos;interface utilisateur de l&apos;émulateur.</translation>
</message>
<message>
<source>Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key.</source>
<translation>Activer le mode plein écran:\nMet automatiquement la fenêtre du jeu en mode plein écran.\nCela peut être activé en appuyant sur la touche F11.</translation>
</message>
<message>
<source>Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name &quot;CUSA00000-UPDATE&quot; where the CUSA ID matches the game&apos;s ID.</source>
<translation>Dossier séparé pour les mises à jour:\nInstalle les mises à jours des jeux dans un dossier séparé pour une gestion plus facile.</translation>
@ -1739,14 +1719,6 @@
<source>Browse:\nBrowse for a folder to set as the save data path.</source>
<translation type="unfinished">Browse:\nBrowse for a folder to set as the save data path.</translation>
</message>
<message>
<source>Borderless</source>
<translation type="unfinished">Borderless</translation>
</message>
<message>
<source>True</source>
<translation type="unfinished">True</translation>
</message>
<message>
<source>Release</source>
<translation type="unfinished">Release</translation>
@ -1791,6 +1763,46 @@
<source>Directory to save data</source>
<translation type="unfinished">Directory to save data</translation>
</message>
<message>
<source>Video</source>
<translation type="unfinished">Video</translation>
</message>
<message>
<source>Display Mode</source>
<translation type="unfinished">Display Mode</translation>
</message>
<message>
<source>Windowed</source>
<translation type="unfinished">Windowed</translation>
</message>
<message>
<source>Fullscreen</source>
<translation type="unfinished">Fullscreen</translation>
</message>
<message>
<source>Fullscreen (Borderless)</source>
<translation type="unfinished">Fullscreen (Borderless)</translation>
</message>
<message>
<source>Window Size</source>
<translation type="unfinished">Window Size</translation>
</message>
<message>
<source>W:</source>
<translation type="unfinished">W:</translation>
</message>
<message>
<source>H:</source>
<translation type="unfinished">H:</translation>
</message>
<message>
<source>Separate Log Files</source>
<translation type="unfinished">Separate Log Files</translation>
</message>
<message>
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation type="unfinished">Separate Log Files:\nWrites a separate logfile for each game.</translation>
</message>
</context>
<context>
<name>TrophyViewer</name>

View File

@ -1279,14 +1279,6 @@
<source>Emulator</source>
<translation>Emulátor</translation>
</message>
<message>
<source>Enable Fullscreen</source>
<translation>Teljes Képernyő Engedélyezése</translation>
</message>
<message>
<source>Fullscreen Mode</source>
<translation>Teljes képernyős mód</translation>
</message>
<message>
<source>Enable Separate Update Folder</source>
<translation>Külön Frissítési Mappa Engedélyezése</translation>
@ -1379,14 +1371,6 @@
<source>Graphics Device</source>
<translation>Grafikai Eszköz</translation>
</message>
<message>
<source>Width</source>
<translation>Szélesség</translation>
</message>
<message>
<source>Height</source>
<translation>Magasság</translation>
</message>
<message>
<source>Vblank Divider</source>
<translation>Vblank Elosztó</translation>
@ -1559,10 +1543,6 @@
<source>Emulator Language:\nSets the language of the emulator&apos;s user interface.</source>
<translation>Emulátor nyelve:\nBeállítja az emulátor felhasználói felületének nyelvét.</translation>
</message>
<message>
<source>Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key.</source>
<translation>Teljes képernyő engedélyezése:\nAutomatikusan teljes képernyőre állítja a játék ablakát.\nEz a F11 billentyű megnyomásával kapcsolható ki/be.</translation>
</message>
<message>
<source>Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name &quot;CUSA00000-UPDATE&quot; where the CUSA ID matches the game&apos;s ID.</source>
<translation>Külön Frissítéi Mappa Engedélyezése:\nEngedélyezi a frissítések külön mappába helyezését, a könnyű kezelésük érdekében.</translation>
@ -1739,14 +1719,6 @@
<source>Browse:\nBrowse for a folder to set as the save data path.</source>
<translation type="unfinished">Browse:\nBrowse for a folder to set as the save data path.</translation>
</message>
<message>
<source>Borderless</source>
<translation type="unfinished">Borderless</translation>
</message>
<message>
<source>True</source>
<translation type="unfinished">True</translation>
</message>
<message>
<source>Release</source>
<translation type="unfinished">Release</translation>
@ -1791,6 +1763,46 @@
<source>Directory to save data</source>
<translation type="unfinished">Directory to save data</translation>
</message>
<message>
<source>Video</source>
<translation type="unfinished">Video</translation>
</message>
<message>
<source>Display Mode</source>
<translation type="unfinished">Display Mode</translation>
</message>
<message>
<source>Windowed</source>
<translation type="unfinished">Windowed</translation>
</message>
<message>
<source>Fullscreen</source>
<translation type="unfinished">Fullscreen</translation>
</message>
<message>
<source>Fullscreen (Borderless)</source>
<translation type="unfinished">Fullscreen (Borderless)</translation>
</message>
<message>
<source>Window Size</source>
<translation type="unfinished">Window Size</translation>
</message>
<message>
<source>W:</source>
<translation type="unfinished">W:</translation>
</message>
<message>
<source>H:</source>
<translation type="unfinished">H:</translation>
</message>
<message>
<source>Separate Log Files</source>
<translation type="unfinished">Separate Log Files</translation>
</message>
<message>
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation type="unfinished">Separate Log Files:\nWrites a separate logfile for each game.</translation>
</message>
</context>
<context>
<name>TrophyViewer</name>

View File

@ -1279,14 +1279,6 @@
<source>Emulator</source>
<translation type="unfinished">Emulator</translation>
</message>
<message>
<source>Enable Fullscreen</source>
<translation type="unfinished">Enable Fullscreen</translation>
</message>
<message>
<source>Fullscreen Mode</source>
<translation>Mode Layar Penuh</translation>
</message>
<message>
<source>Enable Separate Update Folder</source>
<translation type="unfinished">Enable Separate Update Folder</translation>
@ -1379,14 +1371,6 @@
<source>Graphics Device</source>
<translation type="unfinished">Graphics Device</translation>
</message>
<message>
<source>Width</source>
<translation type="unfinished">Width</translation>
</message>
<message>
<source>Height</source>
<translation type="unfinished">Height</translation>
</message>
<message>
<source>Vblank Divider</source>
<translation type="unfinished">Vblank Divider</translation>
@ -1559,10 +1543,6 @@
<source>Emulator Language:\nSets the language of the emulator&apos;s user interface.</source>
<translation>Bahasa Emulator:\nMenetapkan bahasa antarmuka pengguna emulator.</translation>
</message>
<message>
<source>Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key.</source>
<translation>Aktifkan Mode Layar Penuh:\nSecara otomatis menempatkan jendela permainan dalam mode layar penuh.\nIni dapat dinonaktifkan dengan menekan tombol F11.</translation>
</message>
<message>
<source>Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name &quot;CUSA00000-UPDATE&quot; where the CUSA ID matches the game&apos;s ID.</source>
<translation>Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.</translation>
@ -1739,14 +1719,6 @@
<source>Browse:\nBrowse for a folder to set as the save data path.</source>
<translation type="unfinished">Browse:\nBrowse for a folder to set as the save data path.</translation>
</message>
<message>
<source>Borderless</source>
<translation type="unfinished">Borderless</translation>
</message>
<message>
<source>True</source>
<translation type="unfinished">True</translation>
</message>
<message>
<source>Release</source>
<translation type="unfinished">Release</translation>
@ -1791,6 +1763,46 @@
<source>Directory to save data</source>
<translation type="unfinished">Directory to save data</translation>
</message>
<message>
<source>Video</source>
<translation type="unfinished">Video</translation>
</message>
<message>
<source>Display Mode</source>
<translation type="unfinished">Display Mode</translation>
</message>
<message>
<source>Windowed</source>
<translation type="unfinished">Windowed</translation>
</message>
<message>
<source>Fullscreen</source>
<translation type="unfinished">Fullscreen</translation>
</message>
<message>
<source>Fullscreen (Borderless)</source>
<translation type="unfinished">Fullscreen (Borderless)</translation>
</message>
<message>
<source>Window Size</source>
<translation type="unfinished">Window Size</translation>
</message>
<message>
<source>W:</source>
<translation type="unfinished">W:</translation>
</message>
<message>
<source>H:</source>
<translation type="unfinished">H:</translation>
</message>
<message>
<source>Separate Log Files</source>
<translation type="unfinished">Separate Log Files</translation>
</message>
<message>
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation type="unfinished">Separate Log Files:\nWrites a separate logfile for each game.</translation>
</message>
</context>
<context>
<name>TrophyViewer</name>

View File

@ -1279,14 +1279,6 @@
<source>Emulator</source>
<translation>Emulatore</translation>
</message>
<message>
<source>Enable Fullscreen</source>
<translation>Abilita Schermo Intero</translation>
</message>
<message>
<source>Fullscreen Mode</source>
<translation>Modalità Schermo Intero</translation>
</message>
<message>
<source>Enable Separate Update Folder</source>
<translation>Abilita Cartella Aggiornamenti Separata</translation>
@ -1379,14 +1371,6 @@
<source>Graphics Device</source>
<translation>Scheda Grafica</translation>
</message>
<message>
<source>Width</source>
<translation>Larghezza</translation>
</message>
<message>
<source>Height</source>
<translation>Altezza</translation>
</message>
<message>
<source>Vblank Divider</source>
<translation>Divisore Vblank</translation>
@ -1559,10 +1543,6 @@
<source>Emulator Language:\nSets the language of the emulator&apos;s user interface.</source>
<translation>Lingua dell&apos;Emulatore:\nImposta la lingua dell&apos;interfaccia utente dell&apos;emulatore.</translation>
</message>
<message>
<source>Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key.</source>
<translation>Abilita Schermo Intero:\nMetti automaticamente la finestra di gioco in modalità schermo intero.\nQuesto può essere disattivato premendo il tasto F11.</translation>
</message>
<message>
<source>Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name &quot;CUSA00000-UPDATE&quot; where the CUSA ID matches the game&apos;s ID.</source>
<translation>Abilita Cartella Aggiornamenti Separata:\nAbilita l&apos;installazione degli aggiornamenti in una cartella separata per una più facile gestione.</translation>
@ -1739,14 +1719,6 @@
<source>Browse:\nBrowse for a folder to set as the save data path.</source>
<translation>Esplora:\nEsplora una cartella da impostare come percorso dati di salvataggio.</translation>
</message>
<message>
<source>Borderless</source>
<translation>Finestra senza bordi</translation>
</message>
<message>
<source>True</source>
<translation>Vero</translation>
</message>
<message>
<source>Release</source>
<translation>Rilascio</translation>
@ -1791,6 +1763,46 @@
<source>Directory to save data</source>
<translation>Cartella per salvare i dati</translation>
</message>
<message>
<source>Video</source>
<translation>Video</translation>
</message>
<message>
<source>Display Mode</source>
<translation>Modalità di visualizzazione</translation>
</message>
<message>
<source>Windowed</source>
<translation>In finestra</translation>
</message>
<message>
<source>Fullscreen</source>
<translation>Schermo Intero</translation>
</message>
<message>
<source>Fullscreen (Borderless)</source>
<translation>Schermo Intero (Senza Bordi)</translation>
</message>
<message>
<source>Window Size</source>
<translation>Dimensione Finestra</translation>
</message>
<message>
<source>W:</source>
<translation>L:</translation>
</message>
<message>
<source>H:</source>
<translation>A:</translation>
</message>
<message>
<source>Separate Log Files</source>
<translation>File Di Registro Separati</translation>
</message>
<message>
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation>File di registro separati:\nScrive un file di registro separato per ogni gioco.</translation>
</message>
</context>
<context>
<name>TrophyViewer</name>

View File

@ -1279,14 +1279,6 @@
<source>Emulator</source>
<translation></translation>
</message>
<message>
<source>Enable Fullscreen</source>
<translation></translation>
</message>
<message>
<source>Fullscreen Mode</source>
<translation></translation>
</message>
<message>
<source>Enable Separate Update Folder</source>
<translation></translation>
@ -1379,14 +1371,6 @@
<source>Graphics Device</source>
<translation></translation>
</message>
<message>
<source>Width</source>
<translation></translation>
</message>
<message>
<source>Height</source>
<translation></translation>
</message>
<message>
<source>Vblank Divider</source>
<translation>Vblankディバイダー</translation>
@ -1559,10 +1543,6 @@
<source>Emulator Language:\nSets the language of the emulator&apos;s user interface.</source>
<translation>:\nエミュレーターのユーザーインターフェースの言語を設定します</translation>
</message>
<message>
<source>Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key.</source>
<translation>:\nゲームウィンドウを自動的に全画面モードにします\nF11キーを押すことで切り替えることができます</translation>
</message>
<message>
<source>Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name &quot;CUSA00000-UPDATE&quot; where the CUSA ID matches the game&apos;s ID.</source>
<translation>Enable Separate Update Folder:\nゲームのアップデートを別のフォルダにインストールすることで</translation>
@ -1739,14 +1719,6 @@
<source>Browse:\nBrowse for a folder to set as the save data path.</source>
<translation type="unfinished">Browse:\nBrowse for a folder to set as the save data path.</translation>
</message>
<message>
<source>Borderless</source>
<translation></translation>
</message>
<message>
<source>True</source>
<translation type="unfinished">True</translation>
</message>
<message>
<source>Release</source>
<translation>Release</translation>
@ -1791,6 +1763,46 @@
<source>Directory to save data</source>
<translation type="unfinished">Directory to save data</translation>
</message>
<message>
<source>Video</source>
<translation type="unfinished">Video</translation>
</message>
<message>
<source>Display Mode</source>
<translation type="unfinished">Display Mode</translation>
</message>
<message>
<source>Windowed</source>
<translation type="unfinished">Windowed</translation>
</message>
<message>
<source>Fullscreen</source>
<translation type="unfinished">Fullscreen</translation>
</message>
<message>
<source>Fullscreen (Borderless)</source>
<translation type="unfinished">Fullscreen (Borderless)</translation>
</message>
<message>
<source>Window Size</source>
<translation type="unfinished">Window Size</translation>
</message>
<message>
<source>W:</source>
<translation type="unfinished">W:</translation>
</message>
<message>
<source>H:</source>
<translation type="unfinished">H:</translation>
</message>
<message>
<source>Separate Log Files</source>
<translation type="unfinished">Separate Log Files</translation>
</message>
<message>
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation type="unfinished">Separate Log Files:\nWrites a separate logfile for each game.</translation>
</message>
</context>
<context>
<name>TrophyViewer</name>

View File

@ -1279,14 +1279,6 @@
<source>Emulator</source>
<translation type="unfinished">Emulator</translation>
</message>
<message>
<source>Enable Fullscreen</source>
<translation type="unfinished">Enable Fullscreen</translation>
</message>
<message>
<source>Fullscreen Mode</source>
<translation> </translation>
</message>
<message>
<source>Enable Separate Update Folder</source>
<translation type="unfinished">Enable Separate Update Folder</translation>
@ -1379,14 +1371,6 @@
<source>Graphics Device</source>
<translation type="unfinished">Graphics Device</translation>
</message>
<message>
<source>Width</source>
<translation type="unfinished">Width</translation>
</message>
<message>
<source>Height</source>
<translation type="unfinished">Height</translation>
</message>
<message>
<source>Vblank Divider</source>
<translation type="unfinished">Vblank Divider</translation>
@ -1559,10 +1543,6 @@
<source>Emulator Language:\nSets the language of the emulator&apos;s user interface.</source>
<translation type="unfinished">Emulator Language:\nSets the language of the emulator&apos;s user interface.</translation>
</message>
<message>
<source>Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key.</source>
<translation type="unfinished">Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key.</translation>
</message>
<message>
<source>Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name &quot;CUSA00000-UPDATE&quot; where the CUSA ID matches the game&apos;s ID.</source>
<translation type="unfinished">Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name &quot;CUSA00000-UPDATE&quot; where the CUSA ID matches the game&apos;s ID.</translation>
@ -1739,14 +1719,6 @@
<source>Browse:\nBrowse for a folder to set as the save data path.</source>
<translation type="unfinished">Browse:\nBrowse for a folder to set as the save data path.</translation>
</message>
<message>
<source>Borderless</source>
<translation type="unfinished">Borderless</translation>
</message>
<message>
<source>True</source>
<translation type="unfinished">True</translation>
</message>
<message>
<source>Release</source>
<translation type="unfinished">Release</translation>
@ -1791,6 +1763,46 @@
<source>Directory to save data</source>
<translation type="unfinished">Directory to save data</translation>
</message>
<message>
<source>Video</source>
<translation type="unfinished">Video</translation>
</message>
<message>
<source>Display Mode</source>
<translation type="unfinished">Display Mode</translation>
</message>
<message>
<source>Windowed</source>
<translation type="unfinished">Windowed</translation>
</message>
<message>
<source>Fullscreen</source>
<translation type="unfinished">Fullscreen</translation>
</message>
<message>
<source>Fullscreen (Borderless)</source>
<translation type="unfinished">Fullscreen (Borderless)</translation>
</message>
<message>
<source>Window Size</source>
<translation type="unfinished">Window Size</translation>
</message>
<message>
<source>W:</source>
<translation type="unfinished">W:</translation>
</message>
<message>
<source>H:</source>
<translation type="unfinished">H:</translation>
</message>
<message>
<source>Separate Log Files</source>
<translation type="unfinished">Separate Log Files</translation>
</message>
<message>
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation type="unfinished">Separate Log Files:\nWrites a separate logfile for each game.</translation>
</message>
</context>
<context>
<name>TrophyViewer</name>

View File

@ -1279,14 +1279,6 @@
<source>Emulator</source>
<translation type="unfinished">Emulator</translation>
</message>
<message>
<source>Enable Fullscreen</source>
<translation type="unfinished">Enable Fullscreen</translation>
</message>
<message>
<source>Fullscreen Mode</source>
<translation>Viso ekranas</translation>
</message>
<message>
<source>Enable Separate Update Folder</source>
<translation type="unfinished">Enable Separate Update Folder</translation>
@ -1379,14 +1371,6 @@
<source>Graphics Device</source>
<translation type="unfinished">Graphics Device</translation>
</message>
<message>
<source>Width</source>
<translation type="unfinished">Width</translation>
</message>
<message>
<source>Height</source>
<translation type="unfinished">Height</translation>
</message>
<message>
<source>Vblank Divider</source>
<translation type="unfinished">Vblank Divider</translation>
@ -1559,10 +1543,6 @@
<source>Emulator Language:\nSets the language of the emulator&apos;s user interface.</source>
<translation>Emuliatoriaus kalba:\nNustato emuliatoriaus vartotojo sąsajos kalbą.</translation>
</message>
<message>
<source>Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key.</source>
<translation>Įjungti visą ekraną:\nAutomatiškai perjungia žaidimo langą į viso ekrano režimą.\nTai galima išjungti paspaudus F11 klavišą.</translation>
</message>
<message>
<source>Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name &quot;CUSA00000-UPDATE&quot; where the CUSA ID matches the game&apos;s ID.</source>
<translation type="unfinished">Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name &quot;CUSA00000-UPDATE&quot; where the CUSA ID matches the game&apos;s ID.</translation>
@ -1739,14 +1719,6 @@
<source>Browse:\nBrowse for a folder to set as the save data path.</source>
<translation type="unfinished">Browse:\nBrowse for a folder to set as the save data path.</translation>
</message>
<message>
<source>Borderless</source>
<translation type="unfinished">Borderless</translation>
</message>
<message>
<source>True</source>
<translation type="unfinished">True</translation>
</message>
<message>
<source>Release</source>
<translation type="unfinished">Release</translation>
@ -1791,6 +1763,46 @@
<source>Directory to save data</source>
<translation type="unfinished">Directory to save data</translation>
</message>
<message>
<source>Video</source>
<translation type="unfinished">Video</translation>
</message>
<message>
<source>Display Mode</source>
<translation type="unfinished">Display Mode</translation>
</message>
<message>
<source>Windowed</source>
<translation type="unfinished">Windowed</translation>
</message>
<message>
<source>Fullscreen</source>
<translation type="unfinished">Fullscreen</translation>
</message>
<message>
<source>Fullscreen (Borderless)</source>
<translation type="unfinished">Fullscreen (Borderless)</translation>
</message>
<message>
<source>Window Size</source>
<translation type="unfinished">Window Size</translation>
</message>
<message>
<source>W:</source>
<translation type="unfinished">W:</translation>
</message>
<message>
<source>H:</source>
<translation type="unfinished">H:</translation>
</message>
<message>
<source>Separate Log Files</source>
<translation type="unfinished">Separate Log Files</translation>
</message>
<message>
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation type="unfinished">Separate Log Files:\nWrites a separate logfile for each game.</translation>
</message>
</context>
<context>
<name>TrophyViewer</name>

View File

@ -70,11 +70,11 @@
</message>
<message>
<source>Do you want to delete the selected file?\n%1</source>
<translation>Ønsker du å slette den valgte filen?\n%1</translation>
<translation>Ønsker du å slette den valgte fila?\n%1</translation>
</message>
<message>
<source>Select Patch File:</source>
<translation>Velg programrettelse-filen:</translation>
<translation>Velg programrettelse-fila:</translation>
</message>
<message>
<source>Download Patches</source>
@ -110,11 +110,11 @@
</message>
<message>
<source>Unable to open the file for reading.</source>
<translation>Kan ikke åpne filen for lesing.</translation>
<translation>Kan ikke åpne fila for lesing.</translation>
</message>
<message>
<source>Unable to open the file for writing.</source>
<translation>Kan ikke åpne filen for skriving.</translation>
<translation>Kan ikke åpne fila for skriving.</translation>
</message>
<message>
<source>Failed to parse XML: </source>
@ -138,19 +138,19 @@
</message>
<message>
<source>File Exists</source>
<translation>Filen eksisterer</translation>
<translation>Fila eksisterer</translation>
</message>
<message>
<source>File already exists. Do you want to replace it?</source>
<translation>Filen eksisterer allerede. Ønsker du å erstatte den?</translation>
<translation>Fila eksisterer allerede. Ønsker du å erstatte den?</translation>
</message>
<message>
<source>Failed to save file:</source>
<translation>Kunne ikke lagre filen:</translation>
<translation>Kunne ikke lagre fila:</translation>
</message>
<message>
<source>Failed to download file:</source>
<translation>Kunne ikke laste ned filen:</translation>
<translation>Kunne ikke laste ned fila:</translation>
</message>
<message>
<source>Cheats Not Found</source>
@ -166,7 +166,7 @@
</message>
<message>
<source>You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list.</source>
<translation>Du har lastet ned juks for denne versjonen av spillet fra den valgte pakkebrønnen. Du kan prøve å laste ned fra en annen pakkebrønn, hvis det er tilgjengelig, vil det også være mulig å bruke det ved å velge filen fra listen.</translation>
<translation>Du har lastet ned juks for denne versjonen av spillet fra den valgte pakkebrønnen. Du kan prøve å laste ned fra en annen pakkebrønn, hvis det er tilgjengelig, vil det også være mulig å bruke det ved å velge fila fra lista.</translation>
</message>
<message>
<source>Failed to save:</source>
@ -210,7 +210,7 @@
</message>
<message>
<source>Failed to open file:</source>
<translation>Kunne ikke åpne filen:</translation>
<translation>Kunne ikke åpne fila:</translation>
</message>
<message>
<source>XML ERROR:</source>
@ -341,7 +341,7 @@
</message>
<message>
<source>Failed to save the update file at</source>
<translation>Kunne ikke lagre oppdateringsfilen </translation>
<translation>Kunne ikke lagre oppdateringsfila </translation>
</message>
<message>
<source>Starting Update...</source>
@ -349,7 +349,7 @@
</message>
<message>
<source>Failed to create the update script file</source>
<translation>Kunne ikke opprette oppdateringsskriptfilen</translation>
<translation>Kunne ikke opprette oppdateringsskriptfila</translation>
</message>
</context>
<context>
@ -479,7 +479,7 @@
</message>
<message>
<source>Options / Start</source>
<translation type="unfinished">Options / Start</translation>
<translation>Options / Start</translation>
</message>
<message>
<source>R3</source>
@ -519,27 +519,27 @@
</message>
<message>
<source>Color Adjustment</source>
<translation type="unfinished">Color Adjustment</translation>
<translation>Fargejustering</translation>
</message>
<message>
<source>R:</source>
<translation type="unfinished">R:</translation>
<translation>R:</translation>
</message>
<message>
<source>G:</source>
<translation type="unfinished">G:</translation>
<translation>G:</translation>
</message>
<message>
<source>B:</source>
<translation type="unfinished">B:</translation>
<translation>B:</translation>
</message>
<message>
<source>Override Lightbar Color</source>
<translation type="unfinished">Override Lightbar Color</translation>
<translation>Overstyr farge lyslinja</translation>
</message>
<message>
<source>Override Color</source>
<translation type="unfinished">Override Color</translation>
<translation>Overstyr farge</translation>
</message>
</context>
<context>
@ -553,7 +553,7 @@
<name>GameInfoClass</name>
<message>
<source>Loading game list, please wait :3</source>
<translation>Laster spill-liste, vennligst vent :3</translation>
<translation>Laster spilliste, vennligst vent :3</translation>
</message>
<message>
<source>Cancel</source>
@ -572,7 +572,7 @@
</message>
<message>
<source>Directory to install games</source>
<translation>Mappe for å installere spill</translation>
<translation>Mappe for installering av spill</translation>
</message>
<message>
<source>Browse</source>
@ -584,7 +584,7 @@
</message>
<message>
<source>Directory to install DLC</source>
<translation>Mappe for å installere DLC</translation>
<translation>Mappe for installering av DLC</translation>
</message>
</context>
<context>
@ -717,7 +717,7 @@
</message>
<message>
<source>Trophy Viewer</source>
<translation>Trofé viser</translation>
<translation>Troféviser</translation>
</message>
<message>
<source>Open Folder...</source>
@ -865,7 +865,7 @@
</message>
<message>
<source>SFO Viewer for </source>
<translation type="unfinished">SFO Viewer for </translation>
<translation>SFO-viser for </translation>
</message>
</context>
<context>
@ -939,11 +939,11 @@
</message>
<message>
<source>Show Game List</source>
<translation>Vis spill-listen</translation>
<translation>Vis spilliste</translation>
</message>
<message>
<source>Game List Refresh</source>
<translation>Oppdater spill-listen</translation>
<translation>Oppdater spillista</translation>
</message>
<message>
<source>Tiny</source>
@ -983,11 +983,11 @@
</message>
<message>
<source>Dump Game List</source>
<translation>Dump spill-liste</translation>
<translation>Dump spilliste</translation>
</message>
<message>
<source>PKG Viewer</source>
<translation>PKG viser</translation>
<translation>PKG-viser</translation>
</message>
<message>
<source>Search...</source>
@ -1003,11 +1003,11 @@
</message>
<message>
<source>Game List Icons</source>
<translation>Spill-liste ikoner</translation>
<translation>Spilliste ikoner</translation>
</message>
<message>
<source>Game List Mode</source>
<translation>Spill-liste modus</translation>
<translation>Spilliste modus</translation>
</message>
<message>
<source>Settings</source>
@ -1051,7 +1051,7 @@
</message>
<message>
<source>Game List</source>
<translation>Spill-liste</translation>
<translation>Spilliste</translation>
</message>
<message>
<source> * Unsupported Vulkan Version</source>
@ -1159,7 +1159,7 @@
</message>
<message>
<source>File doesn&apos;t appear to be a valid PKG file</source>
<translation>Filen ser ikke ut til å være en gyldig PKG-fil</translation>
<translation>Fila ser ikke ut til å være en gyldig PKG-fil</translation>
</message>
<message>
<source>Run Game</source>
@ -1279,14 +1279,6 @@
<source>Emulator</source>
<translation>Emulator</translation>
</message>
<message>
<source>Enable Fullscreen</source>
<translation>Bruk fullskjerm</translation>
</message>
<message>
<source>Fullscreen Mode</source>
<translation>Fullskjermmodus</translation>
</message>
<message>
<source>Enable Separate Update Folder</source>
<translation>Bruk seperat oppdateringsmappe</translation>
@ -1297,7 +1289,7 @@
</message>
<message>
<source>Show Game Size In List</source>
<translation>Vis spillstørrelse i listen</translation>
<translation>Vis spillstørrelse i lista</translation>
</message>
<message>
<source>Show Splash</source>
@ -1325,11 +1317,11 @@
</message>
<message>
<source>Log Type</source>
<translation>Logg type</translation>
<translation>Loggføringstype</translation>
</message>
<message>
<source>Log Filter</source>
<translation>Logg filter</translation>
<translation>Loggfilter</translation>
</message>
<message>
<source>Open Log Location</source>
@ -1379,14 +1371,6 @@
<source>Graphics Device</source>
<translation>Grafikkenhet</translation>
</message>
<message>
<source>Width</source>
<translation>Bredde</translation>
</message>
<message>
<source>Height</source>
<translation>Høyde</translation>
</message>
<message>
<source>Vblank Divider</source>
<translation>Vblank skillelinje</translation>
@ -1437,7 +1421,7 @@
</message>
<message>
<source>Enable Vulkan Synchronization Validation</source>
<translation>Bruk Vulkan Validation Layers</translation>
<translation>Bruk Vulkan Synchronization Validation</translation>
</message>
<message>
<source>Enable RenderDoc Debugging</source>
@ -1559,10 +1543,6 @@
<source>Emulator Language:\nSets the language of the emulator&apos;s user interface.</source>
<translation>Emulatorspråket:\nAngir språket for emulatorens brukergrensesnitt.</translation>
</message>
<message>
<source>Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key.</source>
<translation>Bruk fullskjerm:\nSetter spillvinduet automatisk i fullskjermmodus.\nDette kan slås av ved å trykke F11-tasten.</translation>
</message>
<message>
<source>Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name &quot;CUSA00000-UPDATE&quot; where the CUSA ID matches the game&apos;s ID.</source>
<translation>Bruk separat oppdateringsmappe:\n Gjør det mulig å installere spilloppdateringer i en egen mappe for enkel administrasjon.\nDette kan gjøres manuelt ved å legge til den utpakkede oppdateringen, til spillmappa med navnet &quot;CUSA00000-UPDATE&quot; der CUSA-ID-en samsvarer med spillets-ID.</translation>
@ -1585,15 +1565,15 @@
</message>
<message>
<source>Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation.</source>
<translation>Logg type:\nAngir om loggvinduets utdata skal synkroniseres for ytelse. Kan ha negative effekter for emulatoren.</translation>
<translation>Loggføringstype:\nAngir om loggvinduets utdata skal synkroniseres for ytelse. Kan ha negative effekter for emulatoren.</translation>
</message>
<message>
<source>Log Filter:\nFilters the log to only print specific information.\nExamples: &quot;Core:Trace&quot; &quot;Lib.Pad:Debug Common.Filesystem:Error&quot; &quot;*:Critical&quot;\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it.</source>
<translation>Logg filter:\nFiltrerer loggen for å kun skrive ut spesifikk informasjon.\nEksempler: &quot;Core:Trace&quot; &quot;Lib.Pad:Debug Common.Filesystem:Error&quot; &quot;*:Critical&quot; Nivåer: Trace, Debug, Info, Warning, Error, Critical - i denne rekkefølgen, et spesifikt nivå demper alle tidligere nivåer i listen og logger alle nivåer etter det.</translation>
<translation>Loggfilter:\nFiltrerer loggen for å kun skrive ut spesifikk informasjon.\nEksempler: &quot;Core:Trace&quot; &quot;Lib.Pad:Debug Common.Filesystem:Error&quot; &quot;*:Critical&quot; \nNivåer: Trace, Debug, Info, Warning, Error, Critical - i denne rekkefølgen, et spesifikt nivå demper alle tidligere nivåer i lista og loggfører alle nivåer etter det.</translation>
</message>
<message>
<source>Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable.</source>
<translation>Oppdatering:\nRelease: Offisielle versjoner utgitt hver måned som kan være veldig utdaterte, men er mer pålitelige og testet.\nNightly: Utviklingsversjoner som har alle de nyeste funksjonene og feilrettingene, men som kan inneholde feil og er mindre stabile.</translation>
<translation>Oppdatering:\nOffisiell: Offisielle versjoner utgitt hver måned som kan være veldig utdaterte, men er mer pålitelige og testet.\nNattlig: Utviklingsversjoner som har alle de nyeste funksjonene og feilrettingene, men som kan inneholde feil og er mindre stabile.</translation>
</message>
<message>
<source>Background Image:\nControl the opacity of the game background image.</source>
@ -1661,7 +1641,7 @@
</message>
<message>
<source>Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select &quot;Auto Select&quot; to automatically determine it.</source>
<translation>Grafikkenhet:\nI systemer med flere GPU-er, velg GPU-en emulatoren skal bruke fra rullegardinlisten,\neller &quot;Velg automatisk&quot;.</translation>
<translation>Grafikkenhet:\nI systemer med flere GPU-er, velg GPU-en emulatoren skal bruke fra rullegardinlista,\neller &quot;Velg automatisk&amp;quot.</translation>
</message>
<message>
<source>Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution.</source>
@ -1689,11 +1669,11 @@
</message>
<message>
<source>Add:\nAdd a folder to the list.</source>
<translation>Legg til:\nLegg til en mappe til listen.</translation>
<translation>Legg til:\nLegg til en mappe til lista.</translation>
</message>
<message>
<source>Remove:\nRemove a folder from the list.</source>
<translation>Fjern:\nFjern en mappe fra listen.</translation>
<translation>Fjern:\nFjern en mappe fra lista.</translation>
</message>
<message>
<source>Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory.</source>
@ -1701,11 +1681,11 @@
</message>
<message>
<source>Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation.</source>
<translation>Bruk Vulkan Validation Layers:\nAktiverer et system som bekrefter tilstanden til Vulkan-gjengiveren og logger informasjon om dens indre tilstand.\n Dette vil redusere ytelsen og sannsynligvis endre emulatorens atferd.</translation>
<translation>Bruk Vulkan Validation Layers:\nAktiverer et system som bekrefter tilstanden til Vulkan-gjengiveren og loggfører informasjon om dens indre tilstand.\n Dette vil redusere ytelsen og sannsynligvis endre emulatorens atferd.</translation>
</message>
<message>
<source>Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation.</source>
<translation>Bruk Vulkan synkronisering validering:\nEt system som bekrefter frekvens tiden av Vulkan-gjengivelseoppgaver.\nDette vil redusere ytelsen og sannsynligvis endre emulatorens atferd.</translation>
<translation>Bruk Vulkan Synchronization Validation:\nEt system som bekrefter frekvens tiden av Vulkan-gjengivelseoppgaver.\nDette vil redusere ytelsen og sannsynligvis endre emulatorens atferd.</translation>
</message>
<message>
<source>Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame.</source>
@ -1739,21 +1719,13 @@
<source>Browse:\nBrowse for a folder to set as the save data path.</source>
<translation>Endre mappe:\nEndrer hvilken mappe shadPS4 skal lagre data til.</translation>
</message>
<message>
<source>Borderless</source>
<translation>Kantløs</translation>
</message>
<message>
<source>True</source>
<translation>Sant</translation>
</message>
<message>
<source>Release</source>
<translation type="unfinished">Release</translation>
<translation>Offisiell</translation>
</message>
<message>
<source>Nightly</source>
<translation type="unfinished">Nightly</translation>
<translation>Nattlig</translation>
</message>
<message>
<source>Set the volume of the background music.</source>
@ -1773,11 +1745,11 @@
</message>
<message>
<source>async</source>
<translation type="unfinished">async</translation>
<translation>asynkron</translation>
</message>
<message>
<source>sync</source>
<translation type="unfinished">sync</translation>
<translation>synkron</translation>
</message>
<message>
<source>Auto Select</source>
@ -1791,12 +1763,52 @@
<source>Directory to save data</source>
<translation>Mappe for lagring av data</translation>
</message>
<message>
<source>Video</source>
<translation>Video</translation>
</message>
<message>
<source>Display Mode</source>
<translation>Skjermmodus</translation>
</message>
<message>
<source>Windowed</source>
<translation>I vindu</translation>
</message>
<message>
<source>Fullscreen</source>
<translation>Fullskjerm</translation>
</message>
<message>
<source>Fullscreen (Borderless)</source>
<translation>Fullskjerm i vindu</translation>
</message>
<message>
<source>Window Size</source>
<translation>Vindustørrelse</translation>
</message>
<message>
<source>W:</source>
<translation>B:</translation>
</message>
<message>
<source>H:</source>
<translation>H:</translation>
</message>
<message>
<source>Separate Log Files</source>
<translation>Separate loggfiler</translation>
</message>
<message>
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation>Separate loggfiler:\nOppretter en separat loggfil for hvert spill.</translation>
</message>
</context>
<context>
<name>TrophyViewer</name>
<message>
<source>Trophy Viewer</source>
<translation>Trofé viser</translation>
<translation>Troféviser</translation>
</message>
</context>
</TS>

View File

@ -1279,14 +1279,6 @@
<source>Emulator</source>
<translation type="unfinished">Emulator</translation>
</message>
<message>
<source>Enable Fullscreen</source>
<translation type="unfinished">Enable Fullscreen</translation>
</message>
<message>
<source>Fullscreen Mode</source>
<translation>Volledig schermmodus</translation>
</message>
<message>
<source>Enable Separate Update Folder</source>
<translation type="unfinished">Enable Separate Update Folder</translation>
@ -1379,14 +1371,6 @@
<source>Graphics Device</source>
<translation type="unfinished">Graphics Device</translation>
</message>
<message>
<source>Width</source>
<translation type="unfinished">Width</translation>
</message>
<message>
<source>Height</source>
<translation type="unfinished">Height</translation>
</message>
<message>
<source>Vblank Divider</source>
<translation type="unfinished">Vblank Divider</translation>
@ -1559,10 +1543,6 @@
<source>Emulator Language:\nSets the language of the emulator&apos;s user interface.</source>
<translation>Emulator Taal:\nStelt de taal van de gebruikersinterface van de emulator in.</translation>
</message>
<message>
<source>Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key.</source>
<translation>Volledig scherm inschakelen:\nZet het gamevenster automatisch in de volledig scherm modus.\nDit kan worden omgeschakeld door op de F11-toets te drukken.</translation>
</message>
<message>
<source>Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name &quot;CUSA00000-UPDATE&quot; where the CUSA ID matches the game&apos;s ID.</source>
<translation>Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.</translation>
@ -1739,14 +1719,6 @@
<source>Browse:\nBrowse for a folder to set as the save data path.</source>
<translation type="unfinished">Browse:\nBrowse for a folder to set as the save data path.</translation>
</message>
<message>
<source>Borderless</source>
<translation type="unfinished">Borderless</translation>
</message>
<message>
<source>True</source>
<translation type="unfinished">True</translation>
</message>
<message>
<source>Release</source>
<translation type="unfinished">Release</translation>
@ -1791,6 +1763,46 @@
<source>Directory to save data</source>
<translation type="unfinished">Directory to save data</translation>
</message>
<message>
<source>Video</source>
<translation type="unfinished">Video</translation>
</message>
<message>
<source>Display Mode</source>
<translation type="unfinished">Display Mode</translation>
</message>
<message>
<source>Windowed</source>
<translation type="unfinished">Windowed</translation>
</message>
<message>
<source>Fullscreen</source>
<translation type="unfinished">Fullscreen</translation>
</message>
<message>
<source>Fullscreen (Borderless)</source>
<translation type="unfinished">Fullscreen (Borderless)</translation>
</message>
<message>
<source>Window Size</source>
<translation type="unfinished">Window Size</translation>
</message>
<message>
<source>W:</source>
<translation type="unfinished">W:</translation>
</message>
<message>
<source>H:</source>
<translation type="unfinished">H:</translation>
</message>
<message>
<source>Separate Log Files</source>
<translation type="unfinished">Separate Log Files</translation>
</message>
<message>
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation type="unfinished">Separate Log Files:\nWrites a separate logfile for each game.</translation>
</message>
</context>
<context>
<name>TrophyViewer</name>

View File

@ -1279,14 +1279,6 @@
<source>Emulator</source>
<translation type="unfinished">Emulator</translation>
</message>
<message>
<source>Enable Fullscreen</source>
<translation>Włącz pełny ekran</translation>
</message>
<message>
<source>Fullscreen Mode</source>
<translation>Tryb Pełnoekranowy</translation>
</message>
<message>
<source>Enable Separate Update Folder</source>
<translation>Włącz oddzielny folder aktualizacji</translation>
@ -1379,14 +1371,6 @@
<source>Graphics Device</source>
<translation>Karta graficzna</translation>
</message>
<message>
<source>Width</source>
<translation>Szerokość</translation>
</message>
<message>
<source>Height</source>
<translation>Wysokość</translation>
</message>
<message>
<source>Vblank Divider</source>
<translation>Dzielnik przerwy pionowej (Vblank)</translation>
@ -1559,10 +1543,6 @@
<source>Emulator Language:\nSets the language of the emulator&apos;s user interface.</source>
<translation>Język emulatora:\nUstala język interfejsu użytkownika emulatora.</translation>
</message>
<message>
<source>Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key.</source>
<translation>Włącz tryb pełnoekranowy:\nAutomatycznie przełącza okno gry w tryb pełnoekranowy.\nMożna to wyłączyć naciskając klawisz F11.</translation>
</message>
<message>
<source>Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name &quot;CUSA00000-UPDATE&quot; where the CUSA ID matches the game&apos;s ID.</source>
<translation>Włącz oddzielny folder aktualizacji:\nUmożliwia instalowanie aktualizacji gier w oddzielnym folderze w celu łatwego zarządzania.</translation>
@ -1739,14 +1719,6 @@
<source>Browse:\nBrowse for a folder to set as the save data path.</source>
<translation type="unfinished">Browse:\nBrowse for a folder to set as the save data path.</translation>
</message>
<message>
<source>Borderless</source>
<translation type="unfinished">Borderless</translation>
</message>
<message>
<source>True</source>
<translation type="unfinished">True</translation>
</message>
<message>
<source>Release</source>
<translation type="unfinished">Release</translation>
@ -1791,6 +1763,46 @@
<source>Directory to save data</source>
<translation type="unfinished">Directory to save data</translation>
</message>
<message>
<source>Video</source>
<translation type="unfinished">Video</translation>
</message>
<message>
<source>Display Mode</source>
<translation type="unfinished">Display Mode</translation>
</message>
<message>
<source>Windowed</source>
<translation type="unfinished">Windowed</translation>
</message>
<message>
<source>Fullscreen</source>
<translation type="unfinished">Fullscreen</translation>
</message>
<message>
<source>Fullscreen (Borderless)</source>
<translation type="unfinished">Fullscreen (Borderless)</translation>
</message>
<message>
<source>Window Size</source>
<translation type="unfinished">Window Size</translation>
</message>
<message>
<source>W:</source>
<translation type="unfinished">W:</translation>
</message>
<message>
<source>H:</source>
<translation type="unfinished">H:</translation>
</message>
<message>
<source>Separate Log Files</source>
<translation type="unfinished">Separate Log Files</translation>
</message>
<message>
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation type="unfinished">Separate Log Files:\nWrites a separate logfile for each game.</translation>
</message>
</context>
<context>
<name>TrophyViewer</name>

View File

@ -1279,14 +1279,6 @@
<source>Emulator</source>
<translation>Emulador</translation>
</message>
<message>
<source>Enable Fullscreen</source>
<translation>Ativar Tela Cheia</translation>
</message>
<message>
<source>Fullscreen Mode</source>
<translation>Modo de Tela Cheia</translation>
</message>
<message>
<source>Enable Separate Update Folder</source>
<translation>Ativar Pasta de Atualização Separada</translation>
@ -1379,14 +1371,6 @@
<source>Graphics Device</source>
<translation>Placa de Vídeo</translation>
</message>
<message>
<source>Width</source>
<translation>Largura</translation>
</message>
<message>
<source>Height</source>
<translation>Altura</translation>
</message>
<message>
<source>Vblank Divider</source>
<translation>Divisor Vblank</translation>
@ -1559,10 +1543,6 @@
<source>Emulator Language:\nSets the language of the emulator&apos;s user interface.</source>
<translation>Idioma do emulador:\nDefine o idioma da interface do emulador.</translation>
</message>
<message>
<source>Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key.</source>
<translation>Ativar Tela Cheia:\nAltera a janela do jogo para o modo tela cheia.\nIsso pode ser alterado pressionando a tecla F11.</translation>
</message>
<message>
<source>Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name &quot;CUSA00000-UPDATE&quot; where the CUSA ID matches the game&apos;s ID.</source>
<translation>Ativar pasta de atualização separada:\nPermite instalar atualizações de jogos em uma pasta separada para fácil gerenciamento.\nIsso pode ser manualmente criado adicionando a atualização extraída à pasta do jogo com o nome &quot;CUSA00000-UPDATE&quot; onde o ID do CUSA corresponde ao ID do jogo.</translation>
@ -1739,14 +1719,6 @@
<source>Browse:\nBrowse for a folder to set as the save data path.</source>
<translation>Procurar:\nProcure uma pasta para definir como o caminho para salvar dados.</translation>
</message>
<message>
<source>Borderless</source>
<translation>Janela sem Bordas</translation>
</message>
<message>
<source>True</source>
<translation>Tela Cheia</translation>
</message>
<message>
<source>Release</source>
<translation>Release</translation>
@ -1791,6 +1763,46 @@
<source>Directory to save data</source>
<translation>Diretório para salvar dados</translation>
</message>
<message>
<source>Video</source>
<translation>Vídeo</translation>
</message>
<message>
<source>Display Mode</source>
<translation>Modo de Exibição</translation>
</message>
<message>
<source>Windowed</source>
<translation>Em Janela</translation>
</message>
<message>
<source>Fullscreen</source>
<translation>Tela Cheia</translation>
</message>
<message>
<source>Fullscreen (Borderless)</source>
<translation>Tela Cheia (Sem Bordas)</translation>
</message>
<message>
<source>Window Size</source>
<translation>Tamanho da Janela</translation>
</message>
<message>
<source>W:</source>
<translation>L:</translation>
</message>
<message>
<source>H:</source>
<translation>A:</translation>
</message>
<message>
<source>Separate Log Files</source>
<translation>Separar Arquivos de Log</translation>
</message>
<message>
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation>Separar Arquivos de Log:\nGrava um arquivo de log para cada jogo.</translation>
</message>
</context>
<context>
<name>TrophyViewer</name>

View File

@ -1279,14 +1279,6 @@
<source>Emulator</source>
<translation>Emulador</translation>
</message>
<message>
<source>Enable Fullscreen</source>
<translation>Ativar Ecrã Inteiro</translation>
</message>
<message>
<source>Fullscreen Mode</source>
<translation>Modo de Ecrã Inteiro</translation>
</message>
<message>
<source>Enable Separate Update Folder</source>
<translation>Ativar Pasta de Atualizações Separada</translation>
@ -1379,14 +1371,6 @@
<source>Graphics Device</source>
<translation>Placa Gráfica</translation>
</message>
<message>
<source>Width</source>
<translation>Largura</translation>
</message>
<message>
<source>Height</source>
<translation>Altura</translation>
</message>
<message>
<source>Vblank Divider</source>
<translation>Divisor Vblank</translation>
@ -1559,10 +1543,6 @@
<source>Emulator Language:\nSets the language of the emulator&apos;s user interface.</source>
<translation>Idioma do Emulador:\nDefine o idioma da interface gráfica do emulador.</translation>
</message>
<message>
<source>Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key.</source>
<translation>Ativar Ecrã Cheio:\nPõe automaticamente a janela do jogo no modo de ecrã cheio.\nIsto pode ser alterado pressionando a tecla F11.</translation>
</message>
<message>
<source>Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name &quot;CUSA00000-UPDATE&quot; where the CUSA ID matches the game&apos;s ID.</source>
<translation>Ativar Pasta de Atualização Separada:\nPermite instalar as atualizações dos jogos numa pasta separada para uma fácil gestão.\nIsto pode ser manualmente criado adicionando a atualização extraída à pasta do jogo com o nome &quot;CUSA00000-UPDATE&quot; onde o ID do CUSA corresponde ao ID do jogo.</translation>
@ -1739,14 +1719,6 @@
<source>Browse:\nBrowse for a folder to set as the save data path.</source>
<translation>Procurar:\nProcure uma pasta para definir como o caminho para guardar os dados.</translation>
</message>
<message>
<source>Borderless</source>
<translation>Janela sem Bordas</translation>
</message>
<message>
<source>True</source>
<translation>Verdadeiro</translation>
</message>
<message>
<source>Release</source>
<translation>Lançamento</translation>
@ -1791,6 +1763,46 @@
<source>Directory to save data</source>
<translation>Diretório onde guardar os dados</translation>
</message>
<message>
<source>Video</source>
<translation>Vídeo</translation>
</message>
<message>
<source>Display Mode</source>
<translation>Modo de Exibição</translation>
</message>
<message>
<source>Windowed</source>
<translation>Em Janela</translation>
</message>
<message>
<source>Fullscreen</source>
<translation>Ecrã inteiro</translation>
</message>
<message>
<source>Fullscreen (Borderless)</source>
<translation>Ecrã Inteiro (Sem Bordas)</translation>
</message>
<message>
<source>Window Size</source>
<translation>Tamanho da Janela</translation>
</message>
<message>
<source>W:</source>
<translation>L:</translation>
</message>
<message>
<source>H:</source>
<translation>A:</translation>
</message>
<message>
<source>Separate Log Files</source>
<translation>Separar Ficheiros de Registo</translation>
</message>
<message>
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation>Separar Ficheiros de Registo:\nEscreve um ficheiro de registo para cada jogo.</translation>
</message>
</context>
<context>
<name>TrophyViewer</name>

View File

@ -1279,14 +1279,6 @@
<source>Emulator</source>
<translation type="unfinished">Emulator</translation>
</message>
<message>
<source>Enable Fullscreen</source>
<translation type="unfinished">Enable Fullscreen</translation>
</message>
<message>
<source>Fullscreen Mode</source>
<translation>Mod Ecran Complet</translation>
</message>
<message>
<source>Enable Separate Update Folder</source>
<translation type="unfinished">Enable Separate Update Folder</translation>
@ -1379,14 +1371,6 @@
<source>Graphics Device</source>
<translation type="unfinished">Graphics Device</translation>
</message>
<message>
<source>Width</source>
<translation type="unfinished">Width</translation>
</message>
<message>
<source>Height</source>
<translation type="unfinished">Height</translation>
</message>
<message>
<source>Vblank Divider</source>
<translation type="unfinished">Vblank Divider</translation>
@ -1559,10 +1543,6 @@
<source>Emulator Language:\nSets the language of the emulator&apos;s user interface.</source>
<translation>Limba emulatorului:\nSetează limba interfeței utilizatorului a emulatorului.</translation>
</message>
<message>
<source>Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key.</source>
<translation>Activează modul pe ecran complet:\nPune automat fereastra jocului în modul pe ecran complet.\nAceasta poate fi dezactivată apăsând tasta F11.</translation>
</message>
<message>
<source>Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name &quot;CUSA00000-UPDATE&quot; where the CUSA ID matches the game&apos;s ID.</source>
<translation type="unfinished">Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name &quot;CUSA00000-UPDATE&quot; where the CUSA ID matches the game&apos;s ID.</translation>
@ -1739,14 +1719,6 @@
<source>Browse:\nBrowse for a folder to set as the save data path.</source>
<translation type="unfinished">Browse:\nBrowse for a folder to set as the save data path.</translation>
</message>
<message>
<source>Borderless</source>
<translation type="unfinished">Borderless</translation>
</message>
<message>
<source>True</source>
<translation type="unfinished">True</translation>
</message>
<message>
<source>Release</source>
<translation type="unfinished">Release</translation>
@ -1791,6 +1763,46 @@
<source>Directory to save data</source>
<translation type="unfinished">Directory to save data</translation>
</message>
<message>
<source>Video</source>
<translation type="unfinished">Video</translation>
</message>
<message>
<source>Display Mode</source>
<translation type="unfinished">Display Mode</translation>
</message>
<message>
<source>Windowed</source>
<translation type="unfinished">Windowed</translation>
</message>
<message>
<source>Fullscreen</source>
<translation type="unfinished">Fullscreen</translation>
</message>
<message>
<source>Fullscreen (Borderless)</source>
<translation type="unfinished">Fullscreen (Borderless)</translation>
</message>
<message>
<source>Window Size</source>
<translation type="unfinished">Window Size</translation>
</message>
<message>
<source>W:</source>
<translation type="unfinished">W:</translation>
</message>
<message>
<source>H:</source>
<translation type="unfinished">H:</translation>
</message>
<message>
<source>Separate Log Files</source>
<translation type="unfinished">Separate Log Files</translation>
</message>
<message>
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation type="unfinished">Separate Log Files:\nWrites a separate logfile for each game.</translation>
</message>
</context>
<context>
<name>TrophyViewer</name>

View File

@ -1279,14 +1279,6 @@
<source>Emulator</source>
<translation>Эмулятор</translation>
</message>
<message>
<source>Enable Fullscreen</source>
<translation>Полноэкранный режим</translation>
</message>
<message>
<source>Fullscreen Mode</source>
<translation>Тип полноэкранного режима</translation>
</message>
<message>
<source>Enable Separate Update Folder</source>
<translation>Отдельная папка обновлений</translation>
@ -1333,7 +1325,7 @@
</message>
<message>
<source>Open Log Location</source>
<translation>Открыть местоположение журнала</translation>
<translation>Открыть местоположение логов</translation>
</message>
<message>
<source>Input</source>
@ -1379,14 +1371,6 @@
<source>Graphics Device</source>
<translation>Графическое устройство</translation>
</message>
<message>
<source>Width</source>
<translation>Ширина</translation>
</message>
<message>
<source>Height</source>
<translation>Высота</translation>
</message>
<message>
<source>Vblank Divider</source>
<translation>Делитель Vblank</translation>
@ -1559,10 +1543,6 @@
<source>Emulator Language:\nSets the language of the emulator&apos;s user interface.</source>
<translation>Язык эмулятора:\nУстанавливает язык пользовательского интерфейса эмулятора.</translation>
</message>
<message>
<source>Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key.</source>
<translation>Полноэкранный режим:\nАвтоматически переводит игровое окно в полноэкранный режим.\nЭто можно переключить, нажав клавишу F11.</translation>
</message>
<message>
<source>Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name &quot;CUSA00000-UPDATE&quot; where the CUSA ID matches the game&apos;s ID.</source>
<translation>Отдельная папка обновлений:\озволяет устанавливать обновления игры в отдельную папку для удобства.\nМожно создать вручную, добавив извлеченное обновление в папку с игрой с именем &quot;CUSA00000-UPDATE&quot;, где идентификатор CUSA совпадает с идентификатором игры.</translation>
@ -1739,14 +1719,6 @@
<source>Browse:\nBrowse for a folder to set as the save data path.</source>
<translation>Обзор:\nНайдите папку, которую можно указать в качестве пути для сохранений.</translation>
</message>
<message>
<source>Borderless</source>
<translation>Без полей</translation>
</message>
<message>
<source>True</source>
<translation>Истинный</translation>
</message>
<message>
<source>Release</source>
<translation>Релиз</translation>
@ -1791,6 +1763,46 @@
<source>Directory to save data</source>
<translation>Каталог для сохранений</translation>
</message>
<message>
<source>Video</source>
<translation>Видео</translation>
</message>
<message>
<source>Display Mode</source>
<translation>Режим отображения</translation>
</message>
<message>
<source>Windowed</source>
<translation>Оконный</translation>
</message>
<message>
<source>Fullscreen</source>
<translation>Полный экран</translation>
</message>
<message>
<source>Fullscreen (Borderless)</source>
<translation>Полный экран (без рамок)</translation>
</message>
<message>
<source>Window Size</source>
<translation>Размер окна</translation>
</message>
<message>
<source>W:</source>
<translation>Ш:</translation>
</message>
<message>
<source>H:</source>
<translation>В:</translation>
</message>
<message>
<source>Separate Log Files</source>
<translation>Отдельные файлы логов</translation>
</message>
<message>
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation>Отдельные файлы логов:\nПишет отдельный файл логов для каждой игры.</translation>
</message>
</context>
<context>
<name>TrophyViewer</name>

View File

@ -1279,14 +1279,6 @@
<source>Emulator</source>
<translation>Emulatori</translation>
</message>
<message>
<source>Enable Fullscreen</source>
<translation>Aktivizo Ekranin e plotë</translation>
</message>
<message>
<source>Fullscreen Mode</source>
<translation>Mënyra me ekran plotë</translation>
</message>
<message>
<source>Enable Separate Update Folder</source>
<translation>Aktivizo dosjen e ndarë përditësimit</translation>
@ -1379,14 +1371,6 @@
<source>Graphics Device</source>
<translation>Pajisja e Grafikës</translation>
</message>
<message>
<source>Width</source>
<translation>Gjerësia</translation>
</message>
<message>
<source>Height</source>
<translation>Lartësia</translation>
</message>
<message>
<source>Vblank Divider</source>
<translation>Ndarës Vblank</translation>
@ -1559,10 +1543,6 @@
<source>Emulator Language:\nSets the language of the emulator&apos;s user interface.</source>
<translation>Gjuha e emulatorit:\nPërcakton gjuhën e ndërfaqes përdoruesit emulatorit.</translation>
</message>
<message>
<source>Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key.</source>
<translation>Aktivizo ekranin e plotë:\nVendos automatikisht dritaren e lojës mënyrën e ekranit plotë.\nKjo mund aktivizohet duke shtypur tastin F11.</translation>
</message>
<message>
<source>Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name &quot;CUSA00000-UPDATE&quot; where the CUSA ID matches the game&apos;s ID.</source>
<translation>Aktivizo dosjen e ndarë përditësimit:\nAktivizon instalimin e përditësimeve lojërave dosje veçanta për menaxhim lehtë.\nKjo mund krijohet manualisht duke shtuar përditësimin e shpaketuar dosjen e lojës me emrin &quot;CUSA00000-UPDATE&quot; ku ID-ja CUSA përputhet me ID- e lojës.</translation>
@ -1739,14 +1719,6 @@
<source>Browse:\nBrowse for a folder to set as the save data path.</source>
<translation>Shfleto:\nShfleto për vendosur një dosje si shteg ruajtjes dhënave.</translation>
</message>
<message>
<source>Borderless</source>
<translation>Pa kufij</translation>
</message>
<message>
<source>True</source>
<translation>Vërtetë</translation>
</message>
<message>
<source>Release</source>
<translation>Release</translation>
@ -1791,6 +1763,46 @@
<source>Directory to save data</source>
<translation>Dosja për ruajtur dhënat</translation>
</message>
<message>
<source>Video</source>
<translation type="unfinished">Video</translation>
</message>
<message>
<source>Display Mode</source>
<translation type="unfinished">Display Mode</translation>
</message>
<message>
<source>Windowed</source>
<translation type="unfinished">Windowed</translation>
</message>
<message>
<source>Fullscreen</source>
<translation type="unfinished">Fullscreen</translation>
</message>
<message>
<source>Fullscreen (Borderless)</source>
<translation type="unfinished">Fullscreen (Borderless)</translation>
</message>
<message>
<source>Window Size</source>
<translation type="unfinished">Window Size</translation>
</message>
<message>
<source>W:</source>
<translation type="unfinished">W:</translation>
</message>
<message>
<source>H:</source>
<translation type="unfinished">H:</translation>
</message>
<message>
<source>Separate Log Files</source>
<translation type="unfinished">Separate Log Files</translation>
</message>
<message>
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation type="unfinished">Separate Log Files:\nWrites a separate logfile for each game.</translation>
</message>
</context>
<context>
<name>TrophyViewer</name>

View File

@ -1279,14 +1279,6 @@
<source>Emulator</source>
<translation>Emulator</translation>
</message>
<message>
<source>Enable Fullscreen</source>
<translation>Aktivera helskärm</translation>
</message>
<message>
<source>Fullscreen Mode</source>
<translation>Helskärmsläge</translation>
</message>
<message>
<source>Enable Separate Update Folder</source>
<translation>Aktivera separat uppdateringsmapp</translation>
@ -1379,14 +1371,6 @@
<source>Graphics Device</source>
<translation>Grafikenhet</translation>
</message>
<message>
<source>Width</source>
<translation>Bredd</translation>
</message>
<message>
<source>Height</source>
<translation>Höjd</translation>
</message>
<message>
<source>Vblank Divider</source>
<translation>Vblank Divider</translation>
@ -1559,10 +1543,6 @@
<source>Emulator Language:\nSets the language of the emulator&apos;s user interface.</source>
<translation>Emulatorspråk:\nStäller in språket för emulatorns användargränssnitt</translation>
</message>
<message>
<source>Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key.</source>
<translation>Aktivera helskärm:\nStäller automatiskt in spelfönstret till helskämsläget.\nDetta kan växlas genom att trycka F11-tangenten</translation>
</message>
<message>
<source>Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name &quot;CUSA00000-UPDATE&quot; where the CUSA ID matches the game&apos;s ID.</source>
<translation>Aktivera separat uppdateringsmapp:\nAktiverar installation av speluppdateringar i en separat mapp för enkel hantering.\nDetta kan skapas manuellt genom att lägga till uppackad uppdatering till spelmappen med namnet &quot;CUSA00000-UPDATE&quot; där CUSA ID matchar spelets id</translation>
@ -1739,14 +1719,6 @@
<source>Browse:\nBrowse for a folder to set as the save data path.</source>
<translation>Bläddra:\nBläddra efter en mapp att ställa in som sökväg för sparat data</translation>
</message>
<message>
<source>Borderless</source>
<translation>Fönster utan kanter</translation>
</message>
<message>
<source>True</source>
<translation>Sant</translation>
</message>
<message>
<source>Release</source>
<translation>Release</translation>
@ -1791,6 +1763,46 @@
<source>Directory to save data</source>
<translation>Katalog för sparat data</translation>
</message>
<message>
<source>Video</source>
<translation type="unfinished">Video</translation>
</message>
<message>
<source>Display Mode</source>
<translation type="unfinished">Display Mode</translation>
</message>
<message>
<source>Windowed</source>
<translation type="unfinished">Windowed</translation>
</message>
<message>
<source>Fullscreen</source>
<translation type="unfinished">Fullscreen</translation>
</message>
<message>
<source>Fullscreen (Borderless)</source>
<translation type="unfinished">Fullscreen (Borderless)</translation>
</message>
<message>
<source>Window Size</source>
<translation type="unfinished">Window Size</translation>
</message>
<message>
<source>W:</source>
<translation type="unfinished">W:</translation>
</message>
<message>
<source>H:</source>
<translation type="unfinished">H:</translation>
</message>
<message>
<source>Separate Log Files</source>
<translation type="unfinished">Separate Log Files</translation>
</message>
<message>
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation type="unfinished">Separate Log Files:\nWrites a separate logfile for each game.</translation>
</message>
</context>
<context>
<name>TrophyViewer</name>

View File

@ -1279,14 +1279,6 @@
<source>Emulator</source>
<translation>Emülatör</translation>
</message>
<message>
<source>Enable Fullscreen</source>
<translation>Tam Ekranı Etkinleştir</translation>
</message>
<message>
<source>Fullscreen Mode</source>
<translation>Tam Ekran Modu</translation>
</message>
<message>
<source>Enable Separate Update Folder</source>
<translation>Ayrı Güncelleme Klasörünü Etkinleştir</translation>
@ -1379,14 +1371,6 @@
<source>Graphics Device</source>
<translation>Grafik Cihazı</translation>
</message>
<message>
<source>Width</source>
<translation>Genişlik</translation>
</message>
<message>
<source>Height</source>
<translation>Yükseklik</translation>
</message>
<message>
<source>Vblank Divider</source>
<translation>Vblank Bölücü</translation>
@ -1559,10 +1543,6 @@
<source>Emulator Language:\nSets the language of the emulator&apos;s user interface.</source>
<translation>Emülatör Dili:\nEmülatörün kullanıcı arayüzünün dilini ayarlar.</translation>
</message>
<message>
<source>Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key.</source>
<translation>Tam Ekranı Etkinleştir:\nOyun penceresini otomatik olarak tam ekran moduna alır.\nBu, F11 tuşuna basarak geçiş yapılabilir.</translation>
</message>
<message>
<source>Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name &quot;CUSA00000-UPDATE&quot; where the CUSA ID matches the game&apos;s ID.</source>
<translation>Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.</translation>
@ -1739,14 +1719,6 @@
<source>Browse:\nBrowse for a folder to set as the save data path.</source>
<translation>Gözat:\nVerileri kaydetme yolu olarak ayarlamak için bir klasöre göz atın.</translation>
</message>
<message>
<source>Borderless</source>
<translation>Çerçevesiz</translation>
</message>
<message>
<source>True</source>
<translation>Gerçek Ekran</translation>
</message>
<message>
<source>Release</source>
<translation>Kararlı</translation>
@ -1791,6 +1763,46 @@
<source>Directory to save data</source>
<translation>Kayıt verilerinin tutulacağı dizin</translation>
</message>
<message>
<source>Video</source>
<translation type="unfinished">Video</translation>
</message>
<message>
<source>Display Mode</source>
<translation type="unfinished">Display Mode</translation>
</message>
<message>
<source>Windowed</source>
<translation type="unfinished">Windowed</translation>
</message>
<message>
<source>Fullscreen</source>
<translation>Tam Ekran</translation>
</message>
<message>
<source>Fullscreen (Borderless)</source>
<translation>Tam Ekran (Kenarlıksız)</translation>
</message>
<message>
<source>Window Size</source>
<translation>Pencere Boyutu</translation>
</message>
<message>
<source>W:</source>
<translation>G:</translation>
</message>
<message>
<source>H:</source>
<translation>Y:</translation>
</message>
<message>
<source>Separate Log Files</source>
<translation>Ayrı Günlük Dosyaları</translation>
</message>
<message>
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation>Ayrı Günlük Dosyaları:\nHer oyun için ayrı bir günlük dosyası yazar.</translation>
</message>
</context>
<context>
<name>TrophyViewer</name>

View File

@ -1279,14 +1279,6 @@
<source>Emulator</source>
<translation>Емулятор</translation>
</message>
<message>
<source>Enable Fullscreen</source>
<translation>Увімкнути повноекранний режим</translation>
</message>
<message>
<source>Fullscreen Mode</source>
<translation>Тип повноекранного режиму</translation>
</message>
<message>
<source>Enable Separate Update Folder</source>
<translation>Увімкнути окрему папку оновлень</translation>
@ -1379,14 +1371,6 @@
<source>Graphics Device</source>
<translation>Графічний пристрій</translation>
</message>
<message>
<source>Width</source>
<translation>Ширина</translation>
</message>
<message>
<source>Height</source>
<translation>Висота</translation>
</message>
<message>
<source>Vblank Divider</source>
<translation>Розділювач Vblank</translation>
@ -1559,10 +1543,6 @@
<source>Emulator Language:\nSets the language of the emulator&apos;s user interface.</source>
<translation>Мова емулятора:\nВстановіть мову користувацького інтерфейсу емулятора.</translation>
</message>
<message>
<source>Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key.</source>
<translation>Повноекранний режим:\nАвтоматично переводить вікно гри у повноекранний режим.\nВи можете відключити це, натиснувши клавішу F11.</translation>
</message>
<message>
<source>Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name &quot;CUSA00000-UPDATE&quot; where the CUSA ID matches the game&apos;s ID.</source>
<translation>Окрема папка для оновлень:\ає змогу встановлювати оновлення гри в окрему папку для зручності.</translation>
@ -1739,14 +1719,6 @@
<source>Browse:\nBrowse for a folder to set as the save data path.</source>
<translation>Вибрати:\nВиберіть папку для ігрових збережень.</translation>
</message>
<message>
<source>Borderless</source>
<translation>Без рамок</translation>
</message>
<message>
<source>True</source>
<translation>Повний екран</translation>
</message>
<message>
<source>Release</source>
<translation>Релізний</translation>
@ -1791,6 +1763,46 @@
<source>Directory to save data</source>
<translation type="unfinished">Directory to save data</translation>
</message>
<message>
<source>Video</source>
<translation type="unfinished">Video</translation>
</message>
<message>
<source>Display Mode</source>
<translation type="unfinished">Display Mode</translation>
</message>
<message>
<source>Windowed</source>
<translation type="unfinished">Windowed</translation>
</message>
<message>
<source>Fullscreen</source>
<translation type="unfinished">Fullscreen</translation>
</message>
<message>
<source>Fullscreen (Borderless)</source>
<translation type="unfinished">Fullscreen (Borderless)</translation>
</message>
<message>
<source>Window Size</source>
<translation type="unfinished">Window Size</translation>
</message>
<message>
<source>W:</source>
<translation type="unfinished">W:</translation>
</message>
<message>
<source>H:</source>
<translation type="unfinished">H:</translation>
</message>
<message>
<source>Separate Log Files</source>
<translation type="unfinished">Separate Log Files</translation>
</message>
<message>
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation type="unfinished">Separate Log Files:\nWrites a separate logfile for each game.</translation>
</message>
</context>
<context>
<name>TrophyViewer</name>

View File

@ -1279,14 +1279,6 @@
<source>Emulator</source>
<translation>Trình giả lập</translation>
</message>
<message>
<source>Enable Fullscreen</source>
<translation>Bật toàn màn hình</translation>
</message>
<message>
<source>Fullscreen Mode</source>
<translation>Chế đ Toàn màn hình</translation>
</message>
<message>
<source>Enable Separate Update Folder</source>
<translation>Bật thư mục cập nhật riêng</translation>
@ -1379,14 +1371,6 @@
<source>Graphics Device</source>
<translation>Thiết bị đ họa</translation>
</message>
<message>
<source>Width</source>
<translation>Rộng</translation>
</message>
<message>
<source>Height</source>
<translation>Cao</translation>
</message>
<message>
<source>Vblank Divider</source>
<translation type="unfinished">Vblank Divider</translation>
@ -1559,10 +1543,6 @@
<source>Emulator Language:\nSets the language of the emulator&apos;s user interface.</source>
<translation>Ngôn ngữ của trình giả lập:\nChọn ngôn ngữ của giao diện người dùng của trình giả lập.</translation>
</message>
<message>
<source>Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key.</source>
<translation>Bật chế đ toàn màn hình:\nTự đng đt cửa sổ trò chơi chế đ toàn màn hình.\nĐiều này thể bị hiệu hóa bằng cách nhấn phím F11.</translation>
</message>
<message>
<source>Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name &quot;CUSA00000-UPDATE&quot; where the CUSA ID matches the game&apos;s ID.</source>
<translation>Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.</translation>
@ -1739,14 +1719,6 @@
<source>Browse:\nBrowse for a folder to set as the save data path.</source>
<translation type="unfinished">Browse:\nBrowse for a folder to set as the save data path.</translation>
</message>
<message>
<source>Borderless</source>
<translation>Không viền</translation>
</message>
<message>
<source>True</source>
<translation type="unfinished">True</translation>
</message>
<message>
<source>Release</source>
<translation type="unfinished">Release</translation>
@ -1791,6 +1763,46 @@
<source>Directory to save data</source>
<translation>Thư mục đ lưu dữ liệu</translation>
</message>
<message>
<source>Video</source>
<translation type="unfinished">Video</translation>
</message>
<message>
<source>Display Mode</source>
<translation type="unfinished">Display Mode</translation>
</message>
<message>
<source>Windowed</source>
<translation type="unfinished">Windowed</translation>
</message>
<message>
<source>Fullscreen</source>
<translation type="unfinished">Fullscreen</translation>
</message>
<message>
<source>Fullscreen (Borderless)</source>
<translation type="unfinished">Fullscreen (Borderless)</translation>
</message>
<message>
<source>Window Size</source>
<translation type="unfinished">Window Size</translation>
</message>
<message>
<source>W:</source>
<translation type="unfinished">W:</translation>
</message>
<message>
<source>H:</source>
<translation type="unfinished">H:</translation>
</message>
<message>
<source>Separate Log Files</source>
<translation type="unfinished">Separate Log Files</translation>
</message>
<message>
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation type="unfinished">Separate Log Files:\nWrites a separate logfile for each game.</translation>
</message>
</context>
<context>
<name>TrophyViewer</name>

View File

@ -1279,14 +1279,6 @@
<source>Emulator</source>
<translation></translation>
</message>
<message>
<source>Enable Fullscreen</source>
<translation></translation>
</message>
<message>
<source>Fullscreen Mode</source>
<translation></translation>
</message>
<message>
<source>Enable Separate Update Folder</source>
<translation></translation>
@ -1379,14 +1371,6 @@
<source>Graphics Device</source>
<translation></translation>
</message>
<message>
<source>Width</source>
<translation></translation>
</message>
<message>
<source>Height</source>
<translation></translation>
</message>
<message>
<source>Vblank Divider</source>
<translation>Vblank Divider</translation>
@ -1559,10 +1543,6 @@
<source>Emulator Language:\nSets the language of the emulator&apos;s user interface.</source>
<translation>\n设置模拟器用户界面的语言</translation>
</message>
<message>
<source>Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key.</source>
<translation>\n以全屏模式启动游戏\n您可以按 F11 </translation>
</message>
<message>
<source>Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name &quot;CUSA00000-UPDATE&quot; where the CUSA ID matches the game&apos;s ID.</source>
<translation>\n启用安装游戏更新到一个单独的目录中以更便于管理</translation>
@ -1739,14 +1719,6 @@
<source>Browse:\nBrowse for a folder to set as the save data path.</source>
<translation>\n选择一个目录保存游戏存档数据</translation>
</message>
<message>
<source>Borderless</source>
<translation></translation>
</message>
<message>
<source>True</source>
<translation></translation>
</message>
<message>
<source>Release</source>
<translation></translation>
@ -1791,6 +1763,46 @@
<source>Directory to save data</source>
<translation></translation>
</message>
<message>
<source>Video</source>
<translation></translation>
</message>
<message>
<source>Display Mode</source>
<translation></translation>
</message>
<message>
<source>Windowed</source>
<translation></translation>
</message>
<message>
<source>Fullscreen</source>
<translation></translation>
</message>
<message>
<source>Fullscreen (Borderless)</source>
<translation></translation>
</message>
<message>
<source>Window Size</source>
<translation></translation>
</message>
<message>
<source>W:</source>
<translation></translation>
</message>
<message>
<source>H:</source>
<translation></translation>
</message>
<message>
<source>Separate Log Files</source>
<translation></translation>
</message>
<message>
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation>\n每个游戏使用单独的日志文件</translation>
</message>
</context>
<context>
<name>TrophyViewer</name>

View File

@ -1279,14 +1279,6 @@
<source>Emulator</source>
<translation type="unfinished">Emulator</translation>
</message>
<message>
<source>Enable Fullscreen</source>
<translation type="unfinished">Enable Fullscreen</translation>
</message>
<message>
<source>Fullscreen Mode</source>
<translation></translation>
</message>
<message>
<source>Enable Separate Update Folder</source>
<translation type="unfinished">Enable Separate Update Folder</translation>
@ -1379,14 +1371,6 @@
<source>Graphics Device</source>
<translation type="unfinished">Graphics Device</translation>
</message>
<message>
<source>Width</source>
<translation type="unfinished">Width</translation>
</message>
<message>
<source>Height</source>
<translation type="unfinished">Height</translation>
</message>
<message>
<source>Vblank Divider</source>
<translation type="unfinished">Vblank Divider</translation>
@ -1559,10 +1543,6 @@
<source>Emulator Language:\nSets the language of the emulator&apos;s user interface.</source>
<translation>:\n設定模擬器的用戶介面的語言</translation>
</message>
<message>
<source>Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key.</source>
<translation>:\n自動將遊戲視窗設置為全螢幕模式\n可以按F11鍵進行切換</translation>
</message>
<message>
<source>Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name &quot;CUSA00000-UPDATE&quot; where the CUSA ID matches the game&apos;s ID.</source>
<translation>Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.</translation>
@ -1739,14 +1719,6 @@
<source>Browse:\nBrowse for a folder to set as the save data path.</source>
<translation type="unfinished">Browse:\nBrowse for a folder to set as the save data path.</translation>
</message>
<message>
<source>Borderless</source>
<translation type="unfinished">Borderless</translation>
</message>
<message>
<source>True</source>
<translation type="unfinished">True</translation>
</message>
<message>
<source>Release</source>
<translation type="unfinished">Release</translation>
@ -1791,6 +1763,46 @@
<source>Directory to save data</source>
<translation type="unfinished">Directory to save data</translation>
</message>
<message>
<source>Video</source>
<translation type="unfinished">Video</translation>
</message>
<message>
<source>Display Mode</source>
<translation type="unfinished">Display Mode</translation>
</message>
<message>
<source>Windowed</source>
<translation type="unfinished">Windowed</translation>
</message>
<message>
<source>Fullscreen</source>
<translation type="unfinished">Fullscreen</translation>
</message>
<message>
<source>Fullscreen (Borderless)</source>
<translation type="unfinished">Fullscreen (Borderless)</translation>
</message>
<message>
<source>Window Size</source>
<translation type="unfinished">Window Size</translation>
</message>
<message>
<source>W:</source>
<translation type="unfinished">W:</translation>
</message>
<message>
<source>H:</source>
<translation type="unfinished">H:</translation>
</message>
<message>
<source>Separate Log Files</source>
<translation type="unfinished">Separate Log Files</translation>
</message>
<message>
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation type="unfinished">Separate Log Files:\nWrites a separate logfile for each game.</translation>
</message>
</context>
<context>
<name>TrophyViewer</name>

View File

@ -2,9 +2,12 @@
// SPDX-License-Identifier: GPL-2.0-or-later
#include <QMessageBox>
#include <cmrc/cmrc.hpp>
#include "common/path_util.h"
#include "trophy_viewer.h"
CMRC_DECLARE(res);
TrophyViewer::TrophyViewer(QString trophyPath, QString gameTrpPath) : QMainWindow() {
this->setWindowTitle(tr("Trophy Viewer"));
this->setAttribute(Qt::WA_DeleteOnClose);
@ -115,13 +118,33 @@ void TrophyViewer::PopulateTrophyWidget(QString title) {
item->setData(Qt::DecorationRole, icon);
item->setFlags(item->flags() & ~Qt::ItemIsEditable);
tableWidget->setItem(row, 1, item);
const std::string filename = GetTrpType(trpType[row].at(0));
QTableWidgetItem* typeitem = new QTableWidgetItem();
auto resource = cmrc::res::get_filesystem();
std::string resourceString = "src/images/" + filename;
auto file = resource.open(resourceString);
std::vector<char> imgdata(file.begin(), file.end());
QImage type_icon = QImage::fromData(imgdata).scaled(QSize(64, 64), Qt::KeepAspectRatio,
Qt::SmoothTransformation);
typeitem->setData(Qt::DecorationRole, type_icon);
typeitem->setFlags(typeitem->flags() & ~Qt::ItemIsEditable);
tableWidget->setItem(row, 6, typeitem);
std::string detailString = trophyDetails[row].toStdString();
std::size_t newline_pos = 0;
while ((newline_pos = detailString.find("\n", newline_pos)) != std::string::npos) {
detailString.replace(newline_pos, 1, " ");
++newline_pos;
}
if (!trophyNames.isEmpty() && !trophyDetails.isEmpty()) {
SetTableItem(tableWidget, row, 0, trpUnlocked[row]);
SetTableItem(tableWidget, row, 2, trophyNames[row]);
SetTableItem(tableWidget, row, 3, trophyDetails[row]);
SetTableItem(tableWidget, row, 3, QString::fromStdString(detailString));
SetTableItem(tableWidget, row, 4, trpId[row]);
SetTableItem(tableWidget, row, 5, trpHidden[row]);
SetTableItem(tableWidget, row, 6, GetTrpType(trpType[row].at(0)));
SetTableItem(tableWidget, row, 7, trpPid[row]);
}
tableWidget->verticalHeader()->resizeSection(row, icon.height());
@ -157,7 +180,7 @@ void TrophyViewer::SetTableItem(QTableWidget* parent, int row, int column, QStri
label->setGraphicsEffect(shadowEffect); // Apply shadow effect to the QLabel
layout->addWidget(label);
if (column != 1 && column != 2)
if (column != 1 && column != 2 && column != 3)
layout->setAlignment(Qt::AlignCenter);
widget->setLayout(layout);
parent->setItem(row, column, item);

View File

@ -32,16 +32,16 @@ private:
QString gameTrpPath_;
TRP trp;
QString GetTrpType(const QChar trp_) {
std::string GetTrpType(const QChar trp_) {
switch (trp_.toLatin1()) {
case 'B':
return "Bronze";
return "bronze.png";
case 'S':
return "Silver";
return "silver.png";
case 'G':
return "Gold";
return "gold.png";
case 'P':
return "Platinum";
return "platinum.png";
}
return "Unknown";
}

View File

@ -134,13 +134,17 @@ void SDLInputEngine::Init() {
m_gyro_poll_rate = SDL_GetGamepadSensorDataRate(m_gamepad, SDL_SENSOR_GYRO);
LOG_INFO(Input, "Gyro initialized, poll rate: {}", m_gyro_poll_rate);
} else {
LOG_ERROR(Input, "Failed to initialize gyro controls for gamepad");
LOG_ERROR(Input, "Failed to initialize gyro controls for gamepad, error: {}",
SDL_GetError());
SDL_SetGamepadSensorEnabled(m_gamepad, SDL_SENSOR_GYRO, false);
}
if (SDL_SetGamepadSensorEnabled(m_gamepad, SDL_SENSOR_ACCEL, true)) {
m_accel_poll_rate = SDL_GetGamepadSensorDataRate(m_gamepad, SDL_SENSOR_ACCEL);
LOG_INFO(Input, "Accel initialized, poll rate: {}", m_accel_poll_rate);
} else {
LOG_ERROR(Input, "Failed to initialize accel controls for gamepad");
LOG_ERROR(Input, "Failed to initialize accel controls for gamepad, error: {}",
SDL_GetError());
SDL_SetGamepadSensorEnabled(m_gamepad, SDL_SENSOR_ACCEL, false);
}
}
@ -290,8 +294,8 @@ WindowSDL::WindowSDL(s32 width_, s32 height_, Input::GameController* controller_
error = true;
}
if (!error) {
SDL_SetWindowFullscreenMode(window,
Config::getFullscreenMode() == "True" ? displayMode : NULL);
SDL_SetWindowFullscreenMode(
window, Config::getFullscreenMode() == "Fullscreen" ? displayMode : NULL);
}
SDL_SetWindowFullscreen(window, Config::getIsFullscreen());

View File

@ -27,8 +27,8 @@ public:
private:
SDL_Gamepad* m_gamepad = nullptr;
float m_gyro_poll_rate{};
float m_accel_poll_rate{};
float m_gyro_poll_rate = 0.0f;
float m_accel_poll_rate = 0.0f;
};
} // namespace Input

View File

@ -369,7 +369,12 @@ void SetupFloatMode(EmitContext& ctx, const Profile& profile, const RuntimeInfo&
LOG_WARNING(Render_Vulkan, "Unknown FP denorm mode {}", u32(fp_denorm_mode));
}
const auto fp_round_mode = runtime_info.fp_round_mode32;
if (fp_round_mode != AmdGpu::FpRoundMode::NearestEven) {
if (fp_round_mode == AmdGpu::FpRoundMode::ToZero) {
if (profile.support_fp32_round_to_zero) {
ctx.AddCapability(spv::Capability::RoundingModeRTZ);
ctx.AddExecutionMode(main_func, spv::ExecutionMode::RoundingModeRTZ, 32U);
}
} else if (fp_round_mode != AmdGpu::FpRoundMode::NearestEven) {
LOG_WARNING(Render_Vulkan, "Unknown FP rounding mode {}", u32(fp_round_mode));
}
}

View File

@ -13,8 +13,7 @@ constexpr u32 SPIRV_VERSION_1_5 = 0x00010500;
struct QuadRectListEmitter : public Sirit::Module {
explicit QuadRectListEmitter(const FragmentRuntimeInfo& fs_info_)
: Sirit::Module{SPIRV_VERSION_1_5}, fs_info{fs_info_}, inputs{fs_info_.num_inputs},
outputs{fs_info_.num_inputs} {
: Sirit::Module{SPIRV_VERSION_1_5}, fs_info{fs_info_} {
void_id = TypeVoid();
bool_id = TypeBool();
float_id = TypeFloat(32);
@ -253,15 +252,16 @@ private:
} else {
gl_per_vertex = AddOutput(gl_per_vertex_type);
}
outputs.reserve(fs_info.num_inputs);
for (int i = 0; i < fs_info.num_inputs; i++) {
const auto& input = fs_info.inputs[i];
if (input.IsDefault()) {
continue;
}
outputs[i] = AddOutput(model == spv::ExecutionModel::TessellationControl
outputs.emplace_back(AddOutput(model == spv::ExecutionModel::TessellationControl
? TypeArray(vec4_id, Int(4))
: vec4_id);
Decorate(outputs[i], spv::Decoration::Location, input.param_index);
: vec4_id));
Decorate(outputs.back(), spv::Decoration::Location, input.param_index);
}
}
@ -276,13 +276,14 @@ private:
const Id gl_per_vertex_array{TypeArray(gl_per_vertex_type, Constant(uint_id, 32U))};
gl_in = AddInput(gl_per_vertex_array);
const Id float_arr{TypeArray(vec4_id, Int(32))};
inputs.reserve(fs_info.num_inputs);
for (int i = 0; i < fs_info.num_inputs; i++) {
const auto& input = fs_info.inputs[i];
if (input.IsDefault()) {
continue;
}
inputs[i] = AddInput(float_arr);
Decorate(inputs[i], spv::Decoration::Location, input.param_index);
inputs.emplace_back(AddInput(float_arr));
Decorate(inputs.back(), spv::Decoration::Location, input.param_index);
}
}

View File

@ -27,7 +27,7 @@ void Translator::EmitScalarAlu(const GcnInst& inst) {
case Opcode::S_ADD_I32:
return S_ADD_I32(inst);
case Opcode::S_SUB_I32:
return S_SUB_U32(inst);
return S_SUB_I32(inst);
case Opcode::S_ADDC_U32:
return S_ADDC_U32(inst);
case Opcode::S_MIN_I32:
@ -216,24 +216,52 @@ void Translator::EmitSOPK(const GcnInst& inst) {
void Translator::S_ADD_U32(const GcnInst& inst) {
const IR::U32 src0{GetSrc(inst.src[0])};
const IR::U32 src1{GetSrc(inst.src[1])};
SetDst(inst.dst[0], ir.IAdd(src0, src1));
// TODO: Carry out
ir.SetScc(ir.Imm1(false));
const IR::U32 result{ir.IAdd(src0, src1)};
SetDst(inst.dst[0], result);
// SCC = tmp >= 0x100000000ULL ? 1'1U : 1'0U;
// The above assumes tmp is a 64-bit value.
// It should be enough however to test that the truncated result is less than at least one
// of the operands. In unsigned addition the result is always bigger than both the operands,
// except in the case of overflow where the truncated result is less than both.
ir.SetScc(ir.ILessThan(result, src0, false));
}
void Translator::S_SUB_U32(const GcnInst& inst) {
const IR::U32 src0{GetSrc(inst.src[0])};
const IR::U32 src1{GetSrc(inst.src[1])};
SetDst(inst.dst[0], ir.ISub(src0, src1));
// TODO: Carry out
ir.SetScc(ir.Imm1(false));
// SCC = S1.u > S0.u ? 1'1U : 1'0U;
ir.SetScc(ir.IGreaterThan(src1, src0, false));
}
void Translator::S_ADD_I32(const GcnInst& inst) {
const IR::U32 src0{GetSrc(inst.src[0])};
const IR::U32 src1{GetSrc(inst.src[1])};
SetDst(inst.dst[0], ir.IAdd(src0, src1));
// TODO: Overflow flag
const IR::U32 result{ir.IAdd(src0, src1)};
SetDst(inst.dst[0], result);
// SCC = ((S0.u[31] == S1.u[31]) && (S0.u[31] != Result.u[31]));
const IR::U32 shift{ir.Imm32(31)};
const IR::U32 sign0{ir.ShiftRightLogical(src0, shift)};
const IR::U32 sign1{ir.ShiftRightLogical(src1, shift)};
const IR::U32 signr{ir.ShiftRightLogical(result, shift)};
ir.SetScc(ir.LogicalAnd(ir.IEqual(sign0, sign1), ir.INotEqual(sign0, signr)));
}
void Translator::S_SUB_I32(const GcnInst& inst) {
const IR::U32 src0{GetSrc(inst.src[0])};
const IR::U32 src1{GetSrc(inst.src[1])};
const IR::U32 result{ir.ISub(src0, src1)};
SetDst(inst.dst[0], result);
// SCC = ((S0.u[31] != S1.u[31]) && (S0.u[31] != tmp.u[31]));
const IR::U32 shift{ir.Imm32(31)};
const IR::U32 sign0{ir.ShiftRightLogical(src0, shift)};
const IR::U32 sign1{ir.ShiftRightLogical(src1, shift)};
const IR::U32 signr{ir.ShiftRightLogical(result, shift)};
ir.SetScc(ir.LogicalAnd(ir.INotEqual(sign0, sign1), ir.INotEqual(sign0, signr)));
}
void Translator::S_ADDC_U32(const GcnInst& inst) {

View File

@ -81,6 +81,7 @@ public:
void S_ADD_U32(const GcnInst& inst);
void S_SUB_U32(const GcnInst& inst);
void S_ADD_I32(const GcnInst& inst);
void S_SUB_I32(const GcnInst& inst);
void S_ADDC_U32(const GcnInst& inst);
void S_MIN_U32(bool is_signed, const GcnInst& inst);
void S_MAX_U32(bool is_signed, const GcnInst& inst);
@ -277,10 +278,9 @@ public:
// Buffer Memory
// MUBUF / MTBUF
void BUFFER_LOAD(u32 num_dwords, bool is_typed, const GcnInst& inst);
void BUFFER_LOAD_FORMAT(u32 num_dwords, const GcnInst& inst);
void BUFFER_STORE(u32 num_dwords, bool is_typed, const GcnInst& inst);
void BUFFER_STORE_FORMAT(u32 num_dwords, const GcnInst& inst);
void BUFFER_LOAD(u32 num_dwords, bool is_inst_typed, bool is_buffer_typed, const GcnInst& inst);
void BUFFER_STORE(u32 num_dwords, bool is_inst_typed, bool is_buffer_typed,
const GcnInst& inst);
void BUFFER_ATOMIC(AtomicOp op, const GcnInst& inst);
// Image Memory

View File

@ -11,59 +11,59 @@ void Translator::EmitVectorMemory(const GcnInst& inst) {
// Buffer load operations
case Opcode::TBUFFER_LOAD_FORMAT_X:
return BUFFER_LOAD(1, true, inst);
return BUFFER_LOAD(1, true, false, inst);
case Opcode::TBUFFER_LOAD_FORMAT_XY:
return BUFFER_LOAD(2, true, inst);
return BUFFER_LOAD(2, true, false, inst);
case Opcode::TBUFFER_LOAD_FORMAT_XYZ:
return BUFFER_LOAD(3, true, inst);
return BUFFER_LOAD(3, true, false, inst);
case Opcode::TBUFFER_LOAD_FORMAT_XYZW:
return BUFFER_LOAD(4, true, inst);
return BUFFER_LOAD(4, true, false, inst);
case Opcode::BUFFER_LOAD_FORMAT_X:
return BUFFER_LOAD_FORMAT(1, inst);
return BUFFER_LOAD(1, false, true, inst);
case Opcode::BUFFER_LOAD_FORMAT_XY:
return BUFFER_LOAD_FORMAT(2, inst);
return BUFFER_LOAD(2, false, true, inst);
case Opcode::BUFFER_LOAD_FORMAT_XYZ:
return BUFFER_LOAD_FORMAT(3, inst);
return BUFFER_LOAD(3, false, true, inst);
case Opcode::BUFFER_LOAD_FORMAT_XYZW:
return BUFFER_LOAD_FORMAT(4, inst);
return BUFFER_LOAD(4, false, true, inst);
case Opcode::BUFFER_LOAD_DWORD:
return BUFFER_LOAD(1, false, inst);
return BUFFER_LOAD(1, false, false, inst);
case Opcode::BUFFER_LOAD_DWORDX2:
return BUFFER_LOAD(2, false, inst);
return BUFFER_LOAD(2, false, false, inst);
case Opcode::BUFFER_LOAD_DWORDX3:
return BUFFER_LOAD(3, false, inst);
return BUFFER_LOAD(3, false, false, inst);
case Opcode::BUFFER_LOAD_DWORDX4:
return BUFFER_LOAD(4, false, inst);
return BUFFER_LOAD(4, false, false, inst);
// Buffer store operations
case Opcode::BUFFER_STORE_FORMAT_X:
return BUFFER_STORE_FORMAT(1, inst);
return BUFFER_STORE(1, false, true, inst);
case Opcode::BUFFER_STORE_FORMAT_XY:
return BUFFER_STORE_FORMAT(2, inst);
return BUFFER_STORE(2, false, true, inst);
case Opcode::BUFFER_STORE_FORMAT_XYZ:
return BUFFER_STORE_FORMAT(3, inst);
return BUFFER_STORE(3, false, true, inst);
case Opcode::BUFFER_STORE_FORMAT_XYZW:
return BUFFER_STORE_FORMAT(4, inst);
return BUFFER_STORE(4, false, true, inst);
case Opcode::TBUFFER_STORE_FORMAT_X:
return BUFFER_STORE(1, true, inst);
return BUFFER_STORE(1, true, false, inst);
case Opcode::TBUFFER_STORE_FORMAT_XY:
return BUFFER_STORE(2, true, inst);
return BUFFER_STORE(2, true, false, inst);
case Opcode::TBUFFER_STORE_FORMAT_XYZ:
return BUFFER_STORE(3, true, inst);
return BUFFER_STORE(3, true, false, inst);
case Opcode::TBUFFER_STORE_FORMAT_XYZW:
return BUFFER_STORE(4, true, inst);
return BUFFER_STORE(4, true, false, inst);
case Opcode::BUFFER_STORE_DWORD:
return BUFFER_STORE(1, false, inst);
return BUFFER_STORE(1, false, false, inst);
case Opcode::BUFFER_STORE_DWORDX2:
return BUFFER_STORE(2, false, inst);
return BUFFER_STORE(2, false, false, inst);
case Opcode::BUFFER_STORE_DWORDX3:
return BUFFER_STORE(3, false, inst);
return BUFFER_STORE(3, false, false, inst);
case Opcode::BUFFER_STORE_DWORDX4:
return BUFFER_STORE(4, false, inst);
return BUFFER_STORE(4, false, false, inst);
// Buffer atomic operations
case Opcode::BUFFER_ATOMIC_ADD:
@ -165,7 +165,8 @@ void Translator::EmitVectorMemory(const GcnInst& inst) {
}
}
void Translator::BUFFER_LOAD(u32 num_dwords, bool is_typed, const GcnInst& inst) {
void Translator::BUFFER_LOAD(u32 num_dwords, bool is_inst_typed, bool is_buffer_typed,
const GcnInst& inst) {
const auto& mubuf = inst.control.mubuf;
const bool is_ring = mubuf.glc && mubuf.slc;
const IR::VectorReg vaddr{inst.src[0].code};
@ -195,22 +196,26 @@ void Translator::BUFFER_LOAD(u32 num_dwords, bool is_typed, const GcnInst& inst)
buffer_info.inst_offset.Assign(mubuf.offset);
buffer_info.globally_coherent.Assign(mubuf.glc);
buffer_info.system_coherent.Assign(mubuf.slc);
buffer_info.typed.Assign(is_typed);
if (is_typed) {
buffer_info.typed.Assign(is_inst_typed || is_buffer_typed);
if (is_inst_typed) {
const auto& mtbuf = inst.control.mtbuf;
const auto dmft = static_cast<AmdGpu::DataFormat>(mtbuf.dfmt);
const auto nfmt = static_cast<AmdGpu::NumberFormat>(mtbuf.nfmt);
ASSERT(nfmt == AmdGpu::NumberFormat::Float &&
(dmft == AmdGpu::DataFormat::Format32_32_32_32 ||
dmft == AmdGpu::DataFormat::Format32_32_32 ||
dmft == AmdGpu::DataFormat::Format32_32 || dmft == AmdGpu::DataFormat::Format32));
buffer_info.inst_data_fmt.Assign(static_cast<AmdGpu::DataFormat>(mtbuf.dfmt));
buffer_info.inst_num_fmt.Assign(static_cast<AmdGpu::NumberFormat>(mtbuf.nfmt));
} else {
buffer_info.inst_data_fmt.Assign(AmdGpu::DataFormat::FormatInvalid);
}
const IR::Value handle =
ir.CompositeConstruct(ir.GetScalarReg(sharp), ir.GetScalarReg(sharp + 1),
ir.GetScalarReg(sharp + 2), ir.GetScalarReg(sharp + 3));
const IR::Value value = ir.LoadBufferU32(num_dwords, handle, address, buffer_info);
const IR::VectorReg dst_reg{inst.src[1].code};
if (buffer_info.typed) {
const IR::Value value = ir.LoadBufferFormat(handle, address, buffer_info);
for (u32 i = 0; i < num_dwords; i++) {
ir.SetVectorReg(dst_reg + i, IR::F32{ir.CompositeExtract(value, i)});
}
} else {
const IR::Value value = ir.LoadBufferU32(num_dwords, handle, address, buffer_info);
if (num_dwords == 1) {
ir.SetVectorReg(dst_reg, IR::U32{value});
return;
@ -218,43 +223,11 @@ void Translator::BUFFER_LOAD(u32 num_dwords, bool is_typed, const GcnInst& inst)
for (u32 i = 0; i < num_dwords; i++) {
ir.SetVectorReg(dst_reg + i, IR::U32{ir.CompositeExtract(value, i)});
}
}
void Translator::BUFFER_LOAD_FORMAT(u32 num_dwords, const GcnInst& inst) {
const auto& mubuf = inst.control.mubuf;
const IR::VectorReg vaddr{inst.src[0].code};
const IR::ScalarReg sharp{inst.src[2].code * 4};
const IR::Value address = [&] -> IR::Value {
if (mubuf.idxen && mubuf.offen) {
return ir.CompositeConstruct(ir.GetVectorReg(vaddr), ir.GetVectorReg(vaddr + 1));
}
if (mubuf.idxen || mubuf.offen) {
return ir.GetVectorReg(vaddr);
}
return {};
}();
const IR::Value soffset{GetSrc(inst.src[3])};
ASSERT_MSG(soffset.IsImmediate() && soffset.U32() == 0, "Non immediate offset not supported");
IR::BufferInstInfo buffer_info{};
buffer_info.index_enable.Assign(mubuf.idxen);
buffer_info.offset_enable.Assign(mubuf.offen);
buffer_info.inst_offset.Assign(mubuf.offset);
buffer_info.globally_coherent.Assign(mubuf.glc);
buffer_info.system_coherent.Assign(mubuf.slc);
buffer_info.typed.Assign(true);
const IR::Value handle =
ir.CompositeConstruct(ir.GetScalarReg(sharp), ir.GetScalarReg(sharp + 1),
ir.GetScalarReg(sharp + 2), ir.GetScalarReg(sharp + 3));
const IR::Value value = ir.LoadBufferFormat(handle, address, buffer_info);
const IR::VectorReg dst_reg{inst.src[1].code};
for (u32 i = 0; i < num_dwords; i++) {
ir.SetVectorReg(dst_reg + i, IR::F32{ir.CompositeExtract(value, i)});
}
}
void Translator::BUFFER_STORE(u32 num_dwords, bool is_typed, const GcnInst& inst) {
void Translator::BUFFER_STORE(u32 num_dwords, bool is_inst_typed, bool is_buffer_typed,
const GcnInst& inst) {
const auto& mubuf = inst.control.mubuf;
const bool is_ring = mubuf.glc && mubuf.slc;
const IR::VectorReg vaddr{inst.src[0].code};
@ -285,80 +258,38 @@ void Translator::BUFFER_STORE(u32 num_dwords, bool is_typed, const GcnInst& inst
buffer_info.inst_offset.Assign(mubuf.offset);
buffer_info.globally_coherent.Assign(mubuf.glc);
buffer_info.system_coherent.Assign(mubuf.slc);
buffer_info.typed.Assign(is_typed);
if (is_typed) {
buffer_info.typed.Assign(is_inst_typed || is_buffer_typed);
if (is_inst_typed) {
const auto& mtbuf = inst.control.mtbuf;
const auto dmft = static_cast<AmdGpu::DataFormat>(mtbuf.dfmt);
const auto nfmt = static_cast<AmdGpu::NumberFormat>(mtbuf.nfmt);
ASSERT(nfmt == AmdGpu::NumberFormat::Float &&
(dmft == AmdGpu::DataFormat::Format32_32_32_32 ||
dmft == AmdGpu::DataFormat::Format32_32_32 ||
dmft == AmdGpu::DataFormat::Format32_32 || dmft == AmdGpu::DataFormat::Format32));
buffer_info.inst_data_fmt.Assign(static_cast<AmdGpu::DataFormat>(mtbuf.dfmt));
buffer_info.inst_num_fmt.Assign(static_cast<AmdGpu::NumberFormat>(mtbuf.nfmt));
} else {
buffer_info.inst_data_fmt.Assign(AmdGpu::DataFormat::FormatInvalid);
}
IR::Value value{};
const IR::VectorReg src_reg{inst.src[1].code};
switch (num_dwords) {
case 1:
value = ir.GetVectorReg(src_reg);
break;
case 2:
value = ir.CompositeConstruct(ir.GetVectorReg(src_reg), ir.GetVectorReg(src_reg + 1));
break;
case 3:
value = ir.CompositeConstruct(ir.GetVectorReg(src_reg), ir.GetVectorReg(src_reg + 1),
ir.GetVectorReg(src_reg + 2));
break;
case 4:
value = ir.CompositeConstruct(ir.GetVectorReg(src_reg), ir.GetVectorReg(src_reg + 1),
ir.GetVectorReg(src_reg + 2), ir.GetVectorReg(src_reg + 3));
break;
}
const IR::Value handle =
ir.CompositeConstruct(ir.GetScalarReg(sharp), ir.GetScalarReg(sharp + 1),
ir.GetScalarReg(sharp + 2), ir.GetScalarReg(sharp + 3));
ir.StoreBufferU32(num_dwords, handle, address, value, buffer_info);
}
void Translator::BUFFER_STORE_FORMAT(u32 num_dwords, const GcnInst& inst) {
const auto& mubuf = inst.control.mubuf;
const IR::VectorReg vaddr{inst.src[0].code};
const IR::ScalarReg sharp{inst.src[2].code * 4};
const IR::Value address = [&] -> IR::Value {
if (mubuf.idxen && mubuf.offen) {
return ir.CompositeConstruct(ir.GetVectorReg(vaddr), ir.GetVectorReg(vaddr + 1));
}
if (mubuf.idxen || mubuf.offen) {
return ir.GetVectorReg(vaddr);
}
return {};
}();
const IR::Value soffset{GetSrc(inst.src[3])};
ASSERT_MSG(soffset.IsImmediate() && soffset.U32() == 0, "Non immediate offset not supported");
IR::BufferInstInfo buffer_info{};
buffer_info.index_enable.Assign(mubuf.idxen);
buffer_info.offset_enable.Assign(mubuf.offen);
buffer_info.inst_offset.Assign(mubuf.offset);
buffer_info.globally_coherent.Assign(mubuf.glc);
buffer_info.system_coherent.Assign(mubuf.slc);
buffer_info.typed.Assign(true);
const IR::VectorReg src_reg{inst.src[1].code};
std::array<IR::F32, 4> comps{};
boost::container::static_vector<IR::Value, 4> comps;
for (u32 i = 0; i < num_dwords; i++) {
comps[i] = ir.GetVectorReg<IR::F32>(src_reg + i);
const auto src_reg_i = src_reg + i;
if (buffer_info.typed) {
comps.push_back(ir.GetVectorReg<IR::F32>(src_reg_i));
} else {
comps.push_back(ir.GetVectorReg<IR::U32>(src_reg_i));
}
}
if (buffer_info.typed) {
for (u32 i = num_dwords; i < 4; i++) {
comps[i] = ir.Imm32(0.f);
comps.push_back(ir.Imm32(0.f));
}
ir.StoreBufferFormat(handle, address, ir.CompositeConstruct(comps), buffer_info);
} else {
const auto value = num_dwords == 1 ? comps[0] : ir.CompositeConstruct(comps);
ir.StoreBufferU32(num_dwords, handle, address, value, buffer_info);
}
const IR::Value value = ir.CompositeConstruct(comps[0], comps[1], comps[2], comps[3]);
const IR::Value handle =
ir.CompositeConstruct(ir.GetScalarReg(sharp), ir.GetScalarReg(sharp + 1),
ir.GetScalarReg(sharp + 2), ir.GetScalarReg(sharp + 3));
ir.StoreBufferFormat(handle, address, value, buffer_info);
}
void Translator::BUFFER_ATOMIC(AtomicOp op, const GcnInst& inst) {

View File

@ -638,7 +638,8 @@ Value IREmitter::CompositeConstruct(std::span<const Value> elements) {
case 4:
return CompositeConstruct(elements[0], elements[1], elements[2], elements[3]);
default:
UNREACHABLE_MSG("Composite construct with greater than 4 elements");
UNREACHABLE_MSG("Composite construct with {} elements, only 2-4 are supported",
elements.size());
}
}

View File

@ -10,6 +10,14 @@
namespace Shader::Optimization {
struct FormatInfo {
AmdGpu::DataFormat data_format;
AmdGpu::NumberFormat num_format;
AmdGpu::CompMapping swizzle;
AmdGpu::NumberConversion num_conversion;
int num_components;
};
static bool IsBufferFormatLoad(const IR::Inst& inst) {
return inst.GetOpcode() == IR::Opcode::LoadBufferFormatF32;
}
@ -18,151 +26,150 @@ static bool IsBufferFormatStore(const IR::Inst& inst) {
return inst.GetOpcode() == IR::Opcode::StoreBufferFormatF32;
}
static IR::Value LoadBufferFormat(IR::IREmitter& ir, const AmdGpu::Buffer& buffer,
const IR::Value handle, const IR::U32 address,
const IR::BufferInstInfo info) {
const auto data_fmt = buffer.GetDataFmt();
const auto num_fmt = buffer.GetNumberFmt();
const auto num_conv = buffer.GetNumberConversion();
const auto num_components = AmdGpu::NumComponents(buffer.GetDataFmt());
static IR::Value LoadBufferFormat(IR::IREmitter& ir, const IR::Value handle, const IR::U32 address,
const IR::BufferInstInfo info, const FormatInfo& format_info) {
IR::Value interpreted;
switch (data_fmt) {
switch (format_info.data_format) {
case AmdGpu::DataFormat::FormatInvalid:
interpreted = ir.Imm32(0.f);
break;
case AmdGpu::DataFormat::Format8: {
const auto unpacked = ir.Unpack4x8(num_fmt, ir.LoadBufferU8(handle, address, info));
const auto unpacked =
ir.Unpack4x8(format_info.num_format, ir.LoadBufferU8(handle, address, info));
interpreted = ir.CompositeExtract(unpacked, 0);
break;
}
case AmdGpu::DataFormat::Format8_8: {
const auto raw = ir.LoadBufferU16(handle, address, info);
const auto unpacked = ir.Unpack4x8(num_fmt, raw);
const auto unpacked = ir.Unpack4x8(format_info.num_format, raw);
interpreted = ir.CompositeConstruct(ir.CompositeExtract(unpacked, 0),
ir.CompositeExtract(unpacked, 1));
break;
}
case AmdGpu::DataFormat::Format8_8_8_8:
interpreted = ir.Unpack4x8(num_fmt, IR::U32{ir.LoadBufferU32(1, handle, address, info)});
interpreted = ir.Unpack4x8(format_info.num_format,
IR::U32{ir.LoadBufferU32(1, handle, address, info)});
break;
case AmdGpu::DataFormat::Format16: {
const auto unpacked = ir.Unpack2x16(num_fmt, ir.LoadBufferU16(handle, address, info));
const auto unpacked =
ir.Unpack2x16(format_info.num_format, ir.LoadBufferU16(handle, address, info));
interpreted = ir.CompositeExtract(unpacked, 0);
break;
}
case AmdGpu::DataFormat::Format16_16:
interpreted = ir.Unpack2x16(num_fmt, IR::U32{ir.LoadBufferU32(1, handle, address, info)});
interpreted = ir.Unpack2x16(format_info.num_format,
IR::U32{ir.LoadBufferU32(1, handle, address, info)});
break;
case AmdGpu::DataFormat::Format10_11_11:
interpreted =
ir.Unpack10_11_11(num_fmt, IR::U32{ir.LoadBufferU32(1, handle, address, info)});
interpreted = ir.Unpack10_11_11(format_info.num_format,
IR::U32{ir.LoadBufferU32(1, handle, address, info)});
break;
case AmdGpu::DataFormat::Format2_10_10_10:
interpreted =
ir.Unpack2_10_10_10(num_fmt, IR::U32{ir.LoadBufferU32(1, handle, address, info)});
interpreted = ir.Unpack2_10_10_10(format_info.num_format,
IR::U32{ir.LoadBufferU32(1, handle, address, info)});
break;
case AmdGpu::DataFormat::Format16_16_16_16: {
const auto raw = ir.LoadBufferU32(2, handle, address, info);
interpreted =
ir.CompositeConstruct(ir.Unpack2x16(num_fmt, IR::U32{ir.CompositeExtract(raw, 0)}),
ir.Unpack2x16(num_fmt, IR::U32{ir.CompositeExtract(raw, 1)}));
interpreted = ir.CompositeConstruct(
ir.Unpack2x16(format_info.num_format, IR::U32{ir.CompositeExtract(raw, 0)}),
ir.Unpack2x16(format_info.num_format, IR::U32{ir.CompositeExtract(raw, 1)}));
break;
}
case AmdGpu::DataFormat::Format32:
case AmdGpu::DataFormat::Format32_32:
case AmdGpu::DataFormat::Format32_32_32:
case AmdGpu::DataFormat::Format32_32_32_32: {
ASSERT(num_fmt == AmdGpu::NumberFormat::Uint || num_fmt == AmdGpu::NumberFormat::Sint ||
num_fmt == AmdGpu::NumberFormat::Float);
interpreted = ir.LoadBufferF32(num_components, handle, address, info);
ASSERT(format_info.num_format == AmdGpu::NumberFormat::Uint ||
format_info.num_format == AmdGpu::NumberFormat::Sint ||
format_info.num_format == AmdGpu::NumberFormat::Float);
interpreted = ir.LoadBufferF32(format_info.num_components, handle, address, info);
break;
}
default:
UNREACHABLE_MSG("Unsupported buffer data format: {}", data_fmt);
UNREACHABLE_MSG("Unsupported buffer data format: {}", format_info.data_format);
}
// Pad to 4 components and apply additional modifications.
boost::container::static_vector<IR::Value, 4> components;
for (u32 i = 0; i < 4; i++) {
if (i < num_components) {
if (i < format_info.num_components) {
const auto component =
IR::F32{num_components == 1 ? interpreted : ir.CompositeExtract(interpreted, i)};
components.push_back(ApplyReadNumberConversion(ir, component, num_conv));
IR::F32{format_info.num_components == 1 ? interpreted
: ir.CompositeExtract(interpreted, i)};
components.push_back(
ApplyReadNumberConversion(ir, component, format_info.num_conversion));
} else {
components.push_back(ir.Imm32(0.f));
}
}
const auto swizzled = ApplySwizzle(ir, ir.CompositeConstruct(components), buffer.DstSelect());
const auto swizzled = ApplySwizzle(ir, ir.CompositeConstruct(components), format_info.swizzle);
return swizzled;
}
static void StoreBufferFormat(IR::IREmitter& ir, const AmdGpu::Buffer& buffer,
const IR::Value handle, const IR::U32 address, const IR::Value& value,
const IR::BufferInstInfo info) {
const auto data_fmt = buffer.GetDataFmt();
const auto num_fmt = buffer.GetNumberFmt();
const auto num_conv = buffer.GetNumberConversion();
const auto num_components = AmdGpu::NumComponents(buffer.GetDataFmt());
static void StoreBufferFormat(IR::IREmitter& ir, const IR::Value handle, const IR::U32 address,
const IR::Value& value, const IR::BufferInstInfo info,
const FormatInfo& format_info) {
// Extract actual number of components and apply additional modifications.
const auto swizzled = ApplySwizzle(ir, value, buffer.DstSelect().Inverse());
const auto swizzled = ApplySwizzle(ir, value, format_info.swizzle.Inverse());
boost::container::static_vector<IR::Value, 4> components;
for (u32 i = 0; i < num_components; i++) {
for (u32 i = 0; i < format_info.num_components; i++) {
const auto component = IR::F32{ir.CompositeExtract(swizzled, i)};
components.push_back(ApplyWriteNumberConversion(ir, component, num_conv));
components.push_back(ApplyWriteNumberConversion(ir, component, format_info.num_conversion));
}
const auto real_value =
components.size() == 1 ? components[0] : ir.CompositeConstruct(components);
switch (data_fmt) {
switch (format_info.data_format) {
case AmdGpu::DataFormat::FormatInvalid:
break;
case AmdGpu::DataFormat::Format8: {
const auto packed =
ir.Pack4x8(num_fmt, ir.CompositeConstruct(real_value, ir.Imm32(0.f), ir.Imm32(0.f),
ir.Imm32(0.f)));
ir.Pack4x8(format_info.num_format, ir.CompositeConstruct(real_value, ir.Imm32(0.f),
ir.Imm32(0.f), ir.Imm32(0.f)));
ir.StoreBufferU8(handle, address, packed, info);
break;
}
case AmdGpu::DataFormat::Format8_8: {
const auto packed =
ir.Pack4x8(num_fmt, ir.CompositeConstruct(ir.CompositeExtract(real_value, 0),
const auto packed = ir.Pack4x8(format_info.num_format,
ir.CompositeConstruct(ir.CompositeExtract(real_value, 0),
ir.CompositeExtract(real_value, 1),
ir.Imm32(0.f), ir.Imm32(0.f)));
ir.StoreBufferU16(handle, address, packed, info);
break;
}
case AmdGpu::DataFormat::Format8_8_8_8: {
auto packed = ir.Pack4x8(num_fmt, real_value);
auto packed = ir.Pack4x8(format_info.num_format, real_value);
ir.StoreBufferU32(1, handle, address, packed, info);
break;
}
case AmdGpu::DataFormat::Format16: {
const auto packed = ir.Pack2x16(num_fmt, ir.CompositeConstruct(real_value, ir.Imm32(0.f)));
const auto packed =
ir.Pack2x16(format_info.num_format, ir.CompositeConstruct(real_value, ir.Imm32(0.f)));
ir.StoreBufferU16(handle, address, packed, info);
break;
}
case AmdGpu::DataFormat::Format16_16: {
const auto packed = ir.Pack2x16(num_fmt, real_value);
const auto packed = ir.Pack2x16(format_info.num_format, real_value);
ir.StoreBufferU32(1, handle, address, packed, info);
break;
}
case AmdGpu::DataFormat::Format10_11_11: {
const auto packed = ir.Pack10_11_11(num_fmt, real_value);
const auto packed = ir.Pack10_11_11(format_info.num_format, real_value);
ir.StoreBufferU32(1, handle, address, packed, info);
break;
}
case AmdGpu::DataFormat::Format2_10_10_10: {
const auto packed = ir.Pack2_10_10_10(num_fmt, real_value);
const auto packed = ir.Pack2_10_10_10(format_info.num_format, real_value);
ir.StoreBufferU32(1, handle, address, packed, info);
break;
}
case AmdGpu::DataFormat::Format16_16_16_16: {
const auto packed = ir.CompositeConstruct(
ir.Pack2x16(num_fmt, ir.CompositeConstruct(ir.CompositeExtract(real_value, 0),
ir.Pack2x16(format_info.num_format,
ir.CompositeConstruct(ir.CompositeExtract(real_value, 0),
ir.CompositeExtract(real_value, 1))),
ir.Pack2x16(num_fmt, ir.CompositeConstruct(ir.CompositeExtract(real_value, 2),
ir.Pack2x16(format_info.num_format,
ir.CompositeConstruct(ir.CompositeExtract(real_value, 2),
ir.CompositeExtract(real_value, 3))));
ir.StoreBufferU32(2, handle, address, packed, info);
break;
@ -171,28 +178,40 @@ static void StoreBufferFormat(IR::IREmitter& ir, const AmdGpu::Buffer& buffer,
case AmdGpu::DataFormat::Format32_32:
case AmdGpu::DataFormat::Format32_32_32:
case AmdGpu::DataFormat::Format32_32_32_32: {
ASSERT(num_fmt == AmdGpu::NumberFormat::Uint || num_fmt == AmdGpu::NumberFormat::Sint ||
num_fmt == AmdGpu::NumberFormat::Float);
ir.StoreBufferF32(num_components, handle, address, real_value, info);
ASSERT(format_info.num_format == AmdGpu::NumberFormat::Uint ||
format_info.num_format == AmdGpu::NumberFormat::Sint ||
format_info.num_format == AmdGpu::NumberFormat::Float);
ir.StoreBufferF32(format_info.num_components, handle, address, real_value, info);
break;
}
default:
UNREACHABLE_MSG("Unsupported buffer data format: {}", data_fmt);
UNREACHABLE_MSG("Unsupported buffer data format: {}", format_info.data_format);
}
}
static void LowerBufferFormatInst(IR::Block& block, IR::Inst& inst, Info& info) {
IR::IREmitter ir{block, IR::Block::InstructionList::s_iterator_to(inst)};
const auto flags = inst.Flags<IR::BufferInstInfo>();
const auto desc{info.buffers[inst.Arg(0).U32()]};
const auto buffer{desc.GetSharp(info)};
const auto is_inst_typed = flags.inst_data_fmt != AmdGpu::DataFormat::FormatInvalid;
const auto data_format = is_inst_typed ? flags.inst_data_fmt.Value() : buffer.GetDataFmt();
const auto num_format = is_inst_typed ? flags.inst_num_fmt.Value() : buffer.GetNumberFmt();
const auto format_info = FormatInfo{
.data_format = data_format,
.num_format = num_format,
.swizzle = is_inst_typed ? AmdGpu::IdentityMapping : buffer.DstSelect(),
.num_conversion = AmdGpu::MapNumberConversion(num_format),
.num_components = AmdGpu::NumComponents(data_format),
};
if (IsBufferFormatLoad(inst)) {
const auto interpreted = LoadBufferFormat(ir, buffer, inst.Arg(0), IR::U32{inst.Arg(1)},
inst.Flags<IR::BufferInstInfo>());
const auto interpreted =
LoadBufferFormat(ir, inst.Arg(0), IR::U32{inst.Arg(1)}, flags, format_info);
inst.ReplaceUsesWithAndRemove(interpreted);
} else if (IsBufferFormatStore(inst)) {
StoreBufferFormat(ir, buffer, inst.Arg(0), IR::U32{inst.Arg(1)}, inst.Arg(2),
inst.Flags<IR::BufferInstInfo>());
StoreBufferFormat(ir, inst.Arg(0), IR::U32{inst.Arg(1)}, inst.Arg(2), flags, format_info);
inst.Invalidate();
}
}

View File

@ -43,6 +43,10 @@ static void EmitBarrierInBlock(IR::Block* block) {
action = BarrierAction::BarrierOnRead;
}
}
if (action != BarrierAction::None) {
IR::IREmitter ir{*block, --block->end()};
ir.Barrier();
}
}
// Inserts a barrier after divergent conditional blocks to avoid undefined

View File

@ -7,6 +7,7 @@
#include "common/bit_field.h"
#include "common/enum.h"
#include "common/types.h"
#include "video_core/amdgpu/types.h"
namespace Shader::IR {
@ -52,6 +53,8 @@ union BufferInstInfo {
BitField<14, 1, u32> system_coherent;
BitField<15, 1, u32> globally_coherent;
BitField<16, 1, u32> typed;
BitField<17, 4, AmdGpu::DataFormat> inst_data_fmt;
BitField<21, 3, AmdGpu::NumberFormat> inst_num_fmt;
};
enum class ScalarReg : u32 {

View File

@ -21,6 +21,7 @@ struct Profile {
bool support_separate_rounding_mode{};
bool support_fp32_denorm_preserve{};
bool support_fp32_denorm_flush{};
bool support_fp32_round_to_zero{};
bool support_explicit_workgroup_layout{};
bool support_legacy_vertex_attributes{};
bool supports_image_load_store_lod{};

View File

@ -93,18 +93,15 @@ void Liverpool::Process(std::stop_token stoken) {
// Process incoming commands with high priority
while (num_commands) {
Common::UniqueFunction<void> callback{};
{
std::unique_lock lk{submit_mutex};
callback = std::move(command_queue.back());
callback = std::move(command_queue.front());
command_queue.pop();
}
callback();
--num_commands;
}
callback();
}
curr_qid = (curr_qid + 1) % num_mapped_queues;
@ -395,6 +392,10 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span<const u32> dcb, std::span<c
header + 2, (count - 1) * sizeof(u32));
break;
}
case PM4ItOpcode::SetPredication: {
LOG_WARNING(Render_Vulkan, "Unimplemented IT_SET_PREDICATION");
break;
}
case PM4ItOpcode::IndexType: {
const auto* index_type = reinterpret_cast<const PM4CmdDrawIndexType*>(header);
regs.index_buffer_type.raw = index_type->raw;
@ -670,6 +671,7 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span<const u32> dcb, std::span<c
if (vo_port->IsVoLabel(wait_addr) &&
num_submits == mapped_queues[GfxQueueId].submits.size()) {
vo_port->WaitVoLabel([&] { return wait_reg_mem->Test(); });
break;
}
while (!wait_reg_mem->Test()) {
YIELD_GFX();
@ -693,7 +695,7 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span<const u32> dcb, std::span<c
break;
}
case PM4ItOpcode::WaitOnCeCounter: {
while (cblock.ce_count <= cblock.de_count) {
while (cblock.ce_count <= cblock.de_count && !ce_task.handle.done()) {
RESUME_GFX(ce_task);
}
break;
@ -714,7 +716,9 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span<const u32> dcb, std::span<c
}
if (ce_task.handle) {
ASSERT_MSG(ce_task.handle.done(), "Partially processed CCB");
while (!ce_task.handle.done()) {
RESUME_GFX(ce_task);
}
ce_task.handle.destroy();
}

View File

@ -83,8 +83,7 @@ struct Liverpool {
u32 crc32;
bool Valid() const {
return shader_hash && crc32 &&
(std::memcmp(signature.data(), signature_ref, sizeof(signature_ref)) == 0);
return std::memcmp(signature.data(), signature_ref, sizeof(signature_ref)) == 0;
}
};

View File

@ -262,6 +262,13 @@ private:
}
};
static constexpr CompMapping IdentityMapping = {
.r = CompSwizzle::Red,
.g = CompSwizzle::Green,
.b = CompSwizzle::Blue,
.a = CompSwizzle::Alpha,
};
inline DataFormat RemapDataFormat(const DataFormat format) {
switch (format) {
case DataFormat::Format11_11_10:

View File

@ -610,9 +610,10 @@ bool BufferCache::SynchronizeBufferFromImage(Buffer& buffer, VAddr device_addr,
Image& image = texture_cache.GetImage(image_id);
// Only perform sync if image is:
// - GPU modified; otherwise there are no changes to synchronize.
// - Not CPU modified; otherwise we could overwrite CPU changes with stale GPU changes.
// - Not CPU dirty; otherwise we could overwrite CPU changes with stale GPU changes.
// - Not GPU dirty; otherwise we could overwrite GPU changes with stale image data.
if (False(image.flags & ImageFlagBits::GpuModified) ||
True(image.flags & ImageFlagBits::CpuDirty)) {
True(image.flags & ImageFlagBits::Dirty)) {
return false;
}
ASSERT_MSG(device_addr == image.info.guest_address,
@ -628,8 +629,8 @@ bool BufferCache::SynchronizeBufferFromImage(Buffer& buffer, VAddr device_addr,
const u32 depth =
image.info.props.is_volume ? std::max(image.info.size.depth >> m, 1u) : 1u;
const auto& [mip_size, mip_pitch, mip_height, mip_ofs] = image.info.mips_layout[m];
offset += mip_ofs * num_layers;
if (offset + (mip_size * num_layers) > max_offset) {
offset += mip_ofs;
if (offset + mip_size > max_offset) {
break;
}
copies.push_back({

View File

@ -121,7 +121,7 @@ vk::PrimitiveTopology PrimitiveType(AmdGpu::PrimitiveType type) {
case AmdGpu::PrimitiveType::RectList:
return vk::PrimitiveTopology::ePatchList;
default:
UNREACHABLE();
UNREACHABLE_MSG("Unimplemented primitive type: {}", static_cast<u32>(type));
return vk::PrimitiveTopology::eTriangleList;
}
}

Some files were not shown because too many files have changed in this diff Show More