linux-dist/x11: Enable fullscreen toggling via F11 button

This commit is contained in:
Jan Holthuis 2015-08-19 12:45:21 +02:00
parent 955c9b99a4
commit fc2d1edea9
2 changed files with 133 additions and 105 deletions

View File

@ -27,6 +27,16 @@ int x11_keyboard_input = 0;
int ndcid = 0; int ndcid = 0;
void* x11_glc; void* x11_glc;
bool x11_fullscreen = false;
int x11_width;
int x11_height;
enum
{
_NET_WM_STATE_REMOVE =0,
_NET_WM_STATE_ADD = 1,
_NET_WM_STATE_TOGGLE =2
};
#ifdef TARGET_PANDORA #ifdef TARGET_PANDORA
static Cursor CreateNullCursor(Display *display, Window root) static Cursor CreateNullCursor(Display *display, Window root)
@ -51,6 +61,23 @@ void* x11_glc;
} }
#endif #endif
void x11_window_set_fullscreen(bool fullscreen)
{
XEvent xev;
xev.xclient.type = ClientMessage;
xev.xclient.window = x11_win;
xev.xclient.message_type = XInternAtom(x11_disp, "_NET_WM_STATE", False);
xev.xclient.format = 32;
xev.xclient.data.l[0] = 2; // _NET_WM_STATE_TOGGLE
xev.xclient.data.l[1] = XInternAtom(x11_disp, "_NET_WM_STATE_FULLSCREEN", True);
xev.xclient.data.l[2] = 0; // no second property to toggle
xev.xclient.data.l[3] = 1;
xev.xclient.data.l[4] = 0;
printf("x11: setting fullscreen to %d\n", fullscreen);
XSendEvent(x11_disp, DefaultRootWindow(x11_disp), False, SubstructureNotifyMask, &xev);
}
void input_x11_handle() void input_x11_handle()
{ {
if (x11_win && x11_keyboard_input) if (x11_win && x11_keyboard_input)
@ -64,28 +91,25 @@ void input_x11_handle()
{ {
case KeyPress: case KeyPress:
case KeyRelease: case KeyRelease:
{ if (e.type == KeyRelease && e.xkey.keycode == 95) // F11 button
int dc_key = x11_keymap[e.xkey.keycode];
if (e.type == KeyPress)
{ {
kcode[0] &= ~dc_key; x11_fullscreen = !x11_fullscreen;
x11_window_set_fullscreen(x11_fullscreen);
} }
else else
{ {
kcode[0] |= dc_key; int dc_key = x11_keymap[e.xkey.keycode];
if (e.type == KeyPress)
{
kcode[0] &= ~dc_key;
}
else
{
kcode[0] |= dc_key;
}
} }
//printf("KEY: %d -> %d: %d\n",e.xkey.keycode, dc_key, x11_dc_buttons ); //printf("KEY: %d -> %d: %d\n",e.xkey.keycode, dc_key, x11_dc_buttons );
} break;
break;
{
printf("KEYRELEASE\n");
}
break;
} }
} }
} }
@ -218,31 +242,35 @@ void x11_window_create()
ui32Mask = CWBackPixel | CWBorderPixel | CWEventMask | CWColormap; ui32Mask = CWBackPixel | CWBorderPixel | CWEventMask | CWColormap;
#ifdef TARGET_PANDORA #ifdef TARGET_PANDORA
int width = 800; x11_width = 800;
int height = 480; x11_height = 480;
#else #else
int width = cfgLoadInt("x11", "width", WINDOW_WIDTH); x11_width = cfgLoadInt("x11", "width", WINDOW_WIDTH);
int height = cfgLoadInt("x11", "height", WINDOW_HEIGHT); x11_height = cfgLoadInt("x11", "height", WINDOW_HEIGHT);
#endif #endif
if (width == -1) if (x11_width < 0 || x11_height < 0)
{ {
width = XDisplayWidth(x11Display, x11Screen); x11_width = XDisplayWidth(x11Display, x11Screen);
height = XDisplayHeight(x11Display, x11Screen); x11_height = XDisplayHeight(x11Display, x11Screen);
} }
// Creates the X11 window // Creates the X11 window
x11Window = XCreateWindow(x11Display, RootWindow(x11Display, x11Screen), (ndcid%3)*640, (ndcid/3)*480, width, height, x11Window = XCreateWindow(x11Display, RootWindow(x11Display, x11Screen), (ndcid%3)*640, (ndcid/3)*480, x11_width, x11_height,
0, depth, InputOutput, x11Visual->visual, ui32Mask, &sWA); 0, depth, InputOutput, x11Visual->visual, ui32Mask, &sWA);
#ifdef TARGET_PANDORA if(x11_fullscreen)
{
// fullscreen // fullscreen
Atom wmState = XInternAtom(x11Display, "_NET_WM_STATE", False); Atom wmState = XInternAtom(x11Display, "_NET_WM_STATE", False);
Atom wmFullscreen = XInternAtom(x11Display, "_NET_WM_STATE_FULLSCREEN", False); Atom wmFullscreen = XInternAtom(x11Display, "_NET_WM_STATE_FULLSCREEN", False);
XChangeProperty(x11Display, x11Window, wmState, XA_ATOM, 32, PropModeReplace, (unsigned char *)&wmFullscreen, 1); XChangeProperty(x11Display, x11Window, wmState, XA_ATOM, 32, PropModeReplace, (unsigned char *)&wmFullscreen, 1);
XMapRaised(x11Display, x11Window); XMapRaised(x11Display, x11Window);
#else }
else
{
XMapWindow(x11Display, x11Window); XMapWindow(x11Display, x11Window);
#if !defined(GLES) #if !defined(GLES)
@ -270,7 +298,7 @@ void x11_window_create()
die("Failed to create GL3.1 context\n"); die("Failed to create GL3.1 context\n");
} }
#endif #endif
#endif }
XFlush(x11Display); XFlush(x11Display);

