glamor: Add glamor_program PolyPoint implementation
This accelerates poly point when possible by off-loading all geometry computation to the GPU. Improves x11perf -dot performance by 28109.5% +/- 1022.01% (n=3) Signed-off-by: Keith Packard <keithp@keithp.com> Signed-off-by: Eric Anholt <eric@anholt.net> Reviewed-by: Eric Anholt <eric@anholt.net>
This commit is contained in:
parent
72a4beff6d
commit
1b5d7e7846
|
@ -32,7 +32,7 @@ libglamor_la_SOURCES = \
|
|||
glamor_getimage.c\
|
||||
glamor_copyplane.c\
|
||||
glamor_glyphblt.c\
|
||||
glamor_polyops.c\
|
||||
glamor_points.c\
|
||||
glamor_priv.h\
|
||||
glamor_pixmap.c\
|
||||
glamor_largepixmap.c\
|
||||
|
|
|
@ -0,0 +1,129 @@
|
|||
/*
|
||||
* Copyright © 2009 Intel Corporation
|
||||
* Copyright © 1998 Keith Packard
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
* Authors:
|
||||
* Zhigang Gong <zhigang.gong@linux.intel.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#include "glamor_priv.h"
|
||||
#include "glamor_transform.h"
|
||||
|
||||
static const glamor_facet glamor_facet_point = {
|
||||
.name = "poly_point",
|
||||
.vs_vars = "attribute vec2 primitive;\n",
|
||||
.vs_exec = GLAMOR_POS(gl_Position, primitive),
|
||||
};
|
||||
|
||||
Bool
|
||||
glamor_poly_point_nf(DrawablePtr drawable, GCPtr gc, int mode, int npt, DDXPointPtr ppt)
|
||||
{
|
||||
ScreenPtr screen = drawable->pScreen;
|
||||
glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
|
||||
PixmapPtr pixmap = glamor_get_drawable_pixmap(drawable);
|
||||
glamor_program *prog = &glamor_priv->point_prog;
|
||||
glamor_pixmap_private *pixmap_priv;
|
||||
int off_x, off_y;
|
||||
GLshort *vbo_ppt;
|
||||
char *vbo_offset;
|
||||
int box_x, box_y;
|
||||
|
||||
pixmap_priv = glamor_get_pixmap_private(pixmap);
|
||||
if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv))
|
||||
goto bail;
|
||||
|
||||
glamor_get_context(glamor_priv);
|
||||
|
||||
if (prog->failed)
|
||||
goto bail_ctx;
|
||||
|
||||
if (!prog->prog) {
|
||||
if (!glamor_build_program(screen, prog,
|
||||
&glamor_facet_point,
|
||||
&glamor_fill_solid))
|
||||
goto bail_ctx;
|
||||
}
|
||||
|
||||
if (!glamor_use_program(pixmap, gc, prog, NULL))
|
||||
goto bail_ctx;
|
||||
|
||||
vbo_ppt = glamor_get_vbo_space(screen, npt * (2 * sizeof (INT16)), &vbo_offset);
|
||||
glEnableVertexAttribArray(GLAMOR_VERTEX_POS);
|
||||
glVertexAttribPointer(GLAMOR_VERTEX_POS, 2, GL_SHORT, GL_FALSE, 0, vbo_offset);
|
||||
if (mode == CoordModePrevious) {
|
||||
int n = npt;
|
||||
INT16 x = 0, y = 0;
|
||||
while (n--) {
|
||||
vbo_ppt[0] = (x += ppt->x);
|
||||
vbo_ppt[1] = (y += ppt->y);
|
||||
vbo_ppt += 2;
|
||||
ppt++;
|
||||
}
|
||||
} else
|
||||
memcpy(vbo_ppt, ppt, npt * (2 * sizeof (INT16)));
|
||||
glamor_put_vbo_space(screen);
|
||||
|
||||
glEnable(GL_SCISSOR_TEST);
|
||||
|
||||
glamor_pixmap_loop(pixmap_priv, box_x, box_y) {
|
||||
int nbox = RegionNumRects(gc->pCompositeClip);
|
||||
BoxPtr box = RegionRects(gc->pCompositeClip);
|
||||
|
||||
glamor_set_destination_drawable(drawable, box_x, box_y, TRUE, TRUE, prog->matrix_uniform, &off_x, &off_y);
|
||||
|
||||
while (nbox--) {
|
||||
glScissor(box->x1 + off_x,
|
||||
box->y1 + off_y,
|
||||
box->x2 - box->x1,
|
||||
box->y2 - box->y1);
|
||||
box++;
|
||||
glDrawArrays(GL_POINTS, 0, npt);
|
||||
}
|
||||
}
|
||||
|
||||
glDisable(GL_SCISSOR_TEST);
|
||||
glDisable(GL_COLOR_LOGIC_OP);
|
||||
glDisableVertexAttribArray(GLAMOR_VERTEX_POS);
|
||||
|
||||
glamor_put_context(glamor_priv);
|
||||
|
||||
glamor_priv->state = RENDER_STATE;
|
||||
glamor_priv->render_idle_cnt = 0;
|
||||
|
||||
return TRUE;
|
||||
|
||||
bail_ctx:
|
||||
glDisable(GL_COLOR_LOGIC_OP);
|
||||
glamor_put_context(glamor_priv);
|
||||
bail:
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void
|
||||
glamor_poly_point(DrawablePtr drawable, GCPtr gc, int mode, int npt,
|
||||
DDXPointPtr ppt)
|
||||
{
|
||||
if (glamor_poly_point_nf(drawable, gc, mode, npt, ppt))
|
||||
return;
|
||||
miPolyPoint(drawable, gc, mode, npt, ppt);
|
||||
}
|
|
@ -1,56 +0,0 @@
|
|||
/*
|
||||
* Copyright © 2009 Intel Corporation
|
||||
* Copyright © 1998 Keith Packard
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
* Authors:
|
||||
* Zhigang Gong <zhigang.gong@linux.intel.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#include "glamor_priv.h"
|
||||
|
||||
static Bool
|
||||
_glamor_poly_point(DrawablePtr pDrawable, GCPtr pGC, int mode, int npt,
|
||||
DDXPointPtr ppt, Bool fallback)
|
||||
{
|
||||
if (!fallback && glamor_ddx_fallback_check_gc(pGC)
|
||||
&& glamor_ddx_fallback_check_pixmap(pDrawable))
|
||||
return FALSE;
|
||||
|
||||
miPolyPoint(pDrawable, pGC, mode, npt, ppt);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void
|
||||
glamor_poly_point(DrawablePtr pDrawable, GCPtr pGC, int mode, int npt,
|
||||
DDXPointPtr ppt)
|
||||
{
|
||||
_glamor_poly_point(pDrawable, pGC, mode, npt, ppt, TRUE);
|
||||
}
|
||||
|
||||
Bool
|
||||
glamor_poly_point_nf(DrawablePtr pDrawable, GCPtr pGC, int mode, int npt,
|
||||
DDXPointPtr ppt)
|
||||
{
|
||||
return _glamor_poly_point(pDrawable, pGC, mode, npt, ppt, FALSE);
|
||||
}
|
|
@ -220,6 +220,9 @@ typedef struct glamor_screen_private {
|
|||
GLint solid_prog;
|
||||
GLint solid_color_uniform_location;
|
||||
|
||||
/* glamor point shader */
|
||||
glamor_program point_prog;
|
||||
|
||||
/* vertext/elment_index buffer object for render */
|
||||
GLuint vbo, ebo;
|
||||
/** Next offset within the VBO that glamor_get_vbo_space() will use. */
|
||||
|
|
Loading…
Reference in New Issue