Compare commits

...

3 Commits

Author SHA1 Message Date
Enrico Weigelt, metux IT consult 31c03b51d8 dri3: simplify dispatcher
The dispatcher functions are much more complex than they're usually are
(just switch/case statement). Bring them in line with the standard scheme
used in the Xserver, so further steps become easier.

It's also much cleaner to use the defines from proto headers instead of
raw numbers.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-04-02 17:37:40 +00:00
Enrico Weigelt, metux IT consult fd8b86583e dri3: consolidate reply buffers
Allocate reply buffers on stack and put multiple fragments into one buffer,
in order to make it easier doing write out by generic macros, in subsequent
commits.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-04-02 17:37:40 +00:00
Enrico Weigelt, metux IT consult 2edc5662f8 dri3: use static reply struct init on declaration
Make the code a bit easier to read by using initialization of the reply
structs, at the point of declaration. Most of them aren't written to later,
just passed into WriteReplyToClient(). Also dropping some useless zero
assignments (struct initializers automatically zero-out unmentioned fields).

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-04-02 17:37:40 +00:00

View File

@ -64,10 +64,10 @@ static int
proc_dri3_query_version(ClientPtr client)
{
REQUEST(xDRI3QueryVersionReq);
xDRI3QueryVersionReply rep = {
.type = X_Reply,
.sequenceNumber = client->sequence,
.length = 0,
.majorVersion = SERVER_DRI3_MAJOR_VERSION,
.minorVersion = SERVER_DRI3_MINOR_VERSION
};
@ -127,7 +127,6 @@ dri3_send_open_reply(ClientPtr client, int fd)
.type = X_Reply,
.nfd = 1,
.sequenceNumber = client->sequence,
.length = 0,
};
if (client->swapped) {
@ -257,12 +256,7 @@ static int
proc_dri3_buffer_from_pixmap(ClientPtr client)
{
REQUEST(xDRI3BufferFromPixmapReq);
xDRI3BufferFromPixmapReply rep = {
.type = X_Reply,
.nfd = 1,
.sequenceNumber = client->sequence,
.length = 0,
};
int rc;
int fd;
PixmapPtr pixmap;
@ -275,10 +269,15 @@ proc_dri3_buffer_from_pixmap(ClientPtr client)
return rc;
}
rep.width = pixmap->drawable.width;
rep.height = pixmap->drawable.height;
rep.depth = pixmap->drawable.depth;
rep.bpp = pixmap->drawable.bitsPerPixel;
xDRI3BufferFromPixmapReply rep = {
.type = X_Reply,
.nfd = 1,
.sequenceNumber = client->sequence,
.width = pixmap->drawable.width,
.height = pixmap->drawable.height,
.depth = pixmap->drawable.depth,
.bpp = pixmap->drawable.bitsPerPixel,
};
fd = dri3_fd_from_pixmap(pixmap, &rep.stride, &rep.size);
if (fd < 0)
@ -336,7 +335,6 @@ proc_dri3_fd_from_fence(ClientPtr client)
.type = X_Reply,
.nfd = 1,
.sequenceNumber = client->sequence,
.length = 0,
};
DrawablePtr drawable;
int fd;
@ -372,10 +370,6 @@ static int
proc_dri3_get_supported_modifiers(ClientPtr client)
{
REQUEST(xDRI3GetSupportedModifiersReq);
xDRI3GetSupportedModifiersReply rep = {
.type = X_Reply,
.sequenceNumber = client->sequence,
};
WindowPtr window;
ScreenPtr pScreen;
CARD64 *window_modifiers = NULL;
@ -397,29 +391,40 @@ proc_dri3_get_supported_modifiers(ClientPtr client)
&nwindowmodifiers, &window_modifiers,
&nscreenmodifiers, &screen_modifiers);
rep.numWindowModifiers = nwindowmodifiers;
rep.numScreenModifiers = nscreenmodifiers;
rep.length = bytes_to_int32(rep.numWindowModifiers * sizeof(CARD64)) +
bytes_to_int32(rep.numScreenModifiers * sizeof(CARD64));
const size_t bufsz = (nwindowmodifiers + nscreenmodifiers) * sizeof(CARD64);
CARD64 *buf = calloc(1, bufsz);
if (!buf) {
free(window_modifiers);
free(screen_modifiers);
return BadAlloc;
}
memcpy(buf, window_modifiers, sizeof(CARD64) * nwindowmodifiers);
memcpy(&buf[nwindowmodifiers], screen_modifiers, sizeof(CARD64) * nscreenmodifiers);
free(window_modifiers);
free(screen_modifiers);
xDRI3GetSupportedModifiersReply rep = {
.type = X_Reply,
.sequenceNumber = client->sequence,
.numWindowModifiers = nwindowmodifiers,
.numScreenModifiers = nscreenmodifiers,
.length = bytes_to_int32(bufsz),
};
if (client->swapped) {
swaps(&rep.sequenceNumber);
swapl(&rep.length);
swapl(&rep.numWindowModifiers);
swapl(&rep.numScreenModifiers);
for (i = 0; i < nwindowmodifiers; i++)
swapll(&window_modifiers[i]);
for (i = 0; i < nscreenmodifiers; i++)
swapll(&screen_modifiers[i]);
for (i = 0; i < nwindowmodifiers+nscreenmodifiers; i++)
swapll(&buf[i]);
}
WriteToClient(client, sizeof(rep), &rep);
WriteToClient(client, nwindowmodifiers * sizeof(CARD64), window_modifiers);
WriteToClient(client, nscreenmodifiers * sizeof(CARD64), screen_modifiers);
free(window_modifiers);
free(screen_modifiers);
WriteToClient(client, bufsz, buf);
free(buf);
return Success;
}
@ -521,10 +526,6 @@ static int
proc_dri3_buffers_from_pixmap(ClientPtr client)
{
REQUEST(xDRI3BuffersFromPixmapReq);
xDRI3BuffersFromPixmapReply rep = {
.type = X_Reply,
.sequenceNumber = client->sequence,
};
int rc;
int fds[4];
int num_fds;
@ -545,26 +546,6 @@ proc_dri3_buffers_from_pixmap(ClientPtr client)
if (num_fds == 0)
return BadPixmap;
rep.nfd = num_fds;
rep.length = bytes_to_int32(num_fds * 2 * sizeof(CARD32));
rep.width = pixmap->drawable.width;
rep.height = pixmap->drawable.height;
rep.depth = pixmap->drawable.depth;
rep.bpp = pixmap->drawable.bitsPerPixel;
rep.modifier = modifier;
if (client->swapped) {
swaps(&rep.sequenceNumber);
swapl(&rep.length);
swaps(&rep.width);
swaps(&rep.height);
swapll(&rep.modifier);
for (i = 0; i < num_fds; i++) {
swapl(&strides[i]);
swapl(&offsets[i]);
}
}
for (i = 0; i < num_fds; i++) {
if (WriteFdToClient(client, fds[i], TRUE) < 0) {
while (i--)
@ -573,10 +554,39 @@ proc_dri3_buffers_from_pixmap(ClientPtr client)
}
}
WriteToClient(client, sizeof(rep), &rep);
WriteToClient(client, num_fds * sizeof(CARD32), strides);
WriteToClient(client, num_fds * sizeof(CARD32), offsets);
const size_t bufsz = num_fds * 2 * sizeof(CARD32);
CARD32 *buf = calloc(1, bufsz);
if (!buf)
return BadAlloc;
memcpy(buf, strides, num_fds * sizeof(CARD32));
memcpy(&buf[num_fds], offsets, num_fds * sizeof(CARD32));
xDRI3BuffersFromPixmapReply rep = {
.type = X_Reply,
.sequenceNumber = client->sequence,
.nfd = num_fds,
.length = bytes_to_int32(bufsz),
.width = pixmap->drawable.width,
.height = pixmap->drawable.height,
.depth = pixmap->drawable.depth,
.bpp = pixmap->drawable.bitsPerPixel,
.modifier = modifier,
};
if (client->swapped) {
swaps(&rep.sequenceNumber);
swapl(&rep.length);
swaps(&rep.width);
swaps(&rep.height);
swapll(&rep.modifier);
for (i = 0; i < num_fds * 2; i++)
swapl(&buf[i]);
}
WriteToClient(client, sizeof(rep), &rep);
WriteToClient(client, bufsz, buf);
free(buf);
return Success;
}
@ -646,30 +656,47 @@ proc_dri3_free_syncobj(ClientPtr client)
return Success;
}
int (*proc_dri3_vector[DRI3NumberRequests]) (ClientPtr) = {
proc_dri3_query_version, /* 0 */
proc_dri3_open, /* 1 */
proc_dri3_pixmap_from_buffer, /* 2 */
proc_dri3_buffer_from_pixmap, /* 3 */
proc_dri3_fence_from_fd, /* 4 */
proc_dri3_fd_from_fence, /* 5 */
proc_dri3_get_supported_modifiers, /* 6 */
proc_dri3_pixmap_from_buffers, /* 7 */
proc_dri3_buffers_from_pixmap, /* 8 */
proc_dri3_set_drm_device_in_use, /* 9 */
proc_dri3_import_syncobj, /* 10 */
proc_dri3_free_syncobj, /* 11 */
};
int
proc_dri3_dispatch(ClientPtr client)
{
REQUEST(xReq);
if (!client->local)
return BadMatch;
if (stuff->data >= DRI3NumberRequests || !proc_dri3_vector[stuff->data])
return BadRequest;
return (*proc_dri3_vector[stuff->data]) (client);
switch (stuff->data) {
case X_DRI3QueryVersion:
return proc_dri3_query_version(client);
case X_DRI3Open:
return proc_dri3_open(client);
case X_DRI3PixmapFromBuffer:
return proc_dri3_pixmap_from_buffer(client);
case X_DRI3BufferFromPixmap:
return proc_dri3_buffer_from_pixmap(client);
case X_DRI3FenceFromFD:
return proc_dri3_fence_from_fd(client);
case X_DRI3FDFromFence:
return proc_dri3_fd_from_fence(client);
/* v1.2 */
case xDRI3GetSupportedModifiers:
return proc_dri3_get_supported_modifiers(client);
case xDRI3PixmapFromBuffers:
return proc_dri3_pixmap_from_buffers(client);
case xDRI3BuffersFromPixmap:
return proc_dri3_buffers_from_pixmap(client);
/* v1.3 */
case xDRI3SetDRMDeviceInUse:
return proc_dri3_set_drm_device_in_use(client);
/* v1.4 */
case xDRI3ImportSyncobj:
return proc_dri3_import_syncobj(client);
case xDRI3FreeSyncobj:
return proc_dri3_free_syncobj(client);
default:
return BadRequest;
}
}
static int _X_COLD
@ -679,7 +706,7 @@ sproc_dri3_query_version(ClientPtr client)
REQUEST_SIZE_MATCH(xDRI3QueryVersionReq);
swapl(&stuff->majorVersion);
swapl(&stuff->minorVersion);
return (*proc_dri3_vector[stuff->dri3ReqType]) (client);
return proc_dri3_query_version(client);
}
static int _X_COLD
@ -689,7 +716,7 @@ sproc_dri3_open(ClientPtr client)
REQUEST_SIZE_MATCH(xDRI3OpenReq);
swapl(&stuff->drawable);
swapl(&stuff->provider);
return (*proc_dri3_vector[stuff->dri3ReqType]) (client);
return proc_dri3_open(client);
}
static int _X_COLD
@ -703,7 +730,7 @@ sproc_dri3_pixmap_from_buffer(ClientPtr client)
swaps(&stuff->width);
swaps(&stuff->height);
swaps(&stuff->stride);
return (*proc_dri3_vector[stuff->dri3ReqType]) (client);
return proc_dri3_pixmap_from_buffer(client);
}
static int _X_COLD
@ -712,7 +739,7 @@ sproc_dri3_buffer_from_pixmap(ClientPtr client)
REQUEST(xDRI3BufferFromPixmapReq);
REQUEST_SIZE_MATCH(xDRI3BufferFromPixmapReq);
swapl(&stuff->pixmap);
return (*proc_dri3_vector[stuff->dri3ReqType]) (client);
return proc_dri3_buffer_from_pixmap(client);
}
static int _X_COLD
@ -722,7 +749,7 @@ sproc_dri3_fence_from_fd(ClientPtr client)
REQUEST_SIZE_MATCH(xDRI3FenceFromFDReq);
swapl(&stuff->drawable);
swapl(&stuff->fence);
return (*proc_dri3_vector[stuff->dri3ReqType]) (client);
return proc_dri3_fence_from_fd(client);
}
static int _X_COLD
@ -732,7 +759,7 @@ sproc_dri3_fd_from_fence(ClientPtr client)
REQUEST_SIZE_MATCH(xDRI3FDFromFenceReq);
swapl(&stuff->drawable);
swapl(&stuff->fence);
return (*proc_dri3_vector[stuff->dri3ReqType]) (client);
return proc_dri3_fd_from_fence(client);
}
static int _X_COLD
@ -741,7 +768,7 @@ sproc_dri3_get_supported_modifiers(ClientPtr client)
REQUEST(xDRI3GetSupportedModifiersReq);
REQUEST_SIZE_MATCH(xDRI3GetSupportedModifiersReq);
swapl(&stuff->window);
return (*proc_dri3_vector[stuff->dri3ReqType]) (client);
return proc_dri3_get_supported_modifiers(client);
}
static int _X_COLD
@ -762,7 +789,7 @@ sproc_dri3_pixmap_from_buffers(ClientPtr client)
swapl(&stuff->stride3);
swapl(&stuff->offset3);
swapll(&stuff->modifier);
return (*proc_dri3_vector[stuff->dri3ReqType]) (client);
return proc_dri3_pixmap_from_buffers(client);
}
static int _X_COLD
@ -771,7 +798,7 @@ sproc_dri3_buffers_from_pixmap(ClientPtr client)
REQUEST(xDRI3BuffersFromPixmapReq);
REQUEST_SIZE_MATCH(xDRI3BuffersFromPixmapReq);
swapl(&stuff->pixmap);
return (*proc_dri3_vector[stuff->dri3ReqType]) (client);
return proc_dri3_buffers_from_pixmap(client);
}
static int _X_COLD
@ -782,7 +809,7 @@ sproc_dri3_set_drm_device_in_use(ClientPtr client)
swapl(&stuff->window);
swapl(&stuff->drmMajor);
swapl(&stuff->drmMinor);
return (*proc_dri3_vector[stuff->dri3ReqType]) (client);
return proc_dri3_set_drm_device_in_use(client);
}
static int _X_COLD
@ -792,7 +819,7 @@ sproc_dri3_import_syncobj(ClientPtr client)
REQUEST_SIZE_MATCH(xDRI3ImportSyncobjReq);
swapl(&stuff->syncobj);
swapl(&stuff->drawable);
return (*proc_dri3_vector[stuff->dri3ReqType]) (client);
return proc_dri3_import_syncobj(client);
}
static int _X_COLD
@ -801,31 +828,48 @@ sproc_dri3_free_syncobj(ClientPtr client)
REQUEST(xDRI3FreeSyncobjReq);
REQUEST_SIZE_MATCH(xDRI3FreeSyncobjReq);
swapl(&stuff->syncobj);
return (*proc_dri3_vector[stuff->dri3ReqType]) (client);
return proc_dri3_free_syncobj(client);
}
int (*sproc_dri3_vector[DRI3NumberRequests]) (ClientPtr) = {
sproc_dri3_query_version, /* 0 */
sproc_dri3_open, /* 1 */
sproc_dri3_pixmap_from_buffer, /* 2 */
sproc_dri3_buffer_from_pixmap, /* 3 */
sproc_dri3_fence_from_fd, /* 4 */
sproc_dri3_fd_from_fence, /* 5 */
sproc_dri3_get_supported_modifiers, /* 6 */
sproc_dri3_pixmap_from_buffers, /* 7 */
sproc_dri3_buffers_from_pixmap, /* 8 */
sproc_dri3_set_drm_device_in_use, /* 9 */
sproc_dri3_import_syncobj, /* 10 */
sproc_dri3_free_syncobj, /* 11 */
};
int _X_COLD
sproc_dri3_dispatch(ClientPtr client)
{
REQUEST(xReq);
if (!client->local)
return BadMatch;
if (stuff->data >= DRI3NumberRequests || !sproc_dri3_vector[stuff->data])
return BadRequest;
return (*sproc_dri3_vector[stuff->data]) (client);
switch (stuff->data) {
case X_DRI3QueryVersion:
return sproc_dri3_query_version(client);
case X_DRI3Open:
return sproc_dri3_open(client);
case X_DRI3PixmapFromBuffer:
return sproc_dri3_pixmap_from_buffer(client);
case X_DRI3BufferFromPixmap:
return sproc_dri3_buffer_from_pixmap(client);
case X_DRI3FenceFromFD:
return sproc_dri3_fence_from_fd(client);
case X_DRI3FDFromFence:
return sproc_dri3_fd_from_fence(client);
/* v1.2 */
case xDRI3GetSupportedModifiers:
return sproc_dri3_get_supported_modifiers(client);
case xDRI3PixmapFromBuffers:
return sproc_dri3_pixmap_from_buffers(client);
case xDRI3BuffersFromPixmap:
return sproc_dri3_buffers_from_pixmap(client);
/* v1.3 */
case xDRI3SetDRMDeviceInUse:
return sproc_dri3_set_drm_device_in_use(client);
/* v1.4 */
case xDRI3ImportSyncobj:
return sproc_dri3_import_syncobj(client);
case xDRI3FreeSyncobj:
return sproc_dri3_free_syncobj(client);
default:
return BadRequest;
}
}