[PATCH 2/8] glamor/xv: add vbo support

Dave Airlie airlied at gmail.com
Mon Jan 18 17:49:54 PST 2016


On 19 January 2016 at 11:15, Eric Anholt <eric at anholt.net> wrote:
> Dave Airlie <airlied at gmail.com> writes:
>
>> From: Dave Airlie <airlied at 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 <airlied at 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:

unfortunately that doesn't work all that easily, as we aren't
interleaving things properly.

I've sent a v2 patch. Also since in some paths we probably can't leave the VBO
mapped across draws, I've fixed things up to do it in two passes, one
to set the VBO
up and the other to do the draws.

Dave.


More information about the xorg-devel mailing list