mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-12-16 04:09:07 +00:00
Compare commits
14 Commits
57f14e0572
...
2089c557b8
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2089c557b8 | ||
|
|
974f7eb721 | ||
|
|
cf87f24587 | ||
|
|
12a3818fcf | ||
|
|
2f5843c6cf | ||
|
|
d9da5f26c0 | ||
|
|
1a3e150a62 | ||
|
|
7d82eebba2 | ||
|
|
a1473e7f74 | ||
|
|
18963da9a5 | ||
|
|
7ca184a3a8 | ||
|
|
b29af77f68 | ||
|
|
0f9244b6e8 | ||
|
|
656491e687 |
4
3rdparty/7zip/CMakeLists.txt
vendored
4
3rdparty/7zip/CMakeLists.txt
vendored
@ -59,11 +59,11 @@ if(WIN32 OR APPLE)
|
||||
7zip/C/XzEnc.c
|
||||
7zip/C/XzIn.c
|
||||
7zip/C/ZstdDec.c)
|
||||
target_include_directories(3rdparty_7zip INTERFACE
|
||||
target_include_directories(3rdparty_7zip SYSTEM INTERFACE
|
||||
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/7zip/C>
|
||||
$<INSTALL_INTERFACE:/7zip/C>)
|
||||
|
||||
target_include_directories(3rdparty_7zip INTERFACE 7zip)
|
||||
target_include_directories(3rdparty_7zip SYSTEM INTERFACE 7zip)
|
||||
|
||||
set_property(TARGET 3rdparty_7zip PROPERTY FOLDER "3rdparty/")
|
||||
|
||||
|
||||
12
3rdparty/CMakeLists.txt
vendored
12
3rdparty/CMakeLists.txt
vendored
@ -35,7 +35,7 @@ if (USE_SYSTEM_FLATBUFFERS)
|
||||
message(FATAL_ERROR "flatc failed to regenerate flatbuffers headers.")
|
||||
endif()
|
||||
else()
|
||||
target_include_directories(3rdparty_flatbuffers INTERFACE flatbuffers/include)
|
||||
target_include_directories(3rdparty_flatbuffers SYSTEM INTERFACE flatbuffers/include)
|
||||
endif()
|
||||
|
||||
# libPNG
|
||||
@ -56,7 +56,7 @@ if (USE_SYSTEM_VULKAN_MEMORY_ALLOCATOR)
|
||||
add_library(3rdparty::vulkanmemoryallocator ALIAS GPUOpen::VulkanMemoryAllocator)
|
||||
else()
|
||||
add_library(3rdparty_vulkanmemoryallocator INTERFACE)
|
||||
target_include_directories(3rdparty_vulkanmemoryallocator INTERFACE GPUOpen/VulkanMemoryAllocator/include)
|
||||
target_include_directories(3rdparty_vulkanmemoryallocator SYSTEM INTERFACE GPUOpen/VulkanMemoryAllocator/include)
|
||||
add_library(3rdparty::vulkanmemoryallocator ALIAS 3rdparty_vulkanmemoryallocator)
|
||||
endif()
|
||||
|
||||
@ -111,7 +111,7 @@ if (NOT ANDROID)
|
||||
find_package(OpenGL REQUIRED OPTIONAL_COMPONENTS EGL)
|
||||
|
||||
add_library(3rdparty_opengl INTERFACE)
|
||||
target_include_directories(3rdparty_opengl INTERFACE GL)
|
||||
target_include_directories(3rdparty_opengl SYSTEM INTERFACE GL)
|
||||
|
||||
if (WIN32)
|
||||
if(NOT MSVC)
|
||||
@ -204,7 +204,7 @@ if(USE_VULKAN)
|
||||
find_package(Wayland)
|
||||
if (WAYLAND_FOUND)
|
||||
target_include_directories(3rdparty_vulkan
|
||||
INTERFACE ${WAYLAND_INCLUDE_DIR})
|
||||
SYSTEM INTERFACE ${WAYLAND_INCLUDE_DIR})
|
||||
endif()
|
||||
endif()
|
||||
|
||||
@ -298,7 +298,7 @@ if(NOT ANDROID)
|
||||
message(STATUS "RPCS3: using shared ffmpeg")
|
||||
find_package(FFMPEG REQUIRED)
|
||||
|
||||
target_include_directories(3rdparty_ffmpeg INTERFACE ${FFMPEG_INCLUDE_DIR})
|
||||
target_include_directories(3rdparty_ffmpeg SYSTEM INTERFACE ${FFMPEG_INCLUDE_DIR})
|
||||
target_link_libraries(3rdparty_ffmpeg INTERFACE ${FFMPEG_LIBRARIES})
|
||||
else()
|
||||
message(STATUS "RPCS3: using builtin ffmpeg")
|
||||
@ -328,7 +328,7 @@ if(NOT ANDROID)
|
||||
${FFMPEG_LIB_SWSCALE}
|
||||
${FFMPEG_LIB_SWRESAMPLE}
|
||||
)
|
||||
target_include_directories(3rdparty_ffmpeg INTERFACE "ffmpeg/include")
|
||||
target_include_directories(3rdparty_ffmpeg SYSTEM INTERFACE "ffmpeg/include")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
|
||||
4
3rdparty/SoundTouch/CMakeLists.txt
vendored
4
3rdparty/SoundTouch/CMakeLists.txt
vendored
@ -11,11 +11,11 @@ add_library(soundtouch STATIC EXCLUDE_FROM_ALL
|
||||
soundtouch/source/SoundTouch/TDStretch.cpp
|
||||
)
|
||||
|
||||
target_include_directories(soundtouch PRIVATE
|
||||
target_include_directories(soundtouch SYSTEM PRIVATE
|
||||
soundtouch/source/SoundTouch
|
||||
soundtouch/include)
|
||||
|
||||
target_include_directories(soundtouch INTERFACE
|
||||
target_include_directories(soundtouch SYSTEM INTERFACE
|
||||
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/soundtouch/include>
|
||||
$<INSTALL_INTERFACE:/soundtouch/include>)
|
||||
|
||||
|
||||
2
3rdparty/asmjit/CMakeLists.txt
vendored
2
3rdparty/asmjit/CMakeLists.txt
vendored
@ -9,7 +9,7 @@ set(ASMJIT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/asmjit" CACHE PATH "Location of 'asm
|
||||
include("${ASMJIT_DIR}/CMakeLists.txt")
|
||||
|
||||
add_library(asmjit ${ASMJIT_SRC})
|
||||
target_include_directories(asmjit PUBLIC ${ASMJIT_DIR}/src)
|
||||
target_include_directories(asmjit SYSTEM PUBLIC ${ASMJIT_DIR}/src)
|
||||
target_link_libraries(asmjit PRIVATE ${ASMJIT_DEPS})
|
||||
|
||||
# ASMJIT should have a option for disabling installing and this wouldnt
|
||||
|
||||
2
3rdparty/discord-rpc/CMakeLists.txt
vendored
2
3rdparty/discord-rpc/CMakeLists.txt
vendored
@ -9,7 +9,7 @@ if (USE_DISCORD_RPC AND (WIN32 OR CMAKE_SYSTEM MATCHES "Linux" OR APPLE))
|
||||
set(WARNINGS_AS_ERRORS FALSE CACHE BOOL "When enabled, compiles with `-Werror` (on *nix platforms).")
|
||||
|
||||
add_subdirectory(discord-rpc EXCLUDE_FROM_ALL)
|
||||
target_include_directories(3rdparty_discordRPC INTERFACE discord-rpc/include)
|
||||
target_include_directories(3rdparty_discordRPC SYSTEM INTERFACE discord-rpc/include)
|
||||
target_compile_definitions(3rdparty_discordRPC INTERFACE -DWITH_DISCORD_RPC)
|
||||
target_link_libraries(3rdparty_discordRPC INTERFACE discord-rpc)
|
||||
endif()
|
||||
|
||||
2
3rdparty/feralinteractive/CMakeLists.txt
vendored
2
3rdparty/feralinteractive/CMakeLists.txt
vendored
@ -3,7 +3,7 @@
|
||||
add_library(3rdparty_feralinteractive INTERFACE)
|
||||
|
||||
if (CMAKE_SYSTEM MATCHES "Linux")
|
||||
target_include_directories(3rdparty_feralinteractive INTERFACE feralinteractive/lib)
|
||||
target_include_directories(3rdparty_feralinteractive SYSTEM INTERFACE feralinteractive/lib)
|
||||
target_compile_definitions(3rdparty_feralinteractive INTERFACE -DGAMEMODE_AVAILABLE)
|
||||
target_link_libraries(3rdparty_feralinteractive INTERFACE feralinteractive)
|
||||
endif()
|
||||
|
||||
2
3rdparty/glslang/CMakeLists.txt
vendored
2
3rdparty/glslang/CMakeLists.txt
vendored
@ -7,7 +7,7 @@ if(USE_SYSTEM_GLSLANG)
|
||||
target_link_libraries(3rdparty_glslang INTERFACE glslang::SPIRV)
|
||||
get_target_property(SPIRV_INCLUDE_DIRS glslang::SPIRV INTERFACE_INCLUDE_DIRECTORIES)
|
||||
list(TRANSFORM SPIRV_INCLUDE_DIRS APPEND "/glslang")
|
||||
target_include_directories(3rdparty_glslang INTERFACE ${SPIRV_INCLUDE_DIRS})
|
||||
target_include_directories(3rdparty_glslang SYSTEM INTERFACE ${SPIRV_INCLUDE_DIRS})
|
||||
else()
|
||||
set(ENABLE_PCH OFF CACHE BOOL "Enables Precompiled header" FORCE)
|
||||
set(BUILD_EXTERNAL OFF CACHE BOOL "Build external dependencies in /External" FORCE)
|
||||
|
||||
2
3rdparty/hidapi/CMakeLists.txt
vendored
2
3rdparty/hidapi/CMakeLists.txt
vendored
@ -4,7 +4,7 @@ if(USE_SYSTEM_HIDAPI)
|
||||
pkg_check_modules(hidapi-hidraw REQUIRED IMPORTED_TARGET hidapi-hidraw)
|
||||
add_library(3rdparty_hidapi INTERFACE)
|
||||
target_link_libraries(3rdparty_hidapi INTERFACE PkgConfig::hidapi-hidraw)
|
||||
target_include_directories(3rdparty_hidapi INTERFACE PkgConfig::hidapi-hidraw)
|
||||
target_include_directories(3rdparty_hidapi SYSTEM INTERFACE PkgConfig::hidapi-hidraw)
|
||||
else()
|
||||
set(BUILD_SHARED_LIBS FALSE CACHE BOOL "Don't build shared libs")
|
||||
set(HIDAPI_INSTALL_TARGETS FALSE CACHE BOOL "Don't install anything")
|
||||
|
||||
4
3rdparty/libpng/CMakeLists.txt
vendored
4
3rdparty/libpng/CMakeLists.txt
vendored
@ -6,14 +6,14 @@ if (NOT USE_SYSTEM_LIBPNG)
|
||||
set(PNG_TESTS OFF CACHE BOOL "Build libpng tests")
|
||||
set(SKIP_INSTALL_ALL ON)
|
||||
add_subdirectory(libpng EXCLUDE_FROM_ALL)
|
||||
target_include_directories(png_static INTERFACE "${libpng_BINARY_DIR}" "${libpng_SOURCE_DIR}")
|
||||
target_include_directories(png_static SYSTEM INTERFACE "${libpng_BINARY_DIR}" "${libpng_SOURCE_DIR}")
|
||||
|
||||
set(LIBPNG_TARGET png_static PARENT_SCOPE)
|
||||
else()
|
||||
find_package(PNG REQUIRED)
|
||||
|
||||
add_library(3rdparty_system_libpng INTERFACE)
|
||||
target_include_directories(3rdparty_system_libpng INTERFACE ${PNG_INCLUDE_DIR})
|
||||
target_include_directories(3rdparty_system_libpng SYSTEM INTERFACE ${PNG_INCLUDE_DIR})
|
||||
target_link_libraries(3rdparty_system_libpng INTERFACE ${PNG_LIBRARY})
|
||||
target_compile_definitions(3rdparty_system_libpng INTERFACE ${PNG_DEFINITIONS})
|
||||
|
||||
|
||||
2
3rdparty/llvm/CMakeLists.txt
vendored
2
3rdparty/llvm/CMakeLists.txt
vendored
@ -107,7 +107,7 @@ if(WITH_LLVM)
|
||||
|
||||
add_library(3rdparty_llvm INTERFACE)
|
||||
target_link_libraries(3rdparty_llvm INTERFACE ${LLVM_LIBS})
|
||||
target_include_directories(3rdparty_llvm INTERFACE ${LLVM_INCLUDE_DIRS})
|
||||
target_include_directories(3rdparty_llvm SYSTEM INTERFACE ${LLVM_INCLUDE_DIRS})
|
||||
separate_arguments(LLVM_DEFINITIONS_LIST NATIVE_COMMAND ${LLVM_DEFINITIONS})
|
||||
target_compile_definitions(3rdparty_llvm INTERFACE ${LLVM_DEFINITIONS_LIST} LLVM_AVAILABLE)
|
||||
|
||||
|
||||
6
3rdparty/miniupnp/CMakeLists.txt
vendored
6
3rdparty/miniupnp/CMakeLists.txt
vendored
@ -3,9 +3,9 @@ if(USE_SYSTEM_MINIUPNPC)
|
||||
pkg_check_modules(MiniUPnPc REQUIRED IMPORTED_TARGET miniupnpc>=2.3.3)
|
||||
add_library(3rdparty_miniupnpc INTERFACE)
|
||||
target_link_libraries(3rdparty_miniupnpc INTERFACE PkgConfig::MiniUPnPc)
|
||||
target_include_directories(3rdparty_miniupnpc INTERFACE PkgConfig::MiniUPnPc)
|
||||
target_include_directories(3rdparty_miniupnpc SYSTEM INTERFACE PkgConfig::MiniUPnPc)
|
||||
list(TRANSFORM MiniUPnPc_INCLUDE_DIRS APPEND "/miniupnpc")
|
||||
target_include_directories(3rdparty_miniupnpc INTERFACE ${MiniUPnPc_INCLUDE_DIRS})
|
||||
target_include_directories(3rdparty_miniupnpc SYSTEM INTERFACE ${MiniUPnPc_INCLUDE_DIRS})
|
||||
else()
|
||||
option (UPNPC_BUILD_STATIC "Build static library" TRUE)
|
||||
option (UPNPC_BUILD_SHARED "Build shared library" FALSE)
|
||||
@ -17,5 +17,5 @@ else()
|
||||
add_subdirectory(miniupnp/miniupnpc EXCLUDE_FROM_ALL)
|
||||
add_library(3rdparty_miniupnpc INTERFACE)
|
||||
target_link_libraries(3rdparty_miniupnpc INTERFACE libminiupnpc-static)
|
||||
target_include_directories(3rdparty_miniupnpc INTERFACE libminiupnpc-static)
|
||||
target_include_directories(3rdparty_miniupnpc SYSTEM INTERFACE libminiupnpc-static)
|
||||
endif()
|
||||
|
||||
2
3rdparty/rtmidi/CMakeLists.txt
vendored
2
3rdparty/rtmidi/CMakeLists.txt
vendored
@ -3,7 +3,7 @@ if(USE_SYSTEM_RTMIDI)
|
||||
pkg_check_modules(RtMidi REQUIRED IMPORTED_TARGET rtmidi>=6.0.0)
|
||||
add_library(rtmidi INTERFACE)
|
||||
target_link_libraries(rtmidi INTERFACE PkgConfig::RtMidi)
|
||||
target_include_directories(rtmidi INTERFACE PkgConfig::RtMidi)
|
||||
target_include_directories(rtmidi SYSTEM INTERFACE PkgConfig::RtMidi)
|
||||
else()
|
||||
option(RTMIDI_API_JACK "Compile with JACK support." OFF)
|
||||
option(RTMIDI_BUILD_TESTING "Build test programs" OFF)
|
||||
|
||||
2
3rdparty/stblib/CMakeLists.txt
vendored
2
3rdparty/stblib/CMakeLists.txt
vendored
@ -1,2 +1,2 @@
|
||||
add_library(3rdparty_stblib INTERFACE)
|
||||
target_include_directories(3rdparty_stblib INTERFACE stb)
|
||||
target_include_directories(3rdparty_stblib SYSTEM INTERFACE stb)
|
||||
|
||||
2
3rdparty/zlib/CMakeLists.txt
vendored
2
3rdparty/zlib/CMakeLists.txt
vendored
@ -13,6 +13,6 @@ else()
|
||||
|
||||
add_library(3rdparty_zlib INTERFACE)
|
||||
target_link_libraries(3rdparty_zlib INTERFACE zlibstatic)
|
||||
target_include_directories(3rdparty_zlib INTERFACE zlib ${CMAKE_CURRENT_BINARY_DIR}/zlib)
|
||||
target_include_directories(3rdparty_zlib SYSTEM INTERFACE zlib ${CMAKE_CURRENT_BINARY_DIR}/zlib)
|
||||
target_compile_definitions(3rdparty_zlib INTERFACE -DZLIB_CONST=1)
|
||||
endif()
|
||||
|
||||
2
3rdparty/zstd/CMakeLists.txt
vendored
2
3rdparty/zstd/CMakeLists.txt
vendored
@ -3,7 +3,7 @@ if(USE_SYSTEM_ZSTD)
|
||||
pkg_check_modules(zstd REQUIRED IMPORTED_TARGET libzstd)
|
||||
add_library(3rdparty_zstd INTERFACE)
|
||||
target_link_libraries(3rdparty_zstd INTERFACE PkgConfig::zstd)
|
||||
target_include_directories(3rdparty_zstd INTERFACE PkgConfig::RtMidi)
|
||||
target_include_directories(3rdparty_zstd SYSTEM INTERFACE PkgConfig::RtMidi)
|
||||
else()
|
||||
option(ZSTD_BUILD_PROGRAMS "BUILD PROGRAMS" OFF)
|
||||
option(ZSTD_BUILD_SHARED "BUILD SHARED LIBRARIES" OFF)
|
||||
|
||||
@ -71,7 +71,11 @@ cpu_translator::cpu_translator(llvm::Module* _module, bool is_be)
|
||||
result = m_ir->CreateInsertElement(v, m_ir->CreateExtractElement(data0, m_ir->CreateExtractElement(mask, i)), i);
|
||||
v->addIncoming(result, loop);
|
||||
m_ir->CreateCondBr(m_ir->CreateICmpULT(i, m_ir->getInt32(16)), loop, next);
|
||||
#if LLVM_VERSION_MAJOR >= 21 || (LLVM_VERSION_MAJOR == 20 && LLVM_VERSION_MINOR >= 1)
|
||||
m_ir->SetInsertPoint(next->getFirstNonPHIIt());
|
||||
#else
|
||||
m_ir->SetInsertPoint(next->getFirstNonPHI());
|
||||
#endif
|
||||
result = m_ir->CreateSelect(m_ir->CreateICmpSLT(index, zeros), zeros, result);
|
||||
|
||||
return result;
|
||||
|
||||
@ -1149,7 +1149,11 @@ struct llvm_fshl
|
||||
static llvm::Function* get_fshl(llvm::IRBuilder<>* ir)
|
||||
{
|
||||
const auto _module = ir->GetInsertBlock()->getParent()->getParent();
|
||||
#if LLVM_VERSION_MAJOR >= 21 || (LLVM_VERSION_MAJOR == 20 && LLVM_VERSION_MINOR >= 1)
|
||||
return llvm::Intrinsic::getOrInsertDeclaration(_module, llvm::Intrinsic::fshl, {llvm_value_t<T>::get_type(ir->getContext())});
|
||||
#else
|
||||
return llvm::Intrinsic::getDeclaration(_module, llvm::Intrinsic::fshl, {llvm_value_t<T>::get_type(ir->getContext())});
|
||||
#endif
|
||||
}
|
||||
|
||||
static llvm::Value* fold(llvm::IRBuilder<>* ir, llvm::Value* v1, llvm::Value* v2, llvm::Value* v3)
|
||||
@ -1221,7 +1225,11 @@ struct llvm_fshr
|
||||
static llvm::Function* get_fshr(llvm::IRBuilder<>* ir)
|
||||
{
|
||||
const auto _module = ir->GetInsertBlock()->getParent()->getParent();
|
||||
#if LLVM_VERSION_MAJOR >= 21 || (LLVM_VERSION_MAJOR == 20 && LLVM_VERSION_MINOR >= 1)
|
||||
return llvm::Intrinsic::getOrInsertDeclaration(_module, llvm::Intrinsic::fshr, {llvm_value_t<T>::get_type(ir->getContext())});
|
||||
#else
|
||||
return llvm::Intrinsic::getDeclaration(_module, llvm::Intrinsic::fshr, {llvm_value_t<T>::get_type(ir->getContext())});
|
||||
#endif
|
||||
}
|
||||
|
||||
static llvm::Value* fold(llvm::IRBuilder<>* ir, llvm::Value* v1, llvm::Value* v2, llvm::Value* v3)
|
||||
@ -2220,7 +2228,11 @@ struct llvm_add_sat
|
||||
static llvm::Function* get_add_sat(llvm::IRBuilder<>* ir)
|
||||
{
|
||||
const auto _module = ir->GetInsertBlock()->getParent()->getParent();
|
||||
#if LLVM_VERSION_MAJOR >= 21 || (LLVM_VERSION_MAJOR == 20 && LLVM_VERSION_MINOR >= 1)
|
||||
return llvm::Intrinsic::getOrInsertDeclaration(_module, intr, {llvm_value_t<T>::get_type(ir->getContext())});
|
||||
#else
|
||||
return llvm::Intrinsic::getDeclaration(_module, intr, {llvm_value_t<T>::get_type(ir->getContext())});
|
||||
#endif
|
||||
}
|
||||
|
||||
llvm::Value* eval(llvm::IRBuilder<>* ir) const
|
||||
@ -2303,7 +2315,11 @@ struct llvm_sub_sat
|
||||
static llvm::Function* get_sub_sat(llvm::IRBuilder<>* ir)
|
||||
{
|
||||
const auto _module = ir->GetInsertBlock()->getParent()->getParent();
|
||||
#if LLVM_VERSION_MAJOR >= 21 || (LLVM_VERSION_MAJOR == 20 && LLVM_VERSION_MINOR >= 1)
|
||||
return llvm::Intrinsic::getOrInsertDeclaration(_module, intr, {llvm_value_t<T>::get_type(ir->getContext())});
|
||||
#else
|
||||
return llvm::Intrinsic::getDeclaration(_module, intr, {llvm_value_t<T>::get_type(ir->getContext())});
|
||||
#endif
|
||||
}
|
||||
|
||||
llvm::Value* eval(llvm::IRBuilder<>* ir) const
|
||||
@ -3592,7 +3608,11 @@ public:
|
||||
llvm::Function* get_intrinsic(llvm::Intrinsic::ID id)
|
||||
{
|
||||
const auto _module = m_ir->GetInsertBlock()->getParent()->getParent();
|
||||
#if LLVM_VERSION_MAJOR >= 21 || (LLVM_VERSION_MAJOR == 20 && LLVM_VERSION_MINOR >= 1)
|
||||
return llvm::Intrinsic::getOrInsertDeclaration(_module, id, {get_type<Types>()...});
|
||||
#else
|
||||
return llvm::Intrinsic::getDeclaration(_module, id, {get_type<Types>()...});
|
||||
#endif
|
||||
}
|
||||
|
||||
template <typename T1, typename T2>
|
||||
|
||||
@ -626,9 +626,9 @@ public:
|
||||
cellGem.notice("Could not load mouse gem config. Using defaults.");
|
||||
}
|
||||
|
||||
cellGem.notice("Real gem config=\n", g_cfg_gem_real.to_string());
|
||||
cellGem.notice("Fake gem config=\n", g_cfg_gem_fake.to_string());
|
||||
cellGem.notice("Mouse gem config=\n", g_cfg_gem_mouse.to_string());
|
||||
cellGem.notice("Real gem config=%s", g_cfg_gem_real.to_string());
|
||||
cellGem.notice("Fake gem config=%s", g_cfg_gem_fake.to_string());
|
||||
cellGem.notice("Mouse gem config=%s", g_cfg_gem_mouse.to_string());
|
||||
}
|
||||
};
|
||||
|
||||
@ -719,43 +719,120 @@ namespace gem
|
||||
constexpr u32 in_pitch = 640;
|
||||
constexpr u32 out_pitch = 640 * 4;
|
||||
|
||||
for (u32 y = 0; y < 480 - 1; y += 2)
|
||||
// Hamilton–Adams demosaicing
|
||||
for (s32 y = 0; y < 480; y++)
|
||||
{
|
||||
const u8* src0 = src + y * in_pitch;
|
||||
const u8* src1 = src0 + in_pitch;
|
||||
const bool is_even_y = (y % 2) == 0;
|
||||
const u8* srcc = src + y * in_pitch;
|
||||
const u8* srcu = src + std::max(0, y - 1) * in_pitch;
|
||||
const u8* srcd = src + std::min(480 - 1, y + 1) * in_pitch;
|
||||
|
||||
u8* dst0 = dst + y * out_pitch;
|
||||
u8* dst1 = dst0 + out_pitch;
|
||||
|
||||
for (u32 x = 0; x < 640 - 1; x += 2, src0 += 2, src1 += 2, dst0 += 8, dst1 += 8)
|
||||
// Split loops (roughly twice the performance by removing one condition)
|
||||
if (is_even_y)
|
||||
{
|
||||
u8 b = src0[0];
|
||||
u8 g0 = src0[1];
|
||||
u8 g1 = src1[0];
|
||||
u8 r = src1[1];
|
||||
|
||||
if constexpr (use_gain)
|
||||
for (s32 x = 0; x < 640; x++, dst0 += 4)
|
||||
{
|
||||
b = static_cast<u8>(std::clamp(b * gain_b, 0.0f, 255.0f));
|
||||
g0 = static_cast<u8>(std::clamp(g0 * gain_g, 0.0f, 255.0f));
|
||||
g1 = static_cast<u8>(std::clamp(g1 * gain_g, 0.0f, 255.0f));
|
||||
r = static_cast<u8>(std::clamp(r * gain_r, 0.0f, 255.0f));
|
||||
const bool is_even_x = (x % 2) == 0;
|
||||
const int xl = std::max(0, x - 1);
|
||||
const int xr = std::min(640 - 1, x + 1);
|
||||
|
||||
u8 r, b, g;
|
||||
|
||||
if (is_even_x)
|
||||
{
|
||||
// Blue pixel
|
||||
const u8 up = srcu[x];
|
||||
const u8 down = srcd[x];
|
||||
const u8 left = srcc[xl];
|
||||
const u8 right = srcc[xr];
|
||||
const int dh = std::abs(int(left) - int(right));
|
||||
const int dv = std::abs(int(up) - int(down));
|
||||
|
||||
r = (srcu[xl] + srcu[xr] + srcd[xl] + srcd[xr]) / 4;
|
||||
if (dh < dv)
|
||||
g = (left + right) / 2;
|
||||
else if (dv < dh)
|
||||
g = (up + down) / 2;
|
||||
else
|
||||
g = (up + down + left + right) / 4;
|
||||
b = srcc[x];
|
||||
}
|
||||
else
|
||||
{
|
||||
// Green (on blue row)
|
||||
r = (srcu[x] + srcd[x]) / 2;
|
||||
g = srcc[x];
|
||||
b = (srcc[xl] + srcc[xr]) / 2;
|
||||
}
|
||||
|
||||
if constexpr (use_gain)
|
||||
{
|
||||
dst0[0] = static_cast<u8>(std::clamp(r * gain_r, 0.0f, 255.0f));
|
||||
dst0[1] = static_cast<u8>(std::clamp(b * gain_b, 0.0f, 255.0f));
|
||||
dst0[2] = static_cast<u8>(std::clamp(g * gain_g, 0.0f, 255.0f));
|
||||
}
|
||||
else
|
||||
{
|
||||
dst0[0] = r;
|
||||
dst0[1] = g;
|
||||
dst0[2] = b;
|
||||
}
|
||||
dst0[3] = alpha;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (s32 x = 0; x < 640; x++, dst0 += 4)
|
||||
{
|
||||
const bool is_even_x = (x % 2) == 0;
|
||||
const int xl = std::max(0, x - 1);
|
||||
const int xr = std::min(640 - 1, x + 1);
|
||||
|
||||
const u8 top[4] = { r, g0, b, alpha };
|
||||
const u8 bottom[4] = { r, g1, b, alpha };
|
||||
u8 r, b, g;
|
||||
|
||||
// Top-Left
|
||||
std::memcpy(dst0, top, 4);
|
||||
if (is_even_x)
|
||||
{
|
||||
// Green (on red row)
|
||||
r = (srcc[xl] + srcc[xr]) / 2;
|
||||
g = srcc[x];
|
||||
b = (srcu[x] + srcd[x]) / 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Red pixel
|
||||
const u8 up = srcu[x];
|
||||
const u8 down = srcd[x];
|
||||
const u8 left = srcc[xl];
|
||||
const u8 right = srcc[xr];
|
||||
const int dh = std::abs(int(left) - int(right));
|
||||
const int dv = std::abs(int(up) - int(down));
|
||||
|
||||
// Top-Right Pixel
|
||||
std::memcpy(dst0 + 4, top, 4);
|
||||
r = srcc[x];
|
||||
if (dh < dv)
|
||||
g = (left + right) / 2;
|
||||
else if (dv < dh)
|
||||
g = (up + down) / 2;
|
||||
else
|
||||
g = (up + down + left + right) / 4;
|
||||
b = (srcu[xl] + srcu[xr] + srcd[xl] + srcd[xr]) / 4;
|
||||
}
|
||||
|
||||
// Bottom-Left Pixel
|
||||
std::memcpy(dst1, bottom, 4);
|
||||
|
||||
// Bottom-Right Pixel
|
||||
std::memcpy(dst1 + 4, bottom, 4);
|
||||
if constexpr (use_gain)
|
||||
{
|
||||
dst0[0] = static_cast<u8>(std::clamp(r * gain_r, 0.0f, 255.0f));
|
||||
dst0[1] = static_cast<u8>(std::clamp(b * gain_b, 0.0f, 255.0f));
|
||||
dst0[2] = static_cast<u8>(std::clamp(g * gain_g, 0.0f, 255.0f));
|
||||
}
|
||||
else
|
||||
{
|
||||
dst0[0] = r;
|
||||
dst0[1] = g;
|
||||
dst0[2] = b;
|
||||
}
|
||||
dst0[3] = alpha;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -2617,7 +2617,11 @@ public:
|
||||
{
|
||||
if (b2 != bqbi)
|
||||
{
|
||||
#if LLVM_VERSION_MAJOR >= 21 || (LLVM_VERSION_MAJOR == 20 && LLVM_VERSION_MINOR >= 1)
|
||||
auto ins = &*b2->block->getFirstNonPHIIt();
|
||||
#else
|
||||
auto ins = b2->block->getFirstNonPHI();
|
||||
#endif
|
||||
|
||||
if (b2->bb->preds.size() == 1)
|
||||
{
|
||||
|
||||
@ -50,6 +50,7 @@ namespace vk
|
||||
: m_device(dev)
|
||||
{
|
||||
const bool nullable = !!(flags & VK_BUFFER_CREATE_ALLOW_NULL_RPCS3);
|
||||
const bool no_vmem_recovery = !!(flags & VK_BUFFER_CREATE_IGNORE_VMEM_PRESSURE_RPCS3);
|
||||
|
||||
info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
|
||||
info.flags = flags & ~VK_BUFFER_CREATE_SPECIAL_FLAGS_RPCS3;
|
||||
@ -69,18 +70,27 @@ namespace vk
|
||||
fmt::throw_exception("No compatible memory type was found!");
|
||||
}
|
||||
|
||||
memory = std::make_unique<memory_block>(m_device, memory_reqs.size, memory_reqs.alignment, allocation_type_info, allocation_pool, nullable);
|
||||
memory_allocation_request request
|
||||
{
|
||||
.size = memory_reqs.size,
|
||||
.alignment = memory_reqs.alignment,
|
||||
.memory_type = &allocation_type_info,
|
||||
.pool = allocation_pool,
|
||||
.throw_on_fail = !nullable,
|
||||
.recover_vmem_on_fail = !no_vmem_recovery
|
||||
};
|
||||
memory = std::make_unique<memory_block>(m_device, request);
|
||||
|
||||
if (auto device_memory = memory->get_vk_device_memory();
|
||||
device_memory != VK_NULL_HANDLE)
|
||||
{
|
||||
vkBindBufferMemory(dev, value, device_memory, memory->get_vk_device_memory_offset());
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
ensure(nullable);
|
||||
vkDestroyBuffer(m_device, value, nullptr);
|
||||
value = VK_NULL_HANDLE;
|
||||
}
|
||||
|
||||
ensure(nullable);
|
||||
vkDestroyBuffer(m_device, value, nullptr);
|
||||
value = VK_NULL_HANDLE;
|
||||
}
|
||||
|
||||
buffer::buffer(const vk::render_device& dev, VkBufferUsageFlags usage, void* host_pointer, u64 size)
|
||||
|
||||
@ -9,9 +9,10 @@ namespace vk
|
||||
{
|
||||
enum : u32
|
||||
{
|
||||
VK_BUFFER_CREATE_ALLOW_NULL_RPCS3 = 0x80000000,
|
||||
VK_BUFFER_CREATE_ALLOW_NULL_RPCS3 = 0x10000000, // If we cannot allocate memory for the buffer, just return an empty but valid object with a null handle.
|
||||
VK_BUFFER_CREATE_IGNORE_VMEM_PRESSURE_RPCS3 = 0x20000000, // If we cannot allocate memory for the buffer, do not run recovery routine to recover VRAM. Crash or return empty handle immediately instead.
|
||||
|
||||
VK_BUFFER_CREATE_SPECIAL_FLAGS_RPCS3 = (VK_BUFFER_CREATE_ALLOW_NULL_RPCS3)
|
||||
VK_BUFFER_CREATE_SPECIAL_FLAGS_RPCS3 = (VK_BUFFER_CREATE_ALLOW_NULL_RPCS3 | VK_BUFFER_CREATE_IGNORE_VMEM_PRESSURE_RPCS3)
|
||||
};
|
||||
|
||||
struct buffer_view : public unique_resource
|
||||
|
||||
@ -53,7 +53,7 @@ namespace vk
|
||||
VkFlags create_flags = 0;
|
||||
if (m_prefer_writethrough)
|
||||
{
|
||||
create_flags |= VK_BUFFER_CREATE_ALLOW_NULL_RPCS3;
|
||||
create_flags |= (VK_BUFFER_CREATE_ALLOW_NULL_RPCS3 | VK_BUFFER_CREATE_IGNORE_VMEM_PRESSURE_RPCS3);
|
||||
}
|
||||
|
||||
heap = std::make_unique<buffer>(*g_render_device, size, memory_index, memory_flags, usage, create_flags, VMM_ALLOCATION_POOL_SYSTEM);
|
||||
@ -146,7 +146,7 @@ namespace vk
|
||||
VkFlags create_flags = 0;
|
||||
if (m_prefer_writethrough)
|
||||
{
|
||||
create_flags |= VK_BUFFER_CREATE_ALLOW_NULL_RPCS3;
|
||||
create_flags |= (VK_BUFFER_CREATE_ALLOW_NULL_RPCS3 | VK_BUFFER_CREATE_IGNORE_VMEM_PRESSURE_RPCS3);
|
||||
}
|
||||
|
||||
heap = std::make_unique<buffer>(*g_render_device, aligned_new_size, memory_index, memory_flags, usage, create_flags, VMM_ALLOCATION_POOL_SYSTEM);
|
||||
|
||||
@ -128,7 +128,16 @@ namespace vk
|
||||
fmt::throw_exception("No compatible memory type was found!");
|
||||
}
|
||||
|
||||
memory = std::make_shared<vk::memory_block>(m_device, memory_req.size, memory_req.alignment, allocation_type_info, allocation_pool, nullable);
|
||||
memory_allocation_request alloc_request
|
||||
{
|
||||
.size = memory_req.size,
|
||||
.alignment = memory_req.alignment,
|
||||
.memory_type = &allocation_type_info,
|
||||
.pool = allocation_pool,
|
||||
.throw_on_fail = !nullable
|
||||
};
|
||||
memory = std::make_shared<vk::memory_block>(m_device, alloc_request);
|
||||
|
||||
if (auto device_mem = memory->get_vk_device_memory();
|
||||
device_mem != VK_NULL_HANDLE) [[likely]]
|
||||
{
|
||||
|
||||
@ -224,7 +224,7 @@ namespace vk
|
||||
vmaDestroyAllocator(m_allocator);
|
||||
}
|
||||
|
||||
mem_allocator_vk::mem_handle_t mem_allocator_vma::alloc(u64 block_sz, u64 alignment, const memory_type_info& memory_type, vmm_allocation_pool pool, bool throw_on_fail)
|
||||
mem_allocator_vk::mem_handle_t mem_allocator_vma::alloc(const memory_allocation_request& request)
|
||||
{
|
||||
VmaAllocation vma_alloc;
|
||||
VkMemoryRequirements mem_req = {};
|
||||
@ -233,11 +233,11 @@ namespace vk
|
||||
|
||||
auto do_vma_alloc = [&]() -> std::tuple<VkResult, u32>
|
||||
{
|
||||
for (const auto& memory_type_index : memory_type)
|
||||
for (const auto& memory_type_index : *request.memory_type)
|
||||
{
|
||||
mem_req.memoryTypeBits = 1u << memory_type_index;
|
||||
mem_req.size = ::align2(block_sz, alignment);
|
||||
mem_req.alignment = alignment;
|
||||
mem_req.size = ::align2(request.size, request.alignment);
|
||||
mem_req.alignment = request.alignment;
|
||||
create_info.memoryTypeBits = 1u << memory_type_index;
|
||||
create_info.flags = m_allocation_flags;
|
||||
|
||||
@ -256,26 +256,29 @@ namespace vk
|
||||
const auto [status, type] = do_vma_alloc();
|
||||
if (status == VK_SUCCESS)
|
||||
{
|
||||
vmm_notify_memory_allocated(vma_alloc, type, block_sz, pool);
|
||||
vmm_notify_memory_allocated(vma_alloc, type, request.size, request.pool);
|
||||
return vma_alloc;
|
||||
}
|
||||
}
|
||||
|
||||
const auto severity = (throw_on_fail) ? rsx::problem_severity::fatal : rsx::problem_severity::severe;
|
||||
if (error_code == VK_ERROR_OUT_OF_DEVICE_MEMORY &&
|
||||
vmm_handle_memory_pressure(severity))
|
||||
if (request.recover_vmem_on_fail)
|
||||
{
|
||||
// Out of memory. Try again.
|
||||
const auto [status, type] = do_vma_alloc();
|
||||
if (status == VK_SUCCESS)
|
||||
const auto severity = (request.throw_on_fail) ? rsx::problem_severity::fatal : rsx::problem_severity::severe;
|
||||
if (error_code == VK_ERROR_OUT_OF_DEVICE_MEMORY &&
|
||||
vmm_handle_memory_pressure(severity))
|
||||
{
|
||||
rsx_log.warning("Renderer ran out of video memory but successfully recovered.");
|
||||
vmm_notify_memory_allocated(vma_alloc, type, block_sz, pool);
|
||||
return vma_alloc;
|
||||
// Out of memory. Try again.
|
||||
const auto [status, type] = do_vma_alloc();
|
||||
if (status == VK_SUCCESS)
|
||||
{
|
||||
rsx_log.warning("Renderer ran out of video memory but successfully recovered.");
|
||||
vmm_notify_memory_allocated(vma_alloc, type, request.size, request.pool);
|
||||
return vma_alloc;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!throw_on_fail)
|
||||
if (!request.throw_on_fail)
|
||||
{
|
||||
return VK_NULL_HANDLE;
|
||||
}
|
||||
@ -361,18 +364,18 @@ namespace vk
|
||||
m_allocation_flags = VMA_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT;
|
||||
}
|
||||
|
||||
mem_allocator_vk::mem_handle_t mem_allocator_vk::alloc(u64 block_sz, u64 /*alignment*/, const memory_type_info& memory_type, vmm_allocation_pool pool, bool throw_on_fail)
|
||||
mem_allocator_vk::mem_handle_t mem_allocator_vk::alloc(const memory_allocation_request& request)
|
||||
{
|
||||
VkResult error_code = VK_ERROR_UNKNOWN;
|
||||
VkDeviceMemory memory;
|
||||
|
||||
VkMemoryAllocateInfo info = {};
|
||||
info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
|
||||
info.allocationSize = block_sz;
|
||||
info.allocationSize = request.size;
|
||||
|
||||
auto do_vk_alloc = [&]() -> std::tuple<VkResult, u32>
|
||||
{
|
||||
for (const auto& memory_type_index : memory_type)
|
||||
for (const auto& memory_type_index : *request.memory_type)
|
||||
{
|
||||
info.memoryTypeIndex = memory_type_index;
|
||||
error_code = vkAllocateMemory(m_device, &info, nullptr, &memory);
|
||||
@ -389,26 +392,29 @@ namespace vk
|
||||
const auto [status, type] = do_vk_alloc();
|
||||
if (status == VK_SUCCESS)
|
||||
{
|
||||
vmm_notify_memory_allocated(memory, type, block_sz, pool);
|
||||
vmm_notify_memory_allocated(memory, type, request.size, request.pool);
|
||||
return memory;
|
||||
}
|
||||
}
|
||||
|
||||
const auto severity = (throw_on_fail) ? rsx::problem_severity::fatal : rsx::problem_severity::severe;
|
||||
if (error_code == VK_ERROR_OUT_OF_DEVICE_MEMORY &&
|
||||
vmm_handle_memory_pressure(severity))
|
||||
if (request.recover_vmem_on_fail)
|
||||
{
|
||||
// Out of memory. Try again.
|
||||
const auto [status, type] = do_vk_alloc();
|
||||
if (status == VK_SUCCESS)
|
||||
const auto severity = (request.throw_on_fail) ? rsx::problem_severity::fatal : rsx::problem_severity::severe;
|
||||
if (error_code == VK_ERROR_OUT_OF_DEVICE_MEMORY &&
|
||||
vmm_handle_memory_pressure(severity))
|
||||
{
|
||||
rsx_log.warning("Renderer ran out of video memory but successfully recovered.");
|
||||
vmm_notify_memory_allocated(memory, type, block_sz, pool);
|
||||
return memory;
|
||||
// Out of memory. Try again.
|
||||
const auto [status, type] = do_vk_alloc();
|
||||
if (status == VK_SUCCESS)
|
||||
{
|
||||
rsx_log.warning("Renderer ran out of video memory but successfully recovered.");
|
||||
vmm_notify_memory_allocated(memory, type, request.size, request.pool);
|
||||
return memory;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!throw_on_fail)
|
||||
if (!request.throw_on_fail)
|
||||
{
|
||||
return VK_NULL_HANDLE;
|
||||
}
|
||||
@ -455,11 +461,11 @@ namespace vk
|
||||
return g_render_device->get_allocator();
|
||||
}
|
||||
|
||||
memory_block::memory_block(VkDevice dev, u64 block_sz, u64 alignment, const memory_type_info& memory_type, vmm_allocation_pool pool, bool nullable)
|
||||
: m_device(dev), m_size(block_sz)
|
||||
memory_block::memory_block(VkDevice dev, const memory_allocation_request& alloc_request)
|
||||
: m_device(dev), m_size(alloc_request.size)
|
||||
{
|
||||
m_mem_allocator = get_current_mem_allocator();
|
||||
m_mem_handle = m_mem_allocator->alloc(block_sz, alignment, memory_type, pool, !nullable);
|
||||
m_mem_handle = m_mem_allocator->alloc(alloc_request);
|
||||
}
|
||||
|
||||
memory_block::~memory_block()
|
||||
|
||||
@ -66,6 +66,16 @@ namespace vk
|
||||
u64 size;
|
||||
};
|
||||
|
||||
struct memory_allocation_request
|
||||
{
|
||||
u64 size = 0;
|
||||
u64 alignment = 1;
|
||||
const memory_type_info* memory_type = nullptr;
|
||||
vmm_allocation_pool pool = VMM_ALLOCATION_POOL_UNDEFINED;
|
||||
bool throw_on_fail = true;
|
||||
bool recover_vmem_on_fail = true;
|
||||
};
|
||||
|
||||
class mem_allocator_base
|
||||
{
|
||||
public:
|
||||
@ -76,7 +86,7 @@ namespace vk
|
||||
|
||||
virtual void destroy() = 0;
|
||||
|
||||
virtual mem_handle_t alloc(u64 block_sz, u64 alignment, const memory_type_info& memory_type, vmm_allocation_pool pool, bool throw_on_fail) = 0;
|
||||
virtual mem_handle_t alloc(const memory_allocation_request& request) = 0;
|
||||
virtual void free(mem_handle_t mem_handle) = 0;
|
||||
virtual void* map(mem_handle_t mem_handle, u64 offset, u64 size) = 0;
|
||||
virtual void unmap(mem_handle_t mem_handle) = 0;
|
||||
@ -104,7 +114,7 @@ namespace vk
|
||||
|
||||
void destroy() override;
|
||||
|
||||
mem_handle_t alloc(u64 block_sz, u64 alignment, const memory_type_info& memory_type, vmm_allocation_pool pool, bool throw_on_fail) override;
|
||||
mem_handle_t alloc(const memory_allocation_request& request) override;
|
||||
|
||||
void free(mem_handle_t mem_handle) override;
|
||||
void* map(mem_handle_t mem_handle, u64 offset, u64 /*size*/) override;
|
||||
@ -134,7 +144,7 @@ namespace vk
|
||||
|
||||
void destroy() override {}
|
||||
|
||||
mem_handle_t alloc(u64 block_sz, u64 /*alignment*/, const memory_type_info& memory_type, vmm_allocation_pool pool, bool throw_on_fail) override;
|
||||
mem_handle_t alloc(const memory_allocation_request& request) override;
|
||||
|
||||
void free(mem_handle_t mem_handle) override;
|
||||
void* map(mem_handle_t mem_handle, u64 offset, u64 size) override;
|
||||
@ -147,7 +157,7 @@ namespace vk
|
||||
|
||||
struct memory_block
|
||||
{
|
||||
memory_block(VkDevice dev, u64 block_sz, u64 alignment, const memory_type_info& memory_type, vmm_allocation_pool pool, bool nullable = false);
|
||||
memory_block(VkDevice dev, const memory_allocation_request& alloc_request);
|
||||
virtual ~memory_block();
|
||||
|
||||
virtual VkDeviceMemory get_vk_device_memory();
|
||||
|
||||
@ -114,45 +114,60 @@ bool qt_camera_video_sink::present(const QVideoFrame& frame)
|
||||
case CELL_CAMERA_RAW8: // The game seems to expect BGGR
|
||||
{
|
||||
// Let's use a very simple algorithm to convert the image to raw BGGR
|
||||
const auto convert_to_bggr = [&image_buffer, &image, width, height](u32 y_begin, u32 y_end)
|
||||
const auto convert_to_bggr = [this, &image_buffer, &image, width, height](u32 y_begin, u32 y_end)
|
||||
{
|
||||
u8* dst = &image_buffer.data[image_buffer.width * y_begin];
|
||||
|
||||
for (u32 y = y_begin; y < height && y < y_end; y++)
|
||||
{
|
||||
const u8* src = image.constScanLine(y);
|
||||
const u8* srcu = image.constScanLine(std::max<s32>(0, y - 1));
|
||||
const u8* srcd = image.constScanLine(std::min(height - 1, y + 1));
|
||||
const bool is_top_pixel = (y % 2) == 0;
|
||||
|
||||
// We apply gaussian blur to get better demosaicing results later when debayering again
|
||||
const auto blurred = [&](s32 x, s32 c)
|
||||
{
|
||||
const s32 i = x * 4 + c;
|
||||
const s32 il = std::max(0, x - 1) * 4 + c;
|
||||
const s32 ir = std::min<s32>(width - 1, x + 1) * 4 + c;
|
||||
const s32 sum =
|
||||
srcu[i] +
|
||||
src[il] + 4 * src[i] + src[ir] +
|
||||
srcd[i];
|
||||
return static_cast<u8>(std::clamp((sum + 4) / 8, 0, 255));
|
||||
};
|
||||
|
||||
// Split loops (roughly twice the performance by removing one condition)
|
||||
if (is_top_pixel)
|
||||
{
|
||||
for (u32 x = 0; x < width; x++, dst++, src += 4)
|
||||
for (u32 x = 0; x < width; x++, dst++)
|
||||
{
|
||||
const bool is_left_pixel = (x % 2) == 0;
|
||||
|
||||
if (is_left_pixel)
|
||||
{
|
||||
*dst = src[2]; // Blue
|
||||
*dst = blurred(x, 2); // Blue
|
||||
}
|
||||
else
|
||||
{
|
||||
*dst = src[1]; // Green
|
||||
*dst = blurred(x, 1); // Green
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (u32 x = 0; x < width; x++, dst++, src += 4)
|
||||
for (u32 x = 0; x < width; x++, dst++)
|
||||
{
|
||||
const bool is_left_pixel = (x % 2) == 0;
|
||||
|
||||
if (is_left_pixel)
|
||||
{
|
||||
*dst = src[1]; // Green
|
||||
*dst = blurred(x, 1); // Green
|
||||
}
|
||||
else
|
||||
{
|
||||
*dst = src[0]; // Red
|
||||
*dst = blurred(x, 0); // Red
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -182,13 +197,13 @@ bool qt_camera_video_sink::present(const QVideoFrame& frame)
|
||||
// Simple RGB to Y0_U_Y1_V conversion from stackoverflow.
|
||||
const auto convert_to_yuv422 = [&image_buffer, &image, width, height, format = m_format](u32 y_begin, u32 y_end)
|
||||
{
|
||||
constexpr int yuv_bytes_per_pixel = 2;
|
||||
const int yuv_pitch = image_buffer.width * yuv_bytes_per_pixel;
|
||||
constexpr s32 yuv_bytes_per_pixel = 2;
|
||||
const s32 yuv_pitch = image_buffer.width * yuv_bytes_per_pixel;
|
||||
|
||||
const int y0_offset = (format == CELL_CAMERA_Y0_U_Y1_V) ? 0 : 3;
|
||||
const int u_offset = (format == CELL_CAMERA_Y0_U_Y1_V) ? 1 : 2;
|
||||
const int y1_offset = (format == CELL_CAMERA_Y0_U_Y1_V) ? 2 : 1;
|
||||
const int v_offset = (format == CELL_CAMERA_Y0_U_Y1_V) ? 3 : 0;
|
||||
const s32 y0_offset = (format == CELL_CAMERA_Y0_U_Y1_V) ? 0 : 3;
|
||||
const s32 u_offset = (format == CELL_CAMERA_Y0_U_Y1_V) ? 1 : 2;
|
||||
const s32 y1_offset = (format == CELL_CAMERA_Y0_U_Y1_V) ? 2 : 1;
|
||||
const s32 v_offset = (format == CELL_CAMERA_Y0_U_Y1_V) ? 3 : 0;
|
||||
|
||||
for (u32 y = y_begin; y < height && y < y_end; y++)
|
||||
{
|
||||
@ -197,19 +212,19 @@ bool qt_camera_video_sink::present(const QVideoFrame& frame)
|
||||
|
||||
for (u32 x = 0; x < width - 1; x += 2, src += 8)
|
||||
{
|
||||
const float r1 = src[0];
|
||||
const float g1 = src[1];
|
||||
const float b1 = src[2];
|
||||
const float r2 = src[4];
|
||||
const float g2 = src[5];
|
||||
const float b2 = src[6];
|
||||
const f32 r1 = src[0];
|
||||
const f32 g1 = src[1];
|
||||
const f32 b1 = src[2];
|
||||
const f32 r2 = src[4];
|
||||
const f32 g2 = src[5];
|
||||
const f32 b2 = src[6];
|
||||
|
||||
const int y0 = (0.257f * r1) + (0.504f * g1) + (0.098f * b1) + 16.0f;
|
||||
const int u = -(0.148f * r1) - (0.291f * g1) + (0.439f * b1) + 128.0f;
|
||||
const int v = (0.439f * r1) - (0.368f * g1) - (0.071f * b1) + 128.0f;
|
||||
const int y1 = (0.257f * r2) + (0.504f * g2) + (0.098f * b2) + 16.0f;
|
||||
const s32 y0 = (0.257f * r1) + (0.504f * g1) + (0.098f * b1) + 16.0f;
|
||||
const s32 u = -(0.148f * r1) - (0.291f * g1) + (0.439f * b1) + 128.0f;
|
||||
const s32 v = (0.439f * r1) - (0.368f * g1) - (0.071f * b1) + 128.0f;
|
||||
const s32 y1 = (0.257f * r2) + (0.504f * g2) + (0.098f * b2) + 16.0f;
|
||||
|
||||
const int yuv_index = x * yuv_bytes_per_pixel;
|
||||
const s32 yuv_index = x * yuv_bytes_per_pixel;
|
||||
yuv_row_ptr[yuv_index + y0_offset] = static_cast<u8>(std::clamp(y0, 0, 255));
|
||||
yuv_row_ptr[yuv_index + u_offset] = static_cast<u8>(std::clamp( u, 0, 255));
|
||||
yuv_row_ptr[yuv_index + y1_offset] = static_cast<u8>(std::clamp(y1, 0, 255));
|
||||
|
||||
Loading…
Reference in New Issue
Block a user