X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=libpicofe.git;a=blobdiff_plain;f=gl.c;h=2ebb87c7077187561119db2069c90c74c6b1fed2;hp=44e0dd50e9001c4043a918b62493c183f4f16cc6;hb=HEAD;hpb=0d645bc539fdc073f20c4dea9f4a4e218cebec0e diff --git a/gl.c b/gl.c index 44e0dd5..c5c5050 100644 --- a/gl.c +++ b/gl.c @@ -10,6 +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(); @@ -30,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; @@ -49,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; } @@ -95,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; @@ -119,12 +135,18 @@ int gl_init(void *display, void *window, int *quirks) if (gl_have_error("init")) goto out; + gl_es_display = (void *)edpy; + 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 ^ @@ -141,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, @@ -185,5 +205,11 @@ void gl_finish(void) eglTerminate(edpy); edpy = EGL_NO_DISPLAY; + gl_es_display = (void *)edpy; + gl_es_surface = (void *)esfc; + + if (tex_mem) free(tex_mem); + tex_mem = NULL; + gl_platform_finish(); }