mirror of
				https://gitlab.freedesktop.org/wayland/wayland.git
				synced 2025-11-03 09:01:42 -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)
 | 
			
		||||
{
 | 
			
		||||
	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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue