Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@ else()
set(IS_RELEASE_BUILD ON)
endif()

option(ENABLE_VULKAN "Enable Vulkan Video Core" ON)

# LTO takes too much memory and time using MSVC.
if (NOT MSVC AND NOT MINGW AND IS_RELEASE_BUILD)
set(DEFAULT_ENABLE_LTO ON)
Expand Down Expand Up @@ -92,6 +94,32 @@ option(ENABLE_LTO "Enable link time optimization" ${DEFAULT_ENABLE_LTO})
option(CITRA_USE_PRECOMPILED_HEADERS "Use precompiled headers" ON)
option(CITRA_WARNINGS_AS_ERRORS "Enable warnings as errors" ON)

# Disable features not used by a libretro core
# =======================================================================
if(ENABLE_LIBRETRO)
set(ENABLE_QT OFF)
set(ENABLE_QT_UPDATER OFF)
set(ENABLE_DEDICATED_ROOM OFF)
set(ENABLE_WEB_SERVICE OFF)
set(ENABLE_SCRIPTING OFF)
set(ENABLE_CUBEB OFF)
set(ENABLE_OPENAL OFF)
set(ENABLE_TESTS OFF)
set(CITRA_ENABLE_BUNDLE_TARGET OFF)
endif()

if(CMAKE_CXX_COMPILER MATCHES "webos" OR
CMAKE_CXX_COMPILER MATCHES "starfish")
set(WEBOS ON)
add_definitions(-DWEBOS=1)
endif()

if(WEBOS)
set(ENABLE_VULKAN OFF)
# temp fix for fmt/ranges.h:211:59: error: self-comparison always evaluates to true [-Werror=tautological-compare]
add_definitions(-Wno-tautological-compare)
endif()

include(CitraHandleSystemLibs)

if (CITRA_USE_PRECOMPILED_HEADERS)
Expand Down Expand Up @@ -326,6 +354,14 @@ endif()
# Use system tsl::robin_map if available (otherwise we fallback to version bundled with dynarmic)
find_package(tsl-robin-map QUIET)

if (NOT TARGET tsl::robin_map)
if (EXISTS "${CMAKE_SOURCE_DIR}/externals/dynarmic/externals/robin-map/CMakeLists.txt")
add_subdirectory(externals/dynarmic/externals/robin-map)
else()
message(FATAL_ERROR "tsl-robin-map not found: please install it or initialize submodules")
endif()
endif()

# Platform-specific library requirements
# ======================================

Expand Down
9 changes: 7 additions & 2 deletions src/citra_libretro/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,20 @@ add_library(citra_libretro SHARED
input/input_factory.h
input/mouse_tracker.cpp
input/mouse_tracker.h
vulkan/vk_swapchain.cpp
vulkan/vk_swapchain.h
citra_libretro.cpp
citra_libretro.h
environment.cpp
environment.h
core_settings.cpp
core_settings.h)

if(ENABLE_VULKAN)
add_library(citra_libretro SHARED
vulkan/vk_swapchain.cpp
vulkan/vk_swapchain.h
)
endif()

create_target_directory_groups(citra_libretro)

target_link_libraries(citra_common PRIVATE libretro)
Expand Down
73 changes: 73 additions & 0 deletions src/common/atomic_ops.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@

#if _MSC_VER
#include <intrin.h>
#if #WEBOS
#include <atomic>
#endif
#else
#include <cstring>
#endif
Expand Down Expand Up @@ -89,6 +92,76 @@ namespace Common {
return result;
}

#elif defined(WEBOS)

inline std::mutex g_atomic128_mutex;

[[nodiscard]] inline bool AtomicCompareAndSwap(volatile u8* pointer, u8 value, u8 expected) {
return __sync_bool_compare_and_swap(pointer, expected, value);
}

[[nodiscard]] inline bool AtomicCompareAndSwap(volatile u16* pointer, u16 value, u16 expected) {
return __sync_bool_compare_and_swap(pointer, expected, value);
}

[[nodiscard]] inline bool AtomicCompareAndSwap(volatile u32* pointer, u32 value, u32 expected) {
return __sync_bool_compare_and_swap(pointer, expected, value);
}

[[nodiscard]] inline bool AtomicCompareAndSwap(volatile u64* pointer, u64 value, u64 expected) {
return __sync_bool_compare_and_swap(pointer, expected, value);
}

[[nodiscard]] inline bool AtomicCompareAndSwap(volatile u64* pointer, u128 value, u128 expected) {
std::lock_guard<std::mutex> lock(g_atomic128_mutex);
u128 current;
std::memcpy(current.data(), (const void*)pointer, sizeof(u128));
bool match = (current == expected);
if (match) {
std::memcpy((void*)pointer, value.data(), sizeof(u128));
}
return match;
}

[[nodiscard]] inline bool AtomicCompareAndSwap(volatile u8* pointer, u8 value, u8 expected, u8& actual) {
actual = __sync_val_compare_and_swap(pointer, expected, value);
return actual == expected;
}

[[nodiscard]] inline bool AtomicCompareAndSwap(volatile u16* pointer, u16 value, u16 expected, u16& actual) {
actual = __sync_val_compare_and_swap(pointer, expected, value);
return actual == expected;
}

[[nodiscard]] inline bool AtomicCompareAndSwap(volatile u32* pointer, u32 value, u32 expected, u32& actual) {
actual = __sync_val_compare_and_swap(pointer, expected, value);
return actual == expected;
}

[[nodiscard]] inline bool AtomicCompareAndSwap(volatile u64* pointer, u64 value, u64 expected, u64& actual) {
actual = __sync_val_compare_and_swap(pointer, expected, value);
return actual == expected;
}

[[nodiscard]] inline bool AtomicCompareAndSwap(volatile u64* pointer, u128 value, u128 expected, u128& actual) {
std::lock_guard<std::mutex> lock(g_atomic128_mutex);
u128 current;
std::memcpy(current.data(), (const void*)pointer, sizeof(u128));
bool match = (current == expected);
if (match) {
std::memcpy((void*)pointer, value.data(), sizeof(u128));
}
actual = current;
return match;
}

[[nodiscard]] inline u128 AtomicLoad128(volatile u64* pointer) {
std::lock_guard<std::mutex> lock(g_atomic128_mutex);
u128 result;
std::memcpy(result.data(), (const void*)pointer, sizeof(u128));
return result;
}

#else

