0,0 → 1,100 |
#include <stdio.h> |
#include <stdlib.h> |
#include <string.h> |
|
#include "render.h" |
#include <kos32sys.h> |
|
void render_swap_and_blit(struct render *render) |
{ |
char proc_info[1024]; |
|
EGLContext context; |
EGLSurface draw, read; |
int winx, winy; |
|
float dst_xscale, dst_yscale; |
float *vertices = render->vertices; |
float *texcoords = render->texcoords; |
int r, b; |
|
if(render == NULL) |
return; |
|
get_proc_info(proc_info); |
|
winx = *(uint32_t*)(proc_info+34); |
winy = *(uint32_t*)(proc_info+38); |
|
context = eglGetCurrentContext(); |
draw = eglGetCurrentSurface(EGL_DRAW); |
read = eglGetCurrentSurface(EGL_READ); |
|
eglSwapBuffers(render->dpy,draw); |
|
if (!eglMakeCurrent(render->dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, render->context)) |
{ |
printf("failed to make window current"); |
goto err1; |
}; |
|
glUseProgram(render->blit_prog); |
glUniform1i(render->sampler, 0); |
|
glVertexAttribPointer(0, 2, GL_FLOAT,GL_FALSE, 2 * sizeof(float),render->vertices); |
glEnableVertexAttribArray(0); |
|
glActiveTexture(GL_TEXTURE0); |
glBindTexture(GL_TEXTURE_2D, render->tx_buffers[render->back_buffer]); |
glTexParameteri(GL_TEXTURE_2D, |
GL_TEXTURE_MIN_FILTER, |
GL_NEAREST); |
glTexParameteri(GL_TEXTURE_2D, |
GL_TEXTURE_MAG_FILTER, |
GL_NEAREST); |
|
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float),render->texcoords); |
glEnableVertexAttribArray(1); |
|
dst_xscale = 1.0/render->scr_width; |
dst_yscale = 1.0/render->scr_height; |
|
r = winx + render->dx + render->width; |
b = winy + render->dy + render->height; |
|
float t0, t1, t2, t5; |
|
vertices[0] = t0 = 2*(winx+render->dx)*dst_xscale - 1.0; |
vertices[1 * 2] = t2 = 2*r*dst_xscale - 1.0; |
|
vertices[2 * 2] = t2; |
vertices[3 * 2] = t0; |
|
vertices[1] = t1 = 2*(winy+render->dy)*dst_yscale - 1.0; |
vertices[2*2+1] = t5 = 2*b*dst_yscale - 1.0; |
vertices[1*2+1] = t1; |
vertices[3*2+1] = t5; |
|
texcoords[0] = 0.0; |
texcoords[1] = 0.0; |
texcoords[1*2] = 1.0; |
texcoords[1*2+1]= 0.0; |
texcoords[2*2] = 1.0; |
texcoords[2*2+1]= 1.0; |
texcoords[3*2] = 0.0; |
texcoords[3*2+1]= 1.0; |
|
glDrawArrays(GL_TRIANGLE_FAN, 0, 4); |
|
glDisableVertexAttribArray(0); |
glDisableVertexAttribArray(1); |
glDisable(GL_TEXTURE_2D); |
glUseProgram(0); |
|
render->back_buffer++; |
render->back_buffer&=1; |
|
err1: |
eglMakeCurrent(render->dpy, draw, read, context); |
} |
|