mirror of
https://github.com/yshui/picom.git
synced 2024-11-11 13:51:02 -05:00
gl_common: update gl_compose to core profile
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
This commit is contained in:
parent
f08004a448
commit
ffc9c32b5e
2 changed files with 70 additions and 39 deletions
|
@ -174,6 +174,15 @@ void gl_compose(backend_t *base, void *image_data, int dst_x, int dst_y,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Painting
|
||||||
|
int nrects;
|
||||||
|
const rect_t *rects;
|
||||||
|
rects = pixman_region32_rectangles((region_t *)reg_tgt, &nrects);
|
||||||
|
if (!nrects) {
|
||||||
|
// Nothing to paint
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// dst_y is the top coordinate, in OpenGL, it is the upper bound of the y
|
// dst_y is the top coordinate, in OpenGL, it is the upper bound of the y
|
||||||
// coordinate.
|
// coordinate.
|
||||||
dst_y = gd->height - dst_y;
|
dst_y = gd->height - dst_y;
|
||||||
|
@ -181,7 +190,7 @@ void gl_compose(backend_t *base, void *image_data, int dst_x, int dst_y,
|
||||||
|
|
||||||
bool dual_texture = false;
|
bool dual_texture = false;
|
||||||
|
|
||||||
if (gd->win_shader.prog) {
|
assert(gd->win_shader.prog);
|
||||||
glUseProgram(gd->win_shader.prog);
|
glUseProgram(gd->win_shader.prog);
|
||||||
if (gd->win_shader.unifm_opacity >= 0) {
|
if (gd->win_shader.unifm_opacity >= 0) {
|
||||||
glUniform1f(gd->win_shader.unifm_opacity, (float)ptex->opacity);
|
glUniform1f(gd->win_shader.unifm_opacity, (float)ptex->opacity);
|
||||||
|
@ -195,7 +204,6 @@ void gl_compose(backend_t *base, void *image_data, int dst_x, int dst_y,
|
||||||
if (gd->win_shader.unifm_dim >= 0) {
|
if (gd->win_shader.unifm_dim >= 0) {
|
||||||
glUniform1f(gd->win_shader.unifm_dim, (float)ptex->dim);
|
glUniform1f(gd->win_shader.unifm_dim, (float)ptex->dim);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// log_trace("Draw: %d, %d, %d, %d -> %d, %d (%d, %d) z %d\n",
|
// log_trace("Draw: %d, %d, %d, %d -> %d, %d (%d, %d) z %d\n",
|
||||||
// x, y, width, height, dx, dy, ptex->width, ptex->height, z);
|
// x, y, width, height, dx, dy, ptex->width, ptex->height, z);
|
||||||
|
@ -207,17 +215,12 @@ void gl_compose(backend_t *base, void *image_data, int dst_x, int dst_y,
|
||||||
glBindTexture(GL_TEXTURE_2D, ptex->texture);
|
glBindTexture(GL_TEXTURE_2D, ptex->texture);
|
||||||
glActiveTexture(GL_TEXTURE0);
|
glActiveTexture(GL_TEXTURE0);
|
||||||
}
|
}
|
||||||
|
auto coord = ccalloc(nrects * 16, GLfloat);
|
||||||
|
auto indices = ccalloc(nrects * 6, GLuint);
|
||||||
|
|
||||||
// Painting
|
for (int i = 0; i < nrects; ++i) {
|
||||||
int nrects;
|
|
||||||
|
|
||||||
const rect_t *rects;
|
|
||||||
rects = pixman_region32_rectangles((region_t *)reg_tgt, &nrects);
|
|
||||||
|
|
||||||
glBegin(GL_QUADS);
|
|
||||||
for (int ri = 0; ri < nrects; ++ri) {
|
|
||||||
// Y-flip. Note after this, crect.y1 > crect.y2
|
// Y-flip. Note after this, crect.y1 > crect.y2
|
||||||
rect_t crect = rects[ri];
|
rect_t crect = rects[i];
|
||||||
crect.y1 = gd->height - crect.y1;
|
crect.y1 = gd->height - crect.y1;
|
||||||
crect.y2 = gd->height - crect.y2;
|
crect.y2 = gd->height - crect.y2;
|
||||||
|
|
||||||
|
@ -242,32 +245,52 @@ void gl_compose(backend_t *base, void *image_data, int dst_x, int dst_y,
|
||||||
texture_y2 /= (GLfloat)ptex->height;
|
texture_y2 /= (GLfloat)ptex->height;
|
||||||
|
|
||||||
// Vertex coordinates
|
// Vertex coordinates
|
||||||
GLint vx1 = crect.x1;
|
auto vx1 = (GLfloat)crect.x1;
|
||||||
GLint vy1 = crect.y2;
|
auto vy1 = (GLfloat)crect.y2;
|
||||||
GLint vx2 = crect.x2;
|
auto vx2 = (GLfloat)crect.x2;
|
||||||
GLint vy2 = crect.y1;
|
auto vy2 = (GLfloat)crect.y1;
|
||||||
|
|
||||||
// log_trace("Rect %d: %f, %f, %f, %f -> %d, %d, %d, %d",
|
// log_trace("Rect %d: %f, %f, %f, %f -> %d, %d, %d, %d",
|
||||||
// ri, rx, ry, rxe, rye, rdx, rdy, rdxe, rdye);
|
// ri, rx, ry, rxe, rye, rdx, rdy, rdxe, rdye);
|
||||||
|
|
||||||
GLfloat texture_x[] = {texture_x1, texture_x2, texture_x2, texture_x1};
|
memcpy(&coord[i * 16],
|
||||||
GLfloat texture_y[] = {texture_y1, texture_y1, texture_y2, texture_y2};
|
(GLfloat[][2]){
|
||||||
GLint vx[] = {vx1, vx2, vx2, vx1};
|
{vx1, vy1},
|
||||||
GLint vy[] = {vy1, vy1, vy2, vy2};
|
{texture_x1, texture_y1},
|
||||||
|
{vx2, vy1},
|
||||||
|
{texture_x2, texture_y1},
|
||||||
|
{vx2, vy2},
|
||||||
|
{texture_x2, texture_y2},
|
||||||
|
{vx1, vy2},
|
||||||
|
{texture_x1, texture_y2},
|
||||||
|
},
|
||||||
|
sizeof(GLfloat[2]) * 8);
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++) {
|
GLuint u = (GLuint)(i * 4);
|
||||||
glVertexAttrib2f((GLuint)gd->win_shader.in_texcoord, texture_x[i],
|
memcpy(&indices[i * 6], (GLuint[]){u + 0, u + 1, u + 2, u + 2, u + 3, u + 0},
|
||||||
texture_y[i]);
|
sizeof(GLuint) * 6);
|
||||||
glVertex3i(vx[i], vy[i], 0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
glEnd();
|
GLuint bo[2];
|
||||||
|
glGenBuffers(2, bo);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, bo[0]);
|
||||||
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bo[1]);
|
||||||
|
glBufferData(GL_ARRAY_BUFFER, (long)sizeof(*coord) * nrects * 16, coord, GL_STATIC_DRAW);
|
||||||
|
glBufferData(GL_ELEMENT_ARRAY_BUFFER, (long)sizeof(*indices) * nrects * 6,
|
||||||
|
indices, GL_STATIC_DRAW);
|
||||||
|
|
||||||
|
glEnableVertexAttribArray((GLuint)gd->win_shader.coord_loc);
|
||||||
|
glEnableVertexAttribArray((GLuint)gd->win_shader.in_texcoord);
|
||||||
|
glVertexAttribPointer((GLuint)gd->win_shader.coord_loc, 2, GL_FLOAT, GL_FALSE,
|
||||||
|
sizeof(GLfloat) * 4, NULL);
|
||||||
|
glVertexAttribPointer((GLuint)gd->win_shader.in_texcoord, 2, GL_FLOAT, GL_FALSE,
|
||||||
|
sizeof(GLfloat) * 4, (void *)(sizeof(GLfloat) * 2));
|
||||||
|
glDrawElements(GL_TRIANGLES, nrects * 6, GL_UNSIGNED_INT, NULL);
|
||||||
|
glDisableVertexAttribArray((GLuint)gd->win_shader.coord_loc);
|
||||||
|
glDisableVertexAttribArray((GLuint)gd->win_shader.in_texcoord);
|
||||||
|
|
||||||
// Cleanup
|
// Cleanup
|
||||||
glBindTexture(GL_TEXTURE_2D, 0);
|
glBindTexture(GL_TEXTURE_2D, 0);
|
||||||
glColor4f(0.0f, 0.0f, 0.0f, 0.0f);
|
|
||||||
glDisable(GL_COLOR_LOGIC_OP);
|
|
||||||
|
|
||||||
if (dual_texture) {
|
if (dual_texture) {
|
||||||
glActiveTexture(GL_TEXTURE1);
|
glActiveTexture(GL_TEXTURE1);
|
||||||
|
@ -275,6 +298,13 @@ void gl_compose(backend_t *base, void *image_data, int dst_x, int dst_y,
|
||||||
glActiveTexture(GL_TEXTURE0);
|
glActiveTexture(GL_TEXTURE0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
|
||||||
|
glDeleteBuffers(2, bo);
|
||||||
|
|
||||||
|
free(indices);
|
||||||
|
free(coord);
|
||||||
|
|
||||||
glUseProgram(0);
|
glUseProgram(0);
|
||||||
|
|
||||||
gl_check_err();
|
gl_check_err();
|
||||||
|
|
|
@ -22,6 +22,7 @@ typedef struct {
|
||||||
GLint unifm_tex;
|
GLint unifm_tex;
|
||||||
GLint unifm_dim;
|
GLint unifm_dim;
|
||||||
GLint in_texcoord;
|
GLint in_texcoord;
|
||||||
|
GLint coord_loc;
|
||||||
} gl_win_shader_t;
|
} gl_win_shader_t;
|
||||||
|
|
||||||
// Program and uniforms for blur shader
|
// Program and uniforms for blur shader
|
||||||
|
|
Loading…
Reference in a new issue