make gl layer reinitializable

This commit is contained in:
kub 2022-09-16 17:07:14 +00:00
parent e3ea3015f0
commit c722861112
3 changed files with 27 additions and 15 deletions

30
gl.c
View file

@ -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();
}