Remove old DRI2 buffer alloc/free interfaces

These old interfaces are no longer supported by the server, removing them
requires bumping the video driver ABI. Note that this is not guaranteed to
be the last change in ABI version 6.

Signed-off-by: Keith Packard <keithp@keithp.com>
Reviewed-by: Eric Anholt <eric@anholt.net>
This commit is contained in:
Keith Packard 2009-07-06 11:53:02 -07:00
parent 2e2c5b216c
commit 5aec727452
4 changed files with 73 additions and 209 deletions

View File

@ -82,7 +82,7 @@ typedef enum {
* mask is 0xFFFF0000.
*/
#define ABI_ANSIC_VERSION SET_ABI_VERSION(0, 4)
#define ABI_VIDEODRV_VERSION SET_ABI_VERSION(5, 0)
#define ABI_VIDEODRV_VERSION SET_ABI_VERSION(6, 0)
#define ABI_XINPUT_VERSION SET_ABI_VERSION(7, 0)
#define ABI_EXTENSION_VERSION SET_ABI_VERSION(2, 0)
#define ABI_FONT_VERSION SET_ABI_VERSION(0, 6)

View File

@ -53,7 +53,7 @@ typedef struct _DRI2Drawable {
unsigned int refCount;
int width;
int height;
DRI2Buffer2Ptr *buffers;
DRI2BufferPtr *buffers;
int bufferCount;
unsigned int pendingSequence;
} DRI2DrawableRec, *DRI2DrawablePtr;
@ -64,9 +64,6 @@ typedef struct _DRI2Screen {
int fd;
unsigned int lastSequence;
DRI2CreateBuffersProcPtr CreateBuffers;
DRI2DestroyBuffersProcPtr DestroyBuffers;
DRI2CreateBufferProcPtr CreateBuffer;
DRI2DestroyBufferProcPtr DestroyBuffer;
DRI2CopyRegionProcPtr CopyRegion;
@ -155,13 +152,13 @@ find_attachment(DRI2DrawablePtr pPriv, unsigned attachment)
return -1;
}
static DRI2Buffer2Ptr
static DRI2BufferPtr
allocate_or_reuse_buffer(DrawablePtr pDraw, DRI2ScreenPtr ds,
DRI2DrawablePtr pPriv,
unsigned int attachment, unsigned int format,
int dimensions_match)
{
DRI2Buffer2Ptr buffer;
DRI2BufferPtr buffer;
int old_buf;
old_buf = find_attachment(pPriv, attachment);
@ -178,14 +175,14 @@ allocate_or_reuse_buffer(DrawablePtr pDraw, DRI2ScreenPtr ds,
return buffer;
}
static DRI2Buffer2Ptr *
static DRI2BufferPtr *
do_get_buffers(DrawablePtr pDraw, int *width, int *height,
unsigned int *attachments, int count, int *out_count,
int has_format)
{
DRI2ScreenPtr ds = DRI2GetScreen(pDraw->pScreen);
DRI2DrawablePtr pPriv = DRI2GetDrawable(pDraw);
DRI2Buffer2Ptr *buffers;
DRI2BufferPtr *buffers;
int need_real_front = 0;
int need_fake_front = 0;
int have_fake_front = 0;
@ -205,154 +202,64 @@ do_get_buffers(DrawablePtr pDraw, int *width, int *height,
buffers = xalloc((count + 1) * sizeof(buffers[0]));
if (ds->CreateBuffer) {
/* Version 2 API with CreateBuffer */
for (i = 0; i < count; i++) {
const unsigned attachment = *(attachments++);
const unsigned format = (has_format) ? *(attachments++) : 0;
for (i = 0; i < count; i++) {
const unsigned attachment = *(attachments++);
const unsigned format = (has_format) ? *(attachments++) : 0;
buffers[i] = allocate_or_reuse_buffer(pDraw, ds, pPriv, attachment,
format, dimensions_match);
buffers[i] = allocate_or_reuse_buffer(pDraw, ds, pPriv, attachment,
format, dimensions_match);
/* If the drawable is a window and the front-buffer is requested,
* silently add the fake front-buffer to the list of requested
* attachments. The counting logic in the loop accounts for the case
* where the client requests both the fake and real front-buffer.
*/
if (attachment == DRI2BufferBackLeft) {
need_real_front++;
front_format = format;
}
/* If the drawable is a window and the front-buffer is requested,
* silently add the fake front-buffer to the list of requested
* attachments. The counting logic in the loop accounts for the case
* where the client requests both the fake and real front-buffer.
*/
if (attachment == DRI2BufferBackLeft) {
need_real_front++;
front_format = format;
}
if (attachment == DRI2BufferFrontLeft) {
need_real_front--;
front_format = format;
if (pDraw->type == DRAWABLE_WINDOW) {
need_fake_front++;
}
}
if (attachment == DRI2BufferFrontLeft) {
need_real_front--;
front_format = format;
if (pDraw->type == DRAWABLE_WINDOW) {
if (attachment == DRI2BufferFakeFrontLeft) {
need_fake_front--;
have_fake_front = 1;
}
need_fake_front++;
}
}
if (need_real_front > 0) {
buffers[i++] = allocate_or_reuse_buffer(pDraw, ds, pPriv,
DRI2BufferFrontLeft,
front_format, dimensions_match);
}
if (need_fake_front > 0) {
buffers[i++] = allocate_or_reuse_buffer(pDraw, ds, pPriv,
DRI2BufferFakeFrontLeft,
front_format, dimensions_match);
have_fake_front = 1;
}
*out_count = i;
if (pPriv->buffers != NULL) {
for (i = 0; i < pPriv->bufferCount; i++) {
if (pPriv->buffers[i] != NULL) {
(*ds->DestroyBuffer)(pDraw, pPriv->buffers[i]);
}
}
xfree(pPriv->buffers);
}
} else {
DRI2BufferPtr buffers1;
unsigned int temp_buf[32];
unsigned int *temp = temp_buf;
int i;
int buffers_match = 1;
/* Version 1 API with CreateBuffers */
if ((count + 1) > 32) {
temp = xalloc((count + 1) * sizeof(temp[0]));
}
for (i = 0; i < count; i++) {
const unsigned attachment = *(attachments++);
/* Version 1 doesn't deal with the format at all */
if (has_format)
attachments++;
/*
* Make sure the client also gets the front buffer when
* it asks for a back buffer
*/
if (attachment == DRI2BufferBackLeft)
need_real_front++;
/*
* If the drawable is a window and the front-buffer is requested,
* silently add the fake front-buffer to the list of requested
* attachments. The counting logic in the loop accounts for the
* case where the client requests both the fake and real
* front-buffer.
*/
if (attachment == DRI2BufferFrontLeft) {
need_real_front--;
if (pDraw->type == DRAWABLE_WINDOW)
need_fake_front++;
}
if (pDraw->type == DRAWABLE_WINDOW &&
attachment == DRI2BufferFakeFrontLeft)
{
if (pDraw->type == DRAWABLE_WINDOW) {
if (attachment == DRI2BufferFakeFrontLeft) {
need_fake_front--;
have_fake_front = 1;
}
}
}
temp[i] = attachment;
if (need_real_front > 0) {
buffers[i++] = allocate_or_reuse_buffer(pDraw, ds, pPriv,
DRI2BufferFrontLeft,
front_format, dimensions_match);
}
if (need_fake_front > 0) {
buffers[i++] = allocate_or_reuse_buffer(pDraw, ds, pPriv,
DRI2BufferFakeFrontLeft,
front_format, dimensions_match);
have_fake_front = 1;
}
*out_count = i;
if (pPriv->buffers != NULL) {
for (i = 0; i < pPriv->bufferCount; i++) {
if (pPriv->buffers[i] != NULL) {
(*ds->DestroyBuffer)(pDraw, pPriv->buffers[i]);
}
}
if (need_real_front > 0)
temp[count++] = DRI2BufferFrontLeft;
if (need_fake_front > 0) {
temp[count++] = DRI2BufferFakeFrontLeft;
have_fake_front = 1;
}
if (count != pPriv->bufferCount)
buffers_match = 0;
else {
for (i = 0; i < count; i++)
if (pPriv->buffers[i]->attachment != temp[i]) {
buffers_match = 0;
break;
}
}
if (pPriv->buffers == NULL || !dimensions_match || !buffers_match)
{
buffers1 = (*ds->CreateBuffers)(pDraw, temp, count);
if (pPriv->buffers != NULL)
(*ds->DestroyBuffers)(pDraw, (DRI2BufferPtr) pPriv->buffers[0],
pPriv->bufferCount);
}
else
buffers1 = (DRI2BufferPtr) pPriv->buffers[0];
for (i = 0; i < count; i++)
buffers[i] = (DRI2Buffer2Ptr) &buffers1[i];
*out_count = count;
if (pPriv->buffers)
xfree (pPriv->buffers);
if (temp != temp_buf) {
xfree(temp);
}
xfree(pPriv->buffers);
}
pPriv->buffers = buffers;
@ -384,7 +291,7 @@ do_get_buffers(DrawablePtr pDraw, int *width, int *height,
return pPriv->buffers;
}
DRI2Buffer2Ptr *
DRI2BufferPtr *
DRI2GetBuffers(DrawablePtr pDraw, int *width, int *height,
unsigned int *attachments, int count, int *out_count)
{
@ -392,7 +299,7 @@ DRI2GetBuffers(DrawablePtr pDraw, int *width, int *height,
out_count, FALSE);
}
DRI2Buffer2Ptr *
DRI2BufferPtr *
DRI2GetBuffersWithFormat(DrawablePtr pDraw, int *width, int *height,
unsigned int *attachments, int count, int *out_count)
{
@ -449,14 +356,8 @@ DRI2DestroyDrawable(DrawablePtr pDraw)
if (pPriv->buffers != NULL) {
int i;
if (ds->DestroyBuffer) {
for (i = 0; i < pPriv->bufferCount; i++) {
(*ds->DestroyBuffer)(pDraw, pPriv->buffers[i]);
}
} else {
(*ds->DestroyBuffers)(pDraw, (DRI2BufferPtr) pPriv->buffers[0],
pPriv->bufferCount);
}
for (i = 0; i < pPriv->bufferCount; i++)
(*ds->DestroyBuffer)(pDraw, pPriv->buffers[i]);
xfree(pPriv->buffers);
}
@ -510,6 +411,9 @@ DRI2ScreenInit(ScreenPtr pScreen, DRI2InfoPtr info)
{
DRI2ScreenPtr ds;
if (info->version < 3)
return FALSE;
ds = xalloc(sizeof *ds);
if (!ds)
return FALSE;
@ -518,32 +422,8 @@ DRI2ScreenInit(ScreenPtr pScreen, DRI2InfoPtr info)
ds->driverName = info->driverName;
ds->deviceName = info->deviceName;
/* Prefer the new one-at-a-time buffer API */
if (info->version >= 2 && info->CreateBuffer && info->DestroyBuffer) {
ds->CreateBuffer = info->CreateBuffer;
ds->DestroyBuffer = info->DestroyBuffer;
ds->CreateBuffers = NULL;
ds->DestroyBuffers = NULL;
} else if (info->CreateBuffers && info->DestroyBuffers) {
xf86DrvMsg(pScreen->myNum, X_WARNING,
"[DRI2] Version 1 API (broken front buffer rendering)\n");
ds->CreateBuffer = NULL;
ds->DestroyBuffer = NULL;
ds->CreateBuffers = info->CreateBuffers;
ds->DestroyBuffers = info->DestroyBuffers;
} else {
xf86DrvMsg(pScreen->myNum, X_ERROR,
"[DRI2] Missing buffer management functions\n");
xfree(ds);
return FALSE;
}
if (!info->CopyRegion) {
xf86DrvMsg(pScreen->myNum, X_ERROR,
"[DRI2] Missing copy region function\n");
xfree(ds);
return FALSE;
}
ds->CreateBuffer = info->CreateBuffer;
ds->DestroyBuffer = info->DestroyBuffer;
ds->CopyRegion = info->CopyRegion;
dixSetPrivate(&pScreen->devPrivates, dri2ScreenPrivateKey, ds);

View File

@ -35,16 +35,6 @@
#include <X11/extensions/dri2tokens.h>
/* Version 1 structure (for ABI compatibility) */
typedef struct {
unsigned int attachment;
unsigned int name;
unsigned int pitch;
unsigned int cpp;
unsigned int flags;
void *driverPrivate;
} DRI2BufferRec, *DRI2BufferPtr;
/* Version 2 structure (with format at the end) */
typedef struct {
unsigned int attachment;
@ -52,9 +42,11 @@ typedef struct {
unsigned int pitch;
unsigned int cpp;
unsigned int flags;
void *driverPrivate;
unsigned int format;
} DRI2Buffer2Rec, *DRI2Buffer2Ptr;
void *driverPrivate;
} DRI2BufferRec, *DRI2BufferPtr;
typedef DRI2BufferRec DRI2Buffer2Rec, *DRI2Buffer2Ptr;
typedef DRI2BufferPtr (*DRI2CreateBuffersProcPtr)(DrawablePtr pDraw,
unsigned int *attachments,
@ -70,16 +62,16 @@ typedef void (*DRI2CopyRegionProcPtr)(DrawablePtr pDraw,
typedef void (*DRI2WaitProcPtr)(WindowPtr pWin,
unsigned int sequence);
typedef DRI2Buffer2Ptr (*DRI2CreateBufferProcPtr)(DrawablePtr pDraw,
typedef DRI2BufferPtr (*DRI2CreateBufferProcPtr)(DrawablePtr pDraw,
unsigned int attachment,
unsigned int format);
typedef void (*DRI2DestroyBufferProcPtr)(DrawablePtr pDraw,
DRI2Buffer2Ptr buffer);
DRI2BufferPtr buffer);
/**
* Version of the DRI2InfoRec structure defined in this header
*/
#define DRI2INFOREC_VERSION 2
#define DRI2INFOREC_VERSION 3
typedef struct {
unsigned int version; /**< Version of this struct */
@ -87,18 +79,10 @@ typedef struct {
const char *driverName;
const char *deviceName;
DRI2CreateBuffersProcPtr CreateBuffers;
DRI2DestroyBuffersProcPtr DestroyBuffers;
DRI2CopyRegionProcPtr CopyRegion;
DRI2WaitProcPtr Wait;
/**
* \name Fields added in version 2 of the structure.
*/
/*@{*/
DRI2CreateBufferProcPtr CreateBuffer;
DRI2DestroyBufferProcPtr DestroyBuffer;
/*@}*/
DRI2CopyRegionProcPtr CopyRegion;
DRI2WaitProcPtr Wait;
} DRI2InfoRec, *DRI2InfoPtr;
@ -119,7 +103,7 @@ extern _X_EXPORT int DRI2CreateDrawable(DrawablePtr pDraw);
extern _X_EXPORT void DRI2DestroyDrawable(DrawablePtr pDraw);
extern _X_EXPORT DRI2Buffer2Ptr *DRI2GetBuffers(DrawablePtr pDraw,
extern _X_EXPORT DRI2BufferPtr *DRI2GetBuffers(DrawablePtr pDraw,
int *width,
int *height,
unsigned int *attachments,
@ -149,7 +133,7 @@ extern _X_EXPORT int DRI2CopyRegion(DrawablePtr pDraw,
*/
extern _X_EXPORT void DRI2Version(int *major, int *minor);
extern _X_EXPORT DRI2Buffer2Ptr *DRI2GetBuffersWithFormat(DrawablePtr pDraw,
extern _X_EXPORT DRI2BufferPtr *DRI2GetBuffersWithFormat(DrawablePtr pDraw,
int *width, int *height, unsigned int *attachments, int count,
int *out_count);

View File

@ -195,7 +195,7 @@ ProcDRI2DestroyDrawable(ClientPtr client)
static void
send_buffers_reply(ClientPtr client, DrawablePtr pDrawable,
DRI2Buffer2Ptr *buffers, int count, int width, int height)
DRI2BufferPtr *buffers, int count, int width, int height)
{
xDRI2GetBuffersReply rep;
int skip = 0;
@ -245,7 +245,7 @@ ProcDRI2GetBuffers(ClientPtr client)
{
REQUEST(xDRI2GetBuffersReq);
DrawablePtr pDrawable;
DRI2Buffer2Ptr *buffers;
DRI2BufferPtr *buffers;
int status, width, height, count;
unsigned int *attachments;
@ -268,7 +268,7 @@ ProcDRI2GetBuffersWithFormat(ClientPtr client)
{
REQUEST(xDRI2GetBuffersReq);
DrawablePtr pDrawable;
DRI2Buffer2Ptr *buffers;
DRI2BufferPtr *buffers;
int status, width, height, count;
unsigned int *attachments;