View File

@ -73,7 +73,7 @@ float fb_scale_x,fb_scale_y;
//Fragment and vertex shaders code //Fragment and vertex shaders code
//pretty much 1:1 copy of the d3d ones for now //pretty much 1:1 copy of the d3d ones for now
const char* VertexShaderSource = const char* VertexShaderSource =
#ifndef GLES #ifndef GLES
"#version 140 \n" "#version 140 \n"
#endif #endif
@ -112,7 +112,7 @@ void main() \n\
const char* VertexShaderSource = const char* VertexShaderSource =
"" ""
"/* Test Projection Matrix */" "/* Test Projection Matrix */"
"" ""
@ -225,11 +225,11 @@ lowp float fog_mode2(highp float invW) \n\
#endif #endif
const char* PixelPipelineShader = const char* PixelPipelineShader =
#ifndef GLES #ifndef GLES
"#version 140 \n" "#version 140 \n"
"out vec4 FragColor; \n" "out vec4 FragColor; \n"
#endif #endif
"\ "\
\ \
#define cp_AlphaTest %d \n\ #define cp_AlphaTest %d \n\
@ -318,7 +318,7 @@ void main() \n\
" FRAGCOL "=color; \n\ " FRAGCOL "=color; \n\
}"; }";
const char* ModifierVolumeShader = const char* ModifierVolumeShader =
#ifndef GLES #ifndef GLES
"#version 140 \n" "#version 140 \n"
"out vec4 FragColor; \n" "out vec4 FragColor; \n"
@ -331,7 +331,7 @@ void main() \n\
" FRAGCOL "=vec4(0.0, 0.0, 0.0, sp_ShaderColor); \n\ " FRAGCOL "=vec4(0.0, 0.0, 0.0, sp_ShaderColor); \n\
}"; }";
const char* OSD_Shader = const char* OSD_Shader =
#ifndef GLES #ifndef GLES
"#version 140 \n" "#version 140 \n"
"out vec4 FragColor; \n" "out vec4 FragColor; \n"
@ -370,7 +370,7 @@ int screen_height;
if(gl.setup.display == EGL_NO_DISPLAY) if(gl.setup.display == EGL_NO_DISPLAY)
gl.setup.display = eglGetDisplay((EGLNativeDisplayType) EGL_DEFAULT_DISPLAY); gl.setup.display = eglGetDisplay((EGLNativeDisplayType) EGL_DEFAULT_DISPLAY);
// Initialise EGL // Initialise EGL
EGLint maj, min; EGLint maj, min;
if (!eglInitialize(gl.setup.display, &maj, &min)) if (!eglInitialize(gl.setup.display, &maj, &min))
@ -385,7 +385,7 @@ int screen_height;
EGLint pi32ConfigAttribs[] = { EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT , EGL_DEPTH_SIZE, 24, EGL_STENCIL_SIZE, 8, EGL_NONE }; EGLint pi32ConfigAttribs[] = { EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT , EGL_DEPTH_SIZE, 24, EGL_STENCIL_SIZE, 8, EGL_NONE };
EGLint pi32ContextAttribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2 , EGL_NONE }; EGLint pi32ContextAttribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2 , EGL_NONE };
int num_config; int num_config;
EGLConfig config; EGLConfig config;
@ -456,14 +456,14 @@ int screen_height;
#ifdef TARGET_PANDORA #ifdef TARGET_PANDORA
eglMakeCurrent( gl.setup.display, NULL, NULL, EGL_NO_CONTEXT ); eglMakeCurrent( gl.setup.display, NULL, NULL, EGL_NO_CONTEXT );
if (gl.setup.context) if (gl.setup.context)
eglDestroyContext(gl.setup.display, gl.setup.context); eglDestroyContext(gl.setup.display, gl.setup.context);
if (gl.setup.surface) if (gl.setup.surface)
eglDestroySurface(gl.setup.display, gl.setup.surface); eglDestroySurface(gl.setup.display, gl.setup.surface);
if (gl.setup.display) if (gl.setup.display)
eglTerminate(gl.setup.display); eglTerminate(gl.setup.display);
if (fbdev>=0) if (fbdev>=0)
close( fbdev ); close( fbdev );
fbdev=-1; fbdev=-1;
gl.setup.context=0; gl.setup.context=0;
gl.setup.surface=0; gl.setup.surface=0;
@ -497,9 +497,9 @@ int screen_height;
#define WGL_CONTEXT_DEBUG_BIT_ARB 0x0001 #define WGL_CONTEXT_DEBUG_BIT_ARB 0x0001
#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002 #define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002
#define ERROR_INVALID_VERSION_ARB 0x2095 #define ERROR_INVALID_VERSION_ARB 0x2095
#define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001 #define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001
typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats,
int *piFormats, UINT *nNumFormats); int *piFormats, UINT *nNumFormats);
typedef HGLRC (WINAPI * PFNWGLCREATECONTEXTATTRIBSARBPROC) (HDC hDC, HGLRC hShareContext, const int *attribList); typedef HGLRC (WINAPI * PFNWGLCREATECONTEXTATTRIBSARBPROC) (HDC hDC, HGLRC hShareContext, const int *attribList);
typedef BOOL (WINAPI * PFNWGLSWAPINTERVALEXTPROC) (int interval); typedef BOOL (WINAPI * PFNWGLSWAPINTERVALEXTPROC) (int interval);
@ -535,7 +535,7 @@ int screen_height;
/*HDC*/ ourWindowHandleToDeviceContext = (HDC)hdc;//GetDC((HWND)hwnd); /*HDC*/ ourWindowHandleToDeviceContext = (HDC)hdc;//GetDC((HWND)hwnd);
int letWindowsChooseThisPixelFormat; int letWindowsChooseThisPixelFormat;
letWindowsChooseThisPixelFormat = ChoosePixelFormat(ourWindowHandleToDeviceContext, &pfd); letWindowsChooseThisPixelFormat = ChoosePixelFormat(ourWindowHandleToDeviceContext, &pfd);
SetPixelFormat(ourWindowHandleToDeviceContext,letWindowsChooseThisPixelFormat, &pfd); SetPixelFormat(ourWindowHandleToDeviceContext,letWindowsChooseThisPixelFormat, &pfd);
HGLRC ourOpenGLRenderingContext = wglCreateContext(ourWindowHandleToDeviceContext); HGLRC ourOpenGLRenderingContext = wglCreateContext(ourWindowHandleToDeviceContext);
@ -566,7 +566,7 @@ int screen_height;
int attribs[] = int attribs[] =
{ {
WGL_CONTEXT_MAJOR_VERSION_ARB, 3, WGL_CONTEXT_MAJOR_VERSION_ARB, 3,
WGL_CONTEXT_MINOR_VERSION_ARB, 1, WGL_CONTEXT_MINOR_VERSION_ARB, 1,
WGL_CONTEXT_FLAGS_ARB, WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB, WGL_CONTEXT_FLAGS_ARB, WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB,
WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_CORE_PROFILE_BIT_ARB, WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_CORE_PROFILE_BIT_ARB,
0 0
@ -614,8 +614,8 @@ int screen_height;
{ {
extern void* x11_glc; extern void* x11_glc;
glXMakeCurrent((Display*)libPvr_GetRenderSurface(), glXMakeCurrent((Display*)libPvr_GetRenderSurface(),
(GLXDrawable)libPvr_GetRenderTarget(), (GLXDrawable)libPvr_GetRenderTarget(),
(GLXContext)x11_glc); (GLXContext)x11_glc);
screen_width = 640; screen_width = 640;
@ -672,19 +672,19 @@ struct ShaderUniforms_t
{ {
if (s->cp_AlphaTestValue!=-1) if (s->cp_AlphaTestValue!=-1)
glUniform1f(s->cp_AlphaTestValue,PT_ALPHA); glUniform1f(s->cp_AlphaTestValue,PT_ALPHA);
if (s->scale!=-1) if (s->scale!=-1)
glUniform4fv( s->scale, 1, scale_coefs); glUniform4fv( s->scale, 1, scale_coefs);
if (s->depth_scale!=-1) if (s->depth_scale!=-1)
glUniform4fv( s->depth_scale, 1, depth_coefs); glUniform4fv( s->depth_scale, 1, depth_coefs);
if (s->sp_FOG_DENSITY!=-1) if (s->sp_FOG_DENSITY!=-1)
glUniform1f( s->sp_FOG_DENSITY,fog_den_float); glUniform1f( s->sp_FOG_DENSITY,fog_den_float);
if (s->sp_FOG_COL_RAM!=-1) if (s->sp_FOG_COL_RAM!=-1)
glUniform3fv( s->sp_FOG_COL_RAM, 1, ps_FOG_COL_RAM); glUniform3fv( s->sp_FOG_COL_RAM, 1, ps_FOG_COL_RAM);
if (s->sp_FOG_COL_VERT!=-1) if (s->sp_FOG_COL_VERT!=-1)
glUniform3fv( s->sp_FOG_COL_VERT, 1, ps_FOG_COL_VERT); glUniform3fv( s->sp_FOG_COL_VERT, 1, ps_FOG_COL_VERT);
@ -797,7 +797,7 @@ int GetProgramID(u32 cp_AlphaTest, u32 pp_ClipTestMode,
bool CompilePipelineShader( PipelineShader* s) bool CompilePipelineShader( PipelineShader* s)
{ {
char pshader[8192]; char pshader[8192];
sprintf(pshader,PixelPipelineShader, sprintf(pshader,PixelPipelineShader,
s->cp_AlphaTest,s->pp_ClipTestMode,s->pp_UseAlpha, s->cp_AlphaTest,s->pp_ClipTestMode,s->pp_UseAlpha,
s->pp_Texture,s->pp_IgnoreTexA,s->pp_ShadInstr,s->pp_Offset,s->pp_FogCtrl); s->pp_Texture,s->pp_IgnoreTexA,s->pp_ShadInstr,s->pp_Offset,s->pp_FogCtrl);
@ -813,10 +813,10 @@ bool CompilePipelineShader( PipelineShader* s)
//get the uniform locations //get the uniform locations
s->scale = glGetUniformLocation(s->program, "scale"); s->scale = glGetUniformLocation(s->program, "scale");
s->depth_scale = glGetUniformLocation(s->program, "depth_scale"); s->depth_scale = glGetUniformLocation(s->program, "depth_scale");
s->pp_ClipTest = glGetUniformLocation(s->program, "pp_ClipTest"); s->pp_ClipTest = glGetUniformLocation(s->program, "pp_ClipTest");
s->sp_FOG_DENSITY = glGetUniformLocation(s->program, "sp_FOG_DENSITY"); s->sp_FOG_DENSITY = glGetUniformLocation(s->program, "sp_FOG_DENSITY");
s->cp_AlphaTestValue= glGetUniformLocation(s->program, "cp_AlphaTestValue"); s->cp_AlphaTestValue= glGetUniformLocation(s->program, "cp_AlphaTestValue");
@ -907,13 +907,13 @@ bool gl_create_resources()
} }
gl.modvol_shader.program=gl_CompileAndLink(VertexShaderSource,ModifierVolumeShader); gl.modvol_shader.program=gl_CompileAndLink(VertexShaderSource,ModifierVolumeShader);
gl.modvol_shader.scale = glGetUniformLocation(gl.modvol_shader.program, "scale"); gl.modvol_shader.scale = glGetUniformLocation(gl.modvol_shader.program, "scale");
gl.modvol_shader.sp_ShaderColor = glGetUniformLocation(gl.modvol_shader.program, "sp_ShaderColor"); gl.modvol_shader.sp_ShaderColor = glGetUniformLocation(gl.modvol_shader.program, "sp_ShaderColor");
gl.modvol_shader.depth_scale = glGetUniformLocation(gl.modvol_shader.program, "depth_scale"); gl.modvol_shader.depth_scale = glGetUniformLocation(gl.modvol_shader.program, "depth_scale");
gl.OSD_SHADER.program=gl_CompileAndLink(VertexShaderSource,OSD_Shader); gl.OSD_SHADER.program=gl_CompileAndLink(VertexShaderSource,OSD_Shader);
printf("OSD: %d\n",gl.OSD_SHADER.program); printf("OSD: %d\n",gl.OSD_SHADER.program);
gl.OSD_SHADER.scale=glGetUniformLocation(gl.OSD_SHADER.program, "scale"); gl.OSD_SHADER.scale=glGetUniformLocation(gl.OSD_SHADER.program, "scale");
@ -987,7 +987,7 @@ float fog_coefs[]={0,0};
void tryfit(float* x,float* y) void tryfit(float* x,float* y)
{ {
//y=B*ln(x)+A //y=B*ln(x)+A
double sylnx=0,sy=0,slnx=0,slnx2=0; double sylnx=0,sy=0,slnx=0,slnx2=0;
u32 cnt=0; u32 cnt=0;
@ -1002,14 +1002,14 @@ void tryfit(float* x,float* y)
if (i>0 && y[i]==0 && y[i-1]==0) if (i>0 && y[i]==0 && y[i-1]==0)
continue; continue;
//Add many samples for first and last value (fog-in, fog-out -> important) //Add many samples for first and last value (fog-in, fog-out -> important)
if (i>0 && y[i]!=1 && y[i-1]==1) if (i>0 && y[i]!=1 && y[i-1]==1)
rep=10000; rep=10000;
if (i<128 && y[i]!=0 && y[i+1]==0) if (i<128 && y[i]!=0 && y[i+1]==0)
rep=10000; rep=10000;
for (int j=0;j<rep;j++) for (int j=0;j<rep;j++)
{ {
cnt++; cnt++;
@ -1118,8 +1118,8 @@ static void DrawButton(float* xy, u32 state)
vjoy_pos[13][4]+=(vjoy_pos[13][0]-vjoy_pos[13][4])/2; vjoy_pos[13][4]+=(vjoy_pos[13][0]-vjoy_pos[13][4])/2;
vtx.x=x; vtx.y=y; vtx.x=x; vtx.y=y;
vtx.u=xy[4]; vtx.v=xy[5]; vtx.u=xy[4]; vtx.v=xy[5];
*pvrrc.verts.Append()=vtx; *pvrrc.verts.Append()=vtx;
@ -1154,7 +1154,7 @@ static void DrawCenteredText(float yy, float scale, int transparency, const char
Vertex vtx; Vertex vtx;
vtx.z=1; vtx.z=1;
float w=float(strlen(text)*14)*scale; float w=float(strlen(text)*14)*scale;
float x=320-w/2.0f; float x=320-w/2.0f;
@ -1163,7 +1163,7 @@ static void DrawCenteredText(float yy, float scale, int transparency, const char
w=14.0f*scale; w=14.0f*scale;
float step=32.0f/512.0f; float step=32.0f/512.0f;
float step2=4.0f/512.0f; float step2=4.0f/512.0f;
if (transparency<0) transparency=0; if (transparency<0) transparency=0;
if (transparency>255) transparency=255; if (transparency>255) transparency=255;
@ -1171,26 +1171,26 @@ static void DrawCenteredText(float yy, float scale, int transparency, const char
int c=text[i]; int c=text[i];
float u=float(c%16); float u=float(c%16);
float v=float(c/16); float v=float(c/16);
vtx.col[0]=vtx.col[1]=vtx.col[2]=255; vtx.col[0]=vtx.col[1]=vtx.col[2]=255;
vtx.col[3]=transparency; vtx.col[3]=transparency;
vtx.x=x; vtx.y=y; vtx.x=x; vtx.y=y;
vtx.u=u*step+step2; vtx.v=v*step+step2; vtx.u=u*step+step2; vtx.v=v*step+step2;
*pvrrc.verts.Append()=vtx; *pvrrc.verts.Append()=vtx;
vtx.x=x+w; vtx.y=y; vtx.x=x+w; vtx.y=y;
vtx.u=u*step+step-step2; vtx.v=v*step+step2; vtx.u=u*step+step-step2; vtx.v=v*step+step2;
*pvrrc.verts.Append()=vtx; *pvrrc.verts.Append()=vtx;
vtx.x=x; vtx.y=y+h; vtx.x=x; vtx.y=y+h;
vtx.u=u*step+step2; vtx.v=v*step+step-step2; vtx.u=u*step+step2; vtx.v=v*step+step-step2;
*pvrrc.verts.Append()=vtx; *pvrrc.verts.Append()=vtx;
vtx.x=x+w; vtx.y=y+h; vtx.x=x+w; vtx.y=y+h;
vtx.u=u*step+step-step2; vtx.v=v*step+step-step2; vtx.u=u*step+step-step2; vtx.v=v*step+step-step2;
*pvrrc.verts.Append()=vtx; *pvrrc.verts.Append()=vtx;
x+=w; x+=w;
osd_count+=4; osd_count+=4;
@ -1201,47 +1201,47 @@ static void DrawRightedText(float yy, float scale, int transparency, const char*
// Transparency 255=opaque, 0=not visible // Transparency 255=opaque, 0=not visible
{ {
Vertex vtx; Vertex vtx;
vtx.z=1; vtx.z=1;
float w=float(strlen(text)*14)*scale; float w=float(strlen(text)*14)*scale;
float x=640-w; float x=640-w;
float y=yy; float y=yy;
float h=16.0f*scale; float h=16.0f*scale;
w=14.0f*scale; w=14.0f*scale;
float step=32.0f/512.0f; float step=32.0f/512.0f;
float step2=4.0f/512.0f; float step2=4.0f/512.0f;
if (transparency<0) transparency=0; if (transparency<0) transparency=0;
if (transparency>255) transparency=255; if (transparency>255) transparency=255;
for (int i=0; i<strlen(text); i++) { for (int i=0; i<strlen(text); i++) {
int c=text[i]; int c=text[i];
float u=float(c%16); float u=float(c%16);
float v=float(c/16); float v=float(c/16);
vtx.col[0]=vtx.col[1]=vtx.col[2]=255; vtx.col[0]=vtx.col[1]=vtx.col[2]=255;
vtx.col[3]=transparency; vtx.col[3]=transparency;
vtx.x=x; vtx.y=y; vtx.x=x; vtx.y=y;
vtx.u=u*step+step2; vtx.v=v*step+step2; vtx.u=u*step+step2; vtx.v=v*step+step2;
*pvrrc.verts.Append()=vtx; *pvrrc.verts.Append()=vtx;
vtx.x=x+w; vtx.y=y; vtx.x=x+w; vtx.y=y;
vtx.u=u*step+step-step2; vtx.v=v*step+step2; vtx.u=u*step+step-step2; vtx.v=v*step+step2;
*pvrrc.verts.Append()=vtx; *pvrrc.verts.Append()=vtx;
vtx.x=x; vtx.y=y+h; vtx.x=x; vtx.y=y+h;
vtx.u=u*step+step2; vtx.v=v*step+step-step2; vtx.u=u*step+step2; vtx.v=v*step+step-step2;
*pvrrc.verts.Append()=vtx; *pvrrc.verts.Append()=vtx;
vtx.x=x+w; vtx.y=y+h; vtx.x=x+w; vtx.y=y+h;
vtx.u=u*step+step-step2; vtx.v=v*step+step-step2; vtx.u=u*step+step-step2; vtx.v=v*step+step-step2;
*pvrrc.verts.Append()=vtx; *pvrrc.verts.Append()=vtx;
x+=w; x+=w;
osd_count+=4; osd_count+=4;
} }
} }
@ -1311,7 +1311,7 @@ void OSD_DRAW()
//umin,vmin,umax,vmax //umin,vmin,umax,vmax
vjoy_pos[i][4]=(u+1)/OSD_TEX_W; vjoy_pos[i][4]=(u+1)/OSD_TEX_W;
vjoy_pos[i][5]=(v+1)/OSD_TEX_H; vjoy_pos[i][5]=(v+1)/OSD_TEX_H;
vjoy_pos[i][6]=((u+vjoy_sz[0][i]-1))/OSD_TEX_W; vjoy_pos[i][6]=((u+vjoy_sz[0][i]-1))/OSD_TEX_W;
vjoy_pos[i][7]=((v+vjoy_sz[1][i]-1))/OSD_TEX_H; vjoy_pos[i][7]=((v+vjoy_sz[1][i]-1))/OSD_TEX_H;
@ -1342,7 +1342,7 @@ void OSD_DRAW()
ShaderUniforms.scale_coefs[1]=-2/dc_height; ShaderUniforms.scale_coefs[1]=-2/dc_height;
ShaderUniforms.scale_coefs[2]=1-2*ds2s_offs_x/(screen_width); ShaderUniforms.scale_coefs[2]=1-2*ds2s_offs_x/(screen_width);
ShaderUniforms.scale_coefs[3]=-1; ShaderUniforms.scale_coefs[3]=-1;
glUniform4fv( gl.OSD_SHADER.scale, 1, ShaderUniforms.scale_coefs); glUniform4fv( gl.OSD_SHADER.scale, 1, ShaderUniforms.scale_coefs);
*/ */
@ -1367,7 +1367,7 @@ void OSD_DRAW()
{ {
float u=0; float u=0;
float v=0; float v=0;
verify(glIsProgram(gl.OSD_SHADER.program)); verify(glIsProgram(gl.OSD_SHADER.program));
float dc_width=640; float dc_width=640;
@ -1376,32 +1376,32 @@ void OSD_DRAW()
float dc2s_scale_h=screen_height/480.0f; float dc2s_scale_h=screen_height/480.0f;
float ds2s_offs_x=(screen_width-dc2s_scale_h*640)/2; float ds2s_offs_x=(screen_width-dc2s_scale_h*640)/2;
glBindTexture(GL_TEXTURE_2D,osd_font); glBindTexture(GL_TEXTURE_2D,osd_font);
glUseProgram(gl.OSD_SHADER.program); glUseProgram(gl.OSD_SHADER.program);
/* /*
//-1 -> too much to left //-1 -> too much to left
ShaderUniforms.scale_coefs[0]=2.0f/(screen_width/dc2s_scale_h); ShaderUniforms.scale_coefs[0]=2.0f/(screen_width/dc2s_scale_h);
ShaderUniforms.scale_coefs[1]=-2/dc_height; ShaderUniforms.scale_coefs[1]=-2/dc_height;
ShaderUniforms.scale_coefs[2]=1-2*ds2s_offs_x/(screen_width); ShaderUniforms.scale_coefs[2]=1-2*ds2s_offs_x/(screen_width);
ShaderUniforms.scale_coefs[3]=-1; ShaderUniforms.scale_coefs[3]=-1;
glUniform4fv( gl.OSD_SHADER.scale, 1, ShaderUniforms.scale_coefs); glUniform4fv( gl.OSD_SHADER.scale, 1, ShaderUniforms.scale_coefs);
*/ */
glEnable(GL_BLEND); glEnable(GL_BLEND);
glDisable(GL_DEPTH_TEST); glDisable(GL_DEPTH_TEST);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDepthMask(false); glDepthMask(false);
glDepthFunc(GL_ALWAYS); glDepthFunc(GL_ALWAYS);
glDisable(GL_CULL_FACE); glDisable(GL_CULL_FACE);
glDisable(GL_SCISSOR_TEST); glDisable(GL_SCISSOR_TEST);
int dfa=osd_count/4; int dfa=osd_count/4;
@ -1447,7 +1447,7 @@ bool RenderFrame()
//if (FrameCount&7) return; //if (FrameCount&7) return;
//Setup the matrix //Setup the matrix
//TODO: Make this dynamic //TODO: Make this dynamic
float vtx_min_fZ=0.f; //pvrrc.fZ_min; float vtx_min_fZ=0.f; //pvrrc.fZ_min;
float vtx_max_fZ=pvrrc.fZ_max; float vtx_max_fZ=pvrrc.fZ_max;
@ -1481,7 +1481,7 @@ bool RenderFrame()
Window space: Window space:
translated NDC (viewport, glDepth) translated NDC (viewport, glDepth)
Attributes: Attributes:
//this needs to be cleared up, been some time since I wrote my rasteriser and i'm starting //this needs to be cleared up, been some time since I wrote my rasteriser and i'm starting
//to forget/mixup stuff //to forget/mixup stuff
vaX -> VS output vaX -> VS output
@ -1513,7 +1513,7 @@ bool RenderFrame()
zt_o=(-min_fz-1)/fz == (-min_fz-1)*W zt_o=(-min_fz-1)/fz == (-min_fz-1)*W
x=fx/(fx_range/2)-1 //0 to max -> -1 to 1 x=fx/(fx_range/2)-1 //0 to max -> -1 to 1
y=fy/(-fy_range/2)+1 //0 to max -> 1 to -1 y=fy/(-fy_range/2)+1 //0 to max -> 1 to -1
z=-min_fz*W + (zt_s-1) //0 to +inf -> -1 to 1 z=-min_fz*W + (zt_s-1) //0 to +inf -> -1 to 1
@ -1574,7 +1574,7 @@ bool RenderFrame()
scale_x *= 0.5f; scale_x *= 0.5f;
} }
} }
if (SCALER_CTL.hscale) if (SCALER_CTL.hscale)
{ {
scale_x*=2; scale_x*=2;
@ -1629,7 +1629,7 @@ bool RenderFrame()
//printf("scale: %f, %f, %f, %f\n",scale_coefs[0],scale_coefs[1],scale_coefs[2],scale_coefs[3]); //printf("scale: %f, %f, %f, %f\n",scale_coefs[0],scale_coefs[1],scale_coefs[2],scale_coefs[3]);
//VERT and RAM fog color constants //VERT and RAM fog color constants
u8* fog_colvert_bgra=(u8*)&FOG_COL_VERT; u8* fog_colvert_bgra=(u8*)&FOG_COL_VERT;
u8* fog_colram_bgra=(u8*)&FOG_COL_RAM; u8* fog_colram_bgra=(u8*)&FOG_COL_RAM;
@ -1698,17 +1698,17 @@ bool RenderFrame()
channels=GL_RGBA; channels=GL_RGBA;
format=GL_UNSIGNED_SHORT_5_5_5_1; format=GL_UNSIGNED_SHORT_5_5_5_1;
break; break;
case 1: //0x1 565 RGB 16 bit case 1: //0x1 565 RGB 16 bit
channels=GL_RGB; channels=GL_RGB;
format=GL_UNSIGNED_SHORT_5_6_5; format=GL_UNSIGNED_SHORT_5_6_5;
break; break;
case 2: //0x2 4444 ARGB 16 bit case 2: //0x2 4444 ARGB 16 bit
channels=GL_RGBA; channels=GL_RGBA;
format=GL_UNSIGNED_SHORT_5_5_5_1; format=GL_UNSIGNED_SHORT_5_5_5_1;
break; break;
case 3://0x3 1555 ARGB 16 bit The alpha value is determined by comparison with the value of fb_alpha_threshold. case 3://0x3 1555 ARGB 16 bit The alpha value is determined by comparison with the value of fb_alpha_threshold.
channels=GL_RGBA; channels=GL_RGBA;
format=GL_UNSIGNED_SHORT_5_5_5_1; format=GL_UNSIGNED_SHORT_5_5_5_1;
@ -1718,12 +1718,12 @@ bool RenderFrame()
channels=GL_RGB; channels=GL_RGB;
format=GL_UNSIGNED_SHORT_5_6_5; format=GL_UNSIGNED_SHORT_5_6_5;
break; break;
case 5: //0x5 0888 KRGB 32 bit K is the value of fk_kval. case 5: //0x5 0888 KRGB 32 bit K is the value of fk_kval.
channels=GL_RGBA; channels=GL_RGBA;
format=GL_UNSIGNED_SHORT_4_4_4_4; format=GL_UNSIGNED_SHORT_4_4_4_4;
break; break;
case 6: //0x6 8888 ARGB 32 bit case 6: //0x6 8888 ARGB 32 bit
channels=GL_RGBA; channels=GL_RGBA;
format=GL_UNSIGNED_SHORT_4_4_4_4; format=GL_UNSIGNED_SHORT_4_4_4_4;
@ -1742,7 +1742,7 @@ bool RenderFrame()
glBindFramebuffer(GL_FRAMEBUFFER,0); glBindFramebuffer(GL_FRAMEBUFFER,0);
#endif #endif
} }
//Clear depth //Clear depth
//Color is cleared by the bgp //Color is cleared by the bgp
if (settings.rend.WideScreen) if (settings.rend.WideScreen)
@ -1776,7 +1776,7 @@ bool RenderFrame()
int offs_x=ds2s_offs_x+0.5f; int offs_x=ds2s_offs_x+0.5f;
//this needs to be scaled //this needs to be scaled
//not all scaling affects pixel operations, scale to adjust for that //not all scaling affects pixel operations, scale to adjust for that
scale_x *= scissoring_scale_x; scale_x *= scissoring_scale_x;
@ -1785,7 +1785,7 @@ bool RenderFrame()
printf("SS: %dx%d\n", screen_width, screen_height); printf("SS: %dx%d\n", screen_width, screen_height);
printf("SCI: %d, %f\n", pvrrc.fb_X_CLIP.max, dc2s_scale_h); printf("SCI: %d, %f\n", pvrrc.fb_X_CLIP.max, dc2s_scale_h);
printf("SCI: %f, %f, %f, %f\n", offs_x+pvrrc.fb_X_CLIP.min/scale_x,(pvrrc.fb_Y_CLIP.min/scale_y)*dc2s_scale_h,(pvrrc.fb_X_CLIP.max-pvrrc.fb_X_CLIP.min+1)/scale_x*dc2s_scale_h,(pvrrc.fb_Y_CLIP.max-pvrrc.fb_Y_CLIP.min+1)/scale_y*dc2s_scale_h); printf("SCI: %f, %f, %f, %f\n", offs_x+pvrrc.fb_X_CLIP.min/scale_x,(pvrrc.fb_Y_CLIP.min/scale_y)*dc2s_scale_h,(pvrrc.fb_X_CLIP.max-pvrrc.fb_X_CLIP.min+1)/scale_x*dc2s_scale_h,(pvrrc.fb_Y_CLIP.max-pvrrc.fb_Y_CLIP.min+1)/scale_y*dc2s_scale_h);
#endif #endif
glScissor(offs_x+pvrrc.fb_X_CLIP.min/scale_x,(pvrrc.fb_Y_CLIP.min/scale_y)*dc2s_scale_h,(pvrrc.fb_X_CLIP.max-pvrrc.fb_X_CLIP.min+1)/scale_x*dc2s_scale_h,(pvrrc.fb_Y_CLIP.max-pvrrc.fb_Y_CLIP.min+1)/scale_y*dc2s_scale_h); glScissor(offs_x+pvrrc.fb_X_CLIP.min/scale_x,(pvrrc.fb_Y_CLIP.min/scale_y)*dc2s_scale_h,(pvrrc.fb_X_CLIP.max-pvrrc.fb_X_CLIP.min+1)/scale_x*dc2s_scale_h,(pvrrc.fb_Y_CLIP.max-pvrrc.fb_Y_CLIP.min+1)/scale_y*dc2s_scale_h);
if (settings.rend.WideScreen && pvrrc.fb_X_CLIP.min==0 && ((pvrrc.fb_X_CLIP.max+1)/scale_x==640) && (pvrrc.fb_Y_CLIP.min==0) && ((pvrrc.fb_Y_CLIP.max+1)/scale_y==480 ) ) if (settings.rend.WideScreen && pvrrc.fb_X_CLIP.min==0 && ((pvrrc.fb_X_CLIP.max+1)/scale_x==640) && (pvrrc.fb_Y_CLIP.min==0) && ((pvrrc.fb_Y_CLIP.max+1)/scale_y==480 ) )
@ -1835,7 +1835,7 @@ bool rend_single_frame()
bool do_swp=false; bool do_swp=false;
//if (kcode[0]&(1<<9)) //if (kcode[0]&(1<<9))
{ {
//clear up & free data .. //clear up & free data ..
tactx_Recycle(_pvrrc); tactx_Recycle(_pvrrc);
@ -1856,16 +1856,16 @@ struct glesrend : Renderer
{ {
bool Init() { return gles_init(); } bool Init() { return gles_init(); }
void Resize(int w, int h) { screen_width=w; screen_height=h; } void Resize(int w, int h) { screen_width=w; screen_height=h; }
void Term() { } void Term() { }
bool Process(TA_context* ctx) { return ProcessFrame(ctx); } bool Process(TA_context* ctx) { return ProcessFrame(ctx); }
bool Render() { return RenderFrame(); } bool Render() { return RenderFrame(); }
void Present() { gl_swap(); } void Present() { gl_swap(); glViewport(0, 0, screen_width, screen_height); }
void DrawOSD() { OSD_DRAW(); } void DrawOSD() { OSD_DRAW(); }
virtual u32 GetTexture(TSP tsp, TCW tcw) { virtual u32 GetTexture(TSP tsp, TCW tcw) {
return gl_GetTexture(tsp, tcw); return gl_GetTexture(tsp, tcw);
} }
}; };
@ -1987,7 +1987,7 @@ GLuint loadPNG(const string& fname, int &width, int &height)
//row_pointers is for pointing to image_data for reading the png with libpng //row_pointers is for pointing to image_data for reading the png with libpng
png_bytep *row_pointers = new png_bytep[height]; png_bytep *row_pointers = new png_bytep[height];
if (!row_pointers) if (!row_pointers)
{ {
//clean up memory and close stuff //clean up memory and close stuff
png_destroy_read_struct(&png_ptr, &info_ptr, &end_info); png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);