libs/vkd3d: Add simple replacement for event objects.

This naming convention for exported functions is used to be consistent
with other D3D12* functions().
This commit is contained in:
Józef Kucia 2016-10-05 15:56:27 +02:00
parent a5e13cf53e
commit 733f720ee4
3 changed files with 125 additions and 0 deletions

View File

@ -171,6 +171,16 @@ typedef struct SECURITY_ATTRIBUTES SECURITY_ATTRIBUTES;
# define IsEqualGUID(guid1, guid2) (!memcmp(guid1, guid2, sizeof(GUID))) # define IsEqualGUID(guid1, guid2) (!memcmp(guid1, guid2, sizeof(GUID)))
#endif #endif
#define WAIT_OBJECT_0 (0)
#define WAIT_TIMEOUT (1)
#define WAIT_FAILED (~0u)
#define INFINITE (~0u)
HANDLE WINAPI VKD3DCreateEvent(void);
BOOL WINAPI VKD3DSignalEvent(HANDLE event);
unsigned int WINAPI VKD3DWaitEvent(HANDLE event, unsigned int milliseconds);
void WINAPI VKD3DDestroyEvent(HANDLE event);
#elif !defined(__WIDL__) #elif !defined(__WIDL__)
# include <windows.h> # include <windows.h>

View File

@ -61,3 +61,111 @@ HRESULT WINAPI D3D12GetDebugInterface(REFIID riid, void **debug)
return E_NOTIMPL; return E_NOTIMPL;
} }
/* Events */
HANDLE WINAPI VKD3DCreateEvent(void)
{
struct vkd3d_event *event;
int rc;
TRACE(".\n");
if (!(event = vkd3d_malloc(sizeof(*event))))
return NULL;
if ((rc = pthread_mutex_init(&event->mutex, NULL)))
{
ERR("Failed to initialize mutex, error %d.\n", rc);
vkd3d_free(event);
return NULL;
}
if ((rc = pthread_cond_init(&event->cond, NULL)))
{
ERR("Failed to initialize condition variable, error %d.\n", rc);
pthread_mutex_destroy(&event->mutex);
vkd3d_free(event);
return NULL;
}
event->is_signaled = FALSE;
TRACE("Created event %p.\n", event);
return event;
}
unsigned int WINAPI VKD3DWaitEvent(HANDLE event, unsigned int milliseconds)
{
struct vkd3d_event *impl = event;
int rc;
TRACE("event %p, milliseconds %u.\n", event, milliseconds);
if ((rc = pthread_mutex_lock(&impl->mutex)))
{
ERR("Failed to lock mutex, error %d.\n", rc);
return WAIT_FAILED;
}
if (impl->is_signaled || !milliseconds)
{
BOOL is_signaled = impl->is_signaled;
impl->is_signaled = FALSE;
pthread_mutex_unlock(&impl->mutex);
return is_signaled ? WAIT_OBJECT_0 : WAIT_TIMEOUT;
}
if (milliseconds == INFINITE)
{
do
{
if ((rc = pthread_cond_wait(&impl->cond, &impl->mutex)))
{
ERR("Failed to wait on condition variable, error %d.\n", rc);
pthread_mutex_unlock(&impl->mutex);
return WAIT_FAILED;
}
} while (!impl->is_signaled);
impl->is_signaled = FALSE;
pthread_mutex_unlock(&impl->mutex);
return WAIT_OBJECT_0;
}
pthread_mutex_unlock(&impl->mutex);
FIXME("Timed wait not implemented yet.\n");
return WAIT_FAILED;
}
BOOL WINAPI VKD3DSignalEvent(HANDLE event)
{
struct vkd3d_event *impl = event;
int rc;
TRACE("event %p.\n", event);
if ((rc = pthread_mutex_lock(&impl->mutex)))
{
ERR("Failed to lock mutex, error %d.\n", rc);
return FALSE;
}
impl->is_signaled = TRUE;
pthread_cond_signal(&impl->cond);
pthread_mutex_unlock(&impl->mutex);
return TRUE;
}
void WINAPI VKD3DDestroyEvent(HANDLE event)
{
struct vkd3d_event *impl = event;
int rc;
TRACE("event %p.\n", event);
if ((rc = pthread_mutex_destroy(&impl->mutex)))
ERR("Failed to destroy mutex, error %d.\n", rc);
if ((rc = pthread_cond_destroy(&impl->cond)))
ERR("Failed to destroy condition variable, error %d.\n", rc);
vkd3d_free(impl);
}

View File

@ -46,6 +46,13 @@ struct vkd3d_instance
struct vkd3d_vk_instance_procs vk_procs; struct vkd3d_vk_instance_procs vk_procs;
}; };
struct vkd3d_event
{
pthread_mutex_t mutex;
pthread_cond_t cond;
BOOL is_signaled;
};
/* ID3D12Fence */ /* ID3D12Fence */
struct d3d12_fence struct d3d12_fence
{ {