dri2: Preserve compatibility with 1.6 DRI2 API/ABI
The old DRI2 buffer allocation API wasn't great, but there's no reason to make the server stop working with those drivers. This patch has the X server adapting to the API provided by the driver, using the new API where available and falling back to the old API as necessary. A warning will be placed in the log file when the old API is in use. Signed-off-by: Keith Packard <keithp@keithp.com>
This commit is contained in:
parent
7c7f0c2c6a
commit
2e2c5b216c
|
@ -53,7 +53,7 @@ typedef struct _DRI2Drawable {
|
||||||
unsigned int refCount;
|
unsigned int refCount;
|
||||||
int width;
|
int width;
|
||||||
int height;
|
int height;
|
||||||
DRI2BufferPtr *buffers;
|
DRI2Buffer2Ptr *buffers;
|
||||||
int bufferCount;
|
int bufferCount;
|
||||||
unsigned int pendingSequence;
|
unsigned int pendingSequence;
|
||||||
} DRI2DrawableRec, *DRI2DrawablePtr;
|
} DRI2DrawableRec, *DRI2DrawablePtr;
|
||||||
|
@ -63,6 +63,10 @@ typedef struct _DRI2Screen {
|
||||||
const char *deviceName;
|
const char *deviceName;
|
||||||
int fd;
|
int fd;
|
||||||
unsigned int lastSequence;
|
unsigned int lastSequence;
|
||||||
|
|
||||||
|
DRI2CreateBuffersProcPtr CreateBuffers;
|
||||||
|
DRI2DestroyBuffersProcPtr DestroyBuffers;
|
||||||
|
|
||||||
DRI2CreateBufferProcPtr CreateBuffer;
|
DRI2CreateBufferProcPtr CreateBuffer;
|
||||||
DRI2DestroyBufferProcPtr DestroyBuffer;
|
DRI2DestroyBufferProcPtr DestroyBuffer;
|
||||||
DRI2CopyRegionProcPtr CopyRegion;
|
DRI2CopyRegionProcPtr CopyRegion;
|
||||||
|
@ -133,17 +137,17 @@ DRI2CreateDrawable(DrawablePtr pDraw)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
find_attachment(DRI2BufferPtr *buffer_list, int count, unsigned attachment)
|
find_attachment(DRI2DrawablePtr pPriv, unsigned attachment)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (buffer_list == NULL) {
|
if (pPriv->buffers == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < count; i++) {
|
for (i = 0; i < pPriv->bufferCount; i++) {
|
||||||
if ((buffer_list[i] != NULL)
|
if ((pPriv->buffers[i] != NULL)
|
||||||
&& (buffer_list[i]->attachment == attachment)) {
|
&& (pPriv->buffers[i]->attachment == attachment)) {
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -151,16 +155,16 @@ find_attachment(DRI2BufferPtr *buffer_list, int count, unsigned attachment)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static DRI2BufferPtr
|
static DRI2Buffer2Ptr
|
||||||
allocate_or_reuse_buffer(DrawablePtr pDraw, DRI2ScreenPtr ds,
|
allocate_or_reuse_buffer(DrawablePtr pDraw, DRI2ScreenPtr ds,
|
||||||
DRI2DrawablePtr pPriv,
|
DRI2DrawablePtr pPriv,
|
||||||
unsigned int attachment, unsigned int format,
|
unsigned int attachment, unsigned int format,
|
||||||
int dimensions_match)
|
int dimensions_match)
|
||||||
{
|
{
|
||||||
DRI2BufferPtr buffer;
|
DRI2Buffer2Ptr buffer;
|
||||||
int old_buf;
|
int old_buf;
|
||||||
|
|
||||||
old_buf = find_attachment(pPriv->buffers, pPriv->bufferCount, attachment);
|
old_buf = find_attachment(pPriv, attachment);
|
||||||
|
|
||||||
if ((old_buf < 0)
|
if ((old_buf < 0)
|
||||||
|| !dimensions_match
|
|| !dimensions_match
|
||||||
|
@ -174,14 +178,14 @@ allocate_or_reuse_buffer(DrawablePtr pDraw, DRI2ScreenPtr ds,
|
||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
static DRI2BufferPtr *
|
static DRI2Buffer2Ptr *
|
||||||
do_get_buffers(DrawablePtr pDraw, int *width, int *height,
|
do_get_buffers(DrawablePtr pDraw, int *width, int *height,
|
||||||
unsigned int *attachments, int count, int *out_count,
|
unsigned int *attachments, int count, int *out_count,
|
||||||
int has_format)
|
int has_format)
|
||||||
{
|
{
|
||||||
DRI2ScreenPtr ds = DRI2GetScreen(pDraw->pScreen);
|
DRI2ScreenPtr ds = DRI2GetScreen(pDraw->pScreen);
|
||||||
DRI2DrawablePtr pPriv = DRI2GetDrawable(pDraw);
|
DRI2DrawablePtr pPriv = DRI2GetDrawable(pDraw);
|
||||||
DRI2BufferPtr *buffers;
|
DRI2Buffer2Ptr *buffers;
|
||||||
int need_real_front = 0;
|
int need_real_front = 0;
|
||||||
int need_fake_front = 0;
|
int need_fake_front = 0;
|
||||||
int have_fake_front = 0;
|
int have_fake_front = 0;
|
||||||
|
@ -201,67 +205,155 @@ do_get_buffers(DrawablePtr pDraw, int *width, int *height,
|
||||||
|
|
||||||
buffers = xalloc((count + 1) * sizeof(buffers[0]));
|
buffers = xalloc((count + 1) * sizeof(buffers[0]));
|
||||||
|
|
||||||
for (i = 0; i < count; i++) {
|
if (ds->CreateBuffer) {
|
||||||
const unsigned attachment = *(attachments++);
|
/* Version 2 API with CreateBuffer */
|
||||||
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,
|
buffers[i] = allocate_or_reuse_buffer(pDraw, ds, pPriv, attachment,
|
||||||
format, dimensions_match);
|
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,
|
if (attachment == DRI2BufferFrontLeft) {
|
||||||
* silently add the fake front-buffer to the list of requested
|
need_real_front--;
|
||||||
* attachments. The counting logic in the loop accounts for the case
|
front_format = format;
|
||||||
* where the client requests both the fake and real front-buffer.
|
|
||||||
*/
|
|
||||||
if (attachment == DRI2BufferBackLeft) {
|
|
||||||
need_real_front++;
|
|
||||||
front_format = format;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (attachment == DRI2BufferFrontLeft) {
|
if (pDraw->type == DRAWABLE_WINDOW) {
|
||||||
need_real_front--;
|
need_fake_front++;
|
||||||
front_format = format;
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (pDraw->type == DRAWABLE_WINDOW) {
|
if (pDraw->type == DRAWABLE_WINDOW) {
|
||||||
need_fake_front++;
|
if (attachment == DRI2BufferFakeFrontLeft) {
|
||||||
|
need_fake_front--;
|
||||||
|
have_fake_front = 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pDraw->type == DRAWABLE_WINDOW) {
|
if (need_real_front > 0) {
|
||||||
if (attachment == DRI2BufferFakeFrontLeft) {
|
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)
|
||||||
|
{
|
||||||
need_fake_front--;
|
need_fake_front--;
|
||||||
have_fake_front = 1;
|
have_fake_front = 1;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (need_real_front > 0) {
|
temp[i] = attachment;
|
||||||
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);
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pPriv->buffers = buffers;
|
pPriv->buffers = buffers;
|
||||||
pPriv->bufferCount = *out_count;
|
pPriv->bufferCount = *out_count;
|
||||||
|
@ -292,7 +384,7 @@ do_get_buffers(DrawablePtr pDraw, int *width, int *height,
|
||||||
return pPriv->buffers;
|
return pPriv->buffers;
|
||||||
}
|
}
|
||||||
|
|
||||||
DRI2BufferPtr *
|
DRI2Buffer2Ptr *
|
||||||
DRI2GetBuffers(DrawablePtr pDraw, int *width, int *height,
|
DRI2GetBuffers(DrawablePtr pDraw, int *width, int *height,
|
||||||
unsigned int *attachments, int count, int *out_count)
|
unsigned int *attachments, int count, int *out_count)
|
||||||
{
|
{
|
||||||
|
@ -300,7 +392,7 @@ DRI2GetBuffers(DrawablePtr pDraw, int *width, int *height,
|
||||||
out_count, FALSE);
|
out_count, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
DRI2BufferPtr *
|
DRI2Buffer2Ptr *
|
||||||
DRI2GetBuffersWithFormat(DrawablePtr pDraw, int *width, int *height,
|
DRI2GetBuffersWithFormat(DrawablePtr pDraw, int *width, int *height,
|
||||||
unsigned int *attachments, int count, int *out_count)
|
unsigned int *attachments, int count, int *out_count)
|
||||||
{
|
{
|
||||||
|
@ -326,13 +418,13 @@ DRI2CopyRegion(DrawablePtr pDraw, RegionPtr pRegion,
|
||||||
for (i = 0; i < pPriv->bufferCount; i++)
|
for (i = 0; i < pPriv->bufferCount; i++)
|
||||||
{
|
{
|
||||||
if (pPriv->buffers[i]->attachment == dest)
|
if (pPriv->buffers[i]->attachment == dest)
|
||||||
pDestBuffer = pPriv->buffers[i];
|
pDestBuffer = (DRI2BufferPtr) pPriv->buffers[i];
|
||||||
if (pPriv->buffers[i]->attachment == src)
|
if (pPriv->buffers[i]->attachment == src)
|
||||||
pSrcBuffer = pPriv->buffers[i];
|
pSrcBuffer = (DRI2BufferPtr) pPriv->buffers[i];
|
||||||
}
|
}
|
||||||
if (pSrcBuffer == NULL || pDestBuffer == NULL)
|
if (pSrcBuffer == NULL || pDestBuffer == NULL)
|
||||||
return BadValue;
|
return BadValue;
|
||||||
|
|
||||||
(*ds->CopyRegion)(pDraw, pRegion, pDestBuffer, pSrcBuffer);
|
(*ds->CopyRegion)(pDraw, pRegion, pDestBuffer, pSrcBuffer);
|
||||||
|
|
||||||
return Success;
|
return Success;
|
||||||
|
@ -349,7 +441,7 @@ DRI2DestroyDrawable(DrawablePtr pDraw)
|
||||||
pPriv = DRI2GetDrawable(pDraw);
|
pPriv = DRI2GetDrawable(pDraw);
|
||||||
if (pPriv == NULL)
|
if (pPriv == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
pPriv->refCount--;
|
pPriv->refCount--;
|
||||||
if (pPriv->refCount > 0)
|
if (pPriv->refCount > 0)
|
||||||
return;
|
return;
|
||||||
|
@ -357,8 +449,13 @@ DRI2DestroyDrawable(DrawablePtr pDraw)
|
||||||
if (pPriv->buffers != NULL) {
|
if (pPriv->buffers != NULL) {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < pPriv->bufferCount; i++) {
|
if (ds->DestroyBuffer) {
|
||||||
(*ds->DestroyBuffer)(pDraw, pPriv->buffers[i]);
|
for (i = 0; i < pPriv->bufferCount; i++) {
|
||||||
|
(*ds->DestroyBuffer)(pDraw, pPriv->buffers[i]);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
(*ds->DestroyBuffers)(pDraw, (DRI2BufferPtr) pPriv->buffers[0],
|
||||||
|
pPriv->bufferCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
xfree(pPriv->buffers);
|
xfree(pPriv->buffers);
|
||||||
|
@ -417,18 +514,36 @@ DRI2ScreenInit(ScreenPtr pScreen, DRI2InfoPtr info)
|
||||||
if (!ds)
|
if (!ds)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if ((info->version < 2)
|
|
||||||
|| (info->CreateBuffer == NULL)
|
|
||||||
|| (info->DestroyBuffer == NULL)) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ds->fd = info->fd;
|
ds->fd = info->fd;
|
||||||
ds->driverName = info->driverName;
|
ds->driverName = info->driverName;
|
||||||
ds->deviceName = info->deviceName;
|
ds->deviceName = info->deviceName;
|
||||||
ds->CreateBuffer = info->CreateBuffer;
|
|
||||||
ds->DestroyBuffer = info->DestroyBuffer;
|
/* 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->CopyRegion = info->CopyRegion;
|
ds->CopyRegion = info->CopyRegion;
|
||||||
|
|
||||||
dixSetPrivate(&pScreen->devPrivates, dri2ScreenPrivateKey, ds);
|
dixSetPrivate(&pScreen->devPrivates, dri2ScreenPrivateKey, ds);
|
||||||
|
|
|
@ -35,16 +35,27 @@
|
||||||
|
|
||||||
#include <X11/extensions/dri2tokens.h>
|
#include <X11/extensions/dri2tokens.h>
|
||||||
|
|
||||||
|
/* Version 1 structure (for ABI compatibility) */
|
||||||
typedef struct {
|
typedef struct {
|
||||||
unsigned int attachment;
|
unsigned int attachment;
|
||||||
unsigned int name;
|
unsigned int name;
|
||||||
unsigned int pitch;
|
unsigned int pitch;
|
||||||
unsigned int cpp;
|
unsigned int cpp;
|
||||||
unsigned int flags;
|
unsigned int flags;
|
||||||
unsigned int format;
|
|
||||||
void *driverPrivate;
|
void *driverPrivate;
|
||||||
} DRI2BufferRec, *DRI2BufferPtr;
|
} DRI2BufferRec, *DRI2BufferPtr;
|
||||||
|
|
||||||
|
/* Version 2 structure (with format at the end) */
|
||||||
|
typedef struct {
|
||||||
|
unsigned int attachment;
|
||||||
|
unsigned int name;
|
||||||
|
unsigned int pitch;
|
||||||
|
unsigned int cpp;
|
||||||
|
unsigned int flags;
|
||||||
|
void *driverPrivate;
|
||||||
|
unsigned int format;
|
||||||
|
} DRI2Buffer2Rec, *DRI2Buffer2Ptr;
|
||||||
|
|
||||||
typedef DRI2BufferPtr (*DRI2CreateBuffersProcPtr)(DrawablePtr pDraw,
|
typedef DRI2BufferPtr (*DRI2CreateBuffersProcPtr)(DrawablePtr pDraw,
|
||||||
unsigned int *attachments,
|
unsigned int *attachments,
|
||||||
int count);
|
int count);
|
||||||
|
@ -59,11 +70,11 @@ typedef void (*DRI2CopyRegionProcPtr)(DrawablePtr pDraw,
|
||||||
typedef void (*DRI2WaitProcPtr)(WindowPtr pWin,
|
typedef void (*DRI2WaitProcPtr)(WindowPtr pWin,
|
||||||
unsigned int sequence);
|
unsigned int sequence);
|
||||||
|
|
||||||
typedef DRI2BufferPtr (*DRI2CreateBufferProcPtr)(DrawablePtr pDraw,
|
typedef DRI2Buffer2Ptr (*DRI2CreateBufferProcPtr)(DrawablePtr pDraw,
|
||||||
unsigned int attachment,
|
unsigned int attachment,
|
||||||
unsigned int format);
|
unsigned int format);
|
||||||
typedef void (*DRI2DestroyBufferProcPtr)(DrawablePtr pDraw,
|
typedef void (*DRI2DestroyBufferProcPtr)(DrawablePtr pDraw,
|
||||||
DRI2BufferPtr buffer);
|
DRI2Buffer2Ptr buffer);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Version of the DRI2InfoRec structure defined in this header
|
* Version of the DRI2InfoRec structure defined in this header
|
||||||
|
@ -108,7 +119,7 @@ extern _X_EXPORT int DRI2CreateDrawable(DrawablePtr pDraw);
|
||||||
|
|
||||||
extern _X_EXPORT void DRI2DestroyDrawable(DrawablePtr pDraw);
|
extern _X_EXPORT void DRI2DestroyDrawable(DrawablePtr pDraw);
|
||||||
|
|
||||||
extern _X_EXPORT DRI2BufferPtr *DRI2GetBuffers(DrawablePtr pDraw,
|
extern _X_EXPORT DRI2Buffer2Ptr *DRI2GetBuffers(DrawablePtr pDraw,
|
||||||
int *width,
|
int *width,
|
||||||
int *height,
|
int *height,
|
||||||
unsigned int *attachments,
|
unsigned int *attachments,
|
||||||
|
@ -138,7 +149,7 @@ extern _X_EXPORT int DRI2CopyRegion(DrawablePtr pDraw,
|
||||||
*/
|
*/
|
||||||
extern _X_EXPORT void DRI2Version(int *major, int *minor);
|
extern _X_EXPORT void DRI2Version(int *major, int *minor);
|
||||||
|
|
||||||
extern _X_EXPORT DRI2BufferPtr *DRI2GetBuffersWithFormat(DrawablePtr pDraw,
|
extern _X_EXPORT DRI2Buffer2Ptr *DRI2GetBuffersWithFormat(DrawablePtr pDraw,
|
||||||
int *width, int *height, unsigned int *attachments, int count,
|
int *width, int *height, unsigned int *attachments, int count,
|
||||||
int *out_count);
|
int *out_count);
|
||||||
|
|
||||||
|
|
|
@ -195,7 +195,7 @@ ProcDRI2DestroyDrawable(ClientPtr client)
|
||||||
|
|
||||||
static void
|
static void
|
||||||
send_buffers_reply(ClientPtr client, DrawablePtr pDrawable,
|
send_buffers_reply(ClientPtr client, DrawablePtr pDrawable,
|
||||||
DRI2BufferPtr *buffers, int count, int width, int height)
|
DRI2Buffer2Ptr *buffers, int count, int width, int height)
|
||||||
{
|
{
|
||||||
xDRI2GetBuffersReply rep;
|
xDRI2GetBuffersReply rep;
|
||||||
int skip = 0;
|
int skip = 0;
|
||||||
|
@ -245,7 +245,7 @@ ProcDRI2GetBuffers(ClientPtr client)
|
||||||
{
|
{
|
||||||
REQUEST(xDRI2GetBuffersReq);
|
REQUEST(xDRI2GetBuffersReq);
|
||||||
DrawablePtr pDrawable;
|
DrawablePtr pDrawable;
|
||||||
DRI2BufferPtr *buffers;
|
DRI2Buffer2Ptr *buffers;
|
||||||
int status, width, height, count;
|
int status, width, height, count;
|
||||||
unsigned int *attachments;
|
unsigned int *attachments;
|
||||||
|
|
||||||
|
@ -268,7 +268,7 @@ ProcDRI2GetBuffersWithFormat(ClientPtr client)
|
||||||
{
|
{
|
||||||
REQUEST(xDRI2GetBuffersReq);
|
REQUEST(xDRI2GetBuffersReq);
|
||||||
DrawablePtr pDrawable;
|
DrawablePtr pDrawable;
|
||||||
DRI2BufferPtr *buffers;
|
DRI2Buffer2Ptr *buffers;
|
||||||
int status, width, height, count;
|
int status, width, height, count;
|
||||||
unsigned int *attachments;
|
unsigned int *attachments;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user