xephyr: Don't forget to glViewport() before drawing the screen.
Fixes misrendering with cairogears. I had noticed the failure while trying to figure out what was going on with traps. Cairogears was apparently putting its results on the screen through putimage, which is a texture upload, so the last GL drawing was done to the size of the cairogears window, not the size of the xephyr screen. Signed-off-by: Eric Anholt <eric@anholt.net> Reviewed-by: Keith Packard <keithp@keithp.com>
This commit is contained in:
parent
96a28e9c91
commit
f31911ff8f
|
@ -67,6 +67,9 @@ struct ephyr_glamor {
|
||||||
GLuint texture_shader;
|
GLuint texture_shader;
|
||||||
GLuint texture_shader_position_loc;
|
GLuint texture_shader_position_loc;
|
||||||
GLuint texture_shader_texcoord_loc;
|
GLuint texture_shader_texcoord_loc;
|
||||||
|
|
||||||
|
/* Size of the window that we're rendering to. */
|
||||||
|
unsigned width, height;
|
||||||
};
|
};
|
||||||
|
|
||||||
static GLint
|
static GLint
|
||||||
|
@ -205,6 +208,7 @@ ephyr_glamor_damage_redisplay(struct ephyr_glamor *glamor,
|
||||||
|
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||||
glUseProgram(glamor->texture_shader);
|
glUseProgram(glamor->texture_shader);
|
||||||
|
glViewport(0, 0, glamor->width, glamor->height);
|
||||||
|
|
||||||
glVertexAttribPointer(glamor->texture_shader_position_loc,
|
glVertexAttribPointer(glamor->texture_shader_position_loc,
|
||||||
2, GL_FLOAT, FALSE, 0, position);
|
2, GL_FLOAT, FALSE, 0, position);
|
||||||
|
@ -329,3 +333,14 @@ ephyr_glamor_get_visual(void)
|
||||||
|
|
||||||
return xcb_aux_find_visual_by_id(xscreen, visual_info->visualid);
|
return xcb_aux_find_visual_by_id(xscreen, visual_info->visualid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ephyr_glamor_set_window_size(struct ephyr_glamor *glamor,
|
||||||
|
unsigned width, unsigned height)
|
||||||
|
{
|
||||||
|
if (!glamor)
|
||||||
|
return;
|
||||||
|
|
||||||
|
glamor->width = width;
|
||||||
|
glamor->height = height;
|
||||||
|
}
|
||||||
|
|
|
@ -50,6 +50,10 @@ void
|
||||||
ephyr_glamor_glx_screen_fini(struct ephyr_glamor *glamor);
|
ephyr_glamor_glx_screen_fini(struct ephyr_glamor *glamor);
|
||||||
|
|
||||||
#ifdef GLAMOR
|
#ifdef GLAMOR
|
||||||
|
void
|
||||||
|
ephyr_glamor_set_window_size(struct ephyr_glamor *glamor,
|
||||||
|
unsigned width, unsigned height);
|
||||||
|
|
||||||
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);
|
||||||
|
@ -59,6 +63,12 @@ ephyr_glamor_process_event(xcb_generic_event_t *xev);
|
||||||
|
|
||||||
#else /* !GLAMOR */
|
#else /* !GLAMOR */
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
ephyr_glamor_set_window_size(struct ephyr_glamor *glamor,
|
||||||
|
unsigned width, unsigned height)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
static inline void
|
static inline 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)
|
||||||
|
|
|
@ -731,6 +731,8 @@ hostx_screen_init(KdScreenInfo *screen,
|
||||||
if (ephyr_glamor) {
|
if (ephyr_glamor) {
|
||||||
*bytes_per_line = 0;
|
*bytes_per_line = 0;
|
||||||
*bits_per_pixel = 0;
|
*bits_per_pixel = 0;
|
||||||
|
ephyr_glamor_set_window_size(scrpriv->glamor,
|
||||||
|
scrpriv->win_width, scrpriv->win_height);
|
||||||
return NULL;
|
return NULL;
|
||||||
} else if (host_depth_matches_server(scrpriv)) {
|
} else if (host_depth_matches_server(scrpriv)) {
|
||||||
*bytes_per_line = scrpriv->ximg->stride;
|
*bytes_per_line = scrpriv->ximg->stride;
|
||||||
|
@ -1218,6 +1220,8 @@ ephyr_glamor_init(ScreenPtr screen)
|
||||||
EphyrScrPriv *scrpriv = kd_screen->driver;
|
EphyrScrPriv *scrpriv = kd_screen->driver;
|
||||||
|
|
||||||
scrpriv->glamor = ephyr_glamor_glx_screen_init(scrpriv->win);
|
scrpriv->glamor = ephyr_glamor_glx_screen_init(scrpriv->win);
|
||||||
|
ephyr_glamor_set_window_size(scrpriv->glamor,
|
||||||
|
scrpriv->win_width, scrpriv->win_height);
|
||||||
|
|
||||||
glamor_init(screen,
|
glamor_init(screen,
|
||||||
GLAMOR_USE_SCREEN |
|
GLAMOR_USE_SCREEN |
|
||||||
|
|
Loading…
Reference in New Issue
Block a user