mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-04-28 13:28:01 +03:00
parent
37ee0a2f55
commit
b5dbd44087
11 changed files with 78 additions and 41 deletions
|
@ -59,7 +59,7 @@ if(APPLE)
|
||||||
#list(APPEND LIBS hidapi)
|
#list(APPEND LIBS hidapi)
|
||||||
elseif(CMAKE_SYSTEM MATCHES "Linux")
|
elseif(CMAKE_SYSTEM MATCHES "Linux")
|
||||||
add_subdirectory(3rdparty/hidapi/linux EXCLUDE_FROM_ALL)
|
add_subdirectory(3rdparty/hidapi/linux EXCLUDE_FROM_ALL)
|
||||||
elseif(MSVC)
|
elseif(WIN32)
|
||||||
add_subdirectory(3rdparty/hidapi/windows EXCLUDE_FROM_ALL)
|
add_subdirectory(3rdparty/hidapi/windows EXCLUDE_FROM_ALL)
|
||||||
else()
|
else()
|
||||||
add_subdirectory(3rdparty/hidapi/libusb EXCLUDE_FROM_ALL)
|
add_subdirectory(3rdparty/hidapi/libusb EXCLUDE_FROM_ALL)
|
||||||
|
|
28
README.md
28
README.md
|
@ -68,6 +68,34 @@ If you're not using precompiled libs, build the projects in *__BUILD_BEFORE* fol
|
||||||
`Build > Build Solution`
|
`Build > Build Solution`
|
||||||
|
|
||||||
|
|
||||||
|
## Building on Windows (MinGW):
|
||||||
|
|
||||||
|
1) Install packages
|
||||||
|
- `pacman -S base-devel mingw-w64-x86_64-toolchain mingw-w64-x86_64-cmake mingw-w64-x86_64-yasm mingw-w64-x86_64-python2 mingw-w64-x86_64-ntldd-git mingw-w64-x86_64-qt5 mingw-w64-x86_64-openal mingw-w64-x86_64-glew git`
|
||||||
|
2) Clone repository
|
||||||
|
- `git clone https://github.com/RPCS3/rpcs3.git`
|
||||||
|
3) Update submodules
|
||||||
|
- `cd rpcs3`
|
||||||
|
- `git submodule update --init`
|
||||||
|
- `cd ..`
|
||||||
|
4) Configure and compile rpcs3
|
||||||
|
- `mkdir rpcs3_build && cd rpcs3_build`
|
||||||
|
- `cmake -G "MSYS Makefiles" -DCMAKE_MAKE_PROGRAM=mingw32-make ../rpcs3/`
|
||||||
|
- `mingw32-make.exe GitVersion && mingw32-make.exe discord-rpc`
|
||||||
|
- If you use ```-DUSE_SYSTEM_FFMPEG=OFF```, run `mingw32-make ffmpeg-mingw`
|
||||||
|
5) Build rpcs3
|
||||||
|
- Run `mingw32-make` or `mingw32-make -jX` where X is your CPU cores.
|
||||||
|
6) Copy dependencies
|
||||||
|
- `cd ./bin`
|
||||||
|
- `for l in $(ntldd.exe -R rpcs3.exe|grep mingw64|sed -e 's/^[ \t]*//'|cut -d' ' -f3);do cp $l .;done`
|
||||||
|
7) Copy qt plugins
|
||||||
|
- `mkdir -p ./qt/plugins/{bearer,imageformats,platforms,styles}`
|
||||||
|
- `cp /mingw64/share/qt5/plugins/bearer/qgenericbearer.dll ./qt/plugins/bearer/`
|
||||||
|
- `cp /mingw64/share/qt5/plugins/imageformats/{qgif.dll,qicns.dll,qico.dll,qjpeg.dll,qtga.dll,qtiff.dll,qwbmp.dll,qwebp.dll} ./qt/plugins/imageformats/`
|
||||||
|
- `cp /mingw64/share/qt5/plugins/platforms/qwindows.dll ./qt/plugins/platforms/`
|
||||||
|
- `cp /mingw64/share/qt5/plugins/styles/qwindowsvistastyle.dll ./qt/plugins/styles/`
|
||||||
|
8) Run RPCS3 with `./rpcs3`
|
||||||
|
|
||||||
|
|
||||||
## Building on Linux & Mac OS:
|
## Building on Linux & Mac OS:
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@ set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake_modules")
|
||||||
set(RES_FILES "")
|
set(RES_FILES "")
|
||||||
set(CMAKE_CXX_STANDARD 17)
|
set(CMAKE_CXX_STANDARD 17)
|
||||||
include(CheckCXXCompilerFlag)
|
include(CheckCXXCompilerFlag)
|
||||||
|
include(ExternalProject)
|
||||||
|
|
||||||
# Qt section
|
# Qt section
|
||||||
find_package(Qt5 5.10 COMPONENTS Widgets Network Qml)
|
find_package(Qt5 5.10 COMPONENTS Widgets Network Qml)
|
||||||
|
@ -205,6 +206,10 @@ if(NOT WITHOUT_LLVM)
|
||||||
option(LLVM_INCLUDE_UTILS OFF)
|
option(LLVM_INCLUDE_UTILS OFF)
|
||||||
option(WITH_POLLY OFF)
|
option(WITH_POLLY OFF)
|
||||||
|
|
||||||
|
if(WIN32 AND NOT MSVC)
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D__STDC_FORMAT_MACROS=1")
|
||||||
|
endif()
|
||||||
|
|
||||||
# LLVM needs to be built out-of-tree
|
# LLVM needs to be built out-of-tree
|
||||||
add_subdirectory(../llvm ../llvm_build EXCLUDE_FROM_ALL)
|
add_subdirectory(../llvm ../llvm_build EXCLUDE_FROM_ALL)
|
||||||
set(LLVM_DIR "${CMAKE_CURRENT_BINARY_DIR}/../llvm_build/lib/cmake/llvm/")
|
set(LLVM_DIR "${CMAKE_CURRENT_BINARY_DIR}/../llvm_build/lib/cmake/llvm/")
|
||||||
|
@ -283,7 +288,31 @@ if(USE_SYSTEM_FFMPEG)
|
||||||
include_directories("${FFMPEG_INCLUDE_DIR}")
|
include_directories("${FFMPEG_INCLUDE_DIR}")
|
||||||
else()
|
else()
|
||||||
message("-- RPCS3: using builtin ffmpeg")
|
message("-- RPCS3: using builtin ffmpeg")
|
||||||
include_directories("${RPCS3_SRC_DIR}/../3rdparty/ffmpeg/${PLATFORM_ARCH}/include")
|
if(MSVC OR NOT WIN32)
|
||||||
|
include_directories("${RPCS3_SRC_DIR}/../3rdparty/ffmpeg/${PLATFORM_ARCH}/include")
|
||||||
|
link_directories("${RPCS3_SRC_DIR}/../3rdparty/ffmpeg/${PLATFORM_ARCH}/lib")
|
||||||
|
else()
|
||||||
|
ExternalProject_Add(ffmpeg-mingw
|
||||||
|
DOWNLOAD_COMMAND ""
|
||||||
|
SOURCE_DIR /e/src/rpcs3/3rdparty/ffmpeg
|
||||||
|
BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/ffmpeg
|
||||||
|
CONFIGURE_COMMAND /e/src/rpcs3/3rdparty/ffmpeg/configure --prefix=./Windows/x86_64 --arch=x86_64 --disable-avdevice --disable-programs --disable-avfilter --disable-postproc --disable-doc --disable-pthreads --enable-w32threads --disable-network --disable-everything --disable-encoders --disable-muxers --disable-hwaccels --disable-parsers --disable-protocols --enable-dxva2 --enable-static --disable-shared --enable-decoder=aac --enable-decoder=aac_latm --enable-decoder=atrac3 --enable-decoder=atrac3p --enable-decoder=mp3 --enable-decoder=pcm_s16le --enable-decoder=pcm_s8 --enable-decoder=h264 --enable-decoder=mpeg4 --enable-decoder=mpeg2video --enable-decoder=mjpeg --enable-decoder=mjpegb --enable-encoder=pcm_s16le --enable-encoder=ffv1 --enable-encoder=mpeg4 --enable-parser=h264 --enable-parser=mpeg4video --enable-parser=mpegaudio --enable-parser=mpegvideo --enable-parser=mjpeg --enable-parser=aac --enable-parser=aac_latm --enable-muxer=avi --enable-demuxer=h264 --enable-demuxer=m4v --enable-demuxer=mp3 --enable-demuxer=mpegvideo --enable-demuxer=mpegps --enable-demuxer=mjpeg --enable-demuxer=avi --enable-demuxer=aac --enable-demuxer=pmp --enable-demuxer=oma --enable-demuxer=pcm_s16le --enable-demuxer=pcm_s8 --enable-demuxer=wav --enable-hwaccel=h264_dxva2 --enable-indev=dshow --enable-protocol=file
|
||||||
|
BUILD_COMMAND make -j 4
|
||||||
|
INSTALL_COMMAND make install
|
||||||
|
)
|
||||||
|
include_directories("${CMAKE_CURRENT_BINARY_DIR}/ffmpeg/${PLATFORM_ARCH}/include")
|
||||||
|
link_directories("${CMAKE_CURRENT_BINARY_DIR}/ffmpeg/${PLATFORM_ARCH}/lib")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Build discord-rpc for mingw
|
||||||
|
if(WIN32 AND NOT MSVC)
|
||||||
|
ExternalProject_Add(discord-rpc
|
||||||
|
GIT_REPOSITORY https://github.com/discordapp/discord-rpc
|
||||||
|
BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/discord-rpc
|
||||||
|
INSTALL_COMMAND ""
|
||||||
|
)
|
||||||
|
link_directories(rpcs3 "${CMAKE_CURRENT_BINARY_DIR}/discord-rpc/src/")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
include_directories(
|
include_directories(
|
||||||
|
@ -326,12 +355,6 @@ endif()
|
||||||
|
|
||||||
link_directories("${RPCS3_SRC_DIR}/../3rdparty/minidx12/")
|
link_directories("${RPCS3_SRC_DIR}/../3rdparty/minidx12/")
|
||||||
|
|
||||||
if(NOT USE_SYSTEM_FFMPEG)
|
|
||||||
if(MSVC OR NOT WIN32)
|
|
||||||
link_directories("${RPCS3_SRC_DIR}/../3rdparty/ffmpeg/${PLATFORM_ARCH}/lib")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
get_property(dirs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES)
|
get_property(dirs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES)
|
||||||
foreach (dir ${dirs})
|
foreach (dir ${dirs})
|
||||||
message(STATUS "dir='${dir}'")
|
message(STATUS "dir='${dir}'")
|
||||||
|
@ -406,15 +429,15 @@ target_include_directories(rpcs3 PUBLIC ${ZLIB_INCLUDE_DIRS})
|
||||||
target_link_libraries(rpcs3 ${ZLIB_LIBRARIES})
|
target_link_libraries(rpcs3 ${ZLIB_LIBRARIES})
|
||||||
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
target_link_libraries(rpcs3 ws2_32.lib Winmm.lib Psapi.lib gdi32.lib setupapi.lib hidapi-hid Shlwapi.lib)
|
target_link_libraries(rpcs3 ws2_32.lib Winmm.lib Psapi.lib gdi32.lib Shlwapi.lib)
|
||||||
if(NOT MSVC)
|
if(MSVC)
|
||||||
target_link_libraries(rpcs3 ${OPENGL_LIBRARIES} opengl32.lib glu32.lib)
|
target_link_libraries(rpcs3 dxgi.lib d2d1.lib dwrite.lib hidapi-hid setupapi.lib)
|
||||||
|
# Link Discord Rich Presence
|
||||||
|
target_link_libraries(rpcs3 "${RPCS3_SRC_DIR}/../3rdparty/discord-rpc/lib/discord-rpc.lib")
|
||||||
else()
|
else()
|
||||||
target_link_libraries(rpcs3 dxgi.lib d2d1.lib dwrite.lib)
|
target_link_libraries(rpcs3 ${OPENGL_LIBRARIES} opengl32.lib glu32.lib hidapi-hid libsetupapi.a libdiscord-rpc.a)
|
||||||
endif()
|
endif()
|
||||||
target_link_libraries(rpcs3 avformat.lib avcodec.lib avutil.lib swscale.lib png_static ${OPENAL_LIBRARY} ${ADDITIONAL_LIBS})
|
target_link_libraries(rpcs3 avformat.lib avcodec.lib avutil.lib swscale.lib png_static ${OPENAL_LIBRARY} ${ADDITIONAL_LIBS})
|
||||||
# Link Discord Rich Presence
|
|
||||||
target_link_libraries(rpcs3 "${RPCS3_SRC_DIR}/../3rdparty/discord-rpc/lib/discord-rpc.lib")
|
|
||||||
else()
|
else()
|
||||||
target_link_libraries(rpcs3 ${OPENAL_LIBRARY} ${OPENGL_LIBRARIES})
|
target_link_libraries(rpcs3 ${OPENAL_LIBRARY} ${OPENGL_LIBRARIES})
|
||||||
if(APPLE)
|
if(APPLE)
|
||||||
|
|
|
@ -99,10 +99,8 @@ void fmt_class_string<pad_handler>::format(std::string& out, u64 arg)
|
||||||
case pad_handler::null: return "Null";
|
case pad_handler::null: return "Null";
|
||||||
case pad_handler::keyboard: return "Keyboard";
|
case pad_handler::keyboard: return "Keyboard";
|
||||||
case pad_handler::ds4: return "DualShock 4";
|
case pad_handler::ds4: return "DualShock 4";
|
||||||
#ifdef _MSC_VER
|
|
||||||
case pad_handler::xinput: return "XInput";
|
|
||||||
#endif
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
case pad_handler::xinput: return "XInput";
|
||||||
case pad_handler::mm: return "MMJoystick";
|
case pad_handler::mm: return "MMJoystick";
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_LIBEVDEV
|
#ifdef HAVE_LIBEVDEV
|
||||||
|
|
|
@ -62,10 +62,8 @@ enum class pad_handler
|
||||||
null,
|
null,
|
||||||
keyboard,
|
keyboard,
|
||||||
ds4,
|
ds4,
|
||||||
#ifdef _MSC_VER
|
|
||||||
xinput,
|
|
||||||
#endif
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
xinput,
|
||||||
mm,
|
mm,
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_LIBEVDEV
|
#ifdef HAVE_LIBEVDEV
|
||||||
|
|
|
@ -493,8 +493,8 @@ std::unordered_map<u64, u16> mm_joystick_handler::GetButtonValues(const JOYINFOE
|
||||||
};
|
};
|
||||||
|
|
||||||
float rad = static_cast<float>(js_info.dwPOV / 100 * acos(-1) / 180);
|
float rad = static_cast<float>(js_info.dwPOV / 100 * acos(-1) / 180);
|
||||||
emplacePOVs(std::cosf(rad) * 255.0f, JOY_POVBACKWARD, JOY_POVFORWARD);
|
emplacePOVs(cosf(rad) * 255.0f, JOY_POVBACKWARD, JOY_POVFORWARD);
|
||||||
emplacePOVs(std::sinf(rad) * 255.0f, JOY_POVLEFT, JOY_POVRIGHT);
|
emplacePOVs(sinf(rad) * 255.0f, JOY_POVLEFT, JOY_POVRIGHT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (js_caps.wCaps & JOYCAPS_POV4DIR)
|
else if (js_caps.wCaps & JOYCAPS_POV4DIR)
|
||||||
|
|
|
@ -60,12 +60,10 @@ void pad_thread::Init(const u32 max_connect)
|
||||||
case pad_handler::ds4:
|
case pad_handler::ds4:
|
||||||
cur_pad_handler = std::make_shared<ds4_pad_handler>();
|
cur_pad_handler = std::make_shared<ds4_pad_handler>();
|
||||||
break;
|
break;
|
||||||
#ifdef _MSC_VER
|
#ifdef _WIN32
|
||||||
case pad_handler::xinput:
|
case pad_handler::xinput:
|
||||||
cur_pad_handler = std::make_shared<xinput_pad_handler>();
|
cur_pad_handler = std::make_shared<xinput_pad_handler>();
|
||||||
break;
|
break;
|
||||||
#endif
|
|
||||||
#ifdef _WIN32
|
|
||||||
case pad_handler::mm:
|
case pad_handler::mm:
|
||||||
cur_pad_handler = std::make_shared<mm_joystick_handler>();
|
cur_pad_handler = std::make_shared<mm_joystick_handler>();
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -24,10 +24,8 @@
|
||||||
#include "Emu/Io/Null/NullPadHandler.h"
|
#include "Emu/Io/Null/NullPadHandler.h"
|
||||||
#include "keyboard_pad_handler.h"
|
#include "keyboard_pad_handler.h"
|
||||||
#include "ds4_pad_handler.h"
|
#include "ds4_pad_handler.h"
|
||||||
#ifdef _MSC_VER
|
|
||||||
#include "xinput_pad_handler.h"
|
|
||||||
#endif
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
#include "xinput_pad_handler.h"
|
||||||
#include "mm_joystick_handler.h"
|
#include "mm_joystick_handler.h"
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_LIBEVDEV
|
#ifdef HAVE_LIBEVDEV
|
||||||
|
|
|
@ -85,9 +85,7 @@ void gl_gs_frame::delete_context(draw_context_t ctx)
|
||||||
auto gl_ctx = (GLContext*)ctx;
|
auto gl_ctx = (GLContext*)ctx;
|
||||||
gl_ctx->handle->doneCurrent();
|
gl_ctx->handle->doneCurrent();
|
||||||
|
|
||||||
#ifndef _WIN32
|
#ifdef _MSC_VER
|
||||||
delete gl_ctx->handle;
|
|
||||||
#else
|
|
||||||
//AMD driver crashes when executing wglDeleteContext
|
//AMD driver crashes when executing wglDeleteContext
|
||||||
//Catch with SEH
|
//Catch with SEH
|
||||||
__try
|
__try
|
||||||
|
@ -98,6 +96,8 @@ void gl_gs_frame::delete_context(draw_context_t ctx)
|
||||||
{
|
{
|
||||||
LOG_FATAL(RSX, "Your graphics driver just crashed whilst cleaning up. All consumed VRAM should have been released, but you may want to restart the emulator just in case");
|
LOG_FATAL(RSX, "Your graphics driver just crashed whilst cleaning up. All consumed VRAM should have been released, but you may want to restart the emulator just in case");
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
delete gl_ctx->handle;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (gl_ctx->owner)
|
if (gl_ctx->owner)
|
||||||
|
|
|
@ -16,8 +16,6 @@
|
||||||
#include "ds4_pad_handler.h"
|
#include "ds4_pad_handler.h"
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#include "xinput_pad_handler.h"
|
#include "xinput_pad_handler.h"
|
||||||
#endif
|
|
||||||
#ifdef _MSC_VER
|
|
||||||
#include "mm_joystick_handler.h"
|
#include "mm_joystick_handler.h"
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_LIBEVDEV
|
#ifdef HAVE_LIBEVDEV
|
||||||
|
@ -673,12 +671,10 @@ std::shared_ptr<PadHandlerBase> pad_settings_dialog::GetHandler(pad_handler type
|
||||||
case pad_handler::ds4:
|
case pad_handler::ds4:
|
||||||
ret_handler = std::make_unique<ds4_pad_handler>();
|
ret_handler = std::make_unique<ds4_pad_handler>();
|
||||||
break;
|
break;
|
||||||
#ifdef _MSC_VER
|
#ifdef _WIN32
|
||||||
case pad_handler::xinput:
|
case pad_handler::xinput:
|
||||||
ret_handler = std::make_unique<xinput_pad_handler>();
|
ret_handler = std::make_unique<xinput_pad_handler>();
|
||||||
break;
|
break;
|
||||||
#endif
|
|
||||||
#ifdef _WIN32
|
|
||||||
case pad_handler::mm:
|
case pad_handler::mm:
|
||||||
ret_handler = std::make_unique<mm_joystick_handler>();
|
ret_handler = std::make_unique<mm_joystick_handler>();
|
||||||
break;
|
break;
|
||||||
|
@ -720,7 +716,7 @@ void pad_settings_dialog::ChangeInputType()
|
||||||
// Refill the device combobox with currently available devices
|
// Refill the device combobox with currently available devices
|
||||||
switch (m_handler->m_type)
|
switch (m_handler->m_type)
|
||||||
{
|
{
|
||||||
#ifdef _MSC_VER
|
#ifdef _WIN32
|
||||||
case pad_handler::xinput:
|
case pad_handler::xinput:
|
||||||
{
|
{
|
||||||
const QString name_string = qstr(m_handler->name_string());
|
const QString name_string = qstr(m_handler->name_string());
|
||||||
|
@ -819,12 +815,10 @@ void pad_settings_dialog::ChangeProfile()
|
||||||
case pad_handler::ds4:
|
case pad_handler::ds4:
|
||||||
((ds4_pad_handler*)m_handler.get())->init_config(&m_handler_cfg, cfg_name);
|
((ds4_pad_handler*)m_handler.get())->init_config(&m_handler_cfg, cfg_name);
|
||||||
break;
|
break;
|
||||||
#ifdef _MSC_VER
|
#ifdef _WIN32
|
||||||
case pad_handler::xinput:
|
case pad_handler::xinput:
|
||||||
((xinput_pad_handler*)m_handler.get())->init_config(&m_handler_cfg, cfg_name);
|
((xinput_pad_handler*)m_handler.get())->init_config(&m_handler_cfg, cfg_name);
|
||||||
break;
|
break;
|
||||||
#endif
|
|
||||||
#ifdef _WIN32
|
|
||||||
case pad_handler::mm:
|
case pad_handler::mm:
|
||||||
((mm_joystick_handler*)m_handler.get())->init_config(&m_handler_cfg, cfg_name);
|
((mm_joystick_handler*)m_handler.get())->init_config(&m_handler_cfg, cfg_name);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _WIN32
|
||||||
#include "xinput_pad_handler.h"
|
#include "xinput_pad_handler.h"
|
||||||
|
|
||||||
xinput_pad_handler::xinput_pad_handler() : PadHandlerBase(pad_handler::xinput)
|
xinput_pad_handler::xinput_pad_handler() : PadHandlerBase(pad_handler::xinput)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue