/* IDirect3DVolume9 Interface follow: */ static HRESULT WINAPI IDirect3DVolume9Impl_GetDevice(LPDIRECT3DVOLUME9 iface, IDirect3DDevice9** ppDevice) { IDirect3DVolume9Impl *This = (IDirect3DVolume9Impl *)iface; IWineD3DDevice *myDevice = NULL; IWineD3DVolume_GetDevice(This->wineD3DVolume, &myDevice); IWineD3DDevice_GetParent(myDevice, (IUnknown **)ppDevice); IWineD3DDevice_Release(myDevice); return D3D_OK; }
/* IDirect3DResource9 Interface follow: */ HRESULT WINAPI IDirect3DResource9Impl_GetDevice(LPDIRECT3DRESOURCE9 iface, IDirect3DDevice9** ppDevice) { IDirect3DResource9Impl *This = (IDirect3DResource9Impl *)iface; IWineD3DDevice *myDevice = NULL; TRACE("(%p) Relay\n", This); IWineD3DResource_GetDevice(This->wineD3DResource, &myDevice); IWineD3DDevice_GetParent(myDevice, (IUnknown **)ppDevice); IWineD3DDevice_Release(myDevice); return D3D_OK; }
/* IDirect3DVertexShader9 Interface follow: */ static HRESULT WINAPI IDirect3DVertexShader9Impl_GetDevice(LPDIRECT3DVERTEXSHADER9 iface, IDirect3DDevice9** ppDevice) { IDirect3DVertexShader9Impl *This = (IDirect3DVertexShader9Impl *)iface; IWineD3DDevice *myDevice = NULL; HRESULT hr; TRACE("(%p) : Relay\n", This); EnterCriticalSection(&d3d9_cs); hr = IWineD3DVertexShader_GetDevice(This->wineD3DVertexShader, &myDevice); if (WINED3D_OK == hr && myDevice != NULL) { hr = IWineD3DDevice_GetParent(myDevice, (IUnknown **)ppDevice); IWineD3DDevice_Release(myDevice); } else { *ppDevice = NULL; } LeaveCriticalSection(&d3d9_cs); TRACE("(%p) returning (%p)\n", This, *ppDevice); return hr; }
/* IDirect3DQuery9 Interface follow: */ static HRESULT WINAPI IDirect3DQuery9Impl_GetDevice(LPDIRECT3DQUERY9 iface, IDirect3DDevice9** ppDevice) { IDirect3DQuery9Impl *This = (IDirect3DQuery9Impl *)iface; IWineD3DDevice* pDevice; HRESULT hr; TRACE("(%p) Relay\n", This); EnterCriticalSection(&d3d9_cs); hr = IWineD3DQuery_GetDevice(This->wineD3DQuery, &pDevice); if(hr != D3D_OK){ *ppDevice = NULL; }else{ hr = IWineD3DDevice_GetParent(pDevice, (IUnknown **)ppDevice); IWineD3DDevice_Release(pDevice); } LeaveCriticalSection(&d3d9_cs); return hr; }
static HRESULT WINAPI IDirect3D8Impl_CreateDevice(LPDIRECT3D8 iface, UINT Adapter, D3DDEVTYPE DeviceType, HWND hFocusWindow, DWORD BehaviourFlags, D3DPRESENT_PARAMETERS* pPresentationParameters, IDirect3DDevice8** ppReturnedDeviceInterface) { IDirect3D8Impl *This = (IDirect3D8Impl *)iface; IDirect3DDevice8Impl *object = NULL; WINED3DPRESENT_PARAMETERS localParameters; HRESULT hr; TRACE("(%p) Relay\n", This); /* Check the validity range of the adapter parameter */ if (Adapter >= IDirect3D8Impl_GetAdapterCount(iface)) { *ppReturnedDeviceInterface = NULL; return D3DERR_INVALIDCALL; } /* Allocate the storage for the device object */ object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DDevice8Impl)); if (NULL == object) { FIXME("Allocation of memory failed\n"); *ppReturnedDeviceInterface = NULL; return D3DERR_OUTOFVIDEOMEMORY; } object->lpVtbl = &Direct3DDevice8_Vtbl; object->device_parent_vtbl = &d3d8_wined3d_device_parent_vtbl; object->ref = 1; object->shader_handles = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, INITIAL_SHADER_HANDLE_TABLE_SIZE * sizeof(shader_handle)); object->shader_handle_table_size = INITIAL_SHADER_HANDLE_TABLE_SIZE; *ppReturnedDeviceInterface = (IDirect3DDevice8 *)object; /* Allocate an associated WineD3DDevice object */ EnterCriticalSection(&d3d8_cs); hr = IWineD3D_CreateDevice(This->WineD3D, Adapter, DeviceType, hFocusWindow, BehaviourFlags, (IUnknown *)object, (IWineD3DDeviceParent *)&object->device_parent_vtbl, &object->WineD3DDevice); if (hr != D3D_OK) { HeapFree(GetProcessHeap(), 0, object); *ppReturnedDeviceInterface = NULL; LeaveCriticalSection(&d3d8_cs); return hr; } TRACE("(%p) : Created Device %p\n", This, object); localParameters.BackBufferWidth = pPresentationParameters->BackBufferWidth; localParameters.BackBufferHeight = pPresentationParameters->BackBufferHeight; localParameters.BackBufferFormat = pPresentationParameters->BackBufferFormat; localParameters.BackBufferCount = pPresentationParameters->BackBufferCount; localParameters.MultiSampleType = pPresentationParameters->MultiSampleType; localParameters.MultiSampleQuality = 0; /* d3d9 only */ localParameters.SwapEffect = pPresentationParameters->SwapEffect; localParameters.hDeviceWindow = pPresentationParameters->hDeviceWindow; localParameters.Windowed = pPresentationParameters->Windowed; localParameters.EnableAutoDepthStencil = pPresentationParameters->EnableAutoDepthStencil; localParameters.AutoDepthStencilFormat = pPresentationParameters->AutoDepthStencilFormat; localParameters.Flags = pPresentationParameters->Flags; localParameters.FullScreen_RefreshRateInHz = pPresentationParameters->FullScreen_RefreshRateInHz; localParameters.PresentationInterval = pPresentationParameters->FullScreen_PresentationInterval; localParameters.AutoRestoreDisplayMode = TRUE; if(BehaviourFlags & D3DCREATE_MULTITHREADED) { IWineD3DDevice_SetMultithreaded(object->WineD3DDevice); } hr = IWineD3DDevice_Init3D(object->WineD3DDevice, &localParameters); LeaveCriticalSection(&d3d8_cs); pPresentationParameters->BackBufferWidth = localParameters.BackBufferWidth; pPresentationParameters->BackBufferHeight = localParameters.BackBufferHeight; pPresentationParameters->BackBufferFormat = localParameters.BackBufferFormat; pPresentationParameters->BackBufferCount = localParameters.BackBufferCount; pPresentationParameters->MultiSampleType = localParameters.MultiSampleType; pPresentationParameters->SwapEffect = localParameters.SwapEffect; pPresentationParameters->hDeviceWindow = localParameters.hDeviceWindow; pPresentationParameters->Windowed = localParameters.Windowed; pPresentationParameters->EnableAutoDepthStencil = localParameters.EnableAutoDepthStencil; pPresentationParameters->AutoDepthStencilFormat = localParameters.AutoDepthStencilFormat; pPresentationParameters->Flags = localParameters.Flags; pPresentationParameters->FullScreen_RefreshRateInHz = localParameters.FullScreen_RefreshRateInHz; pPresentationParameters->FullScreen_PresentationInterval = localParameters.PresentationInterval; if (hr != D3D_OK) { FIXME("(%p) D3D Initialization failed for WineD3DDevice %p\n", This, object->WineD3DDevice); HeapFree(GetProcessHeap(), 0, object); *ppReturnedDeviceInterface = NULL; } object->declArraySize = 16; object->decls = HeapAlloc(GetProcessHeap(), 0, object->declArraySize * sizeof(*object->decls)); if(!object->decls) { ERR("Out of memory\n"); IWineD3DDevice_Release(object->WineD3DDevice); HeapFree(GetProcessHeap(), 0, object); *ppReturnedDeviceInterface = NULL; hr = E_OUTOFMEMORY; } return hr; }
/* TODO: The DXGI swapchain desc is a bit nicer than WINED3DPRESENT_PARAMETERS, * change wined3d to use a structure more similar to DXGI. */ static HRESULT STDMETHODCALLTYPE dxgi_factory_CreateSwapChain(IWineDXGIFactory *iface, IUnknown *device, DXGI_SWAP_CHAIN_DESC *desc, IDXGISwapChain **swapchain) { WINED3DPRESENT_PARAMETERS present_parameters; IWineD3DSwapChain *wined3d_swapchain; IWineD3DDevice *wined3d_device; IWineDXGIDevice *dxgi_device; UINT count; HRESULT hr; FIXME("iface %p, device %p, desc %p, swapchain %p partial stub!\n", iface, device, desc, swapchain); hr = IUnknown_QueryInterface(device, &IID_IWineDXGIDevice, (void **)&dxgi_device); if (FAILED(hr)) { ERR("This is not the device we're looking for\n"); return hr; } wined3d_device = IWineDXGIDevice_get_wined3d_device(dxgi_device); IWineDXGIDevice_Release(dxgi_device); count = IWineD3DDevice_GetNumberOfSwapChains(wined3d_device); if (count) { FIXME("Only a single swapchain supported.\n"); IWineD3DDevice_Release(wined3d_device); return E_FAIL; } if (!desc->OutputWindow) { FIXME("No output window, should use factory output window\n"); } FIXME("Ignoring SwapEffect and Flags\n"); present_parameters.BackBufferWidth = desc->BufferDesc.Width; present_parameters.BackBufferHeight = desc->BufferDesc.Height; present_parameters.BackBufferFormat = wined3dformat_from_dxgi_format(desc->BufferDesc.Format); present_parameters.BackBufferCount = desc->BufferCount; if (desc->SampleDesc.Count > 1) { present_parameters.MultiSampleType = desc->SampleDesc.Count; present_parameters.MultiSampleQuality = desc->SampleDesc.Quality; } else { present_parameters.MultiSampleType = WINED3DMULTISAMPLE_NONE; present_parameters.MultiSampleQuality = 0; } present_parameters.SwapEffect = WINED3DSWAPEFFECT_DISCARD; present_parameters.hDeviceWindow = desc->OutputWindow; present_parameters.Windowed = desc->Windowed; present_parameters.EnableAutoDepthStencil = FALSE; present_parameters.AutoDepthStencilFormat = 0; present_parameters.Flags = 0; /* WINED3DPRESENTFLAG_DISCARD_DEPTHSTENCIL? */ present_parameters.FullScreen_RefreshRateInHz = desc->BufferDesc.RefreshRate.Numerator / desc->BufferDesc.RefreshRate.Denominator; present_parameters.PresentationInterval = WINED3DPRESENT_INTERVAL_DEFAULT; hr = IWineD3DDevice_Init3D(wined3d_device, &present_parameters); if (FAILED(hr)) { WARN("Failed to initialize 3D, returning %#x\n", hr); IWineD3DDevice_Release(wined3d_device); return hr; } hr = IWineD3DDevice_GetSwapChain(wined3d_device, 0, &wined3d_swapchain); IWineD3DDevice_Release(wined3d_device); if (FAILED(hr)) { WARN("Failed to get swapchain, returning %#x\n", hr); return hr; } hr = IWineD3DSwapChain_GetParent(wined3d_swapchain, (IUnknown **)swapchain); IUnknown_Release(wined3d_swapchain); if (FAILED(hr)) { WARN("Failed to get swapchain, returning %#x\n", hr); return hr; } /* FIXME? The swapchain is created with refcount 1 by the wined3d device, * but the wined3d device can't hold a real reference. */ IUnknown_Release(*swapchain); TRACE("Created IDXGISwapChain %p\n", *swapchain); return S_OK; }