[[nodiscard]] inline bool AtomicCompareAndSwap(volatile u8* pointer, u8 value, u8 expected) {
Expand Down
2 changes: 1 addition & 1 deletion src/core/core.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -395,7 +395,7 @@ System::ResultStatus System::Init(Frontend::EmuWindow& emu_window,
#else
for (u32 i = 0; i < num_cores; ++i) {
cpu_cores.push_back(
std::make_shared<ARM_DynCom>(this, *memory, USER32MODE, i, timing->GetTimer(i)));
std::make_shared<ARM_DynCom>(*this, *memory, USER32MODE, i, timing->GetTimer(i)));
}
LOG_WARNING(Core, "CPU JIT requested, but Dynarmic not available");
#endif
Expand Down
2 changes: 1 addition & 1 deletion src/core/file_sys/archive_extsavedata.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ class FixSizeDiskFile : public DiskFile {
if (offset > size) {
return ERR_WRITE_BEYOND_END;
} else if (offset == size) {
return 0ULL;
return static_cast<std::size_t>(0);
}

if (offset + length > size) {
Expand Down
2 changes: 1 addition & 1 deletion src/core/file_sys/archive_ncch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,7 @@ ResultVal<std::size_t> NCCHFile::Write(const u64 offset, const std::size_t lengt
const u8* buffer) {
LOG_ERROR(Service_FS, "Attempted to write to NCCH file");
// TODO(shinyquagsire23): Find error code
return 0ULL;
return static_cast<std::size_t>(0);
}

u64 NCCHFile::GetSize() const {
Expand Down
4 changes: 2 additions & 2 deletions src/core/file_sys/ivfc_archive.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ ResultVal<std::size_t> IVFCFile::Write(const u64 offset, const std::size_t lengt
const u8* buffer) {
LOG_ERROR(Service_FS, "Attempted to write to IVFC file");
// TODO(Subv): Find error code
return 0ULL;
return static_cast<std::size_t>(0);
}

u64 IVFCFile::GetSize() const {
Expand Down Expand Up @@ -136,7 +136,7 @@ ResultVal<std::size_t> IVFCFileInMemory::Write(const u64 offset, const std::size
const bool flush, const u8* buffer) {
LOG_ERROR(Service_FS, "Attempted to write to IVFC file");
// TODO(Subv): Find error code
return 0ULL;
return static_cast<std::size_t>(0);
}

u64 IVFCFileInMemory::GetSize() const {
Expand Down
85 changes: 45 additions & 40 deletions src/video_core/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -96,46 +96,6 @@ add_library(video_core STATIC
renderer_software/sw_rasterizer.h
renderer_software/sw_texturing.cpp
renderer_software/sw_texturing.h
renderer_vulkan/pica_to_vk.h
renderer_vulkan/renderer_vulkan.cpp
renderer_vulkan/renderer_vulkan.h
renderer_vulkan/vk_blit_helper.cpp
renderer_vulkan/vk_blit_helper.h
renderer_vulkan/vk_common.cpp
renderer_vulkan/vk_common.h
renderer_vulkan/vk_descriptor_pool.cpp
renderer_vulkan/vk_descriptor_pool.h
renderer_vulkan/vk_graphics_pipeline.cpp
renderer_vulkan/vk_graphics_pipeline.h
renderer_vulkan/vk_master_semaphore.cpp
renderer_vulkan/vk_master_semaphore.h
renderer_vulkan/vk_memory_util.cpp
renderer_vulkan/vk_memory_util.h
renderer_vulkan/vk_rasterizer.cpp
renderer_vulkan/vk_rasterizer.h
renderer_vulkan/vk_rasterizer_cache.cpp
renderer_vulkan/vk_scheduler.cpp
renderer_vulkan/vk_scheduler.h
renderer_vulkan/vk_resource_pool.cpp
renderer_vulkan/vk_resource_pool.h
renderer_vulkan/vk_instance.cpp
renderer_vulkan/vk_instance.h
renderer_vulkan/vk_pipeline_cache.cpp
renderer_vulkan/vk_pipeline_cache.h
renderer_vulkan/vk_platform.cpp
renderer_vulkan/vk_platform.h
renderer_vulkan/vk_present_window.cpp
renderer_vulkan/vk_present_window.h
renderer_vulkan/vk_renderpass_cache.cpp
renderer_vulkan/vk_renderpass_cache.h
renderer_vulkan/vk_shader_util.cpp
renderer_vulkan/vk_shader_util.h
renderer_vulkan/vk_stream_buffer.cpp
renderer_vulkan/vk_stream_buffer.h
renderer_vulkan/vk_swapchain.cpp
renderer_vulkan/vk_swapchain.h
renderer_vulkan/vk_texture_runtime.cpp
renderer_vulkan/vk_texture_runtime.h
shader/debug_data.h
shader/generator/glsl_fs_shader_gen.cpp
shader/generator/glsl_fs_shader_gen.h
Expand Down Expand Up @@ -173,6 +133,51 @@ add_library(video_core STATIC
video_core.h
)

if(ENABLE_VULKAN)
add_library(video_core STATIC
renderer_vulkan/pica_to_vk.h
renderer_vulkan/renderer_vulkan.cpp
renderer_vulkan/renderer_vulkan.h
renderer_vulkan/vk_blit_helper.cpp
renderer_vulkan/vk_blit_helper.h
renderer_vulkan/vk_common.cpp
renderer_vulkan/vk_common.h
renderer_vulkan/vk_descriptor_pool.cpp
renderer_vulkan/vk_descriptor_pool.h
renderer_vulkan/vk_graphics_pipeline.cpp
renderer_vulkan/vk_graphics_pipeline.h
renderer_vulkan/vk_master_semaphore.cpp
renderer_vulkan/vk_master_semaphore.h
renderer_vulkan/vk_memory_util.cpp
renderer_vulkan/vk_memory_util.h
renderer_vulkan/vk_rasterizer.cpp
renderer_vulkan/vk_rasterizer.h
renderer_vulkan/vk_rasterizer_cache.cpp
renderer_vulkan/vk_scheduler.cpp
renderer_vulkan/vk_scheduler.h
renderer_vulkan/vk_resource_pool.cpp
renderer_vulkan/vk_resource_pool.h
renderer_vulkan/vk_instance.cpp
renderer_vulkan/vk_instance.h
renderer_vulkan/vk_pipeline_cache.cpp
renderer_vulkan/vk_pipeline_cache.h
renderer_vulkan/vk_platform.cpp
renderer_vulkan/vk_platform.h
renderer_vulkan/vk_present_window.cpp
renderer_vulkan/vk_present_window.h
renderer_vulkan/vk_renderpass_cache.cpp
renderer_vulkan/vk_renderpass_cache.h
renderer_vulkan/vk_shader_util.cpp
renderer_vulkan/vk_shader_util.h
renderer_vulkan/vk_stream_buffer.cpp
renderer_vulkan/vk_stream_buffer.h
renderer_vulkan/vk_swapchain.cpp
renderer_vulkan/vk_swapchain.h
renderer_vulkan/vk_texture_runtime.cpp
renderer_vulkan/vk_texture_runtime.h
)
endif()

add_dependencies(video_core host_shaders)
target_include_directories(video_core PRIVATE ${HOST_SHADERS_INCLUDE})

Expand Down