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 <chris@chris-wilson.co.uk> Reviewed-by: Zhigang Gong <zhigang.gong@linux.intel.com>
This commit is contained in:
parent
864153bb9e
commit
97efbd25fe
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue
Block a user