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.
dev
Kristian Høgsberg 15 years ago
parent 31bd6c7ab1
commit fa4e2a7676
  1. 70
      compositor/compositor.c
  2. 2
      compositor/compositor.h

@ -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…
Cancel
Save