diff -Nur a/core/rend/gles/gles.cpp b/core/rend/gles/gles.cpp
--- a/core/rend/gles/gles.cpp	2015-10-06 21:43:53.047336437 -0300
+++ b/core/rend/gles/gles.cpp	2015-10-06 21:51:21.723570329 -0300
@@ -1,27 +1,3 @@
-#include <math.h>
-#include "gles.h"
-#include "rend/TexCache.h"
-#include "cfg/cfg.h"
-
-#ifdef TARGET_PANDORA
-#include <unistd.h>
-#include <fcntl.h>
-#include <sys/ioctl.h>
-#include <linux/fb.h>
-
-#ifndef FBIO_WAITFORVSYNC
-	#define FBIO_WAITFORVSYNC _IOW('F', 0x20, __u32)
-#endif
-int fbdev = -1;
-#endif
-
-#ifndef GLES
-#if HOST_OS != OS_DARWIN
-#include <GL3/gl3w.c>
-#pragma comment(lib,"Opengl32.lib")
-#endif
-#endif
-
 /*
 GL|ES 2
 Slower, smaller subset of gl2
@@ -54,305 +30,126 @@
 
 */
 
+#include <math.h>
+#include "cfg/cfg.h"
 #include "oslib/oslib.h"
 #include "rend/rend.h"
+#include "rend/TexCache.h"
 #include "hw/pvr/Renderer_if.h"
+#include "deps/libpng/png.h"
+#include "gles.h"
+#include "glshaders.h"
 
-void GenSorted();
-
-float fb_scale_x,fb_scale_y;
-
-#ifndef GLES
-#define attr "in"
-#define vary "out"
-#else
-#define attr "attribute"
-#define vary "varying"
+#ifdef TARGET_PANDORA
+	#include <unistd.h>
+	#include <fcntl.h>
+	#include <sys/ioctl.h>
+	#include <linux/fb.h>
 #endif
-#if 1
 
-//Fragment and vertex shaders code
-//pretty much 1:1 copy of the d3d ones for now
-const char* VertexShaderSource =
-#ifndef GLES
-	"#version 140 \n"
+#if !defined(GLES) && HOST_OS != OS_DARWIN
+	#include <GL3/gl3w.c>
+	#pragma comment(lib,"Opengl32.lib")
 #endif
-"\
-/* Vertex constants*/  \n\
-uniform highp vec4      scale; \n\
-uniform highp vec4      depth_scale; \n\
-uniform highp float sp_FOG_DENSITY; \n\
-/* Vertex input */ \n\
-" attr " highp vec4    in_pos; \n\
-" attr " lowp vec4     in_base; \n\
-" attr " lowp vec4     in_offs; \n\
-" attr " mediump vec2  in_uv; \n\
-/* output */ \n\
-" vary " lowp vec4 vtx_base; \n\
-" vary " lowp vec4 vtx_offs; \n\
-" vary " mediump vec2 vtx_uv; \n\
-" vary " highp vec3 vtx_xyz; \n\
-void main() \n\
-{ \n\
-	vtx_base=in_base; \n\
-	vtx_offs=in_offs; \n\
-	vtx_uv=in_uv; \n\
-	vec4 vpos=in_pos; \n\
-	vtx_xyz.xy = vpos.xy;  \n\
-	vtx_xyz.z = vpos.z*sp_FOG_DENSITY;  \n\
-	vpos.w=1.0/vpos.z;  \n\
-	vpos.xy=vpos.xy*scale.xy-scale.zw;  \n\
-	vpos.xy*=vpos.w;  \n\
-	vpos.z=depth_scale.x+depth_scale.y*vpos.w;  \n\
-	gl_Position = vpos; \n\
-}";
-
 
-#else
-
-
-
-const char* VertexShaderSource =
-				""
-				"/* Test Projection Matrix */"
-				""
-				"uniform highp mat4  Projection;"
-				""
-				""
-				"/* Vertex constants */"
-				""
-				"uniform highp float sp_FOG_DENSITY;"
-				"uniform highp vec4  scale;"
-				""
-				"/* Vertex output */"
-				""
-				"attribute highp   vec4 in_pos;"
-				"attribute lowp    vec4 in_base;"
-				"attribute lowp    vec4 in_offs;"
-				"attribute mediump vec2 in_uv;"
-				""
-				"/* Transformed input */"
-				""
-				"varying lowp    vec4 vtx_base;"
-				"varying lowp    vec4 vtx_offs;"
-				"varying mediump vec2 vtx_uv;"
-				"varying highp   vec3 vtx_xyz;"
-				""
-				"void main()"
-				"{"
-				"  vtx_base = in_base;"
-				"  vtx_offs = in_offs;"
-				"  vtx_uv   = in_uv;"
-				""
-				"  vec4 vpos  = in_pos;"
-				"  vtx_xyz.xy = vpos.xy; "
-				"  vtx_xyz.z  = vpos.z*sp_FOG_DENSITY; "
-				""
-				"  vpos.w     = 1.0/vpos.z; "
-				"  vpos.z    *= -scale.w; "
-				"  vpos.xy    = vpos.xy*scale.xy-sign(scale.xy); "
-				"  vpos.xy   *= vpos.w; "
-				""
-				"  gl_Position = vpos;"
-			//	"  gl_Position = vpos * Projection;"
-				"}"
-				;
+#define OSD_TEX_W 512
+#define OSD_TEX_H 256
 
