Dave Airlie <airl...@gmail.com> writes: > From: Dave Airlie <airl...@redhat.com> > > This converts the Xv code to using VBOs instead of > client ptrs. This is necessary to move towards using > the core profile later. > > Signed-off-by: Dave Airlie <airl...@redhat.com> > --- > glamor/glamor_xv.c | 31 +++++++++++++++++++++---------- > 1 file changed, 21 insertions(+), 10 deletions(-) > > diff --git a/glamor/glamor_xv.c b/glamor/glamor_xv.c > index 85e6528..d9db574 100644 > --- a/glamor/glamor_xv.c > +++ b/glamor/glamor_xv.c > @@ -245,7 +245,6 @@ glamor_xv_render(glamor_port_private *port_priv) > PixmapPtr pixmap = port_priv->pPixmap; > glamor_pixmap_private *pixmap_priv = glamor_get_pixmap_private(pixmap); > glamor_pixmap_private *src_pixmap_priv[3]; > - float vertices[32], texcoords[8]; > BoxPtr box = REGION_RECTS(&port_priv->clip); > int nBox = REGION_NUM_RECTS(&port_priv->clip); > int dst_x_off, dst_y_off; > @@ -260,6 +259,8 @@ glamor_xv_render(glamor_port_private *port_priv) > float bright, cont, gamma; > int ref = port_priv->transform_index; > GLint uloc, sampler_loc; > + GLfloat *v; > + char *vbo_offset; > > if (!glamor_priv->xv_prog) > glamor_init_xv_shader(screen); > @@ -335,16 +336,13 @@ glamor_xv_render(glamor_port_private *port_priv) > sampler_loc = glGetUniformLocation(glamor_priv->xv_prog, "v_sampler"); > glUniform1i(sampler_loc, 2); > > - glVertexAttribPointer(GLAMOR_VERTEX_SOURCE, 2, > - GL_FLOAT, GL_FALSE, > - 2 * sizeof(float), texcoords); > + glEnableVertexAttribArray(GLAMOR_VERTEX_POS); > glEnableVertexAttribArray(GLAMOR_VERTEX_SOURCE); > > - glVertexAttribPointer(GLAMOR_VERTEX_POS, 2, GL_FLOAT, > - GL_FALSE, 2 * sizeof(float), vertices); > - > - glEnableVertexAttribArray(GLAMOR_VERTEX_POS); > glEnable(GL_SCISSOR_TEST); > + > + v = glamor_get_vbo_space(screen, 16 * sizeof(GLfloat) * nBox, > &vbo_offset); > + > for (i = 0; i < nBox; i++) { > float off_x = box[i].x1 - port_priv->drw_x; > float off_y = box[i].y1 - port_priv->drw_y; > @@ -352,6 +350,7 @@ glamor_xv_render(glamor_port_private *port_priv) > float diff_y = (float) port_priv->src_h / (float) port_priv->dst_h; > float srcx, srcy, srcw, srch; > int dstx, dsty, dstw, dsth; > + GLfloat *ptr = v + (i * 16); > > dstx = box[i].x1 + dst_x_off; > dsty = box[i].y1 + dst_y_off; > @@ -369,7 +368,7 @@ glamor_xv_render(glamor_port_private *port_priv) > dsty, > dstx + dstw, > dsty + dsth * 2, > - vertices); > + ptr); > > glamor_set_normalize_tcoords(src_pixmap_priv[0], > src_xscale[0], > @@ -378,16 +377,28 @@ glamor_xv_render(glamor_port_private *port_priv) > srcy, > srcx + srcw, > srcy + srch * 2, > - texcoords); > + ptr + 8); > + > + > + glVertexAttribPointer(GLAMOR_VERTEX_POS, 2, > + GL_FLOAT, GL_FALSE, > + 2 * sizeof(float), vbo_offset); > + > + glVertexAttribPointer(GLAMOR_VERTEX_SOURCE, 2, > + GL_FLOAT, GL_FALSE, > + 2 * sizeof(float), vbo_offset + 8 * > sizeof(GLfloat)); > > glScissor(dstx, dsty, dstw, dsth); > glDrawArrays(GL_TRIANGLE_FAN, 0, 3); > + vbo_offset += 16 * sizeof(GLfloat);
You could move the pointer setup out of the loop, s/0/i * 4/ in glDrawArrays(), and then drop the vbo_offset math, I think. With that changed, the first two are: Reviewed-by: Eric Anholt <e...@anholt.net>
signature.asc
Description: PGP signature
_______________________________________________ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel