summaryrefslogtreecommitdiff
path: root/pcr/reicast-multilib-git
diff options
context:
space:
mode:
Diffstat (limited to 'pcr/reicast-multilib-git')
-rw-r--r--pcr/reicast-multilib-git/PKGBUILD50
-rw-r--r--pcr/reicast-multilib-git/enable_joystick_support.patch346
-rw-r--r--pcr/reicast-multilib-git/wait_if_two_frames_already_in_flight.patch70
3 files changed, 466 insertions, 0 deletions
diff --git a/pcr/reicast-multilib-git/PKGBUILD b/pcr/reicast-multilib-git/PKGBUILD
new file mode 100644
index 000000000..bbf632116
--- /dev/null
+++ b/pcr/reicast-multilib-git/PKGBUILD
@@ -0,0 +1,50 @@
+# Maintainer (Arch): carstene1ns <arch carsten-teibes de> - http://git.io/ctPKG
+# Maintainer: André Silva <emulatorman@parabola.nu>
+# Maintainer: Márcio Silva <coadde@parabola.nu>
+
+pkgname=reicast-multilib-git
+pkgver=r1252.5b92793
+pkgrel=1
+pkgdesc="A multiplatform Sega Dreamcast emulator"
+arch=('x86_64')
+url="http://reicast.com/"
+license=('GPL2')
+conflicts=('reicast')
+provides=('reicast')
+makedepends=('git')
+makedepends_x86_64=('gcc-multilib')
+depends_x86_64=('lib32-libgl' 'lib32-alsa-plugins')
+optdepends=('xboxdrv: Userspace gamepad driver for Xbox and Xbox360 gamepads'
+ 'antimicro: Graphical program used to map keyboard keys and mouse controls to gamepad buttons')
+source=(reicast::"git+https://github.com/reicast/reicast-emulator.git"
+ 'enable_joystick_support.patch'
+ 'wait_if_two_frames_already_in_flight.patch')
+sha256sums=('SKIP'
+ '464946512ca4cffac104128a85dd174520caeaa0325afbf281b6cfdbc0120fc6'
+ 'f4d3b4ad7703da09dc59cae839ca225e1a21b89d905ede3519bf3174b40903da')
+
+pkgver() {
+ cd reicast
+ printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
+}
+
+prepare () {
+ cd reicast
+ patch -Np1 -i "$srcdir"/enable_joystick_support.patch
+ patch -Np1 -i "$srcdir"/wait_if_two_frames_already_in_flight.patch
+
+ # experimental shadow support
+ sed -i 's|//DrawModVols|DrawModVols|' core/rend/gles/gldraw.cpp
+}
+
+build () {
+ make -C reicast/shell/lin86
+}
+
+package () {
+ cd reicast
+
+ install -Dm755 shell/lin86/reicast.elf "$pkgdir"/usr/bin/reicast
+ # license
+ install -Dm644 LICENSE "$pkgdir"/usr/share/licenses/$pkgname/LICENSE
+}
diff --git a/pcr/reicast-multilib-git/enable_joystick_support.patch b/pcr/reicast-multilib-git/enable_joystick_support.patch
new file mode 100644
index 000000000..0fbb59ac7
--- /dev/null
+++ b/pcr/reicast-multilib-git/enable_joystick_support.patch
@@ -0,0 +1,346 @@
+diff -Nur reicast-emulator.orig/core/linux-dist/main.cpp reicast-emulator/core/linux-dist/main.cpp
+--- reicast-emulator.orig/core/linux-dist/main.cpp 2015-06-29 21:42:22.674278849 -0300
++++ reicast-emulator/core/linux-dist/main.cpp 2015-06-29 22:08:38.780500620 -0300
+@@ -22,6 +22,7 @@
+ #include <X11/Xlib.h>
+ #include <X11/Xatom.h>
+ #include <X11/Xutil.h>
++ #include <X11/XKBlib.h>
+
+ #if !defined(GLES)
+ #include <GL/gl.h>
+@@ -49,6 +50,34 @@
+ #endif
+ #define WINDOW_HEIGHT 480
+
++/*****************************************************************/
++/****************** Configure Controls ***************************/
++/*****************************************************************/
++
++// Use XEV in terminal window to find keycodes to configure buttons.
++#define XANA_UP (25)
++#define XANA_DOWN (39)
++#define XANA_LEFT (38)
++#define XANA_RIGHT (40)
++#define XANA_LT (79)
++#define XANA_RT (81)
++#define XDPAD_UP (31)
++#define XDPAD_DOWN (45)
++#define XDPAD_LEFT (44)
++#define XDPAD_RIGHT (46)
++#define XBTN_Y (80)
++#define XBTN_X (83)
++#define XBTN_B (85)
++#define XBTN_A (84)
++#define XBTN_START (36)
++
++/*******************************************************************/
++
++u8 temp_joyx = 0;
++u8 temp_joyy = 0;
++u8 temp_lt = 0;
++u8 temp_rt = 0;
++
+ void* x11_win=0,* x11_disp=0;
+ void* libPvr_GetRenderTarget()
+ {
+@@ -124,8 +153,8 @@
+ { Btn_A,Btn_B,Btn_X,Btn_Y,0,0,0,Btn_Start,0,0 };
+
+ const u32 JMapAxis_360[MAP_SIZE] =
+- { Axis_X,Axis_Y,Axis_LT,0,0,Axis_RT,DPad_Left,DPad_Up,0,0 };
+-
++ //{ Axis_X,Axis_Y,Axis_LT,0,0,Axis_RT,DPad_Left,DPad_Up,0,0 };
++ { Axis_X,Axis_Y,0,0,Axis_RT,Axis_LT,DPad_Left,DPad_Up,0,0 };
+ const u32* JMapBtn=JMapBtn_USB;
+ const u32* JMapAxis=JMapAxis_USB;
+
+@@ -180,7 +209,7 @@
+
+ printf("SDK: Found '%s' joystick with %d axis and %d buttons\n",Name,AxisCount,ButtonCount);
+
+- if (strcmp(Name,"Microsoft X-Box 360 pad")==0)
++ if (strcmp(Name,"Microsoft X-Box 360 pad")==0 || strcmp(Name,"Xbox Gamepad (userspace driver)")==0)
+ {
+ JMapBtn=JMapBtn_360;
+ JMapAxis=JMapAxis_360;
+@@ -414,9 +443,20 @@
+ {
+ static char key = 0;
+
+- kcode[port]= x11_dc_buttons;
+- rt[port]=0;
+- lt[port]=0;
++ if (cfgLoadInt("config","usejoypad",0)==1)
++ {
++ HandleJoystick(port);
++ return;
++ }
++ else
++ {
++ kcode[port]= x11_dc_buttons;
++ joyx[0] = temp_joyx;
++ joyy[0] = temp_joyy;
++ lt[0] = temp_lt;
++ rt[0] = temp_rt;
++ return;
++ }
+
+ #if defined(TARGET_GCW0) || defined(TARGET_PANDORA)
+ HandleJoystick(port);
+@@ -472,7 +512,13 @@
+ void os_DoEvents()
+ {
+ #if defined(SUPPORT_X11)
+- if (x11_win) {
++
++ static bool ana_up = false;
++ static bool ana_down = false;
++ static bool ana_left = false;
++ static bool ana_right = false;
++
++ if (x11_win) {
+ //Handle X11
+ XEvent e;
+ if(XCheckWindowEvent((Display*)x11_disp, (Window)x11_win, KeyPressMask | KeyReleaseMask, &e))
+@@ -483,6 +529,103 @@
+ case KeyPress:
+ case KeyRelease:
+ {
++
++ //Detect up press
++ if(e.xkey.keycode == XANA_UP)
++ {
++ if(e.type == KeyPress)
++ {
++ ana_up = true;
++ }
++ else if(e.type == KeyRelease)
++ {
++ ana_up = false;
++ }
++ else
++ {
++ }
++ }
++
++ //Detect down Press
++ if(e.xkey.keycode == XANA_DOWN)
++ {
++ if(e.type == KeyPress)
++ {
++ ana_down = true;
++ }
++ else if(e.type == KeyRelease)
++ {
++ ana_down = false;
++ }
++ else
++ {
++ }
++ }
++
++ //Detect left press
++ if(e.xkey.keycode == XANA_LEFT)
++ {
++ if(e.type == KeyPress)
++ {
++ ana_left = true;
++ }
++ else if(e.type == KeyRelease)
++ {
++ ana_left = false;
++ }
++ else
++ {
++ }
++ }
++
++ //Detect right Press
++ if(e.xkey.keycode == XANA_RIGHT)
++ {
++ if(e.type == KeyPress)
++ {
++ ana_right = true;
++ }
++ else if(e.type == KeyRelease)
++ {
++ ana_right = false;
++ }
++ else
++ {
++ }
++ }
++
++ //detect LT press
++ if (e.xkey.keycode == XANA_LT)
++ {
++ if (e.type == KeyPress)
++ {
++ temp_lt = 255;
++ }
++ else if (e.type == KeyRelease)
++ {
++ temp_lt = 0;
++ }
++ else
++ {
++ }
++ }
++
++ //detect RT press
++ if (e.xkey.keycode == XANA_RT)
++ {
++ if (e.type == KeyPress)
++ {
++ temp_rt = 255;
++ }
++ else if (e.type == KeyRelease)
++ {
++ temp_rt = 0;
++ }
++ else
++ {
++ }
++ }
++
+ int dc_key = x11_keymap[e.xkey.keycode];
+
+ if (e.type == KeyPress)
+@@ -494,14 +637,44 @@
+ }
+ break;
+
+-
++ default:
+ {
+ printf("KEYRELEASE\n");
+ }
+ break;
+
+ }
+- }
++ }
++
++ /* Check analogue control states (up/down) */
++ if((ana_up == true) && (ana_down == false))
++ {
++ temp_joyy = -127;
++ }
++ else if((ana_up == false) && (ana_down == true))
++ {
++ temp_joyy = 127;
++ }
++ else
++ {
++ /* Either both pressed simultaniously or neither pressed */
++ temp_joyy = 0;
++ }
++
++ /* Check analogue control states (left/right) */
++ if((ana_left == true) && (ana_right == false))
++ {
++ temp_joyx = -127;
++ }
++ else if((ana_left == false) && (ana_right == true))
++ {
++ temp_joyx = 127;
++ }
++ else
++ {
++ /* Either both pressed simultaniously or neither pressed */
++ temp_joyx = 0;
++ }
+ }
+ #endif
+ }
+@@ -527,6 +700,9 @@
+ void os_CreateWindow()
+ {
+ #if defined(SUPPORT_X11)
++
++ Bool ar_set, ar_supp = false;
++
+ if (cfgLoadInt("pvr","nox11",0)==0)
+ {
+ XInitThreads();
+@@ -636,7 +812,8 @@
+ int height=cfgLoadInt("x11","height", WINDOW_HEIGHT);
+ #endif
+
+- if (width==-1)
++ //if (width==-1)
++ if (cfgLoadInt("x11","fullscreen",0)==1)
+ {
+ width=XDisplayWidth(x11Display,x11Screen);
+ height=XDisplayHeight(x11Display,x11Screen);
+@@ -653,8 +830,21 @@
+
+ XMapRaised(x11Display, x11Window);
+ #else
+- XMapWindow(x11Display, x11Window);
+-
++
++ if (cfgLoadInt("x11","fullscreen",0)==1)
++ {
++ // fullscreen
++ Atom wmState = XInternAtom(x11Display, "_NET_WM_STATE", False);
++ Atom wmFullscreen = XInternAtom(x11Display, "_NET_WM_STATE_FULLSCREEN", False);
++ XChangeProperty(x11Display, x11Window, wmState, XA_ATOM, 32, PropModeReplace, (unsigned char *)&wmFullscreen, 1);
++ }
++
++ XMapWindow(x11Display, x11Window);
++
++ //This 1 second delay is important. Without it the GLX code can execute before the window
++ //resize completes causing a black border at the top of the screen....
++ sleep(1);
++
+ #if !defined(GLES)
+
+ #define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091
+@@ -690,6 +880,11 @@
+ //(EGLNativeDisplayType)x11Display;
+ x11_disp=(void*)x11Display;
+ x11_win=(void*)x11Window;
++
++ ar_set = XkbSetDetectableAutoRepeat(x11Display, True, &ar_supp);
++ printf("XkbSetDetectableAutoRepeat returns %u, supported = %u\n",ar_set, ar_supp);
++
++
+ }
+ else
+ printf("Not creating X11 window ..\n");
+@@ -805,16 +1000,16 @@
+ #endif
+
+ #if defined(SUPPORT_X11)
+- x11_keymap[113] = DPad_Left;
+- x11_keymap[114] = DPad_Right;
++ x11_keymap[XDPAD_LEFT] = DPad_Left;
++ x11_keymap[XDPAD_RIGHT] = DPad_Right;
+
+- x11_keymap[111] = DPad_Up;
+- x11_keymap[116] = DPad_Down;
++ x11_keymap[XDPAD_UP] = DPad_Up;
++ x11_keymap[XDPAD_DOWN] = DPad_Down;
+
+- x11_keymap[52] = Btn_Y;
+- x11_keymap[53] = Btn_X;
+- x11_keymap[54] = Btn_B;
+- x11_keymap[55] = Btn_A;
++ x11_keymap[XBTN_Y] = Btn_Y;
++ x11_keymap[XBTN_X] = Btn_X;
++ x11_keymap[XBTN_B] = Btn_B;
++ x11_keymap[XBTN_A] = Btn_A;
+
+ /*
+ //TODO: Fix sliders
+@@ -822,7 +1017,7 @@
+ x11_keymap[39] = DPad_Down;
+ */
+
+- x11_keymap[36] = Btn_Start;
++ x11_keymap[XBTN_START] = Btn_Start;
+ #endif
+
+ printf("Home dir is: %s\n",GetPath("/").c_str());
diff --git a/pcr/reicast-multilib-git/wait_if_two_frames_already_in_flight.patch b/pcr/reicast-multilib-git/wait_if_two_frames_already_in_flight.patch
new file mode 100644
index 000000000..ff297365c
--- /dev/null
+++ b/pcr/reicast-multilib-git/wait_if_two_frames_already_in_flight.patch
@@ -0,0 +1,70 @@
+diff -Nur reicast-emulator.orig/core/hw/pvr/Renderer_if.cpp reicast-emulator/core/hw/pvr/Renderer_if.cpp
+--- reicast-emulator.orig/core/hw/pvr/Renderer_if.cpp 2015-06-20 02:04:02.180069939 -0300
++++ reicast-emulator/core/hw/pvr/Renderer_if.cpp 2015-06-20 02:10:17.831402600 -0300
+@@ -184,6 +184,7 @@
+
+ bool rend_frame(TA_context* ctx, bool draw_osd) {
+ bool proc = renderer->Process(ctx);
++ FinishRender(_pvrrc);
+ re.Set();
+
+ bool do_swp = proc && renderer->Render();
+@@ -207,7 +208,7 @@
+ bool do_swp = rend_frame(_pvrrc, true);
+
+ //clear up & free data ..
+- FinishRender(_pvrrc);
++ tactx_Recycle(_pvrrc);
+ _pvrrc=0;
+
+ return do_swp;
+@@ -260,6 +261,7 @@
+
+
+ bool pend_rend = false;
++extern TA_context* rqueue;
+
+ void rend_resize(int width, int height) {
+ renderer->Resize(width, height);
+@@ -268,6 +270,10 @@
+
+ void rend_start_render()
+ {
++ if (rqueue) {
++ rend_end_render();
++ }
++
+ pend_rend = false;
+ bool is_rtt=(FB_W_SOF1& 0x1000000)!=0;
+ TA_context* ctx = tactx_Pop(CORE_CURRENT_CTX);
+@@ -314,7 +320,6 @@
+ }
+ }
+
+-
+ void rend_end_render()
+ {
+ #if 1 //also disabled the printf, it takes quite some time ...
+@@ -325,8 +330,9 @@
+ #endif
+ #endif
+
+- if (pend_rend)
++ if (pend_rend) {
+ re.Wait();
++ }
+ }
+
+ /*
+diff -Nur reicast-emulator.orig/core/hw/pvr/ta_ctx.cpp reicast-emulator/core/hw/pvr/ta_ctx.cpp
+--- reicast-emulator.orig/core/hw/pvr/ta_ctx.cpp 2015-06-20 02:04:02.186736275 -0300
++++ reicast-emulator/core/hw/pvr/ta_ctx.cpp 2015-06-20 02:07:44.202370584 -0300
+@@ -119,8 +119,6 @@
+ mtx_rqueue.Lock();
+ rqueue = 0;
+ mtx_rqueue.Unlock();
+-
+- tactx_Recycle(ctx);
+ }
+
+ cMutex mtx_pool;