glamor: Scissor rectangle drawing to the bounds of the rects.
Scissors provide a critical hint to tiled renderers as to what tiles need to be load/stored because they could be modified by the rendering. The bounds calculation here is limited to when we have a small number of rects (large enough to cover rounded window corners, but probably not xeyes) to avoid overhead on desktop GL. No performance difference on i965 with x11perf -rect1 -repeat 1 -reps 10000 (n=50) v2: Clamp rectangle bounds addition. Signed-off-by: Eric Anholt <eric@anholt.net> Reviewed-by: Keith Packard <keithp@keithp.com>
This commit is contained in:
parent
f211015771
commit
60cc7e367a
|
@ -53,6 +53,7 @@ glamor_poly_fill_rect_gl(DrawablePtr drawable,
|
||||||
char *vbo_offset;
|
char *vbo_offset;
|
||||||
int box_index;
|
int box_index;
|
||||||
Bool ret = FALSE;
|
Bool ret = FALSE;
|
||||||
|
BoxRec bounds = glamor_no_rendering_bounds();
|
||||||
|
|
||||||
pixmap_priv = glamor_get_pixmap_private(pixmap);
|
pixmap_priv = glamor_get_pixmap_private(pixmap);
|
||||||
if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv))
|
if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv))
|
||||||
|
@ -60,6 +61,12 @@ glamor_poly_fill_rect_gl(DrawablePtr drawable,
|
||||||
|
|
||||||
glamor_make_current(glamor_priv);
|
glamor_make_current(glamor_priv);
|
||||||
|
|
||||||
|
if (nrect < 100) {
|
||||||
|
bounds = glamor_start_rendering_bounds();
|
||||||
|
for (int i = 0; i < nrect; i++)
|
||||||
|
glamor_bounds_union_rect(&bounds, &prect[i]);
|
||||||
|
}
|
||||||
|
|
||||||
if (glamor_priv->glsl_version >= 130) {
|
if (glamor_priv->glsl_version >= 130) {
|
||||||
prog = glamor_use_program_fill(pixmap, gc,
|
prog = glamor_use_program_fill(pixmap, gc,
|
||||||
&glamor_priv->poly_fill_rect_program,
|
&glamor_priv->poly_fill_rect_program,
|
||||||
|
@ -121,11 +128,22 @@ glamor_poly_fill_rect_gl(DrawablePtr drawable,
|
||||||
goto bail;
|
goto bail;
|
||||||
|
|
||||||
while (nbox--) {
|
while (nbox--) {
|
||||||
glScissor(box->x1 + off_x,
|
BoxRec scissor = {
|
||||||
box->y1 + off_y,
|
.x1 = max(box->x1, bounds.x1 + drawable->x),
|
||||||
box->x2 - box->x1,
|
.y1 = max(box->y1, bounds.y1 + drawable->y),
|
||||||
box->y2 - box->y1);
|
.x2 = min(box->x2, bounds.x2 + drawable->x),
|
||||||
|
.y2 = min(box->y2, bounds.y2 + drawable->y),
|
||||||
|
};
|
||||||
|
|
||||||
box++;
|
box++;
|
||||||
|
|
||||||
|
if (scissor.x1 >= scissor.x2 || scissor.y1 >= scissor.y2)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
glScissor(scissor.x1 + off_x,
|
||||||
|
scissor.y1 + off_y,
|
||||||
|
scissor.x2 - scissor.x1,
|
||||||
|
scissor.y2 - scissor.y1);
|
||||||
if (glamor_priv->glsl_version >= 130)
|
if (glamor_priv->glsl_version >= 130)
|
||||||
glDrawArraysInstanced(GL_TRIANGLE_STRIP, 0, 4, nrect);
|
glDrawArraysInstanced(GL_TRIANGLE_STRIP, 0, 4, nrect);
|
||||||
else {
|
else {
|
||||||
|
|
|
@ -729,6 +729,41 @@ glamor_make_current(glamor_screen_private *glamor_priv)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline BoxRec
|
||||||
|
glamor_no_rendering_bounds(void)
|
||||||
|
{
|
||||||
|
BoxRec bounds = {
|
||||||
|
.x1 = 0,
|
||||||
|
.y1 = 0,
|
||||||
|
.x2 = MAXSHORT,
|
||||||
|
.y2 = MAXSHORT,
|
||||||
|
};
|
||||||
|
|
||||||
|
return bounds;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline BoxRec
|
||||||
|
glamor_start_rendering_bounds(void)
|
||||||
|
{
|
||||||
|
BoxRec bounds = {
|
||||||
|
.x1 = MAXSHORT,
|
||||||
|
.y1 = MAXSHORT,
|
||||||
|
.x2 = 0,
|
||||||
|
.y2 = 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
return bounds;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
glamor_bounds_union_rect(BoxPtr bounds, xRectangle *rect)
|
||||||
|
{
|
||||||
|
bounds->x1 = min(bounds->x1, rect->x);
|
||||||
|
bounds->y1 = min(bounds->y1, rect->y);
|
||||||
|
bounds->x2 = min(SHRT_MAX, max(bounds->x2, rect->x + rect->width));
|
||||||
|
bounds->y2 = min(SHRT_MAX, max(bounds->y2, rect->y + rect->height));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper function for implementing draws with GL_QUADS on GLES2,
|
* Helper function for implementing draws with GL_QUADS on GLES2,
|
||||||
* where we don't have them.
|
* where we don't have them.
|
||||||
|
|
Loading…
Reference in New Issue