+#define key_CONT_C           (1 << 0)
+#define key_CONT_B           (1 << 1)
+#define key_CONT_A           (1 << 2)
+#define key_CONT_START       (1 << 3)
+#define key_CONT_DPAD_UP     (1 << 4)
+#define key_CONT_DPAD_DOWN   (1 << 5)
+#define key_CONT_DPAD_LEFT   (1 << 6)
+#define key_CONT_DPAD_RIGHT  (1 << 7)
+#define key_CONT_Z           (1 << 8)
+#define key_CONT_Y           (1 << 9)
+#define key_CONT_X           (1 << 10)
+#define key_CONT_D           (1 << 11)
+#define key_CONT_DPAD2_UP    (1 << 12)
+#define key_CONT_DPAD2_DOWN  (1 << 13)
+#define key_CONT_DPAD2_LEFT  (1 << 14)
+#define key_CONT_DPAD2_RIGHT (1 << 15)
 
-#endif
+gl_ctx gl;
 
+float fb_scale_x;
+float fb_scale_y;
+int screen_width;
+int screen_height;
 
+GLuint osd_tex;
 
+extern u16 kcode[4];
+extern u8 rt[4];
+extern u8 lt[4];
 
+u32 osd_base;
+u32 osd_count;
 
+#if defined(_ANDROID)
+	extern float vjoy_pos[14][8];
+#else
+	float vjoy_pos[14][8]=
+	{
+		{24+0,24+64,64,64},     //LEFT
+		{24+64,24+0,64,64},     //UP
+		{24+128,24+64,64,64},   //RIGHT
+		{24+64,24+128,64,64},   //DOWN
+
+		{440+0,280+64,64,64},   //X
+		{440+64,280+0,64,64},   //Y
+		{440+128,280+64,64,64}, //B
+		{440+64,280+128,64,64}, //A
+
+		{320-32,360+32,64,64},  //Start
+
+		{440,200,90,64},        //RT
+		{542,200,90,64},        //LT
+
+		{-24,128+224,128,128},  //ANALOG_RING
+		{96,320,64,64},         //ANALOG_POINT
+		{1}
+	};
+#endif // !_ANDROID
 
-/*
+float vjoy_sz[2][14] = {
+	{ 64,64,64,64, 64,64,64,64, 64, 90,90, 128, 64 },
+	{ 64,64,64,64, 64,64,64,64, 64, 64,64, 128, 64 },
+};
 
-cp_AlphaTest 0 1        2 2
-pp_ClipTestMode -1 0 1  3 6
-pp_UseAlpha  0 1        2 12
-pp_Texture 1
-	pp_IgnoreTexA 0 1       2   2
-	pp_ShadInstr 0 1 2 3    4   8
-	pp_Offset 0 1           2   16
-	pp_FogCtrl 0 1 2 3      4   64
-pp_Texture 0
-	pp_FogCtrl 0 2 3        4   4
-
-pp_Texture: off -> 12*4=48 shaders
-pp_Texture: on  -> 12*64=768 shaders
-Total: 816 shaders
-
-highp float fdecp(highp float flt,out highp float e)  \n\
-{  \n\
-	highp float lg2=log2(flt);  //ie , 2.5  \n\
-	highp float frc=fract(lg2); //ie , 0.5  \n\
-	e=lg2-frc;                  //ie , 2.5-0.5=2 (exp)  \n\
-	return pow(2.0,frc);        //2^0.5 (manitsa)  \n\
-}  \n\
-lowp float fog_mode2(highp float invW)  \n\
-{  \n\
-	highp float foginvW=invW;  \n\
-	foginvW=clamp(foginvW,1.0,255.0);  \n\
-	  \n\
-	highp float fogexp;                                 //0 ... 7  \n\
-	highp float fogman=fdecp(foginvW, fogexp);          //[1,2) mantissa bits. that is 1.m  \n\
-	  \n\
-	highp float fogman_hi=fogman*16.0-16.0;             //[16,32) -16 -> [0,16)  \n\
-	highp float fogman_idx=floor(fogman_hi);            //[0,15]  \n\
-	highp float fogman_blend=fract(fogman_hi);          //[0,1) -- can also be fogman_idx-fogman_idx !  \n\
-	highp float fog_idx_fr=fogexp*16.0+fogman_idx;      //[0,127]  \n\
-	  \n\
-	highp float fog_idx_pixel_fr=fog_idx_fr+0.5;  \n\
-	highp float fog_idx_pixel_n=fog_idx_pixel_fr/128.0;//normalise to [0.5/128,127.5/128) coordinates  \n\
-  \n\
-	//fog is 128x1 texure  \n\
-	lowp vec2 fog_coefs=texture2D(fog_table,vec2(fog_idx_pixel_n)).rg;  \n\
-  \n\
-	lowp float fog_coef=mix(fog_coefs.r,fog_coefs.g,fogman_blend);  \n\
-	  \n\
-	return fog_coef;  \n\
-} \n\
-*/
+#ifdef TARGET_PANDORA
+	#ifndef FBIO_WAITFORVSYNC
+		#define FBIO_WAITFORVSYNC _IOW('F', 0x20, __u32)
+	#endif
 
-#ifndef GLES
-#define FRAGCOL "FragColor"
-#define TEXLOOKUP "texture"
-#define vary "in"
-#else
-#define FRAGCOL "gl_FragColor"
-#define TEXLOOKUP "texture2D"
+	int fbdev = -1;
+	char OSD_Info[128];
+	int  OSD_Delay = 0;
+	char OSD_Counters[256];
+	int  OSD_Counter = 0;
+	GLuint osd_font;
 #endif
 
-
-const char* PixelPipelineShader =
-#ifndef GLES
-	"#version 140 \n"
-	"out vec4 FragColor; \n"
+#if !defined(_ANDROID) && !defined(TARGET_NACL32) && HOST_OS==OS_LINUX
+	#define SET_AFNT 1
 #endif
-"\
-\
-#define cp_AlphaTest %d \n\
-#define pp_ClipTestMode %d.0 \n\
-#define pp_UseAlpha %d \n\
-#define pp_Texture %d \n\
-#define pp_IgnoreTexA %d \n\
-#define pp_ShadInstr %d \n\
-#define pp_Offset %d \n\
-#define pp_FogCtrl %d \n\
-/* Shader program params*/ \n\
-/* gles has no alpha test stage, so its emulated on the shader */ \n\
-uniform lowp float cp_AlphaTestValue; \n\
-uniform lowp vec4 pp_ClipTest; \n\
-uniform lowp vec3 sp_FOG_COL_RAM,sp_FOG_COL_VERT; \n\
-uniform highp vec2 sp_LOG_FOG_COEFS; \n\
-uniform sampler2D tex,fog_table; \n\
-/* Vertex input*/ \n\
-" vary " lowp vec4 vtx_base; \n\
-" vary " lowp vec4 vtx_offs; \n\
-" vary " mediump vec2 vtx_uv; \n\
-" vary " highp vec3 vtx_xyz; \n\
-lowp float fog_mode2(highp float val) \n\
-{ \n\
-	highp float fog_idx=clamp(val,0.0,127.99); \n\
-	return clamp(sp_LOG_FOG_COEFS.y*log2(fog_idx)+sp_LOG_FOG_COEFS.x,0.001,1.0); //the clamp is required due to yet another bug !\n\
-} \n\
-void main() \n\
-{ \n\
-	lowp vec4 color=vtx_base; \n\
-	#if pp_UseAlpha==0 \n\
-		color.a=1.0; \n\
-	#endif\n\
-	#if pp_FogCtrl==3 \n\
-		color=vec4(sp_FOG_COL_RAM.rgb,fog_mode2(vtx_xyz.z)); \n\
-	#endif\n\
-	#if pp_Texture==1 \n\
-	{ \n\
-		lowp vec4 texcol=" TEXLOOKUP "(tex,vtx_uv); \n\
-		\n\
-		#if pp_IgnoreTexA==1 \n\
-			texcol.a=1.0;	 \n\
-		#endif\n\
-		\n\
-		#if pp_ShadInstr==0 \n\
-		{ \n\
-			color.rgb=texcol.rgb; \n\
-			color.a=texcol.a; \n\
-		} \n\
-		#endif\n\
-		#if pp_ShadInstr==1 \n\
-		{ \n\
-			color.rgb*=texcol.rgb; \n\
-			color.a=texcol.a; \n\
-		} \n\
-		#endif\n\
-		#if pp_ShadInstr==2 \n\
-		{ \n\
-			color.rgb=mix(color.rgb,texcol.rgb,texcol.a); \n\
-		} \n\
-		#endif\n\
-		#if  pp_ShadInstr==3 \n\
-		{ \n\
-			color*=texcol; \n\
-		} \n\
-		#endif\n\
-		\n\
-		#if pp_Offset==1 \n\
-		{ \n\
-			color.rgb+=vtx_offs.rgb; \n\
-			if (pp_FogCtrl==1) \n\
-				color.rgb=mix(color.rgb,sp_FOG_COL_VERT.rgb,vtx_offs.a); \n\
-		} \n\
-		#endif\n\
-	} \n\
-	#endif\n\
-	#if pp_FogCtrl==0 \n\
-	{ \n\
-		color.rgb=mix(color.rgb,sp_FOG_COL_RAM.rgb,fog_mode2(vtx_xyz.z));  \n\
-	} \n\
-	#endif\n\
-	#if cp_AlphaTest == 1 \n\
-		if (cp_AlphaTestValue>color.a) discard;\n\
-	#endif  \n\
-	//color.rgb=vec3(vtx_xyz.z/255.0);\n\
-	" FRAGCOL "=color; \n\
-}";
 
-const char* ModifierVolumeShader =
-#ifndef GLES
-	"#version 140 \n"
-	"out vec4 FragColor; \n"
-#endif
-" \
-uniform lowp float sp_ShaderColor; \n\
-/* Vertex input*/ \n\
-void main() \n\
-{ \n\
-	" FRAGCOL "=vec4(0.0, 0.0, 0.0, sp_ShaderColor); \n\
-}";
+FILE* pngfile;
 
-const char* OSD_Shader =
-#ifndef GLES
-	"#version 140 \n"
-	"out vec4 FragColor; \n"
-#endif
-" \
-" vary " lowp vec4 vtx_base; \n\
-" vary " mediump vec2 vtx_uv; \n\
-/* Vertex input*/ \n\
-uniform sampler2D tex; \n\
-void main() \n\
-{ \n\
-	mediump vec2 uv=vtx_uv; \n\
-	uv.y=1.0-uv.y; \n\
-	" FRAGCOL "=vtx_base*" TEXLOOKUP "(tex,uv.st); \n\n\
-}";
+void GenSorted();
 
+bool gl_init(void* wind, void* disp);
 
-gl_ctx gl;
+//swap buffers
+void gl_swap();
+//destroy the gles context and free resources
+void gl_term();
 
-int screen_width;
-int screen_height;
+GLuint gl_CompileShader(const char* shader,GLuint type);
+
+bool gl_create_resources();
 
 #if (HOST_OS != OS_DARWIN) && !defined(TARGET_NACL32)
 #ifdef GLES
@@ -843,11 +640,6 @@
 	return glIsProgram(s->program)==GL_TRUE;
 }
 
-GLuint osd_tex;
-#ifdef TARGET_PANDORA
-GLuint osd_font;
-#endif
-
 bool gl_create_resources()
 {
 
@@ -938,51 +730,8 @@
 	return true;
 }
 
-bool gl_init(void* wind, void* disp);
-
-//swap buffers
-void gl_swap();
-//destroy the gles context and free resources
-void gl_term();
-
-GLuint gl_CompileShader(const char* shader,GLuint type);
-
-bool gl_create_resources();
-
 //setup
 
-
-bool gles_init()
-{
-
-	if (!gl_init((void*)libPvr_GetRenderTarget(),
-		         (void*)libPvr_GetRenderSurface()))
-			return false;
-
-	if (!gl_create_resources())
-		return false;
-
-#if defined(GLES) && HOST_OS != OS_DARWIN && !defined(TARGET_NACL32)
-	#ifdef TARGET_PANDORA
-	fbdev=open("/dev/fb0", O_RDONLY);
-	#else
-	eglSwapInterval(gl.setup.display,1);
-	#endif
-#endif
-
-	//clean up all buffers ...
-	for (int i=0;i<10;i++)
-	{
-		glClearColor(0.f, 0.f, 0.f, 0.f);
-		glClear(GL_COLOR_BUFFER_BIT);
-		gl_swap();
-	}
-
-	return true;
-}
-
-
-
 float fog_coefs[]={0,0};
 void tryfit(float* x,float* y)
 {
@@ -1043,64 +792,6 @@
 	//printf("%f\n",B*log(maxdev)/log(2.0)+A);
 }
 
-
-
-extern u16 kcode[4];
-extern u8 rt[4],lt[4];
-
-#define key_CONT_C           (1 << 0)
-#define key_CONT_B           (1 << 1)
-#define key_CONT_A           (1 << 2)
-#define key_CONT_START       (1 << 3)
-#define key_CONT_DPAD_UP     (1 << 4)
-#define key_CONT_DPAD_DOWN   (1 << 5)
-#define key_CONT_DPAD_LEFT   (1 << 6)
-#define key_CONT_DPAD_RIGHT  (1 << 7)
-#define key_CONT_Z           (1 << 8)
-#define key_CONT_Y           (1 << 9)
-#define key_CONT_X           (1 << 10)
-#define key_CONT_D           (1 << 11)
-#define key_CONT_DPAD2_UP    (1 << 12)
-#define key_CONT_DPAD2_DOWN  (1 << 13)
-#define key_CONT_DPAD2_LEFT  (1 << 14)
-#define key_CONT_DPAD2_RIGHT (1 << 15)
-
-u32 osd_base;
-u32 osd_count;
-
-
-#if defined(_ANDROID)
-extern float vjoy_pos[14][8];
-#else
-
-float vjoy_pos[14][8]=
-{
-	{24+0,24+64,64,64},     //LEFT
-	{24+64,24+0,64,64},     //UP
-	{24+128,24+64,64,64},   //RIGHT
-	{24+64,24+128,64,64},   //DOWN
-
-	{440+0,280+64,64,64},   //X
-	{440+64,280+0,64,64},   //Y
-	{440+128,280+64,64,64}, //B
-	{440+64,280+128,64,64}, //A
-
-	{320-32,360+32,64,64},  //Start
-
-	{440,200,90,64},        //RT
-	{542,200,90,64},        //LT
-
-	{-24,128+224,128,128},  //ANALOG_RING
-	{96,320,64,64},         //ANALOG_POINT
-	{1}
-};
-#endif // !_ANDROID
-
-float vjoy_sz[2][14] = {
-	{ 64,64,64,64, 64,64,64,64, 64, 90,90, 128, 64 },
-	{ 64,64,64,64, 64,64,64,64, 64, 64,64, 128, 64 },
-};
-
 static void DrawButton(float* xy, u32 state)
 {
 	Vertex vtx;
@@ -1139,12 +830,6 @@
 	osd_count+=4;
 }
 
-static void ClearBG()
-{
-
-}
-
-
 void DrawButton2(float* xy, bool state) { DrawButton(xy,state?0:255); }
 #ifdef TARGET_PANDORA
 static void DrawCenteredText(float yy, float scale, int transparency, const char* text)
@@ -1247,13 +932,6 @@
 }
 #endif
 
-#ifdef TARGET_PANDORA
-char OSD_Info[128];
-int  OSD_Delay=0;
-char OSD_Counters[256];
-int  OSD_Counter=0;
-#endif
-
 static void OSD_HOOK()
 {
 	osd_base=pvrrc.verts.used();
@@ -1290,128 +968,95 @@
 	#endif
 }
 
-extern GLuint osd_tex;
-#ifdef TARGET_PANDORA
-extern GLuint osd_font;
-#endif
-
-#define OSD_TEX_W 512
-#define OSD_TEX_H 256
-
-void OSD_DRAW()
+/*
+bool rend_single_frame()
 {
-	#ifndef TARGET_PANDORA
-	if (osd_tex)
-	{
-		float u=0;
-		float v=0;
-
-		for (int i=0;i<13;i++)
-		{
-			//umin,vmin,umax,vmax
-			vjoy_pos[i][4]=(u+1)/OSD_TEX_W;
-			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][7]=((v+vjoy_sz[1][i]-1))/OSD_TEX_H;
-
-			u+=vjoy_sz[0][i];
-			if (u>=OSD_TEX_W)
-			{
-				u-=OSD_TEX_W;
-				v+=vjoy_sz[1][i];
-			}
-			//v+=vjoy_pos[i][3];
-		}
-
-		verify(glIsProgram(gl.OSD_SHADER.program));
+	//wait render start only if no frame pending
+	_pvrrc = DequeueRender();
 
-		glBindTexture(GL_TEXTURE_2D,osd_tex);
-		glUseProgram(gl.OSD_SHADER.program);
+	while (!_pvrrc)
+	{
+		rs.Wait();
+		_pvrrc = DequeueRender();
+	}
 
-		//reset rendering scale
-/*
-		float dc_width=640;
-		float dc_height=480;
+	bool do_swp=false;
+	//if (kcode[0]&(1<<9))
+	{
 
-		float dc2s_scale_h=screen_height/480.0f;
-		float ds2s_offs_x=(screen_width-dc2s_scale_h*640)/2;
 
-		//-1 -> too much to left
-		ShaderUniforms.scale_coefs[0]=2.0f/(screen_width/dc2s_scale_h);
-		ShaderUniforms.scale_coefs[1]=-2/dc_height;
-		ShaderUniforms.scale_coefs[2]=1-2*ds2s_offs_x/(screen_width);
-		ShaderUniforms.scale_coefs[3]=-1;
+	//clear up & free data ..
+	tactx_Recycle(_pvrrc);
+	_pvrrc=0;
 
-		glUniform4fv( gl.OSD_SHADER.scale, 1, ShaderUniforms.scale_coefs);
+	return do_swp;
+}
 */
 
-		glEnable(GL_BLEND);
-		glDisable(GL_DEPTH_TEST);
-		glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
-		glDepthMask(false);
-		glDepthFunc(GL_ALWAYS);
-
-		glDisable(GL_CULL_FACE);
-		glDisable(GL_SCISSOR_TEST);
-
-		int dfa=osd_count/4;
-
-		for (int i=0;i<dfa;i++)
-			glDrawArrays(GL_TRIANGLE_STRIP,osd_base+i*4,4);
-	}
-#endif
-#ifdef TARGET_PANDORA
-  if (osd_font)
-  {
-    float u=0;
-    float v=0;
-
-    verify(glIsProgram(gl.OSD_SHADER.program));
-
-	float dc_width=640;
-	float dc_height=480;
-
-	float dc2s_scale_h=screen_height/480.0f;
-	float ds2s_offs_x=(screen_width-dc2s_scale_h*640)/2;
 
+void rend_set_fb_scale(float x,float y)
+{
+	fb_scale_x=x;
+	fb_scale_y=y;
+}
 
-    glBindTexture(GL_TEXTURE_2D,osd_font);
-    glUseProgram(gl.OSD_SHADER.program);
+struct glesrend : Renderer
+{
+	bool Init();
+	void Resize(int width, int height);
+	void Term();
 
-  /*
-    //-1 -> too much to left
-    ShaderUniforms.scale_coefs[0]=2.0f/(screen_width/dc2s_scale_h);
-    ShaderUniforms.scale_coefs[1]=-2/dc_height;
-    ShaderUniforms.scale_coefs[2]=1-2*ds2s_offs_x/(screen_width);
-    ShaderUniforms.scale_coefs[3]=-1;
+	bool Process(TA_context* ctx);
+	bool Render();
 
-    glUniform4fv( gl.OSD_SHADER.scale, 1, ShaderUniforms.scale_coefs);
-*/
+	void Present();
 
-    glEnable(GL_BLEND);
-    glDisable(GL_DEPTH_TEST);
-    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+	void DrawOSD();
 
+	virtual u32 GetTexture(TSP tsp, TCW tcw);
+};
 
-    glDepthMask(false);
-    glDepthFunc(GL_ALWAYS);
+bool glesrend::Init()
+{
+	
+	if (!gl_init((void*)libPvr_GetRenderTarget(), (void*)libPvr_GetRenderSurface()))
+	{
+		return false;
+	}
 
+	if (!gl_create_resources())
+	{
+		return false;
+	}
 
-    glDisable(GL_CULL_FACE);
-    glDisable(GL_SCISSOR_TEST);
+	#if defined(GLES) && HOST_OS != OS_DARWIN && !defined(TARGET_NACL32)
+		#ifdef TARGET_PANDORA
+			fbdev = open("/dev/fb0", O_RDONLY);
+		#else
+			eglSwapInterval(gl.setup.display,1);
+		#endif
+	#endif
 
+	//clean up all buffers ...
+	for (int i=0;i<10;i++)
+	{
+		glClearColor(0.f, 0.f, 0.f, 0.f);
+		glClear(GL_COLOR_BUFFER_BIT);
+		gl_swap();
+	}
 
-    int dfa=osd_count/4;
+	return true;
+}
 
-   	for (int i=0;i<dfa;i++)
-		glDrawArrays(GL_TRIANGLE_STRIP,osd_base+i*4,4);
- }
-#endif
+void glesrend::Resize(int width, int height)
+{
+	screen_width = width;
+	screen_height = height;
 }
 
-bool ProcessFrame(TA_context* ctx)
+void glesrend::Term() { };
+
+bool glesrend::Process(TA_context* ctx)
 {
 	//disable RTTs for now ..
 	if (ctx->rend.isRTT)
@@ -1435,7 +1080,7 @@
 	return true;
 }
 
-bool RenderFrame()
+bool glesrend::Render()
 {
 	DoCleanup();
 
@@ -1737,10 +1382,10 @@
 	}
 	else
 	{
-#if HOST_OS != OS_DARWIN
-        //Fix this in a proper way
-		glBindFramebuffer(GL_FRAMEBUFFER,0);
-#endif
+		#if HOST_OS != OS_DARWIN
+			//Fix this in a proper way
+			glBindFramebuffer(GL_FRAMEBUFFER,0);
+		#endif
 	}
 
 	//Clear depth
@@ -1812,68 +1457,93 @@
 	return !is_rtt;
 }
 
-#if !defined(_ANDROID) && !defined(TARGET_NACL32)
-#if HOST_OS==OS_LINUX
-#define SET_AFNT 1
-#endif
-#endif
-
-extern u16 kcode[4];
+void glesrend::Present()
+{
+	gl_swap();
+	glViewport(0, 0, screen_width, screen_height);
+}
 
-/*
-bool rend_single_frame()
+void glesrend::DrawOSD()
 {
-	//wait render start only if no frame pending
-	_pvrrc = DequeueRender();
+	#ifdef TARGET_PANDORA
+	GLuint osd_texture = osd_font;
+	#else
+	GLuint osd_texture = osd_tex;
+	#endif
 
-	while (!_pvrrc)
+	if (!osd_texture)
 	{
-		rs.Wait();
-		_pvrrc = DequeueRender();
+		return;
 	}
 
-	bool do_swp=false;
-	//if (kcode[0]&(1<<9))
-	{
+	verify(glIsProgram(gl.OSD_SHADER.program));
 
+	#ifndef TARGET_PANDORA
+		float u = 0;
+		float v = 0;
+		
+		for (int i = 0; i < 13; i++)
+		{
+			//umin,vmin,umax,vmax
+			vjoy_pos[i][4]=(u+1)/OSD_TEX_W;
+			vjoy_pos[i][5]=(v+1)/OSD_TEX_H;
 
-	//clear up & free data ..
-	tactx_Recycle(_pvrrc);
-	_pvrrc=0;
+			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;
 
-	return do_swp;
-}
-*/
+			u+=vjoy_sz[0][i];
+			if (u>=OSD_TEX_W)
+			{
+				u-=OSD_TEX_W;
+				v+=vjoy_sz[1][i];
+			}
+			//v+=vjoy_pos[i][3];
+		}
+	#endif
 
+	glBindTexture(GL_TEXTURE_2D, osd_texture);
+	glUseProgram(gl.OSD_SHADER.program);
 
-void rend_set_fb_scale(float x,float y)
-{
-	fb_scale_x=x;
-	fb_scale_y=y;
-}
+	/*
+	//reset rendering scale
 
-struct glesrend : Renderer
-{
-	bool Init() { return gles_init(); }
-	void Resize(int w, int h) { screen_width=w; screen_height=h; }
-	void Term() { }
+	float dc_width=640;
+	float dc_height=480;
 
-	bool Process(TA_context* ctx) { return ProcessFrame(ctx); }
-	bool Render() { return RenderFrame(); }
+	float dc2s_scale_h=screen_height/480.0f;
+	float ds2s_offs_x=(screen_width-dc2s_scale_h*640)/2;
 
-	void Present() { gl_swap(); glViewport(0, 0, screen_width, screen_height); }
+	//-1 -> too much to left
+	ShaderUniforms.scale_coefs[0]=2.0f/(screen_width/dc2s_scale_h);
+	ShaderUniforms.scale_coefs[1]=-2/dc_height;
+	ShaderUniforms.scale_coefs[2]=1-2*ds2s_offs_x/(screen_width);
+	ShaderUniforms.scale_coefs[3]=-1;
 
-	void DrawOSD() { OSD_DRAW(); }
+	glUniform4fv( gl.OSD_SHADER.scale, 1, ShaderUniforms.scale_coefs);
+	*/
 
-	virtual u32 GetTexture(TSP tsp, TCW tcw) {
-		return gl_GetTexture(tsp, tcw);
-	}
-};
+	glEnable(GL_BLEND);
+	glDisable(GL_DEPTH_TEST);
+	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 
+	glDepthMask(false);
+	glDepthFunc(GL_ALWAYS);
 
-#include "deps/libpng/png.h"
+	glDisable(GL_CULL_FACE);
+	glDisable(GL_SCISSOR_TEST);
 
-FILE* pngfile;
+	int dfa = osd_count/4;
+
+	for (int i = 0; i < dfa; i++)
+	{
+		glDrawArrays(GL_TRIANGLE_STRIP, osd_base + i*4, 4);
+	}
+}
+
+u32 glesrend::GetTexture(TSP tsp, TCW tcw)
+{
+	return gl_GetTexture(tsp, tcw);
+}
 
 void png_cstd_read(png_structp png_ptr, png_bytep data, png_size_t length)
 {
@@ -2021,5 +1691,4 @@
 	return texture;
 }
 
-
 Renderer* rend_GLES2() { return new glesrend(); }
diff -Nur a/core/rend/gles/glshaders.cpp b/core/rend/gles/glshaders.cpp
--- a/core/rend/gles/glshaders.cpp	1969-12-31 21:00:00.000000000 -0300
+++ b/core/rend/gles/glshaders.cpp	2015-10-06 21:51:21.723570329 -0300
@@ -0,0 +1,280 @@
+#ifndef GLES
+#define attr "in"
+#define vary "out"
+#else
+#define attr "attribute"
+#define vary "varying"
+#endif
+#if 1
+
+//Fragment and vertex shaders code
+//pretty much 1:1 copy of the d3d ones for now
+const char* VertexShaderSource =
+#ifndef GLES
+	"#version 140 \n"
+#endif
+"\
+/* Vertex constants*/  \n\
+uniform highp vec4      scale; \n\
+uniform highp vec4      depth_scale; \n\
+uniform highp float sp_FOG_DENSITY; \n\
+/* Vertex input */ \n\
+" attr " highp vec4    in_pos; \n\
+" attr " lowp vec4     in_base; \n\
+" attr " lowp vec4     in_offs; \n\
+" attr " mediump vec2  in_uv; \n\
+/* output */ \n\
+" vary " lowp vec4 vtx_base; \n\
+" vary " lowp vec4 vtx_offs; \n\
+" vary " mediump vec2 vtx_uv; \n\
+" vary " highp vec3 vtx_xyz; \n\
+void main() \n\
+{ \n\
+	vtx_base=in_base; \n\
+	vtx_offs=in_offs; \n\
+	vtx_uv=in_uv; \n\
+	vec4 vpos=in_pos; \n\
+	vtx_xyz.xy = vpos.xy;  \n\
+	vtx_xyz.z = vpos.z*sp_FOG_DENSITY;  \n\
+	vpos.w=1.0/vpos.z;  \n\
+	vpos.xy=vpos.xy*scale.xy-scale.zw;  \n\
+	vpos.xy*=vpos.w;  \n\
+	vpos.z=depth_scale.x+depth_scale.y*vpos.w;  \n\
+	gl_Position = vpos; \n\
+}";
+
+
+#else
+
+
+
+const char* VertexShaderSource =
+				""
+				"/* Test Projection Matrix */"
+				""
+				"uniform highp mat4  Projection;"
+				""
+				""
+				"/* Vertex constants */"
+				""
+				"uniform highp float sp_FOG_DENSITY;"
+				"uniform highp vec4  scale;"
+				""
+				"/* Vertex output */"
+				""
+				"attribute highp   vec4 in_pos;"
+				"attribute lowp    vec4 in_base;"
+				"attribute lowp    vec4 in_offs;"
+				"attribute mediump vec2 in_uv;"
+				""
+				"/* Transformed input */"
+				""
+				"varying lowp    vec4 vtx_base;"
+				"varying lowp    vec4 vtx_offs;"
+				"varying mediump vec2 vtx_uv;"
+				"varying highp   vec3 vtx_xyz;"
+				""
+				"void main()"
+				"{"
+				"  vtx_base = in_base;"
+				"  vtx_offs = in_offs;"
+				"  vtx_uv   = in_uv;"
+				""
+				"  vec4 vpos  = in_pos;"
+				"  vtx_xyz.xy = vpos.xy; "
+				"  vtx_xyz.z  = vpos.z*sp_FOG_DENSITY; "
+				""
+				"  vpos.w     = 1.0/vpos.z; "
+				"  vpos.z    *= -scale.w; "
+				"  vpos.xy    = vpos.xy*scale.xy-sign(scale.xy); "
+				"  vpos.xy   *= vpos.w; "
+				""
+				"  gl_Position = vpos;"
+			//	"  gl_Position = vpos * Projection;"
+				"}"
+				;
+
+
+#endif
+
+/*
+
+cp_AlphaTest 0 1        2 2
+pp_ClipTestMode -1 0 1  3 6
+pp_UseAlpha  0 1        2 12
+pp_Texture 1
+	pp_IgnoreTexA 0 1       2   2
+	pp_ShadInstr 0 1 2 3    4   8
+	pp_Offset 0 1           2   16
+	pp_FogCtrl 0 1 2 3      4   64
+pp_Texture 0
+	pp_FogCtrl 0 2 3        4   4
+
+pp_Texture: off -> 12*4=48 shaders
+pp_Texture: on  -> 12*64=768 shaders
+Total: 816 shaders
+
+highp float fdecp(highp float flt,out highp float e)  \n\
+{  \n\
+	highp float lg2=log2(flt);  //ie , 2.5  \n\
+	highp float frc=fract(lg2); //ie , 0.5  \n\
+	e=lg2-frc;                  //ie , 2.5-0.5=2 (exp)  \n\
+	return pow(2.0,frc);        //2^0.5 (manitsa)  \n\
+}  \n\
+lowp float fog_mode2(highp float invW)  \n\
+{  \n\
+	highp float foginvW=invW;  \n\
+	foginvW=clamp(foginvW,1.0,255.0);  \n\
+	  \n\
+	highp float fogexp;                                 //0 ... 7  \n\
+	highp float fogman=fdecp(foginvW, fogexp);          //[1,2) mantissa bits. that is 1.m  \n\
+	  \n\
+	highp float fogman_hi=fogman*16.0-16.0;             //[16,32) -16 -> [0,16)  \n\
+	highp float fogman_idx=floor(fogman_hi);            //[0,15]  \n\
+	highp float fogman_blend=fract(fogman_hi);          //[0,1) -- can also be fogman_idx-fogman_idx !  \n\
+	highp float fog_idx_fr=fogexp*16.0+fogman_idx;      //[0,127]  \n\
+	  \n\
+	highp float fog_idx_pixel_fr=fog_idx_fr+0.5;  \n\
+	highp float fog_idx_pixel_n=fog_idx_pixel_fr/128.0;//normalise to [0.5/128,127.5/128) coordinates  \n\
+  \n\
+	//fog is 128x1 texure  \n\
+	lowp vec2 fog_coefs=texture2D(fog_table,vec2(fog_idx_pixel_n)).rg;  \n\
+  \n\
+	lowp float fog_coef=mix(fog_coefs.r,fog_coefs.g,fogman_blend);  \n\
+	  \n\
+	return fog_coef;  \n\
+} \n\
+*/
+
+#ifndef GLES
+#define FRAGCOL "FragColor"
+#define TEXLOOKUP "texture"
+#define vary "in"
+#else
+#define FRAGCOL "gl_FragColor"
+#define TEXLOOKUP "texture2D"
+#endif
+
+
+const char* PixelPipelineShader =
+#ifndef GLES
+	"#version 140 \n"
+	"out vec4 FragColor; \n"
+#endif
+"\
+\
+#define cp_AlphaTest %d \n\
+#define pp_ClipTestMode %d.0 \n\
+#define pp_UseAlpha %d \n\
+#define pp_Texture %d \n\
+#define pp_IgnoreTexA %d \n\
+#define pp_ShadInstr %d \n\
+#define pp_Offset %d \n\
+#define pp_FogCtrl %d \n\
+/* Shader program params*/ \n\
+/* gles has no alpha test stage, so its emulated on the shader */ \n\
+uniform lowp float cp_AlphaTestValue; \n\
+uniform lowp vec4 pp_ClipTest; \n\
+uniform lowp vec3 sp_FOG_COL_RAM,sp_FOG_COL_VERT; \n\
+uniform highp vec2 sp_LOG_FOG_COEFS; \n\
+uniform sampler2D tex,fog_table; \n\
+/* Vertex input*/ \n\
+" vary " lowp vec4 vtx_base; \n\
+" vary " lowp vec4 vtx_offs; \n\
+" vary " mediump vec2 vtx_uv; \n\
+" vary " highp vec3 vtx_xyz; \n\
+lowp float fog_mode2(highp float val) \n\
+{ \n\
+	highp float fog_idx=clamp(val,0.0,127.99); \n\
+	return clamp(sp_LOG_FOG_COEFS.y*log2(fog_idx)+sp_LOG_FOG_COEFS.x,0.001,1.0); //the clamp is required due to yet another bug !\n\
+} \n\
+void main() \n\
+{ \n\
+	lowp vec4 color=vtx_base; \n\
+	#if pp_UseAlpha==0 \n\
+		color.a=1.0; \n\
+	#endif\n\
+	#if pp_FogCtrl==3 \n\
+		color=vec4(sp_FOG_COL_RAM.rgb,fog_mode2(vtx_xyz.z)); \n\
+	#endif\n\
+	#if pp_Texture==1 \n\
+	{ \n\
+		lowp vec4 texcol=" TEXLOOKUP "(tex,vtx_uv); \n\
+		\n\
+		#if pp_IgnoreTexA==1 \n\
+			texcol.a=1.0;	 \n\
+		#endif\n\
+		\n\
+		#if pp_ShadInstr==0 \n\
+		{ \n\
+			color.rgb=texcol.rgb; \n\
+			color.a=texcol.a; \n\
+		} \n\
+		#endif\n\
+		#if pp_ShadInstr==1 \n\
+		{ \n\
+			color.rgb*=texcol.rgb; \n\
+			color.a=texcol.a; \n\
+		} \n\
+		#endif\n\
+		#if pp_ShadInstr==2 \n\
+		{ \n\
+			color.rgb=mix(color.rgb,texcol.rgb,texcol.a); \n\
+		} \n\
+		#endif\n\
+		#if  pp_ShadInstr==3 \n\
+		{ \n\
+			color*=texcol; \n\
+		} \n\
+		#endif\n\
+		\n\
+		#if pp_Offset==1 \n\
+		{ \n\
+			color.rgb+=vtx_offs.rgb; \n\
+			if (pp_FogCtrl==1) \n\
+				color.rgb=mix(color.rgb,sp_FOG_COL_VERT.rgb,vtx_offs.a); \n\
+		} \n\
+		#endif\n\
+	} \n\
+	#endif\n\
+	#if pp_FogCtrl==0 \n\
+	{ \n\
+		color.rgb=mix(color.rgb,sp_FOG_COL_RAM.rgb,fog_mode2(vtx_xyz.z));  \n\
+	} \n\
+	#endif\n\
+	#if cp_AlphaTest == 1 \n\
+		if (cp_AlphaTestValue>color.a) discard;\n\
+	#endif  \n\
+	//color.rgb=vec3(vtx_xyz.z/255.0);\n\
+	" FRAGCOL "=color; \n\
+}";
+
+const char* ModifierVolumeShader =
+#ifndef GLES
+	"#version 140 \n"
+	"out vec4 FragColor; \n"
+#endif
+" \
+uniform lowp float sp_ShaderColor; \n\
+/* Vertex input*/ \n\
+void main() \n\
+{ \n\
+	" FRAGCOL "=vec4(0.0, 0.0, 0.0, sp_ShaderColor); \n\
+}";
+
+const char* OSD_Shader =
+#ifndef GLES
+	"#version 140 \n"
+	"out vec4 FragColor; \n"
+#endif
+" \
+" vary " lowp vec4 vtx_base; \n\
+" vary " mediump vec2 vtx_uv; \n\
+/* Vertex input*/ \n\
+uniform sampler2D tex; \n\
+void main() \n\
+{ \n\
+	mediump vec2 uv=vtx_uv; \n\
+	uv.y=1.0-uv.y; \n\
+	" FRAGCOL "=vtx_base*" TEXLOOKUP "(tex,uv.st); \n\n\
+}";
diff -Nur a/core/rend/gles/glshaders.h b/core/rend/gles/glshaders.h
--- a/core/rend/gles/glshaders.h	1969-12-31 21:00:00.000000000 -0300
+++ b/core/rend/gles/glshaders.h	2015-10-06 21:51:21.723570329 -0300
@@ -0,0 +1,5 @@
+#pragma once
+extern const char* VertexShaderSource;
+extern const char* PixelPipelineShader;
+extern const char* ModifierVolumeShader;
+extern const char* OSD_Shader;
\ No newline at end of file