Avoid unnecessarily re-allocating texture buffer when the size hasn't changed.
v4: Incorporated krh and anderco's comments. Now adding newly allocated buffer's dimensions to texture_damage v3: * Removed unnecessary parentheses * Added check for switching from EGL image to SHM buffer * Moved shader assignment out of IF condition v2: Fixed the wrong comparison v1: Depending on specific DRI driver implementation, glTexImage2D() with data set to NULL may or may not re-allocate the texture buffer each time it is called. Unintended consequences happen if later glTexSubImage2D() is called to only update a sub-region of the texture buffer. I've explored moving glTexImage2D() from gl_renderer_attach() and simply mark the texture dirty, but the current implemention seems cleaner because I won't have to worry about calling ensure_textures() and re-assigning gs->shader unnecessarily.
This commit is contained in:
committed by
Kristian Høgsberg
parent
d7bc6351f8
commit
2ada748289
@@ -1204,6 +1204,13 @@ gl_renderer_attach(struct weston_surface *es, struct wl_buffer *buffer)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (wl_buffer_is_shm(buffer)) {
|
if (wl_buffer_is_shm(buffer)) {
|
||||||
|
/* 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->pitch = wl_shm_buffer_get_stride(buffer) / 4;
|
||||||
gs->height = wl_shm_buffer_get_height(buffer);
|
gs->height = wl_shm_buffer_get_height(buffer);
|
||||||
gs->target = GL_TEXTURE_2D;
|
gs->target = GL_TEXTURE_2D;
|
||||||
@@ -1213,6 +1220,13 @@ gl_renderer_attach(struct weston_surface *es, struct wl_buffer *buffer)
|
|||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT,
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT,
|
||||||
gs->pitch, buffer->height, 0,
|
gs->pitch, buffer->height, 0,
|
||||||
GL_BGRA_EXT, GL_UNSIGNED_BYTE, NULL);
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
if (wl_shm_buffer_get_format(buffer) == WL_SHM_FORMAT_XRGB8888)
|
if (wl_shm_buffer_get_format(buffer) == WL_SHM_FORMAT_XRGB8888)
|
||||||
gs->shader = &gr->texture_shader_rgbx;
|
gs->shader = &gr->texture_shader_rgbx;
|
||||||
else
|
else
|
||||||
|
|||||||
Reference in New Issue
Block a user