diff --git a/hw/xfree86/common/xf86Module.h b/hw/xfree86/common/xf86Module.h index ded52162e..4c64c35b5 100644 --- a/hw/xfree86/common/xf86Module.h +++ b/hw/xfree86/common/xf86Module.h @@ -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) diff --git a/hw/xfree86/dri2/dri2.c b/hw/xfree86/dri2/dri2.c index 3e8a7d4a8..8795cd11d 100644 --- a/hw/xfree86/dri2/dri2.c +++ b/hw/xfree86/dri2/dri2.c @@ -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); diff --git a/hw/xfree86/dri2/dri2.h b/hw/xfree86/dri2/dri2.h index 22ee98304..175471aae 100644 --- a/hw/xfree86/dri2/dri2.h +++ b/hw/xfree86/dri2/dri2.h @@ -35,16 +35,6 @@ #include -/* 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); diff --git a/hw/xfree86/dri2/dri2ext.c b/hw/xfree86/dri2/dri2ext.c index ea160ac60..029dce84e 100644 --- a/hw/xfree86/dri2/dri2ext.c +++ b/hw/xfree86/dri2/dri2ext.c @@ -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;