From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/d3dkmt.c | 14 ++++++++------ server/d3dkmt.c | 6 ++++-- server/protocol.def | 1 + 3 files changed, 13 insertions(+), 8 deletions(-)
diff --git a/dlls/win32u/d3dkmt.c b/dlls/win32u/d3dkmt.c index a8171039d32..f9bcfcfc047 100644 --- a/dlls/win32u/d3dkmt.c +++ b/dlls/win32u/d3dkmt.c @@ -185,7 +185,8 @@ static NTSTATUS d3dkmt_object_alloc( UINT size, enum d3dkmt_type type, void **ob }
/* create a global D3DKMT object, either with a global handle or later shareable */ -static NTSTATUS d3dkmt_object_create( struct d3dkmt_object *object, int fd, BOOL shared, const void *runtime, UINT runtime_size ) +static NTSTATUS d3dkmt_object_create( struct d3dkmt_object *object, int fd, UINT value, BOOL shared, + const void *runtime, UINT runtime_size ) { NTSTATUS status;
@@ -195,6 +196,7 @@ static NTSTATUS d3dkmt_object_create( struct d3dkmt_object *object, int fd, BOOL { req->type = object->type; req->fd = fd; + req->value = value; if (runtime_size) wine_server_add_data( req, runtime, runtime_size ); status = wine_server_call( req ); object->handle = wine_server_ptr_handle( reply->handle ); @@ -1058,7 +1060,7 @@ NTSTATUS WINAPI NtGdiDdDDICreateAllocation2( D3DKMT_CREATEALLOCATION *params ) if ((status = d3dkmt_object_alloc( sizeof(*allocation), D3DKMT_ALLOCATION, (void **)&allocation ))) goto failed;
if (!params->Flags.CreateShared) status = alloc_object_handle( &resource->obj ); - else status = d3dkmt_object_create( &resource->obj, -1, params->Flags.NtSecuritySharing, + else status = d3dkmt_object_create( &resource->obj, -1, 0, params->Flags.NtSecuritySharing, params->pPrivateRuntimeData, params->PrivateRuntimeDataSize ); if (status) goto failed;
@@ -1378,7 +1380,7 @@ NTSTATUS WINAPI NtGdiDdDDICreateKeyedMutex2( D3DKMT_CREATEKEYEDMUTEX2 *params ) if (!params) return STATUS_INVALID_PARAMETER;
if ((status = d3dkmt_object_alloc( sizeof(*mutex), D3DKMT_MUTEX, (void **)&mutex ))) return status; - if ((status = d3dkmt_object_create( &mutex->obj, -1, params->Flags.NtSecuritySharing, + if ((status = d3dkmt_object_create( &mutex->obj, -1, params->InitialValue, params->Flags.NtSecuritySharing, params->pPrivateRuntimeData, params->PrivateRuntimeDataSize ))) goto failed;
@@ -1571,7 +1573,7 @@ NTSTATUS WINAPI NtGdiDdDDICreateSynchronizationObject2( D3DKMT_CREATESYNCHRONIZA
if ((status = d3dkmt_object_alloc( sizeof(*sync), D3DKMT_SYNC, (void **)&sync ))) return status; if (!params->Info.Flags.Shared) status = alloc_object_handle( sync ); - else status = d3dkmt_object_create( sync, -1, params->Info.Flags.NtSecuritySharing, NULL, 0 ); + else status = d3dkmt_object_create( sync, -1, 0, params->Info.Flags.NtSecuritySharing, NULL, 0 ); if (status) goto failed;
if (params->Info.Flags.Shared) params->Info.SharedHandle = sync->shared ? 0 : sync->global; @@ -1758,7 +1760,7 @@ D3DKMT_HANDLE d3dkmt_create_resource( int fd, D3DKMT_HANDLE *global )
if ((status = d3dkmt_object_alloc( sizeof(*resource), D3DKMT_RESOURCE, (void **)&resource ))) goto failed; if ((status = d3dkmt_object_alloc( sizeof(*allocation), D3DKMT_ALLOCATION, (void **)&allocation ))) goto failed; - if ((status = d3dkmt_object_create( &resource->obj, fd, !global, NULL, 0 ))) goto failed; + if ((status = d3dkmt_object_create( &resource->obj, fd, 0, !global, NULL, 0 ))) goto failed;
if ((status = alloc_object_handle( allocation ))) goto failed; resource->allocation = allocation->local; @@ -1823,7 +1825,7 @@ D3DKMT_HANDLE d3dkmt_create_sync( int fd, D3DKMT_HANDLE *global ) TRACE( "global %p\n", global );
if ((status = d3dkmt_object_alloc( sizeof(*sync), D3DKMT_SYNC, (void **)&sync ))) goto failed; - if ((status = d3dkmt_object_create( sync, fd, !global, NULL, 0 ))) goto failed; + if ((status = d3dkmt_object_create( sync, fd, 0, !global, NULL, 0 ))) goto failed; if (global) *global = sync->global; return sync->local;
diff --git a/server/d3dkmt.c b/server/d3dkmt.c index 5b0bd016796..47824a8f1a0 100644 --- a/server/d3dkmt.c +++ b/server/d3dkmt.c @@ -98,6 +98,7 @@ static const struct fd_ops d3dkmt_fd_ops = struct d3dkmt_mutex { struct d3dkmt_object base; + unsigned int key_value; /* last released key value */ };
static void d3dkmt_mutex_dump( struct object *obj, int verbose ); @@ -420,7 +421,7 @@ static void d3dkmt_mutex_destroy( struct object *obj ) free( mutex->base.runtime ); }
-static struct d3dkmt_object *d3dkmt_mutex_create( data_size_t runtime_size, const void *runtime ) +static struct d3dkmt_object *d3dkmt_mutex_create( unsigned int key_value, data_size_t runtime_size, const void *runtime ) { struct d3dkmt_mutex *object;
@@ -429,6 +430,7 @@ static struct d3dkmt_object *d3dkmt_mutex_create( data_size_t runtime_size, cons object->base.global = 0; object->base.runtime_size = runtime_size; object->base.fd = NULL; + object->key_value = key_value;
if (!(object->base.runtime = memdup( runtime, runtime_size )) || !(object->base.global = alloc_object_handle( &object->base ))) @@ -499,7 +501,7 @@ DECL_HANDLER(d3dkmt_object_create) switch (req->type) { case D3DKMT_MUTEX: - if (!(object = d3dkmt_mutex_create( get_req_data_size(), get_req_data() ))) goto done; + if (!(object = d3dkmt_mutex_create( req->value, get_req_data_size(), get_req_data() ))) goto done; break; default: if (!(object = d3dkmt_object_create( req->type, get_req_data_size(), get_req_data() ))) goto done; diff --git a/server/protocol.def b/server/protocol.def index cb46a5ff2dc..ec6738169ed 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -4179,6 +4179,7 @@ enum inproc_sync_type @REQ(d3dkmt_object_create) unsigned int type; /* d3dkmt object type */ int fd; /* host specific fd */ + unsigned int value; /* initial value for keyed mutex */ VARARG(runtime,bytes); /* client runtime data */ @REPLY d3dkmt_handle_t global; /* global d3dkmt handle */