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:
Kristian Høgsberg 2011-02-13 13:44:55 -05:00
parent 31bd6c7ab1
commit fa4e2a7676
2 changed files with 30 additions and 42 deletions

View File

@ -363,12 +363,7 @@ static void
wlsc_surface_draw(struct wlsc_surface *es, struct wlsc_output *output)
{
struct wlsc_compositor *ec = es->compositor;
struct wlsc_matrix tmp;
tmp = es->matrix;
wlsc_matrix_multiply(&tmp, &output->matrix);
glUniformMatrix4fv(ec->proj_uniform, 1, GL_FALSE, tmp.d);
glUniform1i(ec->tex_uniform, 0);
GLfloat vertices[4 * 4];
if (es->visual == &ec->compositor.argb_visual) {
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);
}
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);
glBindBuffer(GL_ARRAY_BUFFER, ec->vbo);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE,
5 * sizeof(GLfloat), NULL);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE,
4 * sizeof(GLfloat), vertices);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE,
5 * sizeof(GLfloat), (GLfloat *) 0 + 3);
4 * sizeof(GLfloat), &vertices[2]);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
@ -432,6 +446,9 @@ wlsc_output_repaint(struct wlsc_output *output)
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(&total_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[] =
"uniform mat4 proj;\n"
"attribute vec4 position;\n"
"attribute vec2 position;\n"
"attribute vec2 texcoord;\n"
"varying vec2 v_texcoord;\n"
"void main()\n"
"{\n"
" gl_Position = proj * position;\n"
" gl_Position = proj * vec4(position, 0.0, 1.0);\n"
" v_texcoord = texcoord;\n"
"}\n";
@ -1177,7 +1194,6 @@ init_shaders(struct wlsc_compositor *ec)
GLuint v, f, program;
const char *p;
char msg[512];
GLfloat vertices[4 * 5];
GLint status;
p = vertex_shader;
@ -1220,34 +1236,6 @@ init_shaders(struct wlsc_compositor *ec)
ec->proj_uniform = glGetUniformLocation(program, "proj");
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;
}

View File

@ -91,7 +91,7 @@ struct wlsc_compositor {
struct wlsc_shm shm;
EGLDisplay display;
EGLContext context;
GLuint fbo, vbo;
GLuint fbo;
GLuint proj_uniform, tex_uniform;
struct wl_buffer **pointer_buffers;
struct wl_display *wl_display;