diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/amdgpu_kms.c | 91 |
1 files changed, 90 insertions, 1 deletions
diff --git a/src/amdgpu_kms.c b/src/amdgpu_kms.c index 3c83702..a870027 100644 --- a/src/amdgpu_kms.c +++ b/src/amdgpu_kms.c @@ -66,6 +66,11 @@ static DevPrivateKeyRec amdgpu_window_private_key; static DevScreenPrivateKeyRec amdgpu_client_private_key; DevScreenPrivateKeyRec amdgpu_device_private_key; +static Bool amdgpu_property_vectors_wrapped; +static Bool restore_property_vector; +static int (*saved_change_property) (ClientPtr client); +static int (*saved_delete_property) (ClientPtr client); + static Bool amdgpu_setup_kernel_mem(ScreenPtr pScreen); const OptionInfoRec AMDGPUOptions_KMS[] = { @@ -89,6 +94,80 @@ const OptionInfoRec *AMDGPUOptionsWeak(void) return AMDGPUOptions_KMS; } +/* Wrapper for xserver/dix/property.c:ProcChangeProperty */ +static int +amdgpu_change_property(ClientPtr client) +{ + int ret; + + client->requestVector[X_ChangeProperty] = saved_change_property; + ret = saved_change_property(client); + + if (!restore_property_vector) + client->requestVector[X_ChangeProperty] = amdgpu_change_property; + + return ret; +} + +/* Wrapper for xserver/dix/property.c:ProcDeleteProperty */ +static int +amdgpu_delete_property(ClientPtr client) +{ + int ret; + + client->requestVector[X_DeleteProperty] = saved_delete_property; + ret = saved_delete_property(client); + + if (!restore_property_vector) + client->requestVector[X_DeleteProperty] = amdgpu_delete_property; + + return ret; +} + +static void +amdgpu_unwrap_property_requests(ScrnInfoPtr scrn) +{ + int i; + + if (!amdgpu_property_vectors_wrapped) + return; + + if (ProcVector[X_ChangeProperty] == amdgpu_change_property) + ProcVector[X_ChangeProperty] = saved_change_property; + else + restore_property_vector = TRUE; + + if (ProcVector[X_DeleteProperty] == amdgpu_delete_property) + ProcVector[X_DeleteProperty] = saved_delete_property; + else + restore_property_vector = TRUE; + + for (i = 0; i < currentMaxClients; i++) { + if (clients[i]->requestVector[X_ChangeProperty] == + amdgpu_change_property) { + clients[i]->requestVector[X_ChangeProperty] = + saved_change_property; + } else { + restore_property_vector = TRUE; + } + + if (clients[i]->requestVector[X_DeleteProperty] == + amdgpu_delete_property) { + clients[i]->requestVector[X_DeleteProperty] = + saved_delete_property; + } else { + restore_property_vector = TRUE; + } + } + + if (restore_property_vector) { + xf86DrvMsg(scrn->scrnIndex, X_WARNING, + "Couldn't unwrap some window property request vectors\n"); + } + + amdgpu_property_vectors_wrapped = FALSE; +} + extern _X_EXPORT int gAMDGPUEntityIndex; static int getAMDGPUEntityIndex(void) @@ -146,6 +225,7 @@ static void AMDGPUFreeRec(ScrnInfoPtr pScrn) pAMDGPUEnt = pPriv->ptr; pAMDGPUEnt->fd_ref--; if (!pAMDGPUEnt->fd_ref) { + amdgpu_unwrap_property_requests(pScrn); amdgpu_device_deinitialize(pAMDGPUEnt->pDev); amdgpu_kernel_close_fd(pAMDGPUEnt); free(pPriv->ptr); @@ -156,7 +236,6 @@ static void AMDGPUFreeRec(ScrnInfoPtr pScrn) free(pEnt); } - static inline struct amdgpu_window_priv *get_window_priv(WindowPtr win) { return dixLookupPrivate(&win->devPrivates, &amdgpu_window_private_key); } @@ -2095,6 +2174,16 @@ Bool AMDGPUScreenInit_KMS(ScreenPtr pScreen, int argc, char **argv) if (serverGeneration == 1) xf86ShowUnusedOptions(pScrn->scrnIndex, pScrn->options); + if (info->vrr_support) { + if (!amdgpu_property_vectors_wrapped) { + saved_change_property = ProcVector[X_ChangeProperty]; + ProcVector[X_ChangeProperty] = amdgpu_change_property; + saved_delete_property = ProcVector[X_DeleteProperty]; + ProcVector[X_DeleteProperty] = amdgpu_delete_property; + amdgpu_property_vectors_wrapped = TRUE; + } + } + drmmode_init(pScrn, &info->drmmode); xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, AMDGPU_LOGLEVEL_DEBUG, |