X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=gl.c;h=c5c505066dc498ed7381677843bc3f4458540a5c;hb=HEAD;hp=2ebb87c7077187561119db2069c90c74c6b1fed2;hpb=6fd09356f0d8c3d823f33c27b5e40041468b94b8;p=libpicofe.git diff --git a/gl.c b/gl.c index 2ebb87c..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,10 +139,14 @@ int gl_init(void *display, void *window, int *quirks) gl_es_surface = (void *)esfc; retval = 0; out: - free(tmp_texture_mem); return retval; } +void gl_announce(void) +{ + printf("GL_RENDERER: %s\n", (char *)glGetString(GL_RENDERER)); +} + static float vertices[] = { -1.0f, 1.0f, 0.0f, // 0 0 1 1.0f, 1.0f, 0.0f, // 1 ^ @@ -147,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, @@ -194,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(); }