static EGLSurface esfc;
static EGLContext ectxt;
+static GLuint texture_name;
+
/* for external flips */
void *gl_es_display;
void *gl_es_surface;
+static int tex_w, tex_h;
+static void *tex_mem;
+
static int gl_have_error(const char *name)
{
GLenum e = glGetError();
return 0;
}
-int gl_init(void *display, void *window, int *quirks)
+int gl_init(void *display, void *window, int *quirks, int w, int h)
{
EGLConfig ecfg = NULL;
- GLuint texture_name = 0;
- void *tmp_texture_mem = NULL;
EGLint num_config;
int retval = -1;
int ret;
goto out;
}
- tmp_texture_mem = calloc(1, 1024 * 512 * 2);
- if (tmp_texture_mem == NULL) {
+ for (tex_w = 1; tex_w < w; tex_w *= 2);
+ for (tex_h = 1; tex_h < h; tex_h *= 2);
+ tex_mem = realloc(tex_mem, tex_w * tex_h * 2);
+ if (tex_mem == NULL) {
fprintf(stderr, "OOM\n");
goto out;
}
glEnable(GL_TEXTURE_2D);
+ if (texture_name)
+ glDeleteTextures(1, &texture_name);
+
glGenTextures(1, &texture_name);
glBindTexture(GL_TEXTURE_2D, texture_name);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1024, 512, 0, GL_RGB,
- GL_UNSIGNED_SHORT_5_6_5, tmp_texture_mem);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, tex_w, tex_h, 0, GL_RGB,
+ GL_UNSIGNED_SHORT_5_6_5, tex_mem);
if (gl_have_error("glTexImage2D"))
goto out;
gl_es_surface = (void *)esfc;
retval = 0;
out:
- free(tmp_texture_mem);
return retval;
}
if (fb != NULL) {
if (w != old_w || h != old_h) {
- float f_w = (float)w / 1024.0f;
- float f_h = (float)h / 512.0f;
+ float f_w = (float)w / tex_w;
+ float f_h = (float)h / tex_h;
texture[1*2 + 0] = f_w;
texture[2*2 + 1] = f_h;
texture[3*2 + 0] = f_w;
gl_es_display = (void *)edpy;
gl_es_surface = (void *)esfc;
+ if (tex_mem) free(tex_mem);
+ tex_mem = NULL;
+
gl_platform_finish();
}
#ifdef HAVE_GLES
-int gl_init(void *display, void *window, int *quirks);
+int gl_init(void *display, void *window, int *quirks, int w, int h);
void gl_announce(void);
int gl_flip(const void *fb, int w, int h);
void gl_finish(void);
#else
-static __inline int gl_init(void *display, void *window, int *quirks)
+static __inline int gl_init(void *display, void *window, int *quirks, int w, int h)
{
return -1;
}
}
}
else if (plat_target.vout_method == vout_mode_gl) {
- plat_sdl_gl_active = (gl_init(display, window, &gl_quirks) == 0);
+ int sw = plat_sdl_screen->w, sh = plat_sdl_screen->h;
+ plat_sdl_gl_active = (gl_init(display, window, &gl_quirks, sw, sh) == 0);
if (!plat_sdl_gl_active) {
fprintf(stderr, "warning: could not init GL.\n");
plat_target.vout_method = 0;
}
else if (plat_sdl_gl_active) {
if (gl_quirks & GL_QUIRK_ACTIVATE_RECREATE) {
+ int sw = plat_sdl_screen->w, sh = plat_sdl_screen->h;
gl_finish();
- plat_sdl_gl_active = (gl_init(display, window, &gl_quirks) == 0);
+ plat_sdl_gl_active = (gl_init(display, window, &gl_quirks, sw, sh) == 0);
}
gl_flip(NULL, 0, 0);
}
if (env)
try_gl = atoi(env);
if (try_gl)
- ret = gl_init(display, window, &gl_quirks);
+ ret = gl_init(display, window, &gl_quirks, g_menuscreen_w, g_menuscreen_h);
if (ret == 0) {
gl_announce();
gl_works = 1;