From c483917512b8a20e89d680c5ac6788645357064d Mon Sep 17 00:00:00 2001 From: Ander Conselvan de Oliveira Date: Tue, 16 Aug 2011 14:25:15 +0300 Subject: [PATCH] compositor-drm: Make unused parts of the cursor image transparent The bo for the cursor image is always created with size 64x64 even if the actual cursor image is smaller than that. If this memory is not initialized, random data can create artifacts near the cursor. Signed-off-by: Ander Conselvan de Oliveira --- compositor/compositor-drm.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/compositor/compositor-drm.c b/compositor/compositor-drm.c index d09732361..27052885c 100644 --- a/compositor/compositor-drm.c +++ b/compositor/compositor-drm.c @@ -681,6 +681,8 @@ drm_compositor_create_cursor_image(struct wlsc_compositor *ec, struct drm_compositor *c = (struct drm_compositor *) ec; struct gbm_bo *bo; EGLImageKHR image; + uint32_t *pixels; + GLuint tex; if (width > 64 || height > 64) return EGL_NO_IMAGE_KHR; @@ -694,6 +696,26 @@ drm_compositor_create_cursor_image(struct wlsc_compositor *ec, EGL_NATIVE_PIXMAP_KHR, bo, NULL); gbm_bo_destroy(bo); + /* If the requested size is smaller than the allocated one, make the + * whole image transparent. */ + if (width != 64 || height != 64) { + pixels = calloc(64 * 64, sizeof *pixels); + + glGenTextures(1, &tex); + glBindTexture(GL_TEXTURE_2D, tex); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + c->base.image_target_texture_2d(GL_TEXTURE_2D, image); + glTexSubImage(GL_TEXTURE_2D, 0, 0, 0, 64, 64, + GL_BGRA_EXT, GL_UNSIGNED_BYTE, pixels); + + glDeleteTextures(1, &tex); + free(pixels); + } + return image; }