From 97efbd25fed0f86338853d81b974b7f4deb9f1b4 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Fri, 27 Jan 2012 13:22:13 +0000 Subject: [PATCH] Use CLAMP_TO_BORDER in copy_n_to_n so we can sample outside of the source In order to reduce a composite operation to a source, we need to provide Render semantics for the pixel values of samples outside of the source pixmap, i.e. they need to be rgba(0, 0, 0, 0). This is provided by using the CLAMP_TO_BORDER repeat mode, but only if the texture has an alpha channel. Signed-off-by: Chris Wilson Reviewed-by: Zhigang Gong --- glamor/glamor_copyarea.c | 6 ++++++ glamor/glamor_render.c | 26 ++++++++++++++------------ 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/glamor/glamor_copyarea.c b/glamor/glamor_copyarea.c index a39c97001..f2d710a90 100644 --- a/glamor/glamor_copyarea.c +++ b/glamor/glamor_copyarea.c @@ -226,6 +226,12 @@ glamor_copy_n_to_n_textured(DrawablePtr src, dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + dispatch->glTexParameteri(GL_TEXTURE_2D, + GL_TEXTURE_WRAP_S, + GL_CLAMP_TO_BORDER); + dispatch->glTexParameteri(GL_TEXTURE_2D, + GL_TEXTURE_WRAP_T, + GL_CLAMP_TO_BORDER); dispatch->glVertexAttribPointer(GLAMOR_VERTEX_SOURCE, 2, GL_FLOAT, GL_FALSE, diff --git a/glamor/glamor_render.c b/glamor/glamor_render.c index 1e68e652b..789c684c2 100644 --- a/glamor/glamor_render.c +++ b/glamor/glamor_render.c @@ -622,19 +622,21 @@ glamor_composite_with_copy(CARD8 op, x_source, y_source, 0, 0, x_dest, y_dest, width, height)) return TRUE; - /* Fallback if we sample outside the source so that we swizzle the - * clear color appropriately. If the source has an alpha channel, - * we could rely on CLAMP_TO_BORDER working as required... - */ - if (region.extents.x1 + x_source - x_dest < 0) - goto cleanup_region; - if (region.extents.x2 + x_source - x_dest > source->pDrawable->width) - goto cleanup_region; - if (region.extents.y1 + y_source - y_dest < 0) - goto cleanup_region; - if (region.extents.y2 + y_source - y_dest > source->pDrawable->height) - goto cleanup_region; + if (PICT_FORMAT_A(source->format) == 0) { + /* Fallback if we sample outside the source so that we + * swizzle the correct clear color for out-of-bounds texels. + */ + if (region.extents.x1 + x_source - x_dest < 0) + goto cleanup_region; + if (region.extents.x2 + x_source - x_dest > source->pDrawable->width) + goto cleanup_region; + + if (region.extents.y1 + y_source - y_dest < 0) + goto cleanup_region; + if (region.extents.y2 + y_source - y_dest > source->pDrawable->height) + goto cleanup_region; + } ret = glamor_copy_n_to_n_nf(source->pDrawable, dest->pDrawable, NULL,