mirror of
https://github.com/PCSX2/pcsx2.git
synced 2025-12-16 04:08:48 +00:00
GSRunner: Support GNU/Linux
This commit is contained in:
parent
b7e17646a3
commit
edf686752a
@ -62,9 +62,6 @@ endif()
|
|||||||
|
|
||||||
# gsrunner
|
# gsrunner
|
||||||
if(ENABLE_GSRUNNER)
|
if(ENABLE_GSRUNNER)
|
||||||
if (NOT WIN32 AND NOT APPLE)
|
|
||||||
message(WARNING "GSRunner is only supported on Windows and macOS and may not build on your system")
|
|
||||||
endif()
|
|
||||||
add_subdirectory(pcsx2-gsrunner)
|
add_subdirectory(pcsx2-gsrunner)
|
||||||
else()
|
else()
|
||||||
add_subdirectory(pcsx2-gsrunner EXCLUDE_FROM_ALL)
|
add_subdirectory(pcsx2-gsrunner EXCLUDE_FROM_ALL)
|
||||||
|
|||||||
@ -47,6 +47,15 @@
|
|||||||
|
|
||||||
#include "svnrev.h"
|
#include "svnrev.h"
|
||||||
|
|
||||||
|
// Down here because X11 has a lot of defines that can conflict
|
||||||
|
#if defined(__linux__)
|
||||||
|
#include <SDL2/SDL.h>
|
||||||
|
#include <X11/Xlib.h>
|
||||||
|
#include <X11/Xutil.h>
|
||||||
|
#include <sys/select.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace GSRunner
|
namespace GSRunner
|
||||||
{
|
{
|
||||||
static void InitializeConsole();
|
static void InitializeConsole();
|
||||||
@ -1086,4 +1095,118 @@ void GSRunner::StopPlatformMessagePump()
|
|||||||
CocoaTools::StopMainThreadEventLoop();
|
CocoaTools::StopMainThreadEventLoop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#elif defined(__linux__)
|
||||||
|
static Display* s_display = nullptr;
|
||||||
|
static Window s_window = None;
|
||||||
|
static WindowInfo s_wi;
|
||||||
|
static std::atomic<bool> s_shutdown_requested{false};
|
||||||
|
|
||||||
|
bool GSRunner::CreatePlatformWindow()
|
||||||
|
{
|
||||||
|
pxAssertRel(!s_display && s_window == None, "Tried to create window when there already was one!");
|
||||||
|
|
||||||
|
s_display = XOpenDisplay(nullptr);
|
||||||
|
if (!s_display)
|
||||||
|
{
|
||||||
|
Console.Error("Failed to open X11 display");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
int screen = DefaultScreen(s_display);
|
||||||
|
Window root = RootWindow(s_display, screen);
|
||||||
|
|
||||||
|
s_window = XCreateSimpleWindow(s_display, root, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, 1,
|
||||||
|
BlackPixel(s_display, screen), WhitePixel(s_display, screen));
|
||||||
|
|
||||||
|
if (s_window == None)
|
||||||
|
{
|
||||||
|
Console.Error("Failed to create X11 window");
|
||||||
|
XCloseDisplay(s_display);
|
||||||
|
s_display = nullptr;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
XStoreName(s_display, s_window, "PCSX2 GS Runner");
|
||||||
|
XSelectInput(s_display, s_window, StructureNotifyMask);
|
||||||
|
XMapWindow(s_display, s_window);
|
||||||
|
|
||||||
|
s_wi.type = WindowInfo::Type::X11;
|
||||||
|
s_wi.display_connection = s_display;
|
||||||
|
s_wi.window_handle = reinterpret_cast<void*>(s_window);
|
||||||
|
s_wi.surface_width = WINDOW_WIDTH;
|
||||||
|
s_wi.surface_height = WINDOW_HEIGHT;
|
||||||
|
s_wi.surface_scale = 1.0f;
|
||||||
|
|
||||||
|
XFlush(s_display);
|
||||||
|
PumpPlatformMessages();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GSRunner::DestroyPlatformWindow()
|
||||||
|
{
|
||||||
|
if (s_display && s_window != None)
|
||||||
|
{
|
||||||
|
XDestroyWindow(s_display, s_window);
|
||||||
|
s_window = None;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (s_display)
|
||||||
|
{
|
||||||
|
XCloseDisplay(s_display);
|
||||||
|
s_display = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::optional<WindowInfo> GSRunner::GetPlatformWindowInfo()
|
||||||
|
{
|
||||||
|
WindowInfo wi;
|
||||||
|
if (s_display && s_window != None)
|
||||||
|
wi = s_wi;
|
||||||
|
else
|
||||||
|
wi.type = WindowInfo::Type::Surfaceless;
|
||||||
|
return wi;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GSRunner::PumpPlatformMessages(bool forever)
|
||||||
|
{
|
||||||
|
if (!s_display)
|
||||||
|
return;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
while (XPending(s_display) > 0)
|
||||||
|
{
|
||||||
|
XEvent event;
|
||||||
|
XNextEvent(s_display, &event);
|
||||||
|
|
||||||
|
switch (event.type)
|
||||||
|
{
|
||||||
|
case ConfigureNotify:
|
||||||
|
{
|
||||||
|
const XConfigureEvent& configure = event.xconfigure;
|
||||||
|
s_wi.surface_width = static_cast<u32>(configure.width);
|
||||||
|
s_wi.surface_height = static_cast<u32>(configure.height);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case DestroyNotify:
|
||||||
|
return;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (s_shutdown_requested.load())
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (forever)
|
||||||
|
{
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(1));
|
||||||
|
}
|
||||||
|
} while (forever && !s_shutdown_requested.load());
|
||||||
|
}
|
||||||
|
|
||||||
|
void GSRunner::StopPlatformMessagePump()
|
||||||
|
{
|
||||||
|
s_shutdown_requested.store(true);
|
||||||
|
}
|
||||||
#endif // _WIN32 / __APPLE__
|
#endif // _WIN32 / __APPLE__
|
||||||
|
|||||||
@ -73,7 +73,6 @@ def run_regression_test(runner, dumpdir, renderer, upscale, renderhacks, paralle
|
|||||||
#print("Running '%s'" % (" ".join(args)))
|
#print("Running '%s'" % (" ".join(args)))
|
||||||
subprocess.run(args, env=environ, stdin=subprocess.DEVNULL, stderr=subprocess.DEVNULL, stdout=subprocess.DEVNULL, creationflags=creationflags)
|
subprocess.run(args, env=environ, stdin=subprocess.DEVNULL, stderr=subprocess.DEVNULL, stdout=subprocess.DEVNULL, creationflags=creationflags)
|
||||||
|
|
||||||
|
|
||||||
def run_regression_tests(runner, gsdir, dumpdir, renderer, upscale, renderhacks, parallel=1):
|
def run_regression_tests(runner, gsdir, dumpdir, renderer, upscale, renderhacks, parallel=1):
|
||||||
paths = glob.glob(gsdir + "/*.*", recursive=True)
|
paths = glob.glob(gsdir + "/*.*", recursive=True)
|
||||||
gamepaths = list(filter(lambda x: get_gs_name(x) is not None, paths))
|
gamepaths = list(filter(lambda x: get_gs_name(x) is not None, paths))
|
||||||
@ -104,12 +103,12 @@ def run_regression_tests(runner, gsdir, dumpdir, renderer, upscale, renderhacks,
|
|||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
parser = argparse.ArgumentParser(description="Generate frame dump images for regression tests")
|
parser = argparse.ArgumentParser(description="Generate frame dump images for regression tests")
|
||||||
parser.add_argument("-runner", action="store", required=True, help="Path to PCSX2 GS runner")
|
parser.add_argument("-runner", action="store", required=True, type=str.strip, help="Path to PCSX2 GS runner")
|
||||||
parser.add_argument("-gsdir", action="store", required=True, help="Directory containing GS dumps")
|
parser.add_argument("-gsdir", action="store", required=True, type=str.strip, help="Directory containing GS dumps")
|
||||||
parser.add_argument("-dumpdir", action="store", required=True, help="Base directory to dump frames to")
|
parser.add_argument("-dumpdir", action="store", required=True, type=str.strip, help="Base directory to dump frames to")
|
||||||
parser.add_argument("-renderer", action="store", required=False, help="Renderer to use")
|
parser.add_argument("-renderer", action="store", required=False, type=str.strip, help="Renderer to use")
|
||||||
parser.add_argument("-upscale", action="store", type=float, default=1, help="Upscaling multiplier to use")
|
parser.add_argument("-upscale", action="store", type=float, default=1, help="Upscaling multiplier to use")
|
||||||
parser.add_argument("-renderhacks", action="store", required=False, help="Enable HW Rendering hacks")
|
parser.add_argument("-renderhacks", action="store", required=False, type=str.strip, help="Enable HW Rendering hacks")
|
||||||
parser.add_argument("-parallel", action="store", type=int, default=1, help="Number of processes to run")
|
parser.add_argument("-parallel", action="store", type=int, default=1, help="Number of processes to run")
|
||||||
|
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user