LOCAL union dri_buffer*
dri_state_get_rendering_buffer(dri_state_t *state, dri_drawable_t *dri_drwble)
{
  dri2_drawable_t *dri2_drwble = (dri2_drawable_t *)dri_drwble;
  int i;
  int count;
  unsigned int attachments[5];
  VA_DRI2Buffer *buffers;

  i = 0;
  attachments[i++] = __DRI_BUFFER_BACK_LEFT;
  attachments[i++] = __DRI_BUFFER_FRONT_LEFT;
  buffers = VA_DRI2GetBuffers(state->x11_dpy,
                              dri_drwble->x_drawable,
                              &dri2_drwble->width,
                              &dri2_drwble->height,
                              attachments,
                              i,
                              &count);
  assert(buffers);
  if (buffers == NULL)
    return NULL;

  dri2_drwble->has_backbuffer = 0;

  for (i = 0; i < count; i++) {
    dri2_drwble->buffers[i].dri2.attachment = buffers[i].attachment;
    dri2_drwble->buffers[i].dri2.name = buffers[i].name;
    dri2_drwble->buffers[i].dri2.pitch = buffers[i].pitch;
    dri2_drwble->buffers[i].dri2.cpp = buffers[i].cpp;
    dri2_drwble->buffers[i].dri2.flags = buffers[i].flags;

    if (buffers[i].attachment == __DRI_BUFFER_BACK_LEFT) {
      dri2_drwble->has_backbuffer = 1;
      dri2_drwble->back_index = i;
    }

    if (buffers[i].attachment == __DRI_BUFFER_FRONT_LEFT)
      dri2_drwble->front_index = i;
  }

  dri_drwble->width = dri2_drwble->width;
  dri_drwble->height = dri2_drwble->height;
  Xfree(buffers);

  if (dri2_drwble->has_backbuffer)
    return &dri2_drwble->buffers[dri2_drwble->back_index];

  return &dri2_drwble->buffers[dri2_drwble->front_index];
}
Exemplo n.º 2
0
static union dri_buffer *
dri2GetRenderingBuffer(VADriverContextP ctx, struct dri_drawable *dri_drawable)
{
    struct dri2_drawable *dri2_drawable = (struct dri2_drawable *)dri_drawable;
    int i;
    int count;
    unsigned int attachments[5];
    VA_DRI2Buffer *buffers;
    
    i = 0;
    if (dri_drawable->is_window)
        attachments[i++] = __DRI_BUFFER_BACK_LEFT;
    else
        attachments[i++] = __DRI_BUFFER_FRONT_LEFT;

    buffers = VA_DRI2GetBuffers(ctx->native_dpy, dri_drawable->x_drawable,
			     &dri2_drawable->width, &dri2_drawable->height, 
                             attachments, i, &count);
    assert(buffers);
    if (buffers == NULL)
        return NULL;

    dri2_drawable->has_backbuffer = 0;

    for (i = 0; i < count; i++) {
        dri2_drawable->buffers[i].dri2.attachment = buffers[i].attachment;
        dri2_drawable->buffers[i].dri2.name = buffers[i].name;
        dri2_drawable->buffers[i].dri2.pitch = buffers[i].pitch;
        dri2_drawable->buffers[i].dri2.cpp = buffers[i].cpp;
        dri2_drawable->buffers[i].dri2.flags = buffers[i].flags;
        
        if (buffers[i].attachment == __DRI_BUFFER_BACK_LEFT) {
            dri2_drawable->has_backbuffer = 1;
            dri2_drawable->back_index = i;
        }

        if (buffers[i].attachment == __DRI_BUFFER_FRONT_LEFT)
            dri2_drawable->front_index = i;
    }
    
    dri_drawable->width = dri2_drawable->width;
    dri_drawable->height = dri2_drawable->height;
    Xfree(buffers);

    if (dri2_drawable->has_backbuffer)
        return &dri2_drawable->buffers[dri2_drawable->back_index];

    return &dri2_drawable->buffers[dri2_drawable->front_index];
}