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