[Glamor] [PATCH 3/7] Modify the logic of gradient pixmap gl draw.
Zhigang Gong
zhigang.gong at linux.intel.com
Mon May 14 21:44:01 PDT 2012
On Tue, May 08, 2012 at 08:44:43AM +0800, junyan.he at linux.intel.com wrote:
> From: Junyan He <junyan.he at linux.intel.com>
>
> Modify the logic of gradient pixmap gl draw. Use the
> logic like composite before, but the gradient always
> just have one rect to render, so no need to set the VB
> and EB, replace it with just call glDrawArrays.
>
>
> Signed-off-by: Junyan He <junyan.he at linux.intel.com>
> ---
> src/glamor_gradient.c | 66 ++++++++++++++++++++++++------------------------
> 1 files changed, 33 insertions(+), 33 deletions(-)
>
> diff --git a/src/glamor_gradient.c b/src/glamor_gradient.c
> index 234aa9e..a519b34 100644
> --- a/src/glamor_gradient.c
> +++ b/src/glamor_gradient.c
> @@ -795,6 +795,8 @@ _glamor_gradient_set_pixmap_destination(ScreenPtr screen,
> {
> glamor_pixmap_private *pixmap_priv;
> PixmapPtr pixmap = NULL;
> + glamor_gl_dispatch *dispatch = NULL;
> + float tmp;
>
> pixmap = glamor_get_drawable_pixmap(dst_picture->pDrawable);
> pixmap_priv = glamor_get_pixmap_private(pixmap);
> @@ -803,13 +805,14 @@ _glamor_gradient_set_pixmap_destination(ScreenPtr screen,
> return 0;
> }
>
> + dispatch = glamor_get_dispatch(glamor_priv);
> +
> glamor_set_destination_pixmap_priv_nc(pixmap_priv);
>
> pixmap_priv_get_scale(pixmap_priv, xscale, yscale);
>
> glamor_priv->has_source_coords = 1;
> glamor_priv->has_mask_coords = 0;
> - glamor_setup_composite_vbo(screen, 4*2);
>
> DEBUGF("xscale = %f, yscale = %f,"
> " x_source = %d, y_source = %d, width = %d, height = %d\n",
> @@ -844,6 +847,31 @@ _glamor_gradient_set_pixmap_destination(ScreenPtr screen,
> tex_vertices[0], tex_vertices[1], tex_vertices[2], tex_vertices[3],
> tex_vertices[4], tex_vertices[5], tex_vertices[6], tex_vertices[7]);
>
> + /* Swap the vtx for triangle render. */
> + tmp = vertices[4];
> + vertices[4] = vertices[6];
> + vertices[6] = tmp;
> + tmp = vertices[5];
> + vertices[5] = vertices[7];
> + vertices[7] = tmp;
> +
> + tmp = tex_vertices[4];
> + tex_vertices[4] = tex_vertices[6];
> + tex_vertices[6] = tmp;
> + tmp = tex_vertices[5];
> + tex_vertices[5] = tex_vertices[7];
> + tex_vertices[7] = tmp;
Maybe you can write a new macro to do the vertices calculating and get
correct vertices sequence for Trangle_Strip and thus can avoid this
vertices swapping.
> +
> + dispatch->glVertexAttribPointer(GLAMOR_VERTEX_POS, 2, GL_FLOAT,
> + GL_FALSE, 2 * sizeof(float), vertices);
> + dispatch->glVertexAttribPointer(GLAMOR_VERTEX_SOURCE, 2, GL_FLOAT,
> + GL_FALSE, 2 * sizeof(float), tex_vertices);
> +
> + dispatch->glEnableVertexAttribArray(GLAMOR_VERTEX_POS);
> + dispatch->glEnableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
> +
> + glamor_put_dispatch(glamor_priv);
> +
> return 1;
> }
>
> @@ -1208,22 +1236,8 @@ glamor_generate_radial_gradient_picture(ScreenPtr screen,
> DEBUGF("C1:(%f, %f) R1:%f\nC2:(%f, %f) R2:%f\nA = %f\n",
> c1x, c1y, r1, c2x, c2y, r2, A_value);
>
> - glamor_emit_composite_rect(screen, tex_vertices, NULL, vertices);
> -
> - if (glamor_priv->render_nr_verts) {
> - if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP)
> - dispatch->glUnmapBuffer(GL_ARRAY_BUFFER);
> - else {
> -
> - dispatch->glBindBuffer(GL_ARRAY_BUFFER, glamor_priv->vbo);
> - dispatch->glBufferData(GL_ARRAY_BUFFER,
> - glamor_priv->vbo_offset,
> - glamor_priv->vb, GL_DYNAMIC_DRAW);
> - }
> -
> - dispatch->glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, NULL);
> - }
> -
> + /* Now rendering. */
> + dispatch->glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
>
> /* Do the clear logic.*/
> if (stops_count > RADIAL_SMALL_STOPS) {
> @@ -1576,22 +1590,8 @@ glamor_generate_linear_gradient_picture(ScreenPtr screen,
> dispatch->glUniform1f(pt_distance_uniform_location, pt_distance);
> }
>
> - /* set the transform matrix. */ /* Now rendering. */
> - glamor_emit_composite_rect(screen, tex_vertices, NULL, vertices);
> -
> - if (glamor_priv->render_nr_verts) {
> - if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP)
> - dispatch->glUnmapBuffer(GL_ARRAY_BUFFER);
> - else {
> -
> - dispatch->glBindBuffer(GL_ARRAY_BUFFER, glamor_priv->vbo);
> - dispatch->glBufferData(GL_ARRAY_BUFFER,
> - glamor_priv->vbo_offset,
> - glamor_priv->vb, GL_DYNAMIC_DRAW);
> - }
> -
> - dispatch->glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, NULL);
> - }
> + /* Now rendering. */
> + dispatch->glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
>
> /* Do the clear logic.*/
> if (stops_count > LINEAR_SMALL_STOPS) {
> --
> 1.7.7.6
>
More information about the Glamor
mailing list