mirror of
https://github.com/PabloMK7/citra.git
synced 2024-11-30 19:30:17 +00:00
Merge pull request #6602 from SachinVin/wall
Chore: enable `-Werror` on GCC and clang
This commit is contained in:
commit
35d1b67fd4
25 changed files with 124 additions and 114 deletions
9
externals/CMakeLists.txt
vendored
9
externals/CMakeLists.txt
vendored
|
@ -3,6 +3,8 @@
|
||||||
# Suppress warnings from external libraries
|
# Suppress warnings from external libraries
|
||||||
if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
|
if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
|
||||||
add_compile_options(/W0)
|
add_compile_options(/W0)
|
||||||
|
else()
|
||||||
|
add_compile_options(-Wno-error)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/CMakeModules)
|
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/CMakeModules)
|
||||||
|
@ -112,6 +114,8 @@ add_library(nihstro-headers INTERFACE)
|
||||||
target_include_directories(nihstro-headers INTERFACE ./nihstro/include)
|
target_include_directories(nihstro-headers INTERFACE ./nihstro/include)
|
||||||
if (MSVC)
|
if (MSVC)
|
||||||
target_compile_options(nihstro-headers INTERFACE /W0)
|
target_compile_options(nihstro-headers INTERFACE /W0)
|
||||||
|
else()
|
||||||
|
target_compile_options(nihstro-headers INTERFACE -Wno-error)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Open Source Archives
|
# Open Source Archives
|
||||||
|
@ -195,6 +199,11 @@ if (ENABLE_WEB_SERVICE)
|
||||||
add_library(cpp-jwt INTERFACE)
|
add_library(cpp-jwt INTERFACE)
|
||||||
target_include_directories(cpp-jwt INTERFACE ./cpp-jwt/include)
|
target_include_directories(cpp-jwt INTERFACE ./cpp-jwt/include)
|
||||||
target_compile_definitions(cpp-jwt INTERFACE CPP_JWT_USE_VENDORED_NLOHMANN_JSON)
|
target_compile_definitions(cpp-jwt INTERFACE CPP_JWT_USE_VENDORED_NLOHMANN_JSON)
|
||||||
|
if (MSVC)
|
||||||
|
target_compile_options(cpp-jwt INTERFACE /W0)
|
||||||
|
else()
|
||||||
|
target_compile_options(cpp-jwt INTERFACE -Wno-error)
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# lodepng
|
# lodepng
|
||||||
|
|
|
@ -102,6 +102,10 @@ else()
|
||||||
-Wno-attributes
|
-Wno-attributes
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if (CITRA_WARNINGS_AS_ERRORS)
|
||||||
|
add_compile_options(-Werror)
|
||||||
|
endif()
|
||||||
|
|
||||||
if (APPLE AND CMAKE_CXX_COMPILER_ID STREQUAL Clang)
|
if (APPLE AND CMAKE_CXX_COMPILER_ID STREQUAL Clang)
|
||||||
add_compile_options("-stdlib=libc++")
|
add_compile_options("-stdlib=libc++")
|
||||||
endif()
|
endif()
|
||||||
|
|
|
@ -56,35 +56,6 @@ std::condition_variable running_cv;
|
||||||
|
|
||||||
} // Anonymous namespace
|
} // Anonymous namespace
|
||||||
|
|
||||||
static bool DisplayAlertMessage(const char* caption, const char* text, bool yes_no) {
|
|
||||||
JNIEnv* env = IDCache::GetEnvForThread();
|
|
||||||
|
|
||||||
// Execute the Java method.
|
|
||||||
jboolean result = env->CallStaticBooleanMethod(
|
|
||||||
IDCache::GetNativeLibraryClass(), IDCache::GetDisplayAlertMsg(), ToJString(env, caption),
|
|
||||||
ToJString(env, text), yes_no ? JNI_TRUE : JNI_FALSE);
|
|
||||||
|
|
||||||
return result != JNI_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static std::string DisplayAlertPrompt(const char* caption, const char* text, int buttonConfig) {
|
|
||||||
JNIEnv* env = IDCache::GetEnvForThread();
|
|
||||||
|
|
||||||
jstring value = reinterpret_cast<jstring>(env->CallStaticObjectMethod(
|
|
||||||
IDCache::GetNativeLibraryClass(), IDCache::GetDisplayAlertPrompt(), ToJString(env, caption),
|
|
||||||
ToJString(env, text), buttonConfig));
|
|
||||||
|
|
||||||
return GetJString(env, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int AlertPromptButton() {
|
|
||||||
JNIEnv* env = IDCache::GetEnvForThread();
|
|
||||||
|
|
||||||
// Execute the Java method.
|
|
||||||
return static_cast<int>(env->CallStaticIntMethod(IDCache::GetNativeLibraryClass(),
|
|
||||||
IDCache::GetAlertPromptButton()));
|
|
||||||
}
|
|
||||||
|
|
||||||
static jobject ToJavaCoreError(Core::System::ResultStatus result) {
|
static jobject ToJavaCoreError(Core::System::ResultStatus result) {
|
||||||
static const std::map<Core::System::ResultStatus, const char*> CoreErrorNameMap{
|
static const std::map<Core::System::ResultStatus, const char*> CoreErrorNameMap{
|
||||||
{Core::System::ResultStatus::ErrorSystemFiles, "ErrorSystemFiles"},
|
{Core::System::ResultStatus::ErrorSystemFiles, "ErrorSystemFiles"},
|
||||||
|
|
|
@ -31,7 +31,7 @@ av_hwframe_ctx_init_func av_hwframe_ctx_init;
|
||||||
av_hwframe_get_buffer_func av_hwframe_get_buffer;
|
av_hwframe_get_buffer_func av_hwframe_get_buffer;
|
||||||
av_hwframe_transfer_data_func av_hwframe_transfer_data;
|
av_hwframe_transfer_data_func av_hwframe_transfer_data;
|
||||||
av_int_list_length_for_size_func av_int_list_length_for_size;
|
av_int_list_length_for_size_func av_int_list_length_for_size;
|
||||||
#if LIBAVCODEC_VERSION_MAJOR >= 59
|
#if LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(56, 53, 100) // lavu 56.53.100
|
||||||
av_opt_child_class_iterate_func av_opt_child_class_iterate;
|
av_opt_child_class_iterate_func av_opt_child_class_iterate;
|
||||||
#else
|
#else
|
||||||
av_opt_child_class_next_func av_opt_child_class_next;
|
av_opt_child_class_next_func av_opt_child_class_next;
|
||||||
|
@ -166,7 +166,7 @@ static bool LoadAVUtil() {
|
||||||
LOAD_SYMBOL(avutil, av_hwframe_get_buffer);
|
LOAD_SYMBOL(avutil, av_hwframe_get_buffer);
|
||||||
LOAD_SYMBOL(avutil, av_hwframe_transfer_data);
|
LOAD_SYMBOL(avutil, av_hwframe_transfer_data);
|
||||||
LOAD_SYMBOL(avutil, av_int_list_length_for_size);
|
LOAD_SYMBOL(avutil, av_int_list_length_for_size);
|
||||||
#if LIBAVCODEC_VERSION_MAJOR >= 59
|
#if LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(56, 53, 100) // lavu 56.53.100
|
||||||
LOAD_SYMBOL(avutil, av_opt_child_class_iterate);
|
LOAD_SYMBOL(avutil, av_opt_child_class_iterate);
|
||||||
#else
|
#else
|
||||||
LOAD_SYMBOL(avutil, av_opt_child_class_next);
|
LOAD_SYMBOL(avutil, av_opt_child_class_next);
|
||||||
|
|
|
@ -47,7 +47,7 @@ typedef int (*av_hwframe_ctx_init_func)(AVBufferRef*);
|
||||||
typedef int (*av_hwframe_get_buffer_func)(AVBufferRef*, AVFrame*, int);
|
typedef int (*av_hwframe_get_buffer_func)(AVBufferRef*, AVFrame*, int);
|
||||||
typedef int (*av_hwframe_transfer_data_func)(AVFrame*, const AVFrame*, int);
|
typedef int (*av_hwframe_transfer_data_func)(AVFrame*, const AVFrame*, int);
|
||||||
typedef unsigned (*av_int_list_length_for_size_func)(unsigned, const void*, uint64_t);
|
typedef unsigned (*av_int_list_length_for_size_func)(unsigned, const void*, uint64_t);
|
||||||
#if LIBAVCODEC_VERSION_MAJOR >= 59
|
#if LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(56, 53, 100) // lavu 56.53.100
|
||||||
typedef const AVClass* (*av_opt_child_class_iterate_func)(const AVClass*, void**);
|
typedef const AVClass* (*av_opt_child_class_iterate_func)(const AVClass*, void**);
|
||||||
#else
|
#else
|
||||||
typedef const AVClass* (*av_opt_child_class_next_func)(const AVClass*, const AVClass*);
|
typedef const AVClass* (*av_opt_child_class_next_func)(const AVClass*, const AVClass*);
|
||||||
|
@ -85,7 +85,7 @@ extern av_hwframe_ctx_init_func av_hwframe_ctx_init;
|
||||||
extern av_hwframe_get_buffer_func av_hwframe_get_buffer;
|
extern av_hwframe_get_buffer_func av_hwframe_get_buffer;
|
||||||
extern av_hwframe_transfer_data_func av_hwframe_transfer_data;
|
extern av_hwframe_transfer_data_func av_hwframe_transfer_data;
|
||||||
extern av_int_list_length_for_size_func av_int_list_length_for_size;
|
extern av_int_list_length_for_size_func av_int_list_length_for_size;
|
||||||
#if LIBAVCODEC_VERSION_MAJOR >= 59
|
#if LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(56, 53, 100) // lavu 56.53.100
|
||||||
extern av_opt_child_class_iterate_func av_opt_child_class_iterate;
|
extern av_opt_child_class_iterate_func av_opt_child_class_iterate;
|
||||||
#else
|
#else
|
||||||
extern av_opt_child_class_next_func av_opt_child_class_next;
|
extern av_opt_child_class_next_func av_opt_child_class_next;
|
||||||
|
|
|
@ -102,12 +102,11 @@ static void StripTailDirSlashes(std::string& fname) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Exists(const std::string& filename) {
|
bool Exists(const std::string& filename) {
|
||||||
struct stat file_info;
|
|
||||||
|
|
||||||
std::string copy(filename);
|
std::string copy(filename);
|
||||||
StripTailDirSlashes(copy);
|
StripTailDirSlashes(copy);
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
struct stat file_info;
|
||||||
// Windows needs a slash to identify a driver root
|
// Windows needs a slash to identify a driver root
|
||||||
if (copy.size() != 0 && copy.back() == ':')
|
if (copy.size() != 0 && copy.back() == ':')
|
||||||
copy += DIR_SEP_CHR;
|
copy += DIR_SEP_CHR;
|
||||||
|
@ -116,6 +115,7 @@ bool Exists(const std::string& filename) {
|
||||||
#elif ANDROID
|
#elif ANDROID
|
||||||
int result = AndroidStorage::FileExists(filename) ? 0 : -1;
|
int result = AndroidStorage::FileExists(filename) ? 0 : -1;
|
||||||
#else
|
#else
|
||||||
|
struct stat file_info;
|
||||||
int result = stat(copy.c_str(), &file_info);
|
int result = stat(copy.c_str(), &file_info);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -699,7 +699,7 @@ static const std::string& GetHomeDirectory() {
|
||||||
* @return The directory path
|
* @return The directory path
|
||||||
* @sa http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
|
* @sa http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
|
||||||
*/
|
*/
|
||||||
static const std::string GetUserDirectory(const std::string& envvar) {
|
[[maybe_unused]] static const std::string GetUserDirectory(const std::string& envvar) {
|
||||||
const char* directory = getenv(envvar.c_str());
|
const char* directory = getenv(envvar.c_str());
|
||||||
|
|
||||||
std::string user_dir;
|
std::string user_dir;
|
||||||
|
|
|
@ -16,19 +16,33 @@
|
||||||
// Call directly after the command or use the error num.
|
// Call directly after the command or use the error num.
|
||||||
// This function might change the error code.
|
// This function might change the error code.
|
||||||
std::string GetLastErrorMsg() {
|
std::string GetLastErrorMsg() {
|
||||||
constexpr std::size_t buff_size = 255;
|
|
||||||
char err_str[buff_size];
|
|
||||||
std::size_t msg_len;
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
msg_len =
|
LPSTR err_str;
|
||||||
FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, nullptr, GetLastError(),
|
|
||||||
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), err_str, buff_size, nullptr);
|
DWORD res = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
||||||
|
FORMAT_MESSAGE_IGNORE_INSERTS,
|
||||||
|
nullptr, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
||||||
|
reinterpret_cast<LPSTR>(&err_str), 1, nullptr);
|
||||||
|
if (!res) {
|
||||||
|
return "(FormatMessageA failed to format error)";
|
||||||
|
}
|
||||||
|
std::string ret(err_str);
|
||||||
|
LocalFree(err_str);
|
||||||
|
return ret;
|
||||||
|
#else
|
||||||
|
char err_str[255];
|
||||||
|
#if (defined(__GLIBC__) || __ANDROID_API__ >= 23) && \
|
||||||
|
(_GNU_SOURCE || (_POSIX_C_SOURCE < 200112L && _XOPEN_SOURCE < 600))
|
||||||
|
// Thread safe (GNU-specific)
|
||||||
|
const char* str = strerror_r(errno, err_str, sizeof(err_str));
|
||||||
|
return std::string(str);
|
||||||
#else
|
#else
|
||||||
// Thread safe (XSI-compliant)
|
// Thread safe (XSI-compliant)
|
||||||
strerror_r(errno, err_str, buff_size);
|
int second_err = strerror_r(errno, err_str, sizeof(err_str));
|
||||||
msg_len = strnlen(err_str, buff_size);
|
if (second_err != 0) {
|
||||||
#endif
|
return "(strerror_r failed to format error)";
|
||||||
|
}
|
||||||
return std::string(err_str, msg_len);
|
return std::string(err_str);
|
||||||
|
#endif // GLIBC etc.
|
||||||
|
#endif // _WIN32
|
||||||
}
|
}
|
||||||
|
|
|
@ -170,7 +170,7 @@ static std::wstring CPToUTF16(u32 code_page, const std::string& input) {
|
||||||
MultiByteToWideChar(code_page, 0, input.data(), static_cast<int>(input.size()), nullptr, 0);
|
MultiByteToWideChar(code_page, 0, input.data(), static_cast<int>(input.size()), nullptr, 0);
|
||||||
|
|
||||||
if (size == 0) {
|
if (size == 0) {
|
||||||
return L"";
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
std::wstring output(size, L'\0');
|
std::wstring output(size, L'\0');
|
||||||
|
|
|
@ -110,7 +110,7 @@ void ARMul_State::Reset() {
|
||||||
Reg[13] = 0x10000000;
|
Reg[13] = 0x10000000;
|
||||||
Reg[15] = 0;
|
Reg[15] = 0;
|
||||||
|
|
||||||
Cpsr = static_cast<u32>(INTBITS) | SVC32MODE;
|
Cpsr = static_cast<u32>(INTBITS) | static_cast<u32>(SVC32MODE);
|
||||||
Mode = SVC32MODE;
|
Mode = SVC32MODE;
|
||||||
Bank = SVCBANK;
|
Bank = SVCBANK;
|
||||||
|
|
||||||
|
|
|
@ -52,7 +52,7 @@ void CheatEngine::AddCheat(const std::shared_ptr<CheatBase>& cheat) {
|
||||||
|
|
||||||
void CheatEngine::RemoveCheat(std::size_t index) {
|
void CheatEngine::RemoveCheat(std::size_t index) {
|
||||||
std::unique_lock<std::shared_mutex> lock(cheats_list_mutex);
|
std::unique_lock<std::shared_mutex> lock(cheats_list_mutex);
|
||||||
if (index < 0 || index >= static_cast<int>(cheats_list.size())) {
|
if (index < 0 || index >= cheats_list.size()) {
|
||||||
LOG_ERROR(Core_Cheats, "Invalid index {}", index);
|
LOG_ERROR(Core_Cheats, "Invalid index {}", index);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -61,7 +61,7 @@ void CheatEngine::RemoveCheat(std::size_t index) {
|
||||||
|
|
||||||
void CheatEngine::UpdateCheat(std::size_t index, const std::shared_ptr<CheatBase>& new_cheat) {
|
void CheatEngine::UpdateCheat(std::size_t index, const std::shared_ptr<CheatBase>& new_cheat) {
|
||||||
std::unique_lock<std::shared_mutex> lock(cheats_list_mutex);
|
std::unique_lock<std::shared_mutex> lock(cheats_list_mutex);
|
||||||
if (index < 0 || index >= static_cast<int>(cheats_list.size())) {
|
if (index < 0 || index >= cheats_list.size()) {
|
||||||
LOG_ERROR(Core_Cheats, "Invalid index {}", index);
|
LOG_ERROR(Core_Cheats, "Invalid index {}", index);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -59,21 +59,25 @@ void FFmpegStream::Flush() {
|
||||||
SendFrame(nullptr);
|
SendFrame(nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FFmpegStream::WritePacket(AVPacket& packet) {
|
void FFmpegStream::WritePacket(AVPacket* packet) {
|
||||||
FFmpeg::av_packet_rescale_ts(&packet, codec_context->time_base, stream->time_base);
|
FFmpeg::av_packet_rescale_ts(packet, codec_context->time_base, stream->time_base);
|
||||||
packet.stream_index = stream->index;
|
packet->stream_index = stream->index;
|
||||||
{
|
{
|
||||||
std::lock_guard lock{*format_context_mutex};
|
std::lock_guard lock{*format_context_mutex};
|
||||||
FFmpeg::av_interleaved_write_frame(format_context, &packet);
|
FFmpeg::av_interleaved_write_frame(format_context, packet);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void FFmpegStream::SendFrame(AVFrame* frame) {
|
void FFmpegStream::SendFrame(AVFrame* frame) {
|
||||||
// Initialize packet
|
// Initialize packet
|
||||||
AVPacket packet;
|
AVPacket* packet = FFmpeg::av_packet_alloc();
|
||||||
FFmpeg::av_init_packet(&packet);
|
if (!packet) {
|
||||||
packet.data = nullptr;
|
LOG_ERROR(Render, "Frame dropped: av_packet_alloc failed");
|
||||||
packet.size = 0;
|
}
|
||||||
|
SCOPE_EXIT({ FFmpeg::av_packet_free(&packet); });
|
||||||
|
|
||||||
|
packet->data = nullptr;
|
||||||
|
packet->size = 0;
|
||||||
|
|
||||||
// Encode frame
|
// Encode frame
|
||||||
if (FFmpeg::avcodec_send_frame(codec_context.get(), frame) < 0) {
|
if (FFmpeg::avcodec_send_frame(codec_context.get(), frame) < 0) {
|
||||||
|
@ -82,7 +86,7 @@ void FFmpegStream::SendFrame(AVFrame* frame) {
|
||||||
}
|
}
|
||||||
int error = 1;
|
int error = 1;
|
||||||
while (error >= 0) {
|
while (error >= 0) {
|
||||||
error = FFmpeg::avcodec_receive_packet(codec_context.get(), &packet);
|
error = FFmpeg::avcodec_receive_packet(codec_context.get(), packet);
|
||||||
if (error == AVERROR(EAGAIN) || error == AVERROR_EOF)
|
if (error == AVERROR(EAGAIN) || error == AVERROR_EOF)
|
||||||
return;
|
return;
|
||||||
if (error < 0) {
|
if (error < 0) {
|
||||||
|
@ -485,7 +489,7 @@ bool FFmpegAudioStream::Init(FFmpegMuxer& muxer) {
|
||||||
}
|
}
|
||||||
codec_context->time_base.num = 1;
|
codec_context->time_base.num = 1;
|
||||||
codec_context->time_base.den = codec_context->sample_rate;
|
codec_context->time_base.den = codec_context->sample_rate;
|
||||||
#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(59, 24, 100)
|
#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(59, 24, 100) // lavc 59.24.100
|
||||||
codec_context->ch_layout = AV_CHANNEL_LAYOUT_STEREO;
|
codec_context->ch_layout = AV_CHANNEL_LAYOUT_STEREO;
|
||||||
#else
|
#else
|
||||||
codec_context->channel_layout = AV_CH_LAYOUT_STEREO;
|
codec_context->channel_layout = AV_CH_LAYOUT_STEREO;
|
||||||
|
@ -527,7 +531,7 @@ bool FFmpegAudioStream::Init(FFmpegMuxer& muxer) {
|
||||||
audio_frame->format = codec_context->sample_fmt;
|
audio_frame->format = codec_context->sample_fmt;
|
||||||
audio_frame->sample_rate = codec_context->sample_rate;
|
audio_frame->sample_rate = codec_context->sample_rate;
|
||||||
|
|
||||||
#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(59, 24, 100)
|
#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(59, 24, 100) // lavc 59.24.100
|
||||||
auto num_channels = codec_context->ch_layout.nb_channels;
|
auto num_channels = codec_context->ch_layout.nb_channels;
|
||||||
audio_frame->ch_layout = codec_context->ch_layout;
|
audio_frame->ch_layout = codec_context->ch_layout;
|
||||||
SwrContext* context = nullptr;
|
SwrContext* context = nullptr;
|
||||||
|
@ -1003,7 +1007,7 @@ void GetOptionList(std::vector<OptionInfo>& out, const AVClass* av_class, bool s
|
||||||
}
|
}
|
||||||
|
|
||||||
const AVClass* child_class = nullptr;
|
const AVClass* child_class = nullptr;
|
||||||
#if LIBAVCODEC_VERSION_MAJOR >= 59
|
#if LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(56, 53, 100) // lavu 56.53.100
|
||||||
void* iter = nullptr;
|
void* iter = nullptr;
|
||||||
while ((child_class = FFmpeg::av_opt_child_class_iterate(av_class, &iter))) {
|
while ((child_class = FFmpeg::av_opt_child_class_iterate(av_class, &iter))) {
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -37,7 +37,7 @@ public:
|
||||||
protected:
|
protected:
|
||||||
~FFmpegStream();
|
~FFmpegStream();
|
||||||
|
|
||||||
void WritePacket(AVPacket& packet);
|
void WritePacket(AVPacket* packet);
|
||||||
void SendFrame(AVFrame* frame);
|
void SendFrame(AVFrame* frame);
|
||||||
|
|
||||||
struct AVCodecContextDeleter {
|
struct AVCodecContextDeleter {
|
||||||
|
@ -52,6 +52,12 @@ protected:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct AVPacketDeleter {
|
||||||
|
void operator()(AVPacket* packet) const {
|
||||||
|
av_packet_free(&packet);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
AVFormatContext* format_context{};
|
AVFormatContext* format_context{};
|
||||||
std::mutex* format_context_mutex{};
|
std::mutex* format_context_mutex{};
|
||||||
std::unique_ptr<AVCodecContext, AVCodecContextDeleter> codec_context{};
|
std::unique_ptr<AVCodecContext, AVCodecContextDeleter> codec_context{};
|
||||||
|
|
|
@ -31,7 +31,7 @@ enum class LowPathType : u32 {
|
||||||
};
|
};
|
||||||
|
|
||||||
union Mode {
|
union Mode {
|
||||||
u32 hex;
|
u32 hex = 0;
|
||||||
BitField<0, 1, u32> read_flag;
|
BitField<0, 1, u32> read_flag;
|
||||||
BitField<1, 1, u32> write_flag;
|
BitField<1, 1, u32> write_flag;
|
||||||
BitField<2, 1, u32> create_flag;
|
BitField<2, 1, u32> create_flag;
|
||||||
|
|
|
@ -90,7 +90,7 @@ union CoreVersion {
|
||||||
major.Assign(major_ver);
|
major.Assign(major_ver);
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 raw;
|
u32 raw = 0;
|
||||||
BitField<8, 8, u32> revision;
|
BitField<8, 8, u32> revision;
|
||||||
BitField<16, 8, u32> minor;
|
BitField<16, 8, u32> minor;
|
||||||
BitField<24, 8, u32> major;
|
BitField<24, 8, u32> major;
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
// Refer to the license.txt file included.
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <climits>
|
||||||
#include <list>
|
#include <list>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <boost/serialization/string.hpp>
|
#include <boost/serialization/string.hpp>
|
||||||
|
@ -288,7 +289,7 @@ void ThreadManager::DebugThreadQueue() {
|
||||||
|
|
||||||
for (auto& t : thread_list) {
|
for (auto& t : thread_list) {
|
||||||
u32 priority = ready_queue.contains(t.get());
|
u32 priority = ready_queue.contains(t.get());
|
||||||
if (priority != -1) {
|
if (priority != UINT_MAX) {
|
||||||
LOG_DEBUG(Kernel, "0x{:02X} {}", priority, t->GetObjectId());
|
LOG_DEBUG(Kernel, "0x{:02X} {}", priority, t->GetObjectId());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -904,7 +904,7 @@ void Module::SetSystemSetupNeeded(bool setup_needed) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Module::IsSystemSetupNeeded() {
|
bool Module::IsSystemSetupNeeded() {
|
||||||
u32 block;
|
u32 block{};
|
||||||
GetConfigInfoBlock(SystemSetupRequiredBlockID, sizeof(block), 0xC, &block);
|
GetConfigInfoBlock(SystemSetupRequiredBlockID, sizeof(block), 0xC, &block);
|
||||||
return (block & 0xFFFF) == 0;
|
return (block & 0xFFFF) == 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -204,12 +204,11 @@ void ExtraHID::HandleReadCalibrationDataRequest(const std::vector<u8>& request_b
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<u8> response(5);
|
std::vector<u8> response(5 + size);
|
||||||
response[0] = static_cast<u8>(ResponseID::ReadCalibrationData);
|
response[0] = static_cast<u8>(ResponseID::ReadCalibrationData);
|
||||||
std::memcpy(&response[1], &request.offset, sizeof(request.offset));
|
std::memcpy(&response[1], &request.offset, sizeof(request.offset));
|
||||||
std::memcpy(&response[3], &request.size, sizeof(request.size));
|
std::memcpy(&response[3], &request.size, sizeof(request.size));
|
||||||
response.insert(response.end(), calibration_data.begin() + offset,
|
std::memcpy(&response[5], calibration_data.data() + offset, size);
|
||||||
calibration_data.begin() + offset + size);
|
|
||||||
Send(response);
|
Send(response);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -303,6 +303,7 @@ std::vector<u8> GenerateEAPoLStartFrame(u16 association_id, const NodeInfo& node
|
||||||
std::memcpy(eapol_buffer.data(), &eapol_start, sizeof(eapol_start));
|
std::memcpy(eapol_buffer.data(), &eapol_start, sizeof(eapol_start));
|
||||||
|
|
||||||
std::vector<u8> buffer = GenerateLLCHeader(EtherType::EAPoL);
|
std::vector<u8> buffer = GenerateLLCHeader(EtherType::EAPoL);
|
||||||
|
buffer.reserve(buffer.size() + sizeof(EAPoLStartPacket));
|
||||||
buffer.insert(buffer.end(), eapol_buffer.begin(), eapol_buffer.end());
|
buffer.insert(buffer.end(), eapol_buffer.begin(), eapol_buffer.end());
|
||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
@ -366,6 +367,7 @@ std::vector<u8> GenerateEAPoLLogoffFrame(const MacAddress& mac_address, u16 netw
|
||||||
std::memcpy(eapol_buffer.data(), &eapol_logoff, sizeof(eapol_logoff));
|
std::memcpy(eapol_buffer.data(), &eapol_logoff, sizeof(eapol_logoff));
|
||||||
|
|
||||||
std::vector<u8> buffer = GenerateLLCHeader(EtherType::EAPoL);
|
std::vector<u8> buffer = GenerateLLCHeader(EtherType::EAPoL);
|
||||||
|
buffer.reserve(buffer.size() + sizeof(EAPoLStartPacket));
|
||||||
buffer.insert(buffer.end(), eapol_buffer.begin(), eapol_buffer.end());
|
buffer.insert(buffer.end(), eapol_buffer.begin(), eapol_buffer.end());
|
||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
|
@ -519,9 +519,9 @@ struct CTRPollFD {
|
||||||
CTRPollFD result;
|
CTRPollFD result;
|
||||||
result.events.hex = Events::TranslateTo3DS(fd.events, has_libctru_bug).hex;
|
result.events.hex = Events::TranslateTo3DS(fd.events, has_libctru_bug).hex;
|
||||||
result.revents.hex = Events::TranslateTo3DS(fd.revents, has_libctru_bug).hex;
|
result.revents.hex = Events::TranslateTo3DS(fd.revents, has_libctru_bug).hex;
|
||||||
for (auto iter = socu.open_sockets.begin(); iter != socu.open_sockets.end(); ++iter) {
|
for (const auto& socket : socu.open_sockets) {
|
||||||
if (iter->second.socket_fd == fd.fd) {
|
if (socket.second.socket_fd == fd.fd) {
|
||||||
result.fd = iter->first;
|
result.fd = socket.first;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -662,7 +662,8 @@ struct CTRAddrInfo {
|
||||||
};
|
};
|
||||||
ctr_addr.ai_addrlen = static_cast<s32_le>(ctr_addr.ai_addr.raw.len);
|
ctr_addr.ai_addrlen = static_cast<s32_le>(ctr_addr.ai_addr.raw.len);
|
||||||
if (addr.ai_canonname)
|
if (addr.ai_canonname)
|
||||||
std::strncpy(ctr_addr.ai_canonname, addr.ai_canonname, sizeof(ctr_addr.ai_canonname));
|
std::strncpy(ctr_addr.ai_canonname, addr.ai_canonname,
|
||||||
|
sizeof(ctr_addr.ai_canonname) - 1);
|
||||||
return ctr_addr;
|
return ctr_addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -45,7 +45,7 @@ struct ControllerState {
|
||||||
union {
|
union {
|
||||||
struct {
|
struct {
|
||||||
union {
|
union {
|
||||||
u16_le hex;
|
u16_le hex = 0;
|
||||||
|
|
||||||
BitField<0, 1, u16> a;
|
BitField<0, 1, u16> a;
|
||||||
BitField<1, 1, u16> b;
|
BitField<1, 1, u16> b;
|
||||||
|
@ -96,7 +96,7 @@ struct ControllerState {
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
union {
|
union {
|
||||||
u32_le hex;
|
u32_le hex = 0;
|
||||||
|
|
||||||
BitField<0, 5, u32> battery_level;
|
BitField<0, 5, u32> battery_level;
|
||||||
BitField<5, 1, u32> zl_not_held;
|
BitField<5, 1, u32> zl_not_held;
|
||||||
|
@ -136,7 +136,7 @@ static u64 GetInputCount(const std::vector<u8>& input) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
ControllerState state;
|
ControllerState state{};
|
||||||
std::memcpy(&state, input.data() + pos, sizeof(ControllerState));
|
std::memcpy(&state, input.data() + pos, sizeof(ControllerState));
|
||||||
if (state.type == ControllerStateType::PadAndCircle) {
|
if (state.type == ControllerStateType::PadAndCircle) {
|
||||||
input_count++;
|
input_count++;
|
||||||
|
@ -238,7 +238,7 @@ void Movie::CheckInputEnd() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Movie::Play(Service::HID::PadState& pad_state, s16& circle_pad_x, s16& circle_pad_y) {
|
void Movie::Play(Service::HID::PadState& pad_state, s16& circle_pad_x, s16& circle_pad_y) {
|
||||||
ControllerState s;
|
ControllerState s{};
|
||||||
std::memcpy(&s, &recorded_input[current_byte], sizeof(ControllerState));
|
std::memcpy(&s, &recorded_input[current_byte], sizeof(ControllerState));
|
||||||
current_byte += sizeof(ControllerState);
|
current_byte += sizeof(ControllerState);
|
||||||
current_input++;
|
current_input++;
|
||||||
|
@ -270,7 +270,7 @@ void Movie::Play(Service::HID::PadState& pad_state, s16& circle_pad_x, s16& circ
|
||||||
}
|
}
|
||||||
|
|
||||||
void Movie::Play(Service::HID::TouchDataEntry& touch_data) {
|
void Movie::Play(Service::HID::TouchDataEntry& touch_data) {
|
||||||
ControllerState s;
|
ControllerState s{};
|
||||||
std::memcpy(&s, &recorded_input[current_byte], sizeof(ControllerState));
|
std::memcpy(&s, &recorded_input[current_byte], sizeof(ControllerState));
|
||||||
current_byte += sizeof(ControllerState);
|
current_byte += sizeof(ControllerState);
|
||||||
|
|
||||||
|
@ -287,7 +287,7 @@ void Movie::Play(Service::HID::TouchDataEntry& touch_data) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Movie::Play(Service::HID::AccelerometerDataEntry& accelerometer_data) {
|
void Movie::Play(Service::HID::AccelerometerDataEntry& accelerometer_data) {
|
||||||
ControllerState s;
|
ControllerState s{};
|
||||||
std::memcpy(&s, &recorded_input[current_byte], sizeof(ControllerState));
|
std::memcpy(&s, &recorded_input[current_byte], sizeof(ControllerState));
|
||||||
current_byte += sizeof(ControllerState);
|
current_byte += sizeof(ControllerState);
|
||||||
|
|
||||||
|
@ -304,7 +304,7 @@ void Movie::Play(Service::HID::AccelerometerDataEntry& accelerometer_data) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Movie::Play(Service::HID::GyroscopeDataEntry& gyroscope_data) {
|
void Movie::Play(Service::HID::GyroscopeDataEntry& gyroscope_data) {
|
||||||
ControllerState s;
|
ControllerState s{};
|
||||||
std::memcpy(&s, &recorded_input[current_byte], sizeof(ControllerState));
|
std::memcpy(&s, &recorded_input[current_byte], sizeof(ControllerState));
|
||||||
current_byte += sizeof(ControllerState);
|
current_byte += sizeof(ControllerState);
|
||||||
|
|
||||||
|
@ -321,7 +321,7 @@ void Movie::Play(Service::HID::GyroscopeDataEntry& gyroscope_data) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Movie::Play(Service::IR::PadState& pad_state, s16& c_stick_x, s16& c_stick_y) {
|
void Movie::Play(Service::IR::PadState& pad_state, s16& c_stick_x, s16& c_stick_y) {
|
||||||
ControllerState s;
|
ControllerState s{};
|
||||||
std::memcpy(&s, &recorded_input[current_byte], sizeof(ControllerState));
|
std::memcpy(&s, &recorded_input[current_byte], sizeof(ControllerState));
|
||||||
current_byte += sizeof(ControllerState);
|
current_byte += sizeof(ControllerState);
|
||||||
|
|
||||||
|
@ -339,7 +339,7 @@ void Movie::Play(Service::IR::PadState& pad_state, s16& c_stick_x, s16& c_stick_
|
||||||
}
|
}
|
||||||
|
|
||||||
void Movie::Play(Service::IR::ExtraHIDResponse& extra_hid_response) {
|
void Movie::Play(Service::IR::ExtraHIDResponse& extra_hid_response) {
|
||||||
ControllerState s;
|
ControllerState s{};
|
||||||
std::memcpy(&s, &recorded_input[current_byte], sizeof(ControllerState));
|
std::memcpy(&s, &recorded_input[current_byte], sizeof(ControllerState));
|
||||||
current_byte += sizeof(ControllerState);
|
current_byte += sizeof(ControllerState);
|
||||||
|
|
||||||
|
@ -371,7 +371,7 @@ void Movie::Record(const Service::HID::PadState& pad_state, const s16& circle_pa
|
||||||
const s16& circle_pad_y) {
|
const s16& circle_pad_y) {
|
||||||
current_input++;
|
current_input++;
|
||||||
|
|
||||||
ControllerState s;
|
ControllerState s{};
|
||||||
s.type = ControllerStateType::PadAndCircle;
|
s.type = ControllerStateType::PadAndCircle;
|
||||||
|
|
||||||
s.pad_and_circle.a.Assign(static_cast<u16>(pad_state.a));
|
s.pad_and_circle.a.Assign(static_cast<u16>(pad_state.a));
|
||||||
|
@ -396,7 +396,7 @@ void Movie::Record(const Service::HID::PadState& pad_state, const s16& circle_pa
|
||||||
}
|
}
|
||||||
|
|
||||||
void Movie::Record(const Service::HID::TouchDataEntry& touch_data) {
|
void Movie::Record(const Service::HID::TouchDataEntry& touch_data) {
|
||||||
ControllerState s;
|
ControllerState s{};
|
||||||
s.type = ControllerStateType::Touch;
|
s.type = ControllerStateType::Touch;
|
||||||
|
|
||||||
s.touch.x = touch_data.x;
|
s.touch.x = touch_data.x;
|
||||||
|
@ -407,7 +407,7 @@ void Movie::Record(const Service::HID::TouchDataEntry& touch_data) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Movie::Record(const Service::HID::AccelerometerDataEntry& accelerometer_data) {
|
void Movie::Record(const Service::HID::AccelerometerDataEntry& accelerometer_data) {
|
||||||
ControllerState s;
|
ControllerState s{};
|
||||||
s.type = ControllerStateType::Accelerometer;
|
s.type = ControllerStateType::Accelerometer;
|
||||||
|
|
||||||
s.accelerometer.x = accelerometer_data.x;
|
s.accelerometer.x = accelerometer_data.x;
|
||||||
|
@ -418,7 +418,7 @@ void Movie::Record(const Service::HID::AccelerometerDataEntry& accelerometer_dat
|
||||||
}
|
}
|
||||||
|
|
||||||
void Movie::Record(const Service::HID::GyroscopeDataEntry& gyroscope_data) {
|
void Movie::Record(const Service::HID::GyroscopeDataEntry& gyroscope_data) {
|
||||||
ControllerState s;
|
ControllerState s{};
|
||||||
s.type = ControllerStateType::Gyroscope;
|
s.type = ControllerStateType::Gyroscope;
|
||||||
|
|
||||||
s.gyroscope.x = gyroscope_data.x;
|
s.gyroscope.x = gyroscope_data.x;
|
||||||
|
@ -430,7 +430,7 @@ void Movie::Record(const Service::HID::GyroscopeDataEntry& gyroscope_data) {
|
||||||
|
|
||||||
void Movie::Record(const Service::IR::PadState& pad_state, const s16& c_stick_x,
|
void Movie::Record(const Service::IR::PadState& pad_state, const s16& c_stick_x,
|
||||||
const s16& c_stick_y) {
|
const s16& c_stick_y) {
|
||||||
ControllerState s;
|
ControllerState s{};
|
||||||
s.type = ControllerStateType::IrRst;
|
s.type = ControllerStateType::IrRst;
|
||||||
|
|
||||||
s.ir_rst.x = c_stick_x;
|
s.ir_rst.x = c_stick_x;
|
||||||
|
@ -442,7 +442,7 @@ void Movie::Record(const Service::IR::PadState& pad_state, const s16& c_stick_x,
|
||||||
}
|
}
|
||||||
|
|
||||||
void Movie::Record(const Service::IR::ExtraHIDResponse& extra_hid_response) {
|
void Movie::Record(const Service::IR::ExtraHIDResponse& extra_hid_response) {
|
||||||
ControllerState s;
|
ControllerState s{};
|
||||||
s.type = ControllerStateType::ExtraHidResponse;
|
s.type = ControllerStateType::ExtraHidResponse;
|
||||||
|
|
||||||
s.extra_hid_response.battery_level.Assign(extra_hid_response.buttons.battery_level);
|
s.extra_hid_response.battery_level.Assign(extra_hid_response.buttons.battery_level);
|
||||||
|
|
|
@ -1018,7 +1018,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
Common::ParamPackage GetNextInput() override {
|
Common::ParamPackage GetNextInput() override {
|
||||||
SDL_Event event;
|
SDL_Event event{};
|
||||||
while (state.event_queue.Pop(event)) {
|
while (state.event_queue.Pop(event)) {
|
||||||
if (event.type != SDL_JOYAXISMOTION || std::abs(event.jaxis.value / 32767.0) < 0.5) {
|
if (event.type != SDL_JOYAXISMOTION || std::abs(event.jaxis.value / 32767.0) < 0.5) {
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -85,42 +85,42 @@ Packet& Packet::operator>>(u8& out_data) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Packet& Packet::operator>>(s16& out_data) {
|
Packet& Packet::operator>>(s16& out_data) {
|
||||||
s16 value;
|
s16 value = 0;
|
||||||
Read(&value, sizeof(value));
|
Read(&value, sizeof(value));
|
||||||
out_data = ntohs(value);
|
out_data = ntohs(value);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
Packet& Packet::operator>>(u16& out_data) {
|
Packet& Packet::operator>>(u16& out_data) {
|
||||||
u16 value;
|
u16 value = 0;
|
||||||
Read(&value, sizeof(value));
|
Read(&value, sizeof(value));
|
||||||
out_data = ntohs(value);
|
out_data = ntohs(value);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
Packet& Packet::operator>>(s32& out_data) {
|
Packet& Packet::operator>>(s32& out_data) {
|
||||||
s32 value;
|
s32 value = 0;
|
||||||
Read(&value, sizeof(value));
|
Read(&value, sizeof(value));
|
||||||
out_data = ntohl(value);
|
out_data = ntohl(value);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
Packet& Packet::operator>>(u32& out_data) {
|
Packet& Packet::operator>>(u32& out_data) {
|
||||||
u32 value;
|
u32 value = 0;
|
||||||
Read(&value, sizeof(value));
|
Read(&value, sizeof(value));
|
||||||
out_data = ntohl(value);
|
out_data = ntohl(value);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
Packet& Packet::operator>>(s64& out_data) {
|
Packet& Packet::operator>>(s64& out_data) {
|
||||||
s64 value;
|
s64 value = 0;
|
||||||
Read(&value, sizeof(value));
|
Read(&value, sizeof(value));
|
||||||
out_data = ntohll(value);
|
out_data = ntohll(value);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
Packet& Packet::operator>>(u64& out_data) {
|
Packet& Packet::operator>>(u64& out_data) {
|
||||||
u64 value;
|
u64 value = 0;
|
||||||
Read(&value, sizeof(value));
|
Read(&value, sizeof(value));
|
||||||
out_data = ntohll(value);
|
out_data = ntohll(value);
|
||||||
return *this;
|
return *this;
|
||||||
|
|
|
@ -150,7 +150,7 @@ public:
|
||||||
setup.uniforms.f[0] = Common::MakeVec(vertex_num, vertex_num, vertex_num, vertex_num);
|
setup.uniforms.f[0] = Common::MakeVec(vertex_num, vertex_num, vertex_num, vertex_num);
|
||||||
|
|
||||||
// The second uniform register and so on are used for receiving input vertices
|
// The second uniform register and so on are used for receiving input vertices
|
||||||
buffer_cur = setup.uniforms.f + 1;
|
buffer_cur = setup.uniforms.f.data() + 1;
|
||||||
|
|
||||||
main_vertex_num = regs.pipeline.variable_vertex_main_num_minus_1 + 1;
|
main_vertex_num = regs.pipeline.variable_vertex_main_num_minus_1 + 1;
|
||||||
total_vertex_num = val;
|
total_vertex_num = val;
|
||||||
|
@ -200,7 +200,7 @@ private:
|
||||||
template <class Archive>
|
template <class Archive>
|
||||||
void save(Archive& ar, const unsigned int version) const {
|
void save(Archive& ar, const unsigned int version) const {
|
||||||
serialize_common(this, ar, version);
|
serialize_common(this, ar, version);
|
||||||
auto buffer_idx = static_cast<u32>(buffer_cur - setup.uniforms.f);
|
auto buffer_idx = static_cast<u32>(buffer_cur - setup.uniforms.f.data());
|
||||||
ar << buffer_idx;
|
ar << buffer_idx;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -209,7 +209,7 @@ private:
|
||||||
serialize_common(this, ar, version);
|
serialize_common(this, ar, version);
|
||||||
u32 buffer_idx;
|
u32 buffer_idx;
|
||||||
ar >> buffer_idx;
|
ar >> buffer_idx;
|
||||||
buffer_cur = setup.uniforms.f + buffer_idx;
|
buffer_cur = setup.uniforms.f.data() + buffer_idx;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_SERIALIZATION_SPLIT_MEMBER()
|
BOOST_SERIALIZATION_SPLIT_MEMBER()
|
||||||
|
@ -229,7 +229,7 @@ public:
|
||||||
vs_output_num = regs.pipeline.vs_outmap_total_minus_1_a + 1;
|
vs_output_num = regs.pipeline.vs_outmap_total_minus_1_a + 1;
|
||||||
ASSERT(vs_output_num == regs.pipeline.gs_config.stride_minus_1 + 1);
|
ASSERT(vs_output_num == regs.pipeline.gs_config.stride_minus_1 + 1);
|
||||||
std::size_t vertex_num = regs.pipeline.gs_config.fixed_vertex_num_minus_1 + 1;
|
std::size_t vertex_num = regs.pipeline.gs_config.fixed_vertex_num_minus_1 + 1;
|
||||||
buffer_cur = buffer_begin = setup.uniforms.f + regs.pipeline.gs_config.start_index;
|
buffer_cur = buffer_begin = setup.uniforms.f.data() + regs.pipeline.gs_config.start_index;
|
||||||
buffer_end = buffer_begin + vs_output_num * vertex_num;
|
buffer_end = buffer_begin + vs_output_num * vertex_num;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -273,9 +273,9 @@ private:
|
||||||
template <class Archive>
|
template <class Archive>
|
||||||
void save(Archive& ar, const unsigned int version) const {
|
void save(Archive& ar, const unsigned int version) const {
|
||||||
serialize_common(this, ar, version);
|
serialize_common(this, ar, version);
|
||||||
auto buffer_offset = static_cast<u32>(buffer_begin - setup.uniforms.f);
|
auto buffer_offset = static_cast<u32>(buffer_begin - setup.uniforms.f.data());
|
||||||
auto buffer_idx = static_cast<u32>(buffer_cur - setup.uniforms.f);
|
auto buffer_idx = static_cast<u32>(buffer_cur - setup.uniforms.f.data());
|
||||||
auto buffer_size = static_cast<u32>(buffer_end - setup.uniforms.f);
|
auto buffer_size = static_cast<u32>(buffer_end - setup.uniforms.f.data());
|
||||||
ar << buffer_offset;
|
ar << buffer_offset;
|
||||||
ar << buffer_idx;
|
ar << buffer_idx;
|
||||||
ar << buffer_size;
|
ar << buffer_size;
|
||||||
|
@ -288,9 +288,9 @@ private:
|
||||||
ar >> buffer_offset;
|
ar >> buffer_offset;
|
||||||
ar >> buffer_idx;
|
ar >> buffer_idx;
|
||||||
ar >> buffer_size;
|
ar >> buffer_size;
|
||||||
buffer_begin = setup.uniforms.f + buffer_offset;
|
buffer_begin = setup.uniforms.f.data() + buffer_offset;
|
||||||
buffer_cur = setup.uniforms.f + buffer_idx;
|
buffer_cur = setup.uniforms.f.data() + buffer_idx;
|
||||||
buffer_end = setup.uniforms.f + buffer_size;
|
buffer_end = setup.uniforms.f.data() + buffer_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_SERIALIZATION_SPLIT_MEMBER()
|
BOOST_SERIALIZATION_SPLIT_MEMBER()
|
||||||
|
|
|
@ -32,8 +32,7 @@ void Shutdown() {
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
void Zero(T& o) {
|
void Zero(T& o) {
|
||||||
static_assert(std::is_trivially_copyable_v<T>,
|
static_assert(std::is_trivial_v<T>, "It's undefined behavior to memset a non-trivial type");
|
||||||
"It's undefined behavior to memset a non-trivially copyable type");
|
|
||||||
memset(&o, 0, sizeof(o));
|
memset(&o, 0, sizeof(o));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -56,10 +55,10 @@ State::State() : geometry_pipeline(*this) {
|
||||||
|
|
||||||
void State::Reset() {
|
void State::Reset() {
|
||||||
Zero(regs);
|
Zero(regs);
|
||||||
Zero(vs);
|
vs = {};
|
||||||
Zero(gs);
|
gs = {};
|
||||||
Zero(cmd_list);
|
Zero(cmd_list);
|
||||||
Zero(immediate);
|
immediate = {};
|
||||||
primitive_assembler.Reconfigure(PipelineRegs::TriangleTopology::List);
|
primitive_assembler.Reconfigure(PipelineRegs::TriangleTopology::List);
|
||||||
vs_float_regs_counter = 0;
|
vs_float_regs_counter = 0;
|
||||||
vs_uniform_write_buffer.fill(0);
|
vs_uniform_write_buffer.fill(0);
|
||||||
|
|
|
@ -241,7 +241,7 @@ private:
|
||||||
struct Uniforms {
|
struct Uniforms {
|
||||||
// The float uniforms are accessed by the shader JIT using SSE instructions, and are
|
// The float uniforms are accessed by the shader JIT using SSE instructions, and are
|
||||||
// therefore required to be 16-byte aligned.
|
// therefore required to be 16-byte aligned.
|
||||||
alignas(16) Common::Vec4<float24> f[96];
|
alignas(16) std::array<Common::Vec4<float24>, 96> f;
|
||||||
|
|
||||||
std::array<bool, 16> b;
|
std::array<bool, 16> b;
|
||||||
std::array<Common::Vec4<u8>, 4> i;
|
std::array<Common::Vec4<u8>, 4> i;
|
||||||
|
|
Loading…
Reference in a new issue