progwrp/dxgi.c
2025-12-13 23:37:26 +01:00

147 lines
3.2 KiB
C

#include "progwrp.h"
#include "export.h"
#include "implementations.h"
#include "com_lite.h"
#include "strsafe.h"
#include <d3d9.h>
#include <dxgi.h>
LPDIRECT3D9 g_pD3D = NULL;
typedef IDirect3D9*( WINAPI* d3d9create) (UINT);
HRESULT WINAPI CheckInterfaceSupport(
void* this,
REFGUID InterfaceName,
LARGE_INTEGER *pUMDVersion
)
{
if(pUMDVersion)
pUMDVersion->QuadPart = 0;
return DXGI_ERROR_UNSUPPORTED;
}
HRESULT WINAPI GetDesc(
void* this,
DXGI_ADAPTER_DESC *pDesc
)
{
if(!pDesc)
return E_INVALIDARG;
StringCchCopyW(pDesc->Description, 128, L"Software Adapter");
pDesc->VendorId = 0;
pDesc->DeviceId = 0;
pDesc->SubSysId = 0;
pDesc->Revision = 0;
pDesc->DedicatedVideoMemory = 4;
pDesc->DedicatedSystemMemory = 8;
pDesc->SharedSystemMemory = 1;
pDesc->AdapterLuid.LowPart = 3453;
return S_OK;
}
HRESULT WINAPI EnumAdapters1(
void* this,
UINT Adapter,
void **ppAdapter
)
{
return E_FAIL;
}
ULONG WINAPI Release(void* this)
{
return 1;
}
HRESULT WINAPI EnumAdapters(
void* this,
UINT Adapter,
void **ppAdapter
)
{
UINT AdapterCount;
pIDXGIAdapterLite pDXGIAdapter;
if(!ppAdapter)
return DXGI_ERROR_INVALID_CALL;
if(g_pD3D)
AdapterCount = IDirect3D9_GetAdapterCount(g_pD3D);
else
return E_FAIL;
if(AdapterCount - 1 < Adapter)
return DXGI_ERROR_NOT_FOUND;
else
{
*ppAdapter = pDXGIAdapter;
pDXGIAdapter->Vtbl = NULL;
pDXGIAdapter->Vtbl = (void*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDXGIAdapterLiteTbl));
if(!pDXGIAdapter->Vtbl)
{
return E_FAIL;
}
pDXGIAdapter->Vtbl->IDXGIObject.IUnknown.pfnQueryInterface = pDXGIAdapter->Vtbl;
pDXGIAdapter->Vtbl->IDXGIObject.IUnknown.pfnRelease = Release;
pDXGIAdapter->Vtbl->pfnGetDesc = GetDesc;
pDXGIAdapter->Vtbl->pfnCheckInterfaceSupport = CheckInterfaceSupport;
return S_OK;
}
}
HRESULT WINAPI Implementation_CreateDXGIFactory(
REFIID riid,
void **ppFactory
)
{
return E_FAIL;
}
BOOL RefIdCmp(IID riid0, IID riid1)
{
if(riid0.Data1 == riid1.Data1 &&
riid0.Data2 == riid1.Data2 &&
riid0.Data3 == riid1.Data3 &&
riid0.Data4 == riid1.Data4)
return TRUE;
return FALSE;
}
HRESULT WINAPI Implementation_CreateDXGIFactory1(
REFIID riid,
void **ppFactory
)
{
d3d9create pfnDirect3DCreate9;
pIDXGIFactory1Lite pDXGIFactory1;
IID iid_DXGIFactory1 = {0x770AAE78, 0xF26F, 0x4DBA, 0xA8, 0x29, 0x25, 0x3C, 0x83, 0xD1, 0xB3, 0x87};
if(RefIdCmp(*riid, iid_DXGIFactory1))
{
pfnDirect3DCreate9 = (d3d9create)Implementation_GetProcAddress(LoadLibraryA("d3d9.dll"), "Direct3DCreate9");
if(!pfnDirect3DCreate9)
return E_FAIL;
g_pD3D = pfnDirect3DCreate9(D3D_SDK_VERSION);
pDXGIFactory1->Vtbl = NULL;
*ppFactory = pDXGIFactory1;
pDXGIFactory1->Vtbl = (void*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDXGIFactory1LiteTbl));
if(!pDXGIFactory1->Vtbl)
{
return E_FAIL;
}
pDXGIFactory1->Vtbl->IDXGIFactory.IDXGIObject.IUnknown.pfnQueryInterface = pDXGIFactory1->Vtbl;
pDXGIFactory1->Vtbl->IDXGIFactory.pfnEnumAdapters = EnumAdapters;
pDXGIFactory1->Vtbl->EnumAdapters1 = EnumAdapters1;
pDXGIFactory1->Vtbl->IDXGIFactory.IDXGIObject.IUnknown.pfnRelease = Release;
return S_OK;
}
return DXGI_ERROR_NOT_FOUND;
}