glamor: Use vertex array objects
Core contexts require the use of vertex array objects, so switch both glamor and ephyr/glamor over. Signed-off-by: Keith Packard <keithp@keithp.com> Reviewed-by: Eric Anholt <eric@anholt.net> Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
		
							parent
							
								
									d99204fb5e
								
							
						
					
					
						commit
						49aa5e3ea4
					
				| 
						 | 
					@ -574,6 +574,8 @@ glamor_init(ScreenPtr screen, unsigned int flags)
 | 
				
			||||||
        glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP ||
 | 
					        glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP ||
 | 
				
			||||||
        epoxy_gl_version() >= 30 ||
 | 
					        epoxy_gl_version() >= 30 ||
 | 
				
			||||||
        epoxy_has_gl_extension("GL_NV_pack_subimage");
 | 
					        epoxy_has_gl_extension("GL_NV_pack_subimage");
 | 
				
			||||||
 | 
					    glamor_priv->has_vertex_array_object =
 | 
				
			||||||
 | 
					        epoxy_has_gl_extension("GL_ARB_vertex_array_object");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    glamor_setup_debug_output(screen);
 | 
					    glamor_setup_debug_output(screen);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -201,6 +201,7 @@ typedef struct glamor_screen_private {
 | 
				
			||||||
    Bool has_unpack_subimage;
 | 
					    Bool has_unpack_subimage;
 | 
				
			||||||
    Bool has_rw_pbo;
 | 
					    Bool has_rw_pbo;
 | 
				
			||||||
    Bool use_quads;
 | 
					    Bool use_quads;
 | 
				
			||||||
 | 
					    Bool has_vertex_array_object;
 | 
				
			||||||
    int max_fbo_size;
 | 
					    int max_fbo_size;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    struct xorg_list
 | 
					    struct xorg_list
 | 
				
			||||||
| 
						 | 
					@ -247,6 +248,7 @@ typedef struct glamor_screen_private {
 | 
				
			||||||
    char                        *glyph_defines;
 | 
					    char                        *glyph_defines;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /** Vertex buffer for all GPU rendering. */
 | 
					    /** Vertex buffer for all GPU rendering. */
 | 
				
			||||||
 | 
					    GLuint vao;
 | 
				
			||||||
    GLuint vbo;
 | 
					    GLuint vbo;
 | 
				
			||||||
    /** Next offset within the VBO that glamor_get_vbo_space() will use. */
 | 
					    /** Next offset within the VBO that glamor_get_vbo_space() will use. */
 | 
				
			||||||
    int vbo_offset;
 | 
					    int vbo_offset;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -174,6 +174,11 @@ glamor_init_vbo(ScreenPtr screen)
 | 
				
			||||||
    glamor_make_current(glamor_priv);
 | 
					    glamor_make_current(glamor_priv);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    glGenBuffers(1, &glamor_priv->vbo);
 | 
					    glGenBuffers(1, &glamor_priv->vbo);
 | 
				
			||||||
 | 
					    if (glamor_priv->has_vertex_array_object) {
 | 
				
			||||||
 | 
					        glGenVertexArrays(1, &glamor_priv->vao);
 | 
				
			||||||
 | 
					        glBindVertexArray(glamor_priv->vao);
 | 
				
			||||||
 | 
					    } else
 | 
				
			||||||
 | 
					        glamor_priv->vao = 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
| 
						 | 
					@ -183,6 +188,10 @@ glamor_fini_vbo(ScreenPtr screen)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    glamor_make_current(glamor_priv);
 | 
					    glamor_make_current(glamor_priv);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (glamor_priv->vao != 0) {
 | 
				
			||||||
 | 
					        glDeleteVertexArrays(1, &glamor_priv->vao);
 | 
				
			||||||
 | 
					        glamor_priv->vao = 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    if (!glamor_priv->has_map_buffer_range)
 | 
					    if (!glamor_priv->has_map_buffer_range)
 | 
				
			||||||
        free(glamor_priv->vb);
 | 
					        free(glamor_priv->vb);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -71,6 +71,8 @@ struct ephyr_glamor {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Size of the window that we're rendering to. */
 | 
					    /* Size of the window that we're rendering to. */
 | 
				
			||||||
    unsigned width, height;
 | 
					    unsigned width, height;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    GLuint vao, vbo;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static GLint
 | 
					static GLint
 | 
				
			||||||
| 
						 | 
					@ -189,47 +191,53 @@ ephyr_glamor_set_texture(struct ephyr_glamor *glamor, uint32_t tex)
 | 
				
			||||||
    glamor->tex = tex;
 | 
					    glamor->tex = tex;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					ephyr_glamor_set_vertices(struct ephyr_glamor *glamor)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    glVertexAttribPointer(glamor->texture_shader_position_loc,
 | 
				
			||||||
 | 
					                          2, GL_FLOAT, FALSE, 0, (void *) 0);
 | 
				
			||||||
 | 
					    glVertexAttribPointer(glamor->texture_shader_texcoord_loc,
 | 
				
			||||||
 | 
					                          2, GL_FLOAT, FALSE, 0, (void *) (sizeof (float) * 8));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    glEnableVertexAttribArray(glamor->texture_shader_position_loc);
 | 
				
			||||||
 | 
					    glEnableVertexAttribArray(glamor->texture_shader_texcoord_loc);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					ephyr_glamor_clear_vertices(struct ephyr_glamor *glamor)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    glDisableVertexAttribArray(glamor->texture_shader_position_loc);
 | 
				
			||||||
 | 
					    glDisableVertexAttribArray(glamor->texture_shader_texcoord_loc);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
ephyr_glamor_damage_redisplay(struct ephyr_glamor *glamor,
 | 
					ephyr_glamor_damage_redisplay(struct ephyr_glamor *glamor,
 | 
				
			||||||
                              struct pixman_region16 *damage)
 | 
					                              struct pixman_region16 *damage)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    /* Redraw the whole screen, since glXSwapBuffers leaves the back
 | 
					    GLint old_vao;
 | 
				
			||||||
     * buffer undefined.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    static const float position[] = {
 | 
					 | 
				
			||||||
        -1, -1,
 | 
					 | 
				
			||||||
         1, -1,
 | 
					 | 
				
			||||||
         1,  1,
 | 
					 | 
				
			||||||
        -1,  1,
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
    static const float texcoords[] = {
 | 
					 | 
				
			||||||
        0, 1,
 | 
					 | 
				
			||||||
        1, 1,
 | 
					 | 
				
			||||||
        1, 0,
 | 
					 | 
				
			||||||
        0, 0,
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    glXMakeCurrent(dpy, glamor->glx_win, glamor->ctx);
 | 
					    glXMakeCurrent(dpy, glamor->glx_win, glamor->ctx);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (glamor->vao) {
 | 
				
			||||||
 | 
					        glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &old_vao);
 | 
				
			||||||
 | 
					        glBindVertexArray(glamor->vao);
 | 
				
			||||||
 | 
					    } else
 | 
				
			||||||
 | 
					        ephyr_glamor_set_vertices(glamor);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    glBindFramebuffer(GL_FRAMEBUFFER, 0);
 | 
					    glBindFramebuffer(GL_FRAMEBUFFER, 0);
 | 
				
			||||||
    glUseProgram(glamor->texture_shader);
 | 
					    glUseProgram(glamor->texture_shader);
 | 
				
			||||||
    glViewport(0, 0, glamor->width, glamor->height);
 | 
					    glViewport(0, 0, glamor->width, glamor->height);
 | 
				
			||||||
    if (!ephyr_glamor_gles2)
 | 
					    if (!ephyr_glamor_gles2)
 | 
				
			||||||
        glDisable(GL_COLOR_LOGIC_OP);
 | 
					        glDisable(GL_COLOR_LOGIC_OP);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    glVertexAttribPointer(glamor->texture_shader_position_loc,
 | 
					 | 
				
			||||||
                          2, GL_FLOAT, FALSE, 0, position);
 | 
					 | 
				
			||||||
    glVertexAttribPointer(glamor->texture_shader_texcoord_loc,
 | 
					 | 
				
			||||||
                          2, GL_FLOAT, FALSE, 0, texcoords);
 | 
					 | 
				
			||||||
    glEnableVertexAttribArray(glamor->texture_shader_position_loc);
 | 
					 | 
				
			||||||
    glEnableVertexAttribArray(glamor->texture_shader_texcoord_loc);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    glActiveTexture(GL_TEXTURE0);
 | 
					    glActiveTexture(GL_TEXTURE0);
 | 
				
			||||||
    glBindTexture(GL_TEXTURE_2D, glamor->tex);
 | 
					    glBindTexture(GL_TEXTURE_2D, glamor->tex);
 | 
				
			||||||
    glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
 | 
					    glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    glDisableVertexAttribArray(glamor->texture_shader_position_loc);
 | 
					    if (glamor->vao)
 | 
				
			||||||
    glDisableVertexAttribArray(glamor->texture_shader_texcoord_loc);
 | 
					        glBindVertexArray(old_vao);
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        ephyr_glamor_clear_vertices(glamor);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    glXSwapBuffers(dpy, glamor->glx_win);
 | 
					    glXSwapBuffers(dpy, glamor->glx_win);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -271,6 +279,18 @@ ephyr_glamor_process_event(xcb_generic_event_t *xev)
 | 
				
			||||||
struct ephyr_glamor *
 | 
					struct ephyr_glamor *
 | 
				
			||||||
ephyr_glamor_glx_screen_init(xcb_window_t win)
 | 
					ephyr_glamor_glx_screen_init(xcb_window_t win)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    static const float position[] = {
 | 
				
			||||||
 | 
					        -1, -1,
 | 
				
			||||||
 | 
					         1, -1,
 | 
				
			||||||
 | 
					         1,  1,
 | 
				
			||||||
 | 
					        -1,  1,
 | 
				
			||||||
 | 
					        0, 1,
 | 
				
			||||||
 | 
					        1, 1,
 | 
				
			||||||
 | 
					        1, 0,
 | 
				
			||||||
 | 
					        0, 0,
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    GLint old_vao;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    GLXContext ctx;
 | 
					    GLXContext ctx;
 | 
				
			||||||
    struct ephyr_glamor *glamor;
 | 
					    struct ephyr_glamor *glamor;
 | 
				
			||||||
    GLXWindow glx_win;
 | 
					    GLXWindow glx_win;
 | 
				
			||||||
| 
						 | 
					@ -312,6 +332,24 @@ ephyr_glamor_glx_screen_init(xcb_window_t win)
 | 
				
			||||||
    glamor->glx_win = glx_win;
 | 
					    glamor->glx_win = glx_win;
 | 
				
			||||||
    ephyr_glamor_setup_texturing_shader(glamor);
 | 
					    ephyr_glamor_setup_texturing_shader(glamor);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (epoxy_has_gl_extension("GL_ARB_vertex_array_object")) {
 | 
				
			||||||
 | 
					        glGenVertexArrays(1, &glamor->vao);
 | 
				
			||||||
 | 
					        glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &old_vao);
 | 
				
			||||||
 | 
					        glBindVertexArray(glamor->vao);
 | 
				
			||||||
 | 
					    } else
 | 
				
			||||||
 | 
					        glamor->vao = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    glGenBuffers(1, &glamor->vbo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    glBindBuffer(GL_ARRAY_BUFFER, glamor->vbo);
 | 
				
			||||||
 | 
					    glBufferData(GL_ARRAY_BUFFER, sizeof (position), position, GL_STATIC_DRAW);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (glamor->vao) {
 | 
				
			||||||
 | 
					        ephyr_glamor_set_vertices(glamor);
 | 
				
			||||||
 | 
					        glBindVertexArray(old_vao);
 | 
				
			||||||
 | 
					    } else
 | 
				
			||||||
 | 
					        glBindBuffer(GL_ARRAY_BUFFER, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return glamor;
 | 
					    return glamor;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue