About Social Code
aboutsummaryrefslogtreecommitdiff
path: root/src/gallium/frontends/nine/iunknown.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/frontends/nine/iunknown.c')
-rw-r--r--src/gallium/frontends/nine/iunknown.c293
1 files changed, 0 insertions, 293 deletions
diff --git a/src/gallium/frontends/nine/iunknown.c b/src/gallium/frontends/nine/iunknown.c
deleted file mode 100644
index 25a86f0755f..00000000000
--- a/src/gallium/frontends/nine/iunknown.c
+++ /dev/null
@@ -1,293 +0,0 @@
-/*
- * Copyright 2011 Joakim Sindholt <opensource@zhasha.com>
- * SPDX-License-Identifier: MIT
- */
-
-#include "iunknown.h"
-#include "util/u_atomic.h"
-#include "util/hash_table.h"
-
-#include "nine_helpers.h"
-#include "nine_pdata.h"
-#include "nine_lock.h"
-
-#define DBG_CHANNEL DBG_UNKNOWN
-
-HRESULT
-NineUnknown_ctor( struct NineUnknown *This,
- struct NineUnknownParams *pParams )
-{
- if (pParams->container) {
- This->refs = 0;
- This->forward = true;
- This->bind = 0;
- assert(!pParams->start_with_bind_not_ref);
- } else if (pParams->start_with_bind_not_ref) {
- This->refs = 0;
- This->forward = false;
- This->bind = 1;
- } else {
- This->refs = 1;
- This->forward = false;
- This->bind = 0;
- }
- This->has_bind_or_refs = This->bind + This->refs;
-
- This->container = pParams->container;
- This->device = pParams->device;
- if (This->refs && This->device)
- NineUnknown_AddRef(NineUnknown(This->device));
-
- This->vtable = pParams->vtable;
- This->vtable_internal = pParams->vtable;
- This->guids = pParams->guids;
- This->dtor = pParams->dtor;
-
- This->pdata = _mesa_hash_table_create(NULL, ht_guid_hash, ht_guid_compare);
- if (!This->pdata)
- return E_OUTOFMEMORY;
-
- return D3D_OK;
-}
-
-void
-NineUnknown_dtor( struct NineUnknown *This )
-{
- if (This->refs && This->device) /* Possible only if early exit after a ctor failed */
- (void) NineUnknown_Release(NineUnknown(This->device));
-
- if (This->pdata)
- _mesa_hash_table_destroy(This->pdata, ht_guid_delete);
-
- FREE(This);
-}
-
-HRESULT NINE_WINAPI
-NineUnknown_QueryInterface( struct NineUnknown *This,
- REFIID riid,
- void **ppvObject )
-{
- unsigned i = 0;
- char guid_str[64];
-
- DBG("This=%p riid=%p id=%s ppvObject=%p\n",
- This, riid, riid ? GUID_sprintf(guid_str, riid) : "", ppvObject);
-
- (void)guid_str;
-
- if (!ppvObject) return E_POINTER;
-
- do {
- if (GUID_equal(This->guids[i], riid)) {
- *ppvObject = This;
- /* Tests showed that this call succeeds even on objects with
- * zero refcount. This can happen if the app released all references
- * but the resource is still bound.
- */
- NineUnknown_AddRef(This);
- return S_OK;
- }
- } while (This->guids[++i]);
-
- *ppvObject = NULL;
- return E_NOINTERFACE;
-}
-
-ULONG NINE_WINAPI
-NineUnknown_AddRef( struct NineUnknown *This )
-{
- ULONG r;
- if (This->forward)
- return NineUnknown_AddRef(This->container);
- else
- r = p_atomic_inc_return(&This->refs);
-
- if (r == 1) {
- p_atomic_inc(&This->has_bind_or_refs);
- if (This->device)
- NineUnknown_AddRef(NineUnknown(This->device));
- }
- return r;
-}
-
-ULONG NINE_WINAPI
-NineUnknown_Release( struct NineUnknown *This )
-{
- if (This->forward)
- return NineUnknown_Release(This->container);
-
- /* Cannot decrease lower than 0. This is a thing
- * according to wine tests. It's not just clamping
- * the result as AddRef after Release while refs is 0
- * will give 1 */
- if (!p_atomic_read(&This->refs))
- return 0;
-
- ULONG r = p_atomic_dec_return(&This->refs);
-
- if (r == 0) {
- struct NineDevice9 *device = This->device;
- UINT b_or_ref = p_atomic_dec_return(&This->has_bind_or_refs);
- /* Containers (here with !forward) take care of item destruction */
-
- if (!This->container && b_or_ref == 0) {
- assert(p_atomic_read(&This->bind) == 0);
- This->dtor(This);
- }
- if (device) {
- NineUnknown_Release(NineUnknown(device));
- }
- }
- return r;
-}
-
-/* No need to lock the mutex protecting nine (when D3DCREATE_MULTITHREADED)
- * for AddRef and Release, except for dtor as some of the dtors require it. */
-ULONG NINE_WINAPI
-NineUnknown_ReleaseWithDtorLock( struct NineUnknown *This )
-{
- if (This->forward)
- return NineUnknown_ReleaseWithDtorLock(This->container);
-
- ULONG r = p_atomic_dec_return(&This->refs);
-
- if (r == 0) {
- struct NineDevice9 *device = This->device;
- UINT b_or_ref = p_atomic_dec_return(&This->has_bind_or_refs);
- /* Containers (here with !forward) take care of item destruction */
- if (!This->container && b_or_ref == 0) {
- assert(p_atomic_read(&This->bind) == 0);
- NineLockGlobalMutex();
- This->dtor(This);
- NineUnlockGlobalMutex();
- }
- if (device) {
- NineUnknown_ReleaseWithDtorLock(NineUnknown(device));
- }
- }
- return r;
-}
-
-HRESULT NINE_WINAPI
-NineUnknown_GetDevice( struct NineUnknown *This,
- IDirect3DDevice9 **ppDevice )
-{
- user_assert(ppDevice, E_POINTER);
- NineUnknown_AddRef(NineUnknown(This->device));
- *ppDevice = (IDirect3DDevice9 *)This->device;
- return D3D_OK;
-}
-
-HRESULT NINE_WINAPI
-NineUnknown_SetPrivateData( struct NineUnknown *This,
- REFGUID refguid,
- const void *pData,
- DWORD SizeOfData,
- DWORD Flags )
-{
- struct pheader *header;
- const void *user_data = pData;
- char guid_str[64];
- void *header_data;
-
- DBG("This=%p GUID=%s pData=%p SizeOfData=%u Flags=%x\n",
- This, GUID_sprintf(guid_str, refguid), pData, SizeOfData, Flags);
-
- (void)guid_str;
-
- if (Flags & D3DSPD_IUNKNOWN)
- user_assert(SizeOfData == sizeof(IUnknown *), D3DERR_INVALIDCALL);
-
- /* data consists of a header and the actual data. avoiding 2 mallocs */
- header = CALLOC_VARIANT_LENGTH_STRUCT(pheader, SizeOfData);
- if (!header) { DBG("Returning E_OUTOFMEMORY\n"); return E_OUTOFMEMORY; }
- header->unknown = (Flags & D3DSPD_IUNKNOWN) ? true : false;
-
- /* if the refguid already exists, delete it */
- NineUnknown_FreePrivateData(This, refguid);
-
- /* IUnknown special case */
- if (header->unknown) {
- /* here the pointer doesn't point to the data we want, so point at the
- * pointer making what we eventually copy is the pointer itself */
- user_data = &pData;
- }
-
- header->size = SizeOfData;
- header_data = (void *)header + sizeof(*header);
- memcpy(header_data, user_data, header->size);
- memcpy(&header->guid, refguid, sizeof(header->guid));
-
- DBG("New header %p, size %d\n", header, (int)header->size);
- _mesa_hash_table_insert(This->pdata, &header->guid, header);
- if (header->unknown) { IUnknown_AddRef(*(IUnknown **)header_data); }
- return D3D_OK;
-}
-
-HRESULT NINE_WINAPI
-NineUnknown_GetPrivateData( struct NineUnknown *This,
- REFGUID refguid,
- void *pData,
- DWORD *pSizeOfData )
-{
- struct hash_entry *entry;
- struct pheader *header;
- DWORD sizeofdata;
- char guid_str[64];
- void *header_data;
-
- DBG("This=%p GUID=%s pData=%p pSizeOfData=%p\n",
- This, GUID_sprintf(guid_str, refguid), pData, pSizeOfData);
-
- (void)guid_str;
-
- entry = _mesa_hash_table_search(This->pdata, refguid);
- if (!entry) { DBG("Returning D3DERR_NOTFOUND\n"); return D3DERR_NOTFOUND; }
-
- header = entry->data;
-
- user_assert(pSizeOfData, E_POINTER);
- sizeofdata = *pSizeOfData;
- *pSizeOfData = header->size;
- DBG("Found header %p, size %d. Requested max %d\n", header, (int)header->size, (int)sizeofdata);
-
- if (!pData) {
- DBG("Returning early D3D_OK\n");
- return D3D_OK;
- }
- if (sizeofdata < header->size) {
- DBG("Returning D3DERR_MOREDATA\n");
- return D3DERR_MOREDATA;
- }
-
- header_data = (void *)header + sizeof(*header);
- if (header->unknown) { IUnknown_AddRef(*(IUnknown **)header_data); }
- memcpy(pData, header_data, header->size);
- DBG("Returning D3D_OK\n");
-
- return D3D_OK;
-}
-
-HRESULT NINE_WINAPI
-NineUnknown_FreePrivateData( struct NineUnknown *This,
- REFGUID refguid )
-{
- struct hash_entry *entry;
- char guid_str[64];
-
- DBG("This=%p GUID=%s\n", This, GUID_sprintf(guid_str, refguid));
-
- (void)guid_str;
-
- entry = _mesa_hash_table_search(This->pdata, refguid);
- if (!entry) {
- DBG("Nothing to free\n");
- return D3DERR_NOTFOUND;
- }
-
- DBG("Freeing %p\n", entry->data);
- ht_guid_delete(entry);
- _mesa_hash_table_remove(This->pdata, entry);
-
- return D3D_OK;
-}