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]; }
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]; }