diff --git a/src/gl-renderer.c b/src/gl-renderer.c index d783a0bab..7d27a97df 100644 --- a/src/gl-renderer.c +++ b/src/gl-renderer.c @@ -1204,15 +1204,29 @@ gl_renderer_attach(struct weston_surface *es, struct wl_buffer *buffer) } if (wl_buffer_is_shm(buffer)) { - gs->pitch = wl_shm_buffer_get_stride(buffer) / 4; - gs->height = wl_shm_buffer_get_height(buffer); - gs->target = GL_TEXTURE_2D; + /* Only allocate a texture if it doesn't match existing one. + * If gs->num_images is not 0, then a switch from DRM allocated + * buffer to a SHM buffer is happening, and we need to allocate + * a new texture buffer. */ + if (wl_shm_buffer_get_stride(buffer) / 4 != gs->pitch || + wl_shm_buffer_get_height(buffer) != gs->height || + gs->num_images > 0) { + gs->pitch = wl_shm_buffer_get_stride(buffer) / 4; + gs->height = wl_shm_buffer_get_height(buffer); + gs->target = GL_TEXTURE_2D; + + ensure_textures(gs, 1); + glBindTexture(GL_TEXTURE_2D, gs->textures[0]); + glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT, + gs->pitch, buffer->height, 0, + GL_BGRA_EXT, GL_UNSIGNED_BYTE, NULL); + pixman_region32_union_rect(&gs->texture_damage, + &gs->texture_damage, + 0, 0, + gs->pitch / es->buffer_scale, + gs->height / es->buffer_scale); + } - ensure_textures(gs, 1); - glBindTexture(GL_TEXTURE_2D, gs->textures[0]); - glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT, - gs->pitch, buffer->height, 0, - GL_BGRA_EXT, GL_UNSIGNED_BYTE, NULL); if (wl_shm_buffer_get_format(buffer) == WL_SHM_FORMAT_XRGB8888) gs->shader = &gr->texture_shader_rgbx; else