mirror of
https://gitlab.freedesktop.org/wayland/wayland.git
synced 2025-11-02 09:01:39 -05:00
compositor: Switch away from using VBOs and just stream the vertex data
We avoid changing uniforms for each window and it will be easier to break up a surface into a series of rectangles.
This commit is contained in:
parent
31bd6c7ab1
commit
fa4e2a7676
2 changed files with 30 additions and 42 deletions
|
|
@ -363,12 +363,7 @@ static void
|
||||||
wlsc_surface_draw(struct wlsc_surface *es, struct wlsc_output *output)
|
wlsc_surface_draw(struct wlsc_surface *es, struct wlsc_output *output)
|
||||||
{
|
{
|
||||||
struct wlsc_compositor *ec = es->compositor;
|
struct wlsc_compositor *ec = es->compositor;
|
||||||
struct wlsc_matrix tmp;
|
GLfloat vertices[4 * 4];
|
||||||
|
|
||||||
tmp = es->matrix;
|
|
||||||
wlsc_matrix_multiply(&tmp, &output->matrix);
|
|
||||||
glUniformMatrix4fv(ec->proj_uniform, 1, GL_FALSE, tmp.d);
|
|
||||||
glUniform1i(ec->tex_uniform, 0);
|
|
||||||
|
|
||||||
if (es->visual == &ec->compositor.argb_visual) {
|
if (es->visual == &ec->compositor.argb_visual) {
|
||||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
|
|
@ -380,12 +375,31 @@ wlsc_surface_draw(struct wlsc_surface *es, struct wlsc_output *output)
|
||||||
glDisable(GL_BLEND);
|
glDisable(GL_BLEND);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vertices[ 0] = es->x;
|
||||||
|
vertices[ 1] = es->y;
|
||||||
|
vertices[ 2] = 0.0;
|
||||||
|
vertices[ 3] = 0.0;
|
||||||
|
|
||||||
|
vertices[ 4] = es->x;
|
||||||
|
vertices[ 5] = es->y + es->height;
|
||||||
|
vertices[ 6] = 0.0;
|
||||||
|
vertices[ 7] = 1.0;
|
||||||
|
|
||||||
|
vertices[ 8] = es->x + es->width;
|
||||||
|
vertices[ 9] = es->y;
|
||||||
|
vertices[10] = 1.0;
|
||||||
|
vertices[11] = 0.0;
|
||||||
|
|
||||||
|
vertices[12] = es->x + es->width;
|
||||||
|
vertices[13] = es->y + es->height;
|
||||||
|
vertices[14] = 1.0;
|
||||||
|
vertices[15] = 1.0;
|
||||||
|
|
||||||
glBindTexture(GL_TEXTURE_2D, es->texture);
|
glBindTexture(GL_TEXTURE_2D, es->texture);
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, ec->vbo);
|
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE,
|
||||||
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE,
|
4 * sizeof(GLfloat), vertices);
|
||||||
5 * sizeof(GLfloat), NULL);
|
|
||||||
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE,
|
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE,
|
||||||
5 * sizeof(GLfloat), (GLfloat *) 0 + 3);
|
4 * sizeof(GLfloat), &vertices[2]);
|
||||||
glEnableVertexAttribArray(0);
|
glEnableVertexAttribArray(0);
|
||||||
glEnableVertexAttribArray(1);
|
glEnableVertexAttribArray(1);
|
||||||
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
||||||
|
|
@ -432,6 +446,9 @@ wlsc_output_repaint(struct wlsc_output *output)
|
||||||
|
|
||||||
glViewport(0, 0, output->width, output->height);
|
glViewport(0, 0, output->width, output->height);
|
||||||
|
|
||||||
|
glUniformMatrix4fv(ec->proj_uniform, 1, GL_FALSE, output->matrix.d);
|
||||||
|
glUniform1i(ec->tex_uniform, 0);
|
||||||
|
|
||||||
pixman_region32_init(&new_damage);
|
pixman_region32_init(&new_damage);
|
||||||
pixman_region32_init(&total_damage);
|
pixman_region32_init(&total_damage);
|
||||||
pixman_region32_intersect_rect(&new_damage,
|
pixman_region32_intersect_rect(&new_damage,
|
||||||
|
|
@ -1153,12 +1170,12 @@ wlsc_output_post_geometry(struct wl_client *client, struct wl_object *global)
|
||||||
|
|
||||||
static const char vertex_shader[] =
|
static const char vertex_shader[] =
|
||||||
"uniform mat4 proj;\n"
|
"uniform mat4 proj;\n"
|
||||||
"attribute vec4 position;\n"
|
"attribute vec2 position;\n"
|
||||||
"attribute vec2 texcoord;\n"
|
"attribute vec2 texcoord;\n"
|
||||||
"varying vec2 v_texcoord;\n"
|
"varying vec2 v_texcoord;\n"
|
||||||
"void main()\n"
|
"void main()\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
" gl_Position = proj * position;\n"
|
" gl_Position = proj * vec4(position, 0.0, 1.0);\n"
|
||||||
" v_texcoord = texcoord;\n"
|
" v_texcoord = texcoord;\n"
|
||||||
"}\n";
|
"}\n";
|
||||||
|
|
||||||
|
|
@ -1177,7 +1194,6 @@ init_shaders(struct wlsc_compositor *ec)
|
||||||
GLuint v, f, program;
|
GLuint v, f, program;
|
||||||
const char *p;
|
const char *p;
|
||||||
char msg[512];
|
char msg[512];
|
||||||
GLfloat vertices[4 * 5];
|
|
||||||
GLint status;
|
GLint status;
|
||||||
|
|
||||||
p = vertex_shader;
|
p = vertex_shader;
|
||||||
|
|
@ -1220,34 +1236,6 @@ init_shaders(struct wlsc_compositor *ec)
|
||||||
ec->proj_uniform = glGetUniformLocation(program, "proj");
|
ec->proj_uniform = glGetUniformLocation(program, "proj");
|
||||||
ec->tex_uniform = glGetUniformLocation(program, "tex");
|
ec->tex_uniform = glGetUniformLocation(program, "tex");
|
||||||
|
|
||||||
vertices[ 0] = 0.0;
|
|
||||||
vertices[ 1] = 0.0;
|
|
||||||
vertices[ 2] = 0.0;
|
|
||||||
vertices[ 3] = 0.0;
|
|
||||||
vertices[ 4] = 0.0;
|
|
||||||
|
|
||||||
vertices[ 5] = 0.0;
|
|
||||||
vertices[ 6] = 1.0;
|
|
||||||
vertices[ 7] = 0.0;
|
|
||||||
vertices[ 8] = 0.0;
|
|
||||||
vertices[ 9] = 1.0;
|
|
||||||
|
|
||||||
vertices[10] = 1.0;
|
|
||||||
vertices[11] = 0.0;
|
|
||||||
vertices[12] = 0.0;
|
|
||||||
vertices[13] = 1.0;
|
|
||||||
vertices[14] = 0.0;
|
|
||||||
|
|
||||||
vertices[15] = 1.0;
|
|
||||||
vertices[16] = 1.0;
|
|
||||||
vertices[17] = 0.0;
|
|
||||||
vertices[18] = 1.0;
|
|
||||||
vertices[19] = 1.0;
|
|
||||||
|
|
||||||
glGenBuffers(1, &ec->vbo);
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, ec->vbo);
|
|
||||||
glBufferData(GL_ARRAY_BUFFER, sizeof vertices, vertices, GL_STATIC_DRAW);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -91,7 +91,7 @@ struct wlsc_compositor {
|
||||||
struct wlsc_shm shm;
|
struct wlsc_shm shm;
|
||||||
EGLDisplay display;
|
EGLDisplay display;
|
||||||
EGLContext context;
|
EGLContext context;
|
||||||
GLuint fbo, vbo;
|
GLuint fbo;
|
||||||
GLuint proj_uniform, tex_uniform;
|
GLuint proj_uniform, tex_uniform;
|
||||||
struct wl_buffer **pointer_buffers;
|
struct wl_buffer **pointer_buffers;
|
||||||
struct wl_display *wl_display;
|
struct wl_display *wl_display;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue