From d66bd5f70f23d56f12d1f00c7bf4d3b242eca91e Mon Sep 17 00:00:00 2001 From: Raul Tambre Date: Thu, 16 Jun 2016 00:12:58 +0300 Subject: [PATCH 1/7] Add myself to mention-bot blacklist. (#1779) --- .mention-bot | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.mention-bot b/.mention-bot index 6599c1a06b..1185adad03 100644 --- a/.mention-bot +++ b/.mention-bot @@ -1,3 +1,3 @@ { - "userBlacklist": ["AlexAltea"] -} \ No newline at end of file + "userBlacklist": ["AlexAltea", "tambry"] +} From 079411eee80f411449a275cda3bc2d6482e17a58 Mon Sep 17 00:00:00 2001 From: raven02 Date: Fri, 17 Jun 2016 14:32:07 +0800 Subject: [PATCH 2/7] Texture format W16_Z16_Y16_X16_FLOAT fix (#1777) --- rpcs3/Emu/RSX/D3D12/D3D12Texture.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/Emu/RSX/D3D12/D3D12Texture.cpp b/rpcs3/Emu/RSX/D3D12/D3D12Texture.cpp index d0fe693af8..bcff1c267d 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12Texture.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12Texture.cpp @@ -264,6 +264,7 @@ void D3D12GSRender::upload_textures(ID3D12GraphicsCommandList *command_list, siz case CELL_GCM_TEXTURE_DEPTH16: case CELL_GCM_TEXTURE_DEPTH16_FLOAT: case CELL_GCM_TEXTURE_X32_FLOAT: + case CELL_GCM_TEXTURE_W16_Z16_Y16_X16_FLOAT: case CELL_GCM_TEXTURE_W32_Z32_Y32_X32_FLOAT: case CELL_GCM_TEXTURE_R5G5B5A1: case CELL_GCM_TEXTURE_D1R5G5B5: @@ -333,7 +334,6 @@ void D3D12GSRender::upload_textures(ID3D12GraphicsCommandList *command_list, siz D3D12_SHADER_COMPONENT_MAPPING_FORCE_VALUE_0); break; - case CELL_GCM_TEXTURE_W16_Z16_Y16_X16_FLOAT: case CELL_GCM_TEXTURE_A8R8G8B8: case CELL_GCM_TEXTURE_D8R8G8B8: { From b52e885cde3af00ee6fc088de056ef3daf189b42 Mon Sep 17 00:00:00 2001 From: DHrpcs3 Date: Sat, 7 May 2016 21:38:52 +0300 Subject: [PATCH 3/7] Added rpcs3 version object Removed _PRGVER_ macros --- Utilities/version.cpp | 65 +++++++++++++++++++++++++++++++++++++ Utilities/version.h | 71 +++++++++++++++++++++++++++++++++++++++++ rpcs3/Gui/AboutDialog.h | 3 +- rpcs3/Gui/MainFrame.cpp | 6 ++-- rpcs3/emucore.vcxproj | 4 +++ rpcs3/rpcs3_version.cpp | 10 ++++++ rpcs3/rpcs3_version.h | 9 ++++++ rpcs3/stdafx.h | 1 - 8 files changed, 164 insertions(+), 5 deletions(-) create mode 100644 Utilities/version.cpp create mode 100644 Utilities/version.h create mode 100644 rpcs3/rpcs3_version.cpp create mode 100644 rpcs3/rpcs3_version.h diff --git a/Utilities/version.cpp b/Utilities/version.cpp new file mode 100644 index 0000000000..dcbd910b4b --- /dev/null +++ b/Utilities/version.cpp @@ -0,0 +1,65 @@ +#include "stdafx.h" +#include "version.h" + +namespace utils +{ + std::string to_string(version_type type) + { + switch (type) + { + case version_type::pre_alpha: return "Pre-Alpha"; + case version_type::alpha: return "Alpha"; + case version_type::beta: return "Beta"; + case version_type::release_candidate: return "RC"; + case version_type::release: return "Release"; + } + + throw; + } + + version::version(std::uint8_t hi, std::uint8_t mid, std::uint8_t lo) + : m_hi(hi) + , m_mid(mid) + , m_lo(lo) + { + } + + version& version::type(version_type type, std::uint8_t type_index) + { + m_type = type; + m_type_index = type_index; + return *this; + } + + std::uint16_t version::to_hex() const + { + return (m_hi << 24) | (m_mid << 16) | (m_lo << 8) | ((std::uint8_t(m_type) & 0xf) << 4) | (m_type_index & 0xf); + } + + std::string version::to_string() const + { + std::string version = std::to_string(hi()) + "." + std::to_string(mid()); + + if (lo()) + { + version += "." + std::to_string(lo()); + } + + if (type() != version_type::release) + { + if (!postfix().empty()) + { + version += "-" + postfix(); + } + + version += " " + utils::to_string(type()); + + if (type_index() > 1) + { + version += " " + std::to_string(type_index()); + } + } + + return version; + } +} diff --git a/Utilities/version.h b/Utilities/version.h new file mode 100644 index 0000000000..af75c1f764 --- /dev/null +++ b/Utilities/version.h @@ -0,0 +1,71 @@ +#pragma once +#include +#include + +namespace utils +{ + enum class version_type : std::uint8_t + { + pre_alpha, + alpha, + beta, + release_candidate, + release + }; + + std::string to_string(version_type type); + + class version + { + std::uint8_t m_hi; + std::uint8_t m_mid; + std::uint8_t m_lo; + version_type m_type = version_type::release; + std::uint8_t m_type_index = 1; + std::string m_postfix; + + public: + version(std::uint8_t hi, std::uint8_t mid, std::uint8_t lo = 0); + + version& type(version_type type, std::uint8_t type_index = 1); + + std::uint8_t hi() const + { + return m_hi; + } + + std::uint8_t mid() const + { + return m_mid; + } + + std::uint8_t lo() const + { + return m_lo; + } + + version_type type() const + { + return m_type; + } + + std::string postfix() const + { + return m_postfix; + } + + version& postfix(const std::string& value) + { + m_postfix = value; + return *this; + } + + std::uint8_t type_index() const + { + return m_type_index; + } + + std::uint16_t to_hex() const; + std::string to_string() const; + }; +} diff --git a/rpcs3/Gui/AboutDialog.h b/rpcs3/Gui/AboutDialog.h index b8471ed69a..1fdae020ad 100644 --- a/rpcs3/Gui/AboutDialog.h +++ b/rpcs3/Gui/AboutDialog.h @@ -1,4 +1,5 @@ #pragma once +#include "rpcs3_version.h" class AboutDialog : public wxDialog { @@ -30,7 +31,7 @@ public: t_descr->SetForegroundColour(wxColor(255, 255, 255)); t_descr->SetPosition(wxPoint(12, 50)); - wxStaticText* t_version = new wxStaticText(this, wxID_ANY, wxString::Format(_PRGNAME_ " Version: " _PRGVER_ "-" RPCS3_GIT_VERSION)); + wxStaticText* t_version = new wxStaticText(this, wxID_ANY, std::string(_PRGNAME_ " Version: ") + rpcs3::version.to_string()); t_version->SetBackgroundColour(wxColor(100, 100, 100)); t_version->SetForegroundColour(wxColor(200, 200, 200)); t_version->SetPosition(wxPoint(12, 66)); diff --git a/rpcs3/Gui/MainFrame.cpp b/rpcs3/Gui/MainFrame.cpp index 8233aaf435..b7b4f403f8 100644 --- a/rpcs3/Gui/MainFrame.cpp +++ b/rpcs3/Gui/MainFrame.cpp @@ -2,7 +2,7 @@ #include "stdafx_gui.h" #include "rpcs3.h" #include "MainFrame.h" -#include "git-version.h" +#include "rpcs3_version.h" #include "Emu/Memory/Memory.h" #include "Emu/System.h" @@ -69,7 +69,7 @@ MainFrame::MainFrame() , m_sys_menu_opened(false) { - SetLabel(_PRGNAME_ " v" _PRGVER_ "-" RPCS3_GIT_VERSION); + SetLabel(std::string(_PRGNAME_ " v") + rpcs3::version.to_string()); wxMenuBar* menubar = new wxMenuBar(); @@ -158,7 +158,7 @@ MainFrame::MainFrame() wxGetApp().Bind(wxEVT_KEY_DOWN, &MainFrame::OnKeyDown, this); wxGetApp().Bind(wxEVT_DBG_COMMAND, &MainFrame::UpdateUI, this); - LOG_NOTICE(GENERAL, "%s", _PRGNAME_ " v" _PRGVER_ "-" RPCS3_GIT_VERSION); + LOG_NOTICE(GENERAL, "%s", (std::string(_PRGNAME_ " v") + rpcs3::version.to_string()).c_str()); LOG_NOTICE(GENERAL, ""); } diff --git a/rpcs3/emucore.vcxproj b/rpcs3/emucore.vcxproj index f2ee70cae5..886db41ffd 100644 --- a/rpcs3/emucore.vcxproj +++ b/rpcs3/emucore.vcxproj @@ -84,6 +84,7 @@ NotUsing + @@ -348,6 +349,7 @@ + Create @@ -379,6 +381,7 @@ + @@ -609,6 +612,7 @@ + diff --git a/rpcs3/rpcs3_version.cpp b/rpcs3/rpcs3_version.cpp new file mode 100644 index 0000000000..2874f882ad --- /dev/null +++ b/rpcs3/rpcs3_version.cpp @@ -0,0 +1,10 @@ +#include "stdafx.h" +#include "rpcs3_version.h" +#include "git-version.h" + +namespace rpcs3 +{ + const utils::version version = utils::version{ 0, 0, 1 } + .type(utils::version_type::pre_alpha) + .postfix(RPCS3_GIT_VERSION); +} diff --git a/rpcs3/rpcs3_version.h b/rpcs3/rpcs3_version.h new file mode 100644 index 0000000000..671fed850e --- /dev/null +++ b/rpcs3/rpcs3_version.h @@ -0,0 +1,9 @@ +#pragma once +#include +#include +#include + +namespace rpcs3 +{ + extern const utils::version version; +} diff --git a/rpcs3/stdafx.h b/rpcs3/stdafx.h index d29af71143..95857b0a30 100644 --- a/rpcs3/stdafx.h +++ b/rpcs3/stdafx.h @@ -42,7 +42,6 @@ using namespace std::literals; #define EXCEPTION(format_str, ...) fmt::exception("%s(): " format_str HERE, __FUNCTION__, ##__VA_ARGS__) #define _PRGNAME_ "RPCS3" -#define _PRGVER_ "0.0.0.9" #include "Utilities/types.h" #include "Utilities/Macro.h" From 795170635f53a11fb559ccbbdf12a31616a06d36 Mon Sep 17 00:00:00 2001 From: DHrpcs3 Date: Sun, 8 May 2016 10:38:40 +0300 Subject: [PATCH 4/7] Added dynamic_library utility --- Utilities/dynamic_library.cpp | 60 +++++++++++++++++++++++++++++++++++ Utilities/dynamic_library.h | 41 ++++++++++++++++++++++++ rpcs3/CMakeLists.txt | 2 +- rpcs3/emucore.vcxproj | 2 ++ rpcs3/emucore.vcxproj.filters | 6 ++++ 5 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 Utilities/dynamic_library.cpp create mode 100644 Utilities/dynamic_library.h diff --git a/Utilities/dynamic_library.cpp b/Utilities/dynamic_library.cpp new file mode 100644 index 0000000000..572edc42ea --- /dev/null +++ b/Utilities/dynamic_library.cpp @@ -0,0 +1,60 @@ +#include "stdafx.h" +#include "dynamic_library.h" + +#ifdef _WIN32 + #include +#else + #include +#endif + +namespace utils +{ + dynamic_library::dynamic_library(const std::string &path) + { + load(path); + } + + dynamic_library::~dynamic_library() + { + close(); + } + + bool dynamic_library::load(const std::string &path) + { +#ifdef _WIN32 + m_handle = LoadLibraryA(path.c_str()); +#else + m_handle = dlopen(path.c_str(), RTLD_LAZY); +#endif + return loaded(); + } + + void dynamic_library::close() + { +#ifdef _WIN32 + FreeLibrary((HMODULE)m_handle); +#else + dlclose(m_handle); +#endif + m_handle = nullptr; + } + + void *dynamic_library::get_impl(const std::string &name) const + { +#ifdef _WIN32 + return GetProcAddress((HMODULE)m_handle, name.c_str()); +#else + return dlsym(m_handle, (char *)name.c_str()); +#endif + } + + bool dynamic_library::loaded() const + { + return !m_handle; + } + + dynamic_library::operator bool() const + { + return loaded(); + } +} diff --git a/Utilities/dynamic_library.h b/Utilities/dynamic_library.h new file mode 100644 index 0000000000..d5578d08e0 --- /dev/null +++ b/Utilities/dynamic_library.h @@ -0,0 +1,41 @@ +#include + +namespace utils +{ + class dynamic_library + { + void *m_handle = nullptr; + + public: + dynamic_library() = default; + dynamic_library(const std::string &path); + + ~dynamic_library(); + + bool load(const std::string &path); + void close(); + + private: + void *get_impl(const std::string &name) const; + + public: + template + Type *get(const std::string &name) const + { + Type *result; + *(void **)(&result) = get_impl(name); + return result; + } + + template + bool get(Type *&function, const std::string &name) const + { + *(void **)(&function) = get_impl(name); + + return !!function; + } + + bool loaded() const; + explicit operator bool() const; + }; +} diff --git a/rpcs3/CMakeLists.txt b/rpcs3/CMakeLists.txt index d4416d6c75..4b4cd91f49 100644 --- a/rpcs3/CMakeLists.txt +++ b/rpcs3/CMakeLists.txt @@ -198,7 +198,7 @@ if(WIN32) target_link_libraries(rpcs3 avformat.lib avcodec.lib avutil.lib swresample.lib swscale.lib png16_static ${wxWidgets_LIBRARIES} ${OPENAL_LIBRARY} ${ADDITIONAL_LIBS}) else() target_link_libraries(rpcs3 ${wxWidgets_LIBRARIES} ${OPENAL_LIBRARY} ${GLEW_LIBRARY} ${OPENGL_LIBRARIES}) - target_link_libraries(rpcs3 libavformat.a libavcodec.a libavutil.a libswresample.a libswscale.a png16_static ${ZLIB_LIBRARIES} ${ADDITIONAL_LIBS}) + target_link_libraries(rpcs3 libavformat.a libavcodec.a libavutil.a libswresample.a libswscale.a -ldl png16_static ${ZLIB_LIBRARIES} ${ADDITIONAL_LIBS}) if (NOT APPLE) target_link_libraries(rpcs3 vulkan glslang OSDependent OGLCompiler SPIRV) endif() diff --git a/rpcs3/emucore.vcxproj b/rpcs3/emucore.vcxproj index 886db41ffd..7ebe0f69b7 100644 --- a/rpcs3/emucore.vcxproj +++ b/rpcs3/emucore.vcxproj @@ -66,6 +66,7 @@ + NotUsing @@ -363,6 +364,7 @@ + diff --git a/rpcs3/emucore.vcxproj.filters b/rpcs3/emucore.vcxproj.filters index ca8e48a36b..5b334d4510 100644 --- a/rpcs3/emucore.vcxproj.filters +++ b/rpcs3/emucore.vcxproj.filters @@ -854,6 +854,9 @@ Emu\PSP2\Modules + + Utilities + @@ -1624,5 +1627,8 @@ Utilities + + Utilities + \ No newline at end of file From bc63eaea48ca5e1f8ba3d01106018a0288da77b2 Mon Sep 17 00:00:00 2001 From: DHrpcs3 Date: Sun, 8 May 2016 16:19:24 +0300 Subject: [PATCH 5/7] Added rpcs3 api (dynamic library) --- ps3emu_api/ps3emu_api.cpp | 65 ++++++++++ ps3emu_api/ps3emu_api.h | 35 ++++++ rpcs3/emucore.vcxproj | 31 +++++ rpcs3/emucore.vcxproj.filters | 15 +++ rpcs3/ps3emu_api_enums.h | 51 ++++++++ rpcs3/ps3emu_api_structs.h | 23 ++++ rpcs3/rpcs3.vcxproj | 6 +- rpcs3/rpcs3_api.cpp | 219 ++++++++++++++++++++++++++++++++++ 8 files changed, 443 insertions(+), 2 deletions(-) create mode 100644 ps3emu_api/ps3emu_api.cpp create mode 100644 ps3emu_api/ps3emu_api.h create mode 100644 rpcs3/ps3emu_api_enums.h create mode 100644 rpcs3/ps3emu_api_structs.h create mode 100644 rpcs3/rpcs3_api.cpp diff --git a/ps3emu_api/ps3emu_api.cpp b/ps3emu_api/ps3emu_api.cpp new file mode 100644 index 0000000000..62cb1a510d --- /dev/null +++ b/ps3emu_api/ps3emu_api.cpp @@ -0,0 +1,65 @@ +#include "ps3emu_api.h" + +ps3emu_api::ps3emu_api(const std::string &path) +{ + load(path); +} + +bool ps3emu_api::load(const std::string &path) +{ + if (!m_library.load(path)) + { + return false; + } + + bool is_no_errors = true; + + if (!m_library.get(get_api_version, "ps3emu_api_get_api_version") || get_api_version() != ps3emu_api_version) + { + is_no_errors = false; + } + + is_no_errors = is_no_errors && m_library.get(initialize, "ps3emu_api_initialize"); + is_no_errors = is_no_errors && m_library.get(destroy, "ps3emu_api_destroy"); + + is_no_errors = is_no_errors && m_library.get(get_version_string, "ps3emu_api_get_version_string"); + is_no_errors = is_no_errors && m_library.get(get_version_number, "ps3emu_api_get_version_number"); + is_no_errors = is_no_errors && m_library.get(get_name_string, "ps3emu_api_get_name_string"); + + is_no_errors = is_no_errors && m_library.get(load_elf, "ps3emu_api_load_elf"); + + is_no_errors = is_no_errors && m_library.get(set_state, "ps3emu_api_set_state"); + is_no_errors = is_no_errors && m_library.get(get_state, "ps3emu_api_get_state"); + + if (!is_no_errors) + { + close(); + return false; + } + + return true; +} + +bool ps3emu_api::loaded() const +{ + return m_library.loaded(); +} + +void ps3emu_api::close() +{ + initialize = nullptr; + destroy = nullptr; + get_version_string = nullptr; + get_version_number = nullptr; + get_name_string = nullptr; + load_elf = nullptr; + set_state = nullptr; + get_state = nullptr; + + m_library.close(); +} + +ps3emu_api::operator bool() const +{ + return loaded(); +} diff --git a/ps3emu_api/ps3emu_api.h b/ps3emu_api/ps3emu_api.h new file mode 100644 index 0000000000..6469086d28 --- /dev/null +++ b/ps3emu_api/ps3emu_api.h @@ -0,0 +1,35 @@ +#pragma once + +#include +#include +#include "ps3emu_api_enums.h" +#include "ps3emu_api_structs.h" + +class ps3emu_api +{ + utils::dynamic_library m_library; + +public: + ps3emu_api() = default; + ps3emu_api(const std::string &path); + + unsigned int(*get_api_version)() = nullptr; + ps3emu_api_error_code(*initialize)(const ps3emu_api_initialize_callbacks *callbacks) = nullptr; + ps3emu_api_error_code(*destroy)() = nullptr; + + ps3emu_api_error_code(*get_version_string)(char *dest_buffer, int dest_buffer_size) = nullptr; + ps3emu_api_error_code(*get_version_number)(int *version_number) = nullptr; + ps3emu_api_error_code(*get_name_string)(char *dest_buffer, int dest_buffer_size) = nullptr; + + ps3emu_api_error_code(*load_elf)(const char *path) = nullptr; + + ps3emu_api_error_code(*set_state)(ps3emu_api_state state) = nullptr; + ps3emu_api_error_code(*get_state)(ps3emu_api_state *state) = nullptr; + + bool load(const std::string &path); + bool loaded() const; + void close(); + + explicit operator bool() const; +}; + diff --git a/rpcs3/emucore.vcxproj b/rpcs3/emucore.vcxproj index 7ebe0f69b7..5486f84215 100644 --- a/rpcs3/emucore.vcxproj +++ b/rpcs3/emucore.vcxproj @@ -63,8 +63,35 @@ Use ..\llvm\include;..\llvm_build\include; + + %windir%\sysnative\cmd.exe /c "$(SolutionDir)\Utilities\git-version-gen.cmd" + Updating git-version.h + + + %windir%\sysnative\cmd.exe /c "$(SolutionDir)\Utilities\git-version-gen.cmd" + Updating git-version.h + + + %windir%\sysnative\cmd.exe /c "$(SolutionDir)\Utilities\git-version-gen.cmd" + Updating git-version.h + + + %windir%\sysnative\cmd.exe /c "$(SolutionDir)\Utilities\git-version-gen.cmd" + Updating git-version.h + + + %windir%\sysnative\cmd.exe /c "$(SolutionDir)\Utilities\git-version-gen.cmd" + Updating git-version.h + + + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + @@ -350,6 +377,7 @@ + @@ -358,6 +386,7 @@ + @@ -613,6 +642,8 @@ + + diff --git a/rpcs3/emucore.vcxproj.filters b/rpcs3/emucore.vcxproj.filters index 5b334d4510..6b845772c8 100644 --- a/rpcs3/emucore.vcxproj.filters +++ b/rpcs3/emucore.vcxproj.filters @@ -857,6 +857,12 @@ Utilities + + Source Files + + + Source Files + @@ -1630,5 +1636,14 @@ Utilities + + Header Files + + + Header Files + + + Header Files + \ No newline at end of file diff --git a/rpcs3/ps3emu_api_enums.h b/rpcs3/ps3emu_api_enums.h new file mode 100644 index 0000000000..92a6371873 --- /dev/null +++ b/rpcs3/ps3emu_api_enums.h @@ -0,0 +1,51 @@ +#pragma once + +#ifndef _PS3EMU_API_ENUMS +#define _PS3EMU_API_ENUMS + +#ifdef __cplusplus +extern"C" +{ +#endif /* __cplusplus */ + + typedef enum + { + ps3emu_api_ok, + ps3emu_api_bad_argument, + ps3emu_api_not_found, + ps3emu_api_internal_error, + ps3emu_api_not_initialized, + ps3emu_api_already_initialized + } ps3emu_api_error_code; + + enum + { + ps3emu_api_version = 1, + ps3emu_api_max_name_length = 16, + ps3emu_api_max_version_length = 64 + }; + + typedef enum + { + ps3emu_api_state_idle, + ps3emu_api_state_stoping, + ps3emu_api_state_stopped, + ps3emu_api_state_pausing, + ps3emu_api_state_paused, + ps3emu_api_state_starting, + ps3emu_api_state_started + } ps3emu_api_state; + + typedef enum + { + ps3emu_api_window_null, + ps3emu_api_window_opengl, + ps3emu_api_window_vulkan + /* ps3emu_api_window_direct3d */ + } ps3emu_api_window_type; + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _PS3EMU_API_ENUMS */ diff --git a/rpcs3/ps3emu_api_structs.h b/rpcs3/ps3emu_api_structs.h new file mode 100644 index 0000000000..cc8337f21e --- /dev/null +++ b/rpcs3/ps3emu_api_structs.h @@ -0,0 +1,23 @@ +#ifndef _PS3EMU_API_STRUCTS +#define _PS3EMU_API_STRUCTS + +#include "ps3emu_api_enums.h" + +#ifdef __cplusplus +extern"C" +{ +#endif /* __cplusplus */ + typedef struct ps3emu_api_window_handle_s * ps3emu_api_window; + + typedef struct + { + ps3emu_api_error_code(*create_window)(ps3emu_api_window *window, ps3emu_api_window_type type, unsigned int version); + ps3emu_api_error_code(*destroy_window)(ps3emu_api_window window); + ps3emu_api_error_code(*flip)(ps3emu_api_window window); + } ps3emu_api_initialize_callbacks; + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _PS3EMU_API_STRUCTS */ diff --git a/rpcs3/rpcs3.vcxproj b/rpcs3/rpcs3.vcxproj index 9e81a8b0a0..82b7632775 100644 --- a/rpcs3/rpcs3.vcxproj +++ b/rpcs3/rpcs3.vcxproj @@ -84,8 +84,10 @@ - %windir%\sysnative\cmd.exe /c "$(SolutionDir)\Utilities\git-version-gen.cmd" - Updating git-version.h + + + + ..\wxWidgets\include\msvc;..\wxWidgets\include;..\3rdparty\XAudio2_7;..\Vulkan\Vulkan-LoaderAndValidationLayers\include;..\Vulkan\glslang\glslang\Public;%(AdditionalIncludeDirectories) diff --git a/rpcs3/rpcs3_api.cpp b/rpcs3/rpcs3_api.cpp new file mode 100644 index 0000000000..499431b83b --- /dev/null +++ b/rpcs3/rpcs3_api.cpp @@ -0,0 +1,219 @@ +#include "stdafx.h" +#include "ps3emu_api_enums.h" +#include "ps3emu_api_structs.h" +#include "rpcs3_version.h" +#include "Emu/System.h" + +#ifdef _MSC_VER + #define UTILS_DLL_C_EXPORT extern "C" __declspec(dllexport) +#else + #define UTILS_DLL_C_EXPORT extern "C" __attribute__((visibility("default"))) +#endif + +static bool g_is_initialized = false; + +UTILS_DLL_C_EXPORT unsigned int ps3emu_api_get_api_version() +{ + return ps3emu_api_version; +} + +UTILS_DLL_C_EXPORT ps3emu_api_error_code ps3emu_api_initialize(const ps3emu_api_initialize_callbacks *callbacks) +{ + if (g_is_initialized) + { + return ps3emu_api_already_initialized; + } + + if (!callbacks) + { + return ps3emu_api_bad_argument; + } + + g_is_initialized = true; + + //TODO + return ps3emu_api_ok; +} + +UTILS_DLL_C_EXPORT ps3emu_api_error_code ps3emu_api_destroy() +{ + if (!g_is_initialized) + { + return ps3emu_api_not_initialized; + } + + g_is_initialized = false; + + //TODO + return ps3emu_api_ok; +} + +UTILS_DLL_C_EXPORT ps3emu_api_error_code ps3emu_api_get_version_string(char *dest_buffer, int dest_buffer_size) +{ + if (!g_is_initialized) + { + return ps3emu_api_not_initialized; + } + + if (!dest_buffer || dest_buffer_size <= 0) + { + return ps3emu_api_bad_argument; + } + + if (dest_buffer_size > ps3emu_api_max_version_length) + { + dest_buffer_size = ps3emu_api_max_version_length; + } + + const std::string version_string = rpcs3::version.to_string(); + + if (dest_buffer_size > version_string.length()) + { + dest_buffer_size = version_string.length(); + } + + std::memcpy(dest_buffer, version_string.c_str(), dest_buffer_size - 1); + dest_buffer[dest_buffer_size - 1] = '\0'; + return ps3emu_api_ok; +} + +UTILS_DLL_C_EXPORT ps3emu_api_error_code ps3emu_api_get_version_number(int *version_number) +{ + if (!g_is_initialized) + { + return ps3emu_api_not_initialized; + } + + if (!version_number) + { + return ps3emu_api_bad_argument; + } + + *version_number = rpcs3::version.to_hex(); + return ps3emu_api_ok; +} + +UTILS_DLL_C_EXPORT ps3emu_api_error_code ps3emu_api_get_name_string(char *dest_buffer, int dest_buffer_size) +{ + if (!g_is_initialized) + { + return ps3emu_api_not_initialized; + } + + if (!dest_buffer || dest_buffer_size <= 0) + { + return ps3emu_api_bad_argument; + } + + if (dest_buffer_size > ps3emu_api_max_name_length) + { + dest_buffer_size = ps3emu_api_max_name_length; + } + + const std::string name_string = "RPCS3"; + + if (dest_buffer_size > name_string.length()) + { + dest_buffer_size = name_string.length(); + } + + std::memcpy(dest_buffer, name_string.c_str(), dest_buffer_size - 1); + dest_buffer[dest_buffer_size - 1] = '\0'; + + return ps3emu_api_ok; +} + +UTILS_DLL_C_EXPORT ps3emu_api_error_code ps3emu_api_load_elf(const char *path) +{ + if (!g_is_initialized) + { + return ps3emu_api_not_initialized; + } + + if (!path) + { + return ps3emu_api_bad_argument; + } + + if (!fs::is_file(path)) + { + return ps3emu_api_not_found; + } + + Emu.SetPath(path); + Emu.Load(); + + return ps3emu_api_ok; +} + +UTILS_DLL_C_EXPORT ps3emu_api_error_code ps3emu_api_set_state(ps3emu_api_state state) +{ + if (!g_is_initialized) + { + return ps3emu_api_not_initialized; + } + + //TODO state machine + switch (state) + { + case ps3emu_api_state_stoping: + Emu.Stop(); + break; + + case ps3emu_api_state_pausing: + Emu.Pause(); + break; + + case ps3emu_api_state_starting: + if (Emu.IsPaused()) + { + Emu.Resume(); + } + else + { + Emu.Run(); + } + break; + + default: + return ps3emu_api_bad_argument; + } + + return ps3emu_api_ok; +} + +UTILS_DLL_C_EXPORT ps3emu_api_error_code ps3emu_api_get_state(ps3emu_api_state *state) +{ + if (!g_is_initialized) + { + return ps3emu_api_not_initialized; + } + + if (!state) + { + return ps3emu_api_bad_argument; + } + + if (Emu.IsRunning()) + { + *state = ps3emu_api_state_started; + } + else if (Emu.IsPaused()) + { + *state = ps3emu_api_state_paused; + } + else if (Emu.IsStopped()) + { + *state = ps3emu_api_state_stopped; + } + else if (Emu.IsReady()) + { + *state = ps3emu_api_state_idle; + } + else + { + return ps3emu_api_internal_error; + } + + return ps3emu_api_ok; +} From 1e39c691dc47c60e5a526e74da600c0bf46671d0 Mon Sep 17 00:00:00 2001 From: DHrpcs3 Date: Fri, 17 Jun 2016 23:18:10 +0300 Subject: [PATCH 6/7] Updated rsx_program_decompiler submodule --- rsx_program_decompiler | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rsx_program_decompiler b/rsx_program_decompiler index 139d8092b9..b4d0986764 160000 --- a/rsx_program_decompiler +++ b/rsx_program_decompiler @@ -1 +1 @@ -Subproject commit 139d8092b9daaa823f6398d4a273fdc0a1d20c09 +Subproject commit b4d09867643df26e503ec09119c8048832676780 From 833c100850fc61493de8ed761f06632281af2bea Mon Sep 17 00:00:00 2001 From: kd-11 Date: Thu, 16 Jun 2016 18:51:56 +0300 Subject: [PATCH 7/7] vk: Properly enable window resizing --- rpcs3/Emu/RSX/VK/VKGSRender.cpp | 178 ++++++++++++++++++++++---------- rpcs3/Emu/RSX/VK/VKGSRender.h | 3 + 2 files changed, 125 insertions(+), 56 deletions(-) diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.cpp b/rpcs3/Emu/RSX/VK/VKGSRender.cpp index c195c9acd1..2463d5bed8 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.cpp +++ b/rpcs3/Emu/RSX/VK/VKGSRender.cpp @@ -430,7 +430,9 @@ VKGSRender::VKGSRender() : GSRender(frame_type::Vulkan) vk::set_current_thread_ctx(m_thread_context); vk::set_current_renderer(m_swap_chain->get_device()); - m_swap_chain->init_swapchain(m_frame->client_width(), m_frame->client_height()); + m_client_width = m_frame->client_width(); + m_client_height = m_frame->client_height(); + m_swap_chain->init_swapchain(m_client_width, m_client_height); //create command buffer... m_command_buffer_pool.create((*m_device)); @@ -1135,13 +1137,9 @@ void VKGSRender::prepare_rtts() return; m_rtts_dirty = false; - bool reconfigure_render_pass = true; if (m_surface.format != surface_format) - { m_surface.unpack(surface_format); - reconfigure_render_pass = true; - } u32 clip_horizontal = rsx::method_registers[NV4097_SET_SURFACE_CLIP_HORIZONTAL]; u32 clip_vertical = rsx::method_registers[NV4097_SET_SURFACE_CLIP_VERTICAL]; @@ -1202,18 +1200,27 @@ void VKGSRender::prepare_rtts() void VKGSRender::flip(int buffer) { - //LOG_NOTICE(Log::RSX, "flip(%d)", buffer); - u32 buffer_width = gcm_buffers[buffer].width; - u32 buffer_height = gcm_buffers[buffer].height; - u32 buffer_pitch = gcm_buffers[buffer].pitch; + bool resize_screen = false; - rsx::tiled_region buffer_region = get_tiled_address(gcm_buffers[buffer].offset, CELL_GCM_LOCATION_LOCAL); + if (m_client_height != m_frame->client_height() || + m_client_width != m_frame->client_width()) + { + if (!!m_frame->client_height() && !!m_frame->client_width()) + resize_screen = true; + } - areai screen_area = coordi({}, { (int)buffer_width, (int)buffer_height }); - - coordi aspect_ratio; - if (1) //enable aspect ratio + if (!resize_screen) { + u32 buffer_width = gcm_buffers[buffer].width; + u32 buffer_height = gcm_buffers[buffer].height; + u32 buffer_pitch = gcm_buffers[buffer].pitch; + + rsx::tiled_region buffer_region = get_tiled_address(gcm_buffers[buffer].offset, CELL_GCM_LOCATION_LOCAL); + + areai screen_area = coordi({}, { (int)buffer_width, (int)buffer_height }); + + coordi aspect_ratio; + sizei csize = { m_frame->client_width(), m_frame->client_height() }; sizei new_size = csize; @@ -1233,53 +1240,112 @@ void VKGSRender::flip(int buffer) } aspect_ratio.size = new_size; + + VkSwapchainKHR swap_chain = (VkSwapchainKHR)(*m_swap_chain); + + //Prepare surface for new frame + CHECK_RESULT(vkAcquireNextImageKHR((*m_device), (*m_swap_chain), 0, m_present_semaphore, VK_NULL_HANDLE, &m_current_present_image)); + + //Blit contents to screen.. + VkImage image_to_flip = nullptr; + + if (std::get<1>(m_rtts.m_bound_render_targets[0]) != nullptr) + image_to_flip = std::get<1>(m_rtts.m_bound_render_targets[0])->value; + else if (std::get<1>(m_rtts.m_bound_render_targets[1]) != nullptr) + image_to_flip = std::get<1>(m_rtts.m_bound_render_targets[1])->value; + + VkImage target_image = m_swap_chain->get_swap_chain_image(m_current_present_image); + if (image_to_flip) + { + vk::copy_scaled_image(m_command_buffer, image_to_flip, target_image, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, + buffer_width, buffer_height, aspect_ratio.width, aspect_ratio.height, 1, VK_IMAGE_ASPECT_COLOR_BIT); + } + else + { + //No draw call was issued! + VkImageSubresourceRange range = vk::get_image_subresource_range(0, 0, 1, 1, VK_IMAGE_ASPECT_COLOR_BIT); + VkClearColorValue clear_black = { 0 }; + vk::change_image_layout(m_command_buffer, m_swap_chain->get_swap_chain_image(m_current_present_image), VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, VK_IMAGE_LAYOUT_GENERAL, range); + vkCmdClearColorImage(m_command_buffer, m_swap_chain->get_swap_chain_image(m_current_present_image), VK_IMAGE_LAYOUT_GENERAL, &clear_black, 1, &range); + vk::change_image_layout(m_command_buffer, m_swap_chain->get_swap_chain_image(m_current_present_image), VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, range); + } + + close_and_submit_command_buffer({ m_present_semaphore }, m_submit_fence); + CHECK_RESULT(vkWaitForFences((*m_device), 1, &m_submit_fence, VK_TRUE, ~0ULL)); + + VkPresentInfoKHR present = {}; + present.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR; + present.pNext = nullptr; + present.swapchainCount = 1; + present.pSwapchains = &swap_chain; + present.pImageIndices = &m_current_present_image; + CHECK_RESULT(m_swap_chain->queuePresentKHR(m_swap_chain->get_present_queue(), &present)); } else { - aspect_ratio.size = { m_frame->client_width(), m_frame->client_height() }; + /** + * Since we are about to destroy the old swapchain and its images, we just discard the commandbuffer. + * Waiting for the commands to process does not work reliably as the fence can be signaled before swap images are released + * and there are no explicit methods to ensure that the presentation engine is not using the images at all. + */ + + CHECK_RESULT(vkEndCommandBuffer(m_command_buffer)); + + //Will have to block until rendering is completed + VkFence resize_fence = VK_NULL_HANDLE; + VkFenceCreateInfo infos = {}; + infos.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; + + vkQueueWaitIdle(m_swap_chain->get_present_queue()); + vkDeviceWaitIdle(*m_device); + + vkCreateFence((*m_device), &infos, nullptr, &resize_fence); + + //Wait for all grpahics tasks to complete + VkPipelineStageFlags pipe_stage_flags = VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT; + VkSubmitInfo submit_infos = {}; + submit_infos.commandBufferCount = 0; + submit_infos.pCommandBuffers = nullptr; + submit_infos.pWaitDstStageMask = &pipe_stage_flags; + submit_infos.pWaitSemaphores = nullptr; + submit_infos.waitSemaphoreCount = 0; + submit_infos.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; + CHECK_RESULT(vkQueueSubmit(m_swap_chain->get_present_queue(), 1, &submit_infos, resize_fence)); + + vkWaitForFences((*m_device), 1, &resize_fence, VK_TRUE, UINT64_MAX); + vkResetFences((*m_device), 1, &resize_fence); + + vkDeviceWaitIdle(*m_device); + + //Rebuild swapchain. Old swapchain destruction is handled by the init_swapchain call + m_client_width = m_frame->client_width(); + m_client_height = m_frame->client_height(); + m_swap_chain->init_swapchain(m_client_width, m_client_height); + + //Prepare new swapchain images for use + CHECK_RESULT(vkResetCommandPool(*m_device, m_command_buffer_pool, 0)); + open_command_buffer(); + + for (u32 i = 0; i < m_swap_chain->get_swap_image_count(); ++i) + { + vk::change_image_layout(m_command_buffer, m_swap_chain->get_swap_chain_image(i), + VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL, + vk::get_image_subresource_range(0, 0, 1, 1, VK_IMAGE_ASPECT_COLOR_BIT)); + + VkClearColorValue clear_color{}; + auto range = vk::get_image_subresource_range(0, 0, 1, 1, VK_IMAGE_ASPECT_COLOR_BIT); + vkCmdClearColorImage(m_command_buffer, m_swap_chain->get_swap_chain_image(i), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range); + vk::change_image_layout(m_command_buffer, m_swap_chain->get_swap_chain_image(i), + VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, + vk::get_image_subresource_range(0, 0, 1, 1, VK_IMAGE_ASPECT_COLOR_BIT)); + } + + //Flush the command buffer + close_and_submit_command_buffer({}, resize_fence); + CHECK_RESULT(vkWaitForFences((*m_device), 1, &resize_fence, VK_TRUE, UINT64_MAX)); + vkDestroyFence((*m_device), resize_fence, nullptr); } - VkSwapchainKHR swap_chain = (VkSwapchainKHR)(*m_swap_chain); - - //Prepare surface for new frame - CHECK_RESULT(vkAcquireNextImageKHR((*m_device), (*m_swap_chain), 0, m_present_semaphore, VK_NULL_HANDLE, &m_current_present_image)); - - - //Blit contents to screen.. - VkImage image_to_flip = nullptr; - - if (std::get<1>(m_rtts.m_bound_render_targets[0]) != nullptr) - image_to_flip = std::get<1>(m_rtts.m_bound_render_targets[0])->value; - else if (std::get<1>(m_rtts.m_bound_render_targets[1]) != nullptr) - image_to_flip = std::get<1>(m_rtts.m_bound_render_targets[1])->value; - - VkImage target_image = m_swap_chain->get_swap_chain_image(m_current_present_image); - if (image_to_flip) - { - vk::copy_scaled_image(m_command_buffer, image_to_flip, target_image, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, - buffer_width, buffer_height, aspect_ratio.width, aspect_ratio.height, 1, VK_IMAGE_ASPECT_COLOR_BIT); - } - else - { - //No draw call was issued! - VkImageSubresourceRange range = vk::get_image_subresource_range(0, 0, 1, 1, VK_IMAGE_ASPECT_COLOR_BIT); - VkClearColorValue clear_black = { 0 }; - vk::change_image_layout(m_command_buffer, m_swap_chain->get_swap_chain_image(m_current_present_image), VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, VK_IMAGE_LAYOUT_GENERAL, range); - vkCmdClearColorImage(m_command_buffer, m_swap_chain->get_swap_chain_image(m_current_present_image), VK_IMAGE_LAYOUT_GENERAL, &clear_black, 1, &range); - vk::change_image_layout(m_command_buffer, m_swap_chain->get_swap_chain_image(m_current_present_image), VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, range); - } - - close_and_submit_command_buffer({ m_present_semaphore }, m_submit_fence); - CHECK_RESULT(vkWaitForFences((*m_device), 1, &m_submit_fence, VK_TRUE, ~0ULL)); - - VkPresentInfoKHR present = {}; - present.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR; - present.pNext = nullptr; - present.swapchainCount = 1; - present.pSwapchains = &swap_chain; - present.pImageIndices = &m_current_present_image; - CHECK_RESULT(m_swap_chain->queuePresentKHR(m_swap_chain->get_present_queue(), &present)); - m_uniform_buffer_ring_info.m_get_pos = m_uniform_buffer_ring_info.get_current_put_pos_minus_one(); m_index_buffer_ring_info.m_get_pos = m_index_buffer_ring_info.get_current_put_pos_minus_one(); m_attrib_ring_info.m_get_pos = m_attrib_ring_info.get_current_put_pos_minus_one(); diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.h b/rpcs3/Emu/RSX/VK/VKGSRender.h index 3788265446..4b7e1b12c8 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.h +++ b/rpcs3/Emu/RSX/VK/VKGSRender.h @@ -69,6 +69,9 @@ private: std::vector > m_framebuffer_to_clean; std::vector > m_sampler_to_clean; + u32 m_client_width = 0; + u32 m_client_height = 0; + u32 m_draw_calls = 0; u32 m_used_descriptors = 0; u8 m_draw_buffers_count = 0;