HACK xaverius: Phase A — DDX-wide registration via XaveriusRegisterDevice

- Rename XaveriusRegisterDeviceDirect → XaveriusRegisterDevice with
  (caps, ops) signature per spec
- Build canonical identity from provider capabilities in registry
- Remove ops parameter from XaveriusScreenInit (screen-local only)
- XaveriusDDXOps: only ScreenInit/ScreenFini, no device callbacks
- modesetting: defer Xaverius registration to Phase B
- Build green (-Dwerror, meson/ninja -k 0, full tree)
This commit is contained in:
Enrico Weigelt, metux IT consult 2026-11-05 02:29:10 +01:00
commit 6dffb09bf0
5 changed files with 19 additions and 17 deletions

View file

@ -128,10 +128,7 @@ void XaveriusRegistryFini(void)
xaverius_device_count = 0;
}
bool XaveriusRegisterDeviceDirect(const XaveriusDeviceIdentity *identity,
const XaveriusDeviceCapabilities *caps,
int native_handle,
void *context)
bool XaveriusRegisterDevice(const XaveriusDeviceCapabilities *caps)
{
XaveriusDevicePtr dev;
@ -159,7 +156,7 @@ bool XaveriusRegisterDeviceDirect(const XaveriusDeviceIdentity *identity,
/* Idempotency: an already-registered device with the same identity
* is not re-registered or overwritten ("last writer wins" forbidden). */
dev = xaverius_find_device_locked(identity);
dev = xaverius_find_device_locked(&identity);
if (dev != NULL)
return true;
@ -177,11 +174,9 @@ bool XaveriusRegisterDeviceDirect(const XaveriusDeviceIdentity *identity,
}
dev->xid = xid;
dev->identity = *identity;
dev->identity = identity;
dev->status = XAVERIUS_DEVICE_STATUS_AVAILABLE;
dev->generation = 1;
dev->native_handle = native_handle;
dev->context = context;
dev->caps = *caps; /* Phase A: metadata snapshot; ops/generation in Phase B */
if (!AddResource(xid, XaveriusPhysicalDeviceType, dev)) {

View file

@ -40,7 +40,8 @@ static void XaveriusScreenCloseHook(CallbackListPtr *pcbl, ScreenPtr pScreen, vo
*
* Called by the DDX during ScreenInit. Strictly Screen-local: allocates
* and installs the per-screen Xaverius private record. Does not discover,
* register, or unregister any PhysicalDevice.
* register, or unregister any PhysicalDevice. The DDX's ops pointer is
* stored for later use by the DDX itself; Xaverius never invokes it.
*/
bool XaveriusScreenInit(ScreenPtr pScreen, const XaveriusDDXOps *ops)
{

View file

@ -49,10 +49,6 @@ int ProcXaveriusGetPhysicalDeviceQueueFamilyProperties(ClientPtr client);
void XaveriusRegistryInit(void);
void XaveriusRegistryFini(void);
bool XaveriusRegisterDeviceDirect(const XaveriusDeviceIdentity *identity,
const XaveriusDeviceCapabilities *caps,
int native_handle,
void *context);
XaveriusDevicePtr XaveriusFindDeviceByXid(XID xid);
void XaveriusSetDeviceStatus(XaveriusDevicePtr device, XaveriusDeviceStatus status);
XaveriusDevicePtr XaveriusFirstDevice(void);

View file

@ -1,4 +1,5 @@
/* SPDX-License-Identifier: X11 OR MIT OR AGPL-3.0-or-later
*
* Copyright © 2026 Enrico Weigelt, metux IT consult <info@metux.net>
*
@ -110,6 +111,13 @@ _X_EXPORT bool XaveriusScreenInit(ScreenPtr pScreen);
_X_EXPORT XaveriusScreenPtr XaveriusGetScreen(ScreenPtr pScreen);
/* DDX-wide provider registration entry point (Phase A).
* DDX drivers call this once per provider to register all served
* PhysicalDevices and their provider capabilities/ops.
* Strictly DDX-wide; no ScreenPtr, no per-screen state.
*/
_X_EXPORT bool XaveriusRegisterDevice(const XaveriusDeviceCapabilities *caps);
/* ===== DDX backend operation tables (spec/provider-operation-matrix.md §3) =====
*
* These declarations are the mandatory DDX/backend API contract.

View file

@ -294,8 +294,8 @@ modesetting_register_xaverius_devices(DriverPtr drv)
caps.device_type = XAVERIUS_DEVICE_TYPE_PHYSICAL;
caps.device_name = "modesetting";
/* Register with card fd as native handle. */
XaveriusRegisterDeviceDirect(&identity, &caps, fd_card, NULL);
/* Xaverius registration deferred to Phase B */
(void)identity; (void)caps;
close(fd_render); /* render fd not needed */
} else {
@ -316,7 +316,8 @@ modesetting_register_xaverius_devices(DriverPtr drv)
caps.device_type = XAVERIUS_DEVICE_TYPE_PHYSICAL;
caps.device_name = "modesetting";
XaveriusRegisterDeviceDirect(&identity, &caps, fd_card, NULL);
/* Xaverius registration deferred to Phase B */
(void)identity; (void)caps;
} else if (fd_card >= 0) {
close(fd_card);
}
@ -337,7 +338,8 @@ modesetting_register_xaverius_devices(DriverPtr drv)
caps.device_type = XAVERIUS_DEVICE_TYPE_PHYSICAL;
caps.device_name = "modesetting";
XaveriusRegisterDeviceDirect(&identity, &caps, fd_render, NULL);
/* Xaverius registration deferred to Phase B */
(void)identity; (void)caps;
} else if (fd_render >= 0) {
close(fd_render);
}