-Subproject commit 63f173a2509a27f9ae156ad6ee798d76dec0ad6b
+Subproject commit 6fd09356f0d8c3d823f33c27b5e40041468b94b8
/*
- * (C) Gražvydas "notaz" Ignotas, 2011,2012
+ * (C) Gražvydas "notaz" Ignotas, 2011-2013
*
* This work is licensed under the terms of any of these licenses
* (at your option):
#include "libpicofe/gl.h"
#include "../plugins/gpulib/cspace.h"
#include "plugin_lib.h"
+#include "plugin.h"
#include "main.h"
#include "plat.h"
#include "revision.h"
static void *shadow_fb, *menubg_img;
static int in_menu;
-static int change_video_mode(void)
+static int change_video_mode(int force)
{
int w, h;
h = psx_h;
}
- return plat_sdl_change_video_mode(w, h, 0);
+ return plat_sdl_change_video_mode(w, h, force);
+}
+
+static void resize_cb(int w, int h)
+{
+ // used by some plugins..
+ pl_rearmed_cbs.screen_w = w;
+ pl_rearmed_cbs.screen_h = h;
+ pl_rearmed_cbs.gles_display = gl_es_display;
+ pl_rearmed_cbs.gles_surface = gl_es_surface;
+ plugin_call_rearmed_cbs();
}
static void quit_cb(void)
emu_core_ask_exit();
}
+static void get_layer_pos(int *x, int *y, int *w, int *h)
+{
+ // always fill entire SDL window
+ *x = *y = 0;
+ *w = pl_rearmed_cbs.screen_w;
+ *h = pl_rearmed_cbs.screen_h;
+}
+
void plat_init(void)
{
int ret;
+ plat_sdl_quit_cb = quit_cb;
+ plat_sdl_resize_cb = resize_cb;
+
ret = plat_sdl_init();
if (ret != 0)
exit(1);
in_sdl_init(in_sdl_defbinds, plat_sdl_event_handler);
in_probe();
pl_rearmed_cbs.only_16bpp = 1;
+ pl_rearmed_cbs.pl_get_layer_pos = get_layer_pos;
bgr_to_uyvy_init();
- plat_sdl_quit_cb = quit_cb;
}
void plat_finish(void)
{
psx_w = *w;
psx_h = *h;
- change_video_mode();
+ change_video_mode(0);
if (plat_sdl_overlay != NULL) {
pl_plat_clear = plat_sdl_overlay_clear;
pl_plat_blit = overlay_blit;
void plat_video_menu_enter(int is_rom_loaded)
{
+ int force_mode_change = 0;
+
in_menu = 1;
/* surface will be lost, must adjust pl_vout_buf for menu bg */
memcpy(menubg_img, plat_sdl_screen->pixels, psx_w * psx_h * 2);
pl_vout_buf = menubg_img;
- change_video_mode();
+ /* gles plugin messes stuff up.. */
+ if (pl_rearmed_cbs.gpu_caps & GPU_CAP_OWNS_DISPLAY)
+ force_mode_change = 1;
+
+ change_video_mode(force_mode_change);
}
void plat_video_menu_begin(void)
// some stats, for display by some plugins
int flips_per_sec, cpu_usage;
float vsps_cur; // currect vsync/s
+ // these are for gles plugin
+ unsigned int screen_w, screen_h;
+ void *gles_display, *gles_surface;
// gpu options
int frameskip;
int fskip_advice;
unsigned int *gpu_frame_count;
unsigned int *gpu_hcnt;
unsigned int flip_cnt; // increment manually if not using pl_vout_flip
- unsigned int screen_w, screen_h; // gles plugin wants this
unsigned int only_16bpp; // platform is 16bpp-only
struct {
int allow_interlace; // 0 off, 1 on, 2 guess
int use_fsaa = 0;\r
\r
EGLDisplay display;\r
-EGLConfig config;\r
-EGLContext context;\r
EGLSurface surface;\r
+static EGLConfig config;\r
+static EGLContext context;\r
\r
#if defined(USE_X11)\r
#include "X11/Xlib.h"\r
return 0;\r
}\r
\r
-int GLinitialize() \r
+static int created_gles_context;\r
+\r
+int GLinitialize(void *ext_gles_display, void *ext_gles_surface)\r
{\r
- if(initEGL()!=0)\r
- return -1;\r
+ if(ext_gles_display != NULL && ext_gles_surface != NULL) { \r
+ display = (EGLDisplay)ext_gles_display;\r
+ surface = (EGLSurface)ext_gles_surface;\r
+ }\r
+ else {\r
+ if(initEGL()!=0)\r
+ return -1;\r
+ created_gles_context=1;\r
+ }\r
\r
//----------------------------------------------------// \r
\r
iResY-(rRatioRect.top+rRatioRect.bottom),\r
rRatioRect.right, \r
rRatioRect.bottom); glError();\r
- \r
+\r
glScissor(0, 0, iResX, iResY); glError(); // init clipping (fullscreen)\r
glEnable(GL_SCISSOR_TEST); glError();\r
\r
{ \r
CleanupTextureStore(); // bye textures\r
\r
- eglMakeCurrent( display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT );\r
- eglDestroySurface( display, surface );\r
- eglDestroyContext( display, context );\r
- eglTerminate( display );\r
+ if(created_gles_context) {\r
+ eglMakeCurrent( display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT );\r
+ eglDestroySurface( display, surface );\r
+ eglDestroyContext( display, context );\r
+ eglTerminate( display );\r
\r
#if defined(USE_X11)\r
if (x11Window) XDestroyWindow(x11Display, x11Window);\r
if (x11Colormap) XFreeColormap( x11Display, x11Colormap );\r
if (x11Display) XCloseDisplay(x11Display);\r
#endif\r
+ created_gles_context=0;\r
+ }\r
}\r
\r
////////////////////////////////////////////////////////////////////////\r
BOOL bSetupPixelFormat(HDC hDC);\r
#endif\r
\r
-int GLinitialize();\r
+int GLinitialize(void *ext_gles_display, void *ext_gles_surface);\r
void GLcleanup();\r
#ifdef _WINDOWS\r
BOOL offset2(void);\r
#include <GLES/glext.h>\r
#endif\r
\r
+#ifndef GL_BGRA_EXT\r
+#define GL_BGRA_EXT GL_RGBA // ??\r
+#endif\r
+\r
#ifdef __NANOGL__\r
#define glTexParameteri(x,y,z) glTexParameterf(x,y,z) \r
#define glAlphaFuncx(x,y) glAlphaFunc(x,y) \r
// lGPUstatusRet = 0x74000000;\r
\r
// with some emus, we could do the OGL init right here... oh my\r
- if(bIsFirstFrame) GLinitialize();\r
+ if(bIsFirstFrame) GLinitialize(NULL, NULL);\r
\r
return 0;\r
}\r
{\r
unsigned long lCommand=(gdata>>24)&0xff;\r
\r
-if(bIsFirstFrame) GLinitialize(); // real ogl startup (needed by some emus)\r
+if(bIsFirstFrame) GLinitialize(NULL, NULL); // real ogl startup (needed by some emus)\r
\r
ulStatusControl[lCommand]=gdata;\r
\r
unsigned char * baseAddrB;\r
short count;unsigned int DMACommandCounter = 0;\r
\r
-if(bIsFirstFrame) GLinitialize();\r
+if(bIsFirstFrame) GLinitialize(NULL, NULL);\r
\r
GPUIsBusy;\r
\r
// globals\r
////////////////////////////////////////////////////////////////////////\r
\r
-EGLSurface surface;\r
-EGLDisplay display;\r
-\r
\r
BOOL bDrawTextured; // current active drawing states\r
BOOL bDrawSmoothShaded;\r
#define SHADETEXBIT(x) ((x>>24) & 0x1)\r
#define SEMITRANSBIT(x) ((x>>25) & 0x1)\r
\r
-#ifndef _WINDOWS\r
-#ifndef GL_BGRA_EXT\r
-#define GL_BGRA_EXT GL_RGBA\r
-#endif\r
-#endif\r
-\r
#if 0\r
#define glError() { \\r
GLenum err = glGetError(); \\r
InitializeTextureStore(); // init texture mem
- ret = GLinitialize();
+ ret = GLinitialize(cbs->gles_display, cbs->gles_surface);
MakeDisplayLists();
is_opened = 1;
bUseFastMdec = cbs->gpu_peopsgl.bUseFastMdec;
iTexGarbageCollection = cbs->gpu_peopsgl.iTexGarbageCollection;
iVRamSize = cbs->gpu_peopsgl.iVRamSize;
+
if (cbs->pl_set_gpu_caps)
cbs->pl_set_gpu_caps(GPU_CAP_OWNS_DISPLAY);
+ if (is_opened && cbs->gles_display != NULL && cbs->gles_surface != NULL) {
+ // HACK..
+ GPUclose();
+ GPUopen(NULL);
+ }
+
set_vram(gpu.vram);
}