X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=gl.c;fp=gl.c;h=3f72c770cfdf12c6b06676533cf45ecdd9c92f6f;hb=1dd8f2036e7da6fc2e28863c9f0be589572a71da;hp=0e18c45850de322c27b0aadc98124b0c4da14880;hpb=7167e5f3376f0d0692ae102ed2df1ef5d2cc199a;p=libpicofe.git diff --git a/gl.c b/gl.c index 0e18c45..3f72c77 100644 --- a/gl.c +++ b/gl.c @@ -10,10 +10,15 @@ 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 gl_have_error(const char *name) { GLenum e = glGetError(); @@ -34,11 +39,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 +56,10 @@ int gl_init(void *display, void *window, int *quirks) 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; } @@ -99,12 +104,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 +135,6 @@ int gl_init(void *display, void *window, int *quirks) gl_es_surface = (void *)esfc; retval = 0; out: - free(tmp_texture_mem); return retval; } @@ -156,8 +163,8 @@ int gl_flip(const void *fb, int w, int 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; + 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; @@ -199,5 +206,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(); }