dri3: use REQUEST_HEAD_STRUCT and REQUEST_FIELD_* macros

Use the new macros to make request struct parsing / field swapping
much easier.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
This commit is contained in:
Enrico Weigelt, metux IT consult 2024-07-15 12:08:44 +02:00
parent dc39130899
commit 9c6271258c
3 changed files with 60 additions and 208 deletions

View File

@ -90,7 +90,7 @@ dri3_extension_init(void)
#endif /* XINERAMA */ #endif /* XINERAMA */
extension = AddExtension(DRI3_NAME, DRI3NumberEvents, DRI3NumberErrors, extension = AddExtension(DRI3_NAME, DRI3NumberEvents, DRI3NumberErrors,
proc_dri3_dispatch, sproc_dri3_dispatch, proc_dri3_dispatch, proc_dri3_dispatch,
NULL, StandardMinorOpcode); NULL, StandardMinorOpcode);
if (!extension) if (!extension)
goto bail; goto bail;

View File

@ -81,9 +81,6 @@ dri3_screen_priv(ScreenPtr screen)
int int
proc_dri3_dispatch(ClientPtr client); proc_dri3_dispatch(ClientPtr client);
int
sproc_dri3_dispatch(ClientPtr client);
/* DDX interface */ /* DDX interface */
int int

View File

@ -24,6 +24,7 @@
#include <unistd.h> #include <unistd.h>
#include "dix/dix_priv.h" #include "dix/dix_priv.h"
#include "dix/request_priv.h"
#include "os/client_priv.h" #include "os/client_priv.h"
#include "dri3_priv.h" #include "dri3_priv.h"
@ -63,7 +64,9 @@ dri3_screen_can_one_point_two(ScreenPtr screen)
static int static int
proc_dri3_query_version(ClientPtr client) proc_dri3_query_version(ClientPtr client)
{ {
REQUEST(xDRI3QueryVersionReq); REQUEST_HEAD_STRUCT(xDRI3QueryVersionReq);
REQUEST_FIELD_CARD32(majorVersion);
REQUEST_FIELD_CARD32(minorVersion);
xDRI3QueryVersionReply rep = { xDRI3QueryVersionReply rep = {
.type = X_Reply, .type = X_Reply,
@ -72,8 +75,6 @@ proc_dri3_query_version(ClientPtr client)
.minorVersion = SERVER_DRI3_MINOR_VERSION .minorVersion = SERVER_DRI3_MINOR_VERSION
}; };
REQUEST_SIZE_MATCH(xDRI3QueryVersionReq);
for (int i = 0; i < screenInfo.numScreens; i++) { for (int i = 0; i < screenInfo.numScreens; i++) {
if (!dri3_screen_can_one_point_two(screenInfo.screens[i])) { if (!dri3_screen_can_one_point_two(screenInfo.screens[i])) {
rep.minorVersion = 0; rep.minorVersion = 0;
@ -147,15 +148,16 @@ dri3_send_open_reply(ClientPtr client, int fd)
static int static int
proc_dri3_open(ClientPtr client) proc_dri3_open(ClientPtr client)
{ {
REQUEST(xDRI3OpenReq); REQUEST_HEAD_STRUCT(xDRI3OpenReq);
REQUEST_FIELD_CARD32(drawable);
REQUEST_FIELD_CARD32(provider);
RRProviderPtr provider; RRProviderPtr provider;
DrawablePtr drawable; DrawablePtr drawable;
ScreenPtr screen; ScreenPtr screen;
int fd; int fd;
int status; int status;
REQUEST_SIZE_MATCH(xDRI3OpenReq);
status = dixLookupDrawable(&drawable, stuff->drawable, client, 0, DixGetAttrAccess); status = dixLookupDrawable(&drawable, stuff->drawable, client, 0, DixGetAttrAccess);
if (status != Success) if (status != Success)
return status; return status;
@ -184,14 +186,20 @@ proc_dri3_open(ClientPtr client)
static int static int
proc_dri3_pixmap_from_buffer(ClientPtr client) proc_dri3_pixmap_from_buffer(ClientPtr client)
{ {
REQUEST(xDRI3PixmapFromBufferReq); REQUEST_HEAD_STRUCT(xDRI3PixmapFromBufferReq);
REQUEST_FIELD_CARD32(pixmap);
REQUEST_FIELD_CARD32(drawable);
REQUEST_FIELD_CARD32(size);
REQUEST_FIELD_CARD16(width);
REQUEST_FIELD_CARD16(height);
REQUEST_FIELD_CARD16(stride);
int fd; int fd;
DrawablePtr drawable; DrawablePtr drawable;
PixmapPtr pixmap; PixmapPtr pixmap;
CARD32 stride, offset; CARD32 stride, offset;
int rc; int rc;
REQUEST_SIZE_MATCH(xDRI3PixmapFromBufferReq);
LEGAL_NEW_RESOURCE(stuff->pixmap, client); LEGAL_NEW_RESOURCE(stuff->pixmap, client);
rc = dixLookupDrawable(&drawable, stuff->drawable, client, M_ANY, DixGetAttrAccess); rc = dixLookupDrawable(&drawable, stuff->drawable, client, M_ANY, DixGetAttrAccess);
if (rc != Success) { if (rc != Success) {
@ -255,13 +263,13 @@ proc_dri3_pixmap_from_buffer(ClientPtr client)
static int static int
proc_dri3_buffer_from_pixmap(ClientPtr client) proc_dri3_buffer_from_pixmap(ClientPtr client)
{ {
REQUEST(xDRI3BufferFromPixmapReq); REQUEST_HEAD_STRUCT(xDRI3BufferFromPixmapReq);
REQUEST_FIELD_CARD32(pixmap);
int rc; int rc;
int fd; int fd;
PixmapPtr pixmap; PixmapPtr pixmap;
REQUEST_SIZE_MATCH(xDRI3BufferFromPixmapReq);
rc = dixLookupResourceByType((void **) &pixmap, stuff->pixmap, X11_RESTYPE_PIXMAP, rc = dixLookupResourceByType((void **) &pixmap, stuff->pixmap, X11_RESTYPE_PIXMAP,
client, DixWriteAccess); client, DixWriteAccess);
if (rc != Success) { if (rc != Success) {
@ -304,12 +312,14 @@ proc_dri3_buffer_from_pixmap(ClientPtr client)
static int static int
proc_dri3_fence_from_fd(ClientPtr client) proc_dri3_fence_from_fd(ClientPtr client)
{ {
REQUEST(xDRI3FenceFromFDReq); REQUEST_HEAD_STRUCT(xDRI3FenceFromFDReq);
REQUEST_FIELD_CARD32(drawable);
REQUEST_FIELD_CARD32(fence);
DrawablePtr drawable; DrawablePtr drawable;
int fd; int fd;
int status; int status;
REQUEST_SIZE_MATCH(xDRI3FenceFromFDReq);
LEGAL_NEW_RESOURCE(stuff->fence, client); LEGAL_NEW_RESOURCE(stuff->fence, client);
status = dixLookupDrawable(&drawable, stuff->drawable, client, M_ANY, DixGetAttrAccess); status = dixLookupDrawable(&drawable, stuff->drawable, client, M_ANY, DixGetAttrAccess);
@ -330,7 +340,10 @@ proc_dri3_fence_from_fd(ClientPtr client)
static int static int
proc_dri3_fd_from_fence(ClientPtr client) proc_dri3_fd_from_fence(ClientPtr client)
{ {
REQUEST(xDRI3FDFromFenceReq); REQUEST_HEAD_STRUCT(xDRI3FDFromFenceReq);
REQUEST_FIELD_CARD32(drawable);
REQUEST_FIELD_CARD32(fence);
xDRI3FDFromFenceReply rep = { xDRI3FDFromFenceReply rep = {
.type = X_Reply, .type = X_Reply,
.nfd = 1, .nfd = 1,
@ -341,8 +354,6 @@ proc_dri3_fd_from_fence(ClientPtr client)
int status; int status;
SyncFence *fence; SyncFence *fence;
REQUEST_SIZE_MATCH(xDRI3FDFromFenceReq);
status = dixLookupDrawable(&drawable, stuff->drawable, client, M_ANY, DixGetAttrAccess); status = dixLookupDrawable(&drawable, stuff->drawable, client, M_ANY, DixGetAttrAccess);
if (status != Success) if (status != Success)
return status; return status;
@ -369,7 +380,9 @@ proc_dri3_fd_from_fence(ClientPtr client)
static int static int
proc_dri3_get_supported_modifiers(ClientPtr client) proc_dri3_get_supported_modifiers(ClientPtr client)
{ {
REQUEST(xDRI3GetSupportedModifiersReq); REQUEST_HEAD_STRUCT(xDRI3GetSupportedModifiersReq);
REQUEST_FIELD_CARD32(window);
WindowPtr window; WindowPtr window;
ScreenPtr pScreen; ScreenPtr pScreen;
CARD64 *window_modifiers = NULL; CARD64 *window_modifiers = NULL;
@ -379,8 +392,6 @@ proc_dri3_get_supported_modifiers(ClientPtr client)
int status; int status;
int i; int i;
REQUEST_SIZE_MATCH(xDRI3GetSupportedModifiersReq);
status = dixLookupWindow(&window, stuff->window, client, DixGetAttrAccess); status = dixLookupWindow(&window, stuff->window, client, DixGetAttrAccess);
if (status != Success) if (status != Success)
return status; return status;
@ -423,7 +434,21 @@ proc_dri3_get_supported_modifiers(ClientPtr client)
static int static int
proc_dri3_pixmap_from_buffers(ClientPtr client) proc_dri3_pixmap_from_buffers(ClientPtr client)
{ {
REQUEST(xDRI3PixmapFromBuffersReq); REQUEST_HEAD_STRUCT(xDRI3PixmapFromBuffersReq);
REQUEST_FIELD_CARD32(pixmap);
REQUEST_FIELD_CARD32(window);
REQUEST_FIELD_CARD16(width);
REQUEST_FIELD_CARD16(height);
REQUEST_FIELD_CARD32(stride0);
REQUEST_FIELD_CARD32(offset0);
REQUEST_FIELD_CARD32(stride1);
REQUEST_FIELD_CARD32(offset1);
REQUEST_FIELD_CARD32(stride2);
REQUEST_FIELD_CARD32(offset2);
REQUEST_FIELD_CARD32(stride3);
REQUEST_FIELD_CARD32(offset3);
REQUEST_FIELD_CARD64(modifier);
int fds[4]; int fds[4];
CARD32 strides[4], offsets[4]; CARD32 strides[4], offsets[4];
ScreenPtr screen; ScreenPtr screen;
@ -432,7 +457,6 @@ proc_dri3_pixmap_from_buffers(ClientPtr client)
int rc; int rc;
int i; int i;
REQUEST_SIZE_MATCH(xDRI3PixmapFromBuffersReq);
LEGAL_NEW_RESOURCE(stuff->pixmap, client); LEGAL_NEW_RESOURCE(stuff->pixmap, client);
rc = dixLookupWindow(&window, stuff->window, client, DixGetAttrAccess); rc = dixLookupWindow(&window, stuff->window, client, DixGetAttrAccess);
if (rc != Success) { if (rc != Success) {
@ -516,7 +540,9 @@ proc_dri3_pixmap_from_buffers(ClientPtr client)
static int static int
proc_dri3_buffers_from_pixmap(ClientPtr client) proc_dri3_buffers_from_pixmap(ClientPtr client)
{ {
REQUEST(xDRI3BuffersFromPixmapReq); REQUEST_HEAD_STRUCT(xDRI3BuffersFromPixmapReq);
REQUEST_FIELD_CARD32(pixmap);
int rc; int rc;
int fds[4]; int fds[4];
int num_fds; int num_fds;
@ -525,7 +551,6 @@ proc_dri3_buffers_from_pixmap(ClientPtr client)
int i; int i;
PixmapPtr pixmap; PixmapPtr pixmap;
REQUEST_SIZE_MATCH(xDRI3BuffersFromPixmapReq);
rc = dixLookupResourceByType((void **) &pixmap, stuff->pixmap, X11_RESTYPE_PIXMAP, rc = dixLookupResourceByType((void **) &pixmap, stuff->pixmap, X11_RESTYPE_PIXMAP,
client, DixWriteAccess); client, DixWriteAccess);
if (rc != Success) { if (rc != Success) {
@ -580,11 +605,14 @@ proc_dri3_buffers_from_pixmap(ClientPtr client)
static int static int
proc_dri3_set_drm_device_in_use(ClientPtr client) proc_dri3_set_drm_device_in_use(ClientPtr client)
{ {
REQUEST(xDRI3SetDRMDeviceInUseReq); REQUEST_HEAD_STRUCT(xDRI3SetDRMDeviceInUseReq);
REQUEST_FIELD_CARD32(window);
REQUEST_FIELD_CARD32(drmMajor);
REQUEST_FIELD_CARD32(drmMinor);
WindowPtr window; WindowPtr window;
int status; int status;
REQUEST_SIZE_MATCH(xDRI3SetDRMDeviceInUseReq);
status = dixLookupWindow(&window, stuff->window, client, status = dixLookupWindow(&window, stuff->window, client,
DixGetAttrAccess); DixGetAttrAccess);
if (status != Success) if (status != Success)
@ -601,13 +629,15 @@ proc_dri3_set_drm_device_in_use(ClientPtr client)
static int static int
proc_dri3_import_syncobj(ClientPtr client) proc_dri3_import_syncobj(ClientPtr client)
{ {
REQUEST(xDRI3ImportSyncobjReq); REQUEST_HEAD_STRUCT(xDRI3ImportSyncobjReq);
REQUEST_FIELD_CARD32(syncobj);
REQUEST_FIELD_CARD32(drawable);
DrawablePtr drawable; DrawablePtr drawable;
ScreenPtr screen; ScreenPtr screen;
int fd; int fd;
int status; int status;
REQUEST_SIZE_MATCH(xDRI3ImportSyncobjReq);
LEGAL_NEW_RESOURCE(stuff->syncobj, client); LEGAL_NEW_RESOURCE(stuff->syncobj, client);
status = dixLookupDrawable(&drawable, stuff->drawable, client, status = dixLookupDrawable(&drawable, stuff->drawable, client,
@ -628,12 +658,12 @@ proc_dri3_import_syncobj(ClientPtr client)
static int static int
proc_dri3_free_syncobj(ClientPtr client) proc_dri3_free_syncobj(ClientPtr client)
{ {
REQUEST(xDRI3FreeSyncobjReq); REQUEST_HEAD_STRUCT(xDRI3FreeSyncobjReq);
REQUEST_FIELD_CARD32(syncobj);
struct dri3_syncobj *syncobj; struct dri3_syncobj *syncobj;
int status; int status;
REQUEST_SIZE_MATCH(xDRI3FreeSyncobjReq);
status = dixLookupResourceByType((void **) &syncobj, stuff->syncobj, status = dixLookupResourceByType((void **) &syncobj, stuff->syncobj,
dri3_syncobj_type, client, DixWriteAccess); dri3_syncobj_type, client, DixWriteAccess);
if (status != Success) if (status != Success)
@ -685,178 +715,3 @@ proc_dri3_dispatch(ClientPtr client)
return BadRequest; return BadRequest;
} }
} }
static int _X_COLD
sproc_dri3_query_version(ClientPtr client)
{
REQUEST(xDRI3QueryVersionReq);
REQUEST_SIZE_MATCH(xDRI3QueryVersionReq);
swapl(&stuff->majorVersion);
swapl(&stuff->minorVersion);
return proc_dri3_query_version(client);
}
static int _X_COLD
sproc_dri3_open(ClientPtr client)
{
REQUEST(xDRI3OpenReq);
REQUEST_SIZE_MATCH(xDRI3OpenReq);
swapl(&stuff->drawable);
swapl(&stuff->provider);
return proc_dri3_open(client);
}
static int _X_COLD
sproc_dri3_pixmap_from_buffer(ClientPtr client)
{
REQUEST(xDRI3PixmapFromBufferReq);
REQUEST_SIZE_MATCH(xDRI3PixmapFromBufferReq);
swapl(&stuff->pixmap);
swapl(&stuff->drawable);
swapl(&stuff->size);
swaps(&stuff->width);
swaps(&stuff->height);
swaps(&stuff->stride);
return proc_dri3_pixmap_from_buffer(client);
}
static int _X_COLD
sproc_dri3_buffer_from_pixmap(ClientPtr client)
{
REQUEST(xDRI3BufferFromPixmapReq);
REQUEST_SIZE_MATCH(xDRI3BufferFromPixmapReq);
swapl(&stuff->pixmap);
return proc_dri3_buffer_from_pixmap(client);
}
static int _X_COLD
sproc_dri3_fence_from_fd(ClientPtr client)
{
REQUEST(xDRI3FenceFromFDReq);
REQUEST_SIZE_MATCH(xDRI3FenceFromFDReq);
swapl(&stuff->drawable);
swapl(&stuff->fence);
return proc_dri3_fence_from_fd(client);
}
static int _X_COLD
sproc_dri3_fd_from_fence(ClientPtr client)
{
REQUEST(xDRI3FDFromFenceReq);
REQUEST_SIZE_MATCH(xDRI3FDFromFenceReq);
swapl(&stuff->drawable);
swapl(&stuff->fence);
return proc_dri3_fd_from_fence(client);
}
static int _X_COLD
sproc_dri3_get_supported_modifiers(ClientPtr client)
{
REQUEST(xDRI3GetSupportedModifiersReq);
REQUEST_SIZE_MATCH(xDRI3GetSupportedModifiersReq);
swapl(&stuff->window);
return proc_dri3_get_supported_modifiers(client);
}
static int _X_COLD
sproc_dri3_pixmap_from_buffers(ClientPtr client)
{
REQUEST(xDRI3PixmapFromBuffersReq);
REQUEST_SIZE_MATCH(xDRI3PixmapFromBuffersReq);
swapl(&stuff->pixmap);
swapl(&stuff->window);
swaps(&stuff->width);
swaps(&stuff->height);
swapl(&stuff->stride0);
swapl(&stuff->offset0);
swapl(&stuff->stride1);
swapl(&stuff->offset1);
swapl(&stuff->stride2);
swapl(&stuff->offset2);
swapl(&stuff->stride3);
swapl(&stuff->offset3);
swapll(&stuff->modifier);
return proc_dri3_pixmap_from_buffers(client);
}
static int _X_COLD
sproc_dri3_buffers_from_pixmap(ClientPtr client)
{
REQUEST(xDRI3BuffersFromPixmapReq);
REQUEST_SIZE_MATCH(xDRI3BuffersFromPixmapReq);
swapl(&stuff->pixmap);
return proc_dri3_buffers_from_pixmap(client);
}
static int _X_COLD
sproc_dri3_set_drm_device_in_use(ClientPtr client)
{
REQUEST(xDRI3SetDRMDeviceInUseReq);
REQUEST_SIZE_MATCH(xDRI3SetDRMDeviceInUseReq);
swapl(&stuff->window);
swapl(&stuff->drmMajor);
swapl(&stuff->drmMinor);
return proc_dri3_set_drm_device_in_use(client);
}
static int _X_COLD
sproc_dri3_import_syncobj(ClientPtr client)
{
REQUEST(xDRI3ImportSyncobjReq);
REQUEST_SIZE_MATCH(xDRI3ImportSyncobjReq);
swapl(&stuff->syncobj);
swapl(&stuff->drawable);
return proc_dri3_import_syncobj(client);
}
static int _X_COLD
sproc_dri3_free_syncobj(ClientPtr client)
{
REQUEST(xDRI3FreeSyncobjReq);
REQUEST_SIZE_MATCH(xDRI3FreeSyncobjReq);
swapl(&stuff->syncobj);
return proc_dri3_free_syncobj(client);
}
int _X_COLD
sproc_dri3_dispatch(ClientPtr client)
{
REQUEST(xReq);
if (!client->local)
return BadMatch;
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;
}
}