X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=gl.c;h=c5c505066dc498ed7381677843bc3f4458540a5c;hb=HEAD;hp=0e18c45850de322c27b0aadc98124b0c4da14880;hpb=c668921a45b7a7f5f548d0e09836f143f56b4ae0;p=libpicofe.git diff --git a/gl.c b/gl.c index 0e18c45..c5c5050 100644 --- a/gl.c +++ b/gl.c @@ -10,10 +10,16 @@ static EGLDisplay edpy; 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 flip_old_w, flip_old_h; + static int gl_have_error(const char *name) { GLenum e = glGetError(); @@ -34,11 +40,9 @@ static int gles_have_error(const char *name) 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; @@ -53,8 +57,13 @@ int gl_init(void *display, void *window, int *quirks) goto out; } - tmp_texture_mem = calloc(1, 1024 * 512 * 2); - if (tmp_texture_mem == NULL) { + flip_old_w = flip_old_h = 0; + 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; } @@ -99,12 +108,15 @@ int gl_init(void *display, void *window, int *quirks) 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; @@ -127,7 +139,6 @@ int gl_init(void *display, void *window, int *quirks) gl_es_surface = (void *)esfc; retval = 0; out: - free(tmp_texture_mem); return retval; } @@ -152,18 +163,16 @@ static float texture[] = { int gl_flip(const void *fb, int w, int h) { - static int old_w, old_h; - if (fb != NULL) { - if (w != old_w || h != old_h) { - float f_w = (float)w / 1024.0f; - float f_h = (float)h / 512.0f; + if (w != flip_old_w || h != flip_old_h) { + 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; texture[3*2 + 1] = f_h; - old_w = w; - old_h = h; + flip_old_w = w; + flip_old_h = h; } glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, w, h, @@ -199,5 +208,8 @@ void gl_finish(void) gl_es_display = (void *)edpy; gl_es_surface = (void *)esfc; + if (tex_mem) free(tex_mem); + tex_mem = NULL; + gl_platform_finish(); }