Compare commits

...

3 commits

Author SHA1 Message Date
Philip Rebohle
ad5162d03e vrclient: Add DXVK support for D3D11 submissions 2018-05-03 03:28:48 +02:00
Philip Rebohle
ed1b2364c9 vrclient: Add DXVK interop header 2018-05-03 03:20:41 +02:00
Pierre-Loup A. Griffais
be42f80ad2
Update LICENSE.proton 2018-04-30 12:55:48 -07:00
4 changed files with 457 additions and 49 deletions

View file

@ -1 +1,27 @@
TODO - Valve to provide a license for Proton itself. Similar to openvr license?
Copyright (c) 2018, Valve Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation and/or
other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its contributors
may be used to endorse or promote products derived from this software without
specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

283
vrclient_x64/dxvk-interop.h Normal file
View file

@ -0,0 +1,283 @@
/*** Autogenerated by WIDL 3.5 from /home/yorha-2b/Valve/Proton/wine/include/wine/dxvk-interop.idl - Do not edit ***/
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif
#include <rpc.h>
#include <rpcndr.h>
#ifndef COM_NO_WINDOWS_H
#include <windows.h>
#include <ole2.h>
#endif
#ifndef __dxvk_interop_h__
#define __dxvk_interop_h__
/* Forward declarations */
#ifndef __IDXGIVkInteropSurface_FWD_DEFINED__
#define __IDXGIVkInteropSurface_FWD_DEFINED__
typedef interface IDXGIVkInteropSurface IDXGIVkInteropSurface;
#ifdef __cplusplus
interface IDXGIVkInteropSurface;
#endif /* __cplusplus */
#endif
#ifndef __IDXGIVkInteropDevice_FWD_DEFINED__
#define __IDXGIVkInteropDevice_FWD_DEFINED__
typedef interface IDXGIVkInteropDevice IDXGIVkInteropDevice;
#ifdef __cplusplus
interface IDXGIVkInteropDevice;
#endif /* __cplusplus */
#endif
/* Headers for imported files */
#include <d3d11.h>
#include <vulkan/vulkan.h>
#ifdef __cplusplus
extern "C" {
#endif
/*****************************************************************************
* IDXGIVkInteropSurface interface
*/
#ifndef __IDXGIVkInteropSurface_INTERFACE_DEFINED__
#define __IDXGIVkInteropSurface_INTERFACE_DEFINED__
DEFINE_GUID(IID_IDXGIVkInteropSurface, 0x5546cf8c, 0x77e7, 0x4341, 0xb0,0x5d, 0x8d,0x4d,0x50,0x00,0xe7,0x7d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("5546cf8c-77e7-4341-b05d-8d4d5000e77d")
IDXGIVkInteropSurface : public IUnknown
{
virtual HRESULT STDMETHODCALLTYPE GetDevice(
IDXGIVkInteropDevice** ppDevice) = 0;
virtual HRESULT STDMETHODCALLTYPE GetVulkanImageInfo(
VkImage *pHandle,
VkImageLayout *pLayout,
VkImageCreateInfo *pInfo) = 0;
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDXGIVkInteropSurface, 0x5546cf8c, 0x77e7, 0x4341, 0xb0,0x5d, 0x8d,0x4d,0x50,0x00,0xe7,0x7d)
#endif
#else
typedef struct IDXGIVkInteropSurfaceVtbl {
BEGIN_INTERFACE
/*** IUnknown methods ***/
HRESULT (STDMETHODCALLTYPE *QueryInterface)(
IDXGIVkInteropSurface *This,
REFIID riid,
void **ppvObject);
ULONG (STDMETHODCALLTYPE *AddRef)(
IDXGIVkInteropSurface *This);
ULONG (STDMETHODCALLTYPE *Release)(
IDXGIVkInteropSurface *This);
/*** IDXGIVkInteropSurface methods ***/
HRESULT (STDMETHODCALLTYPE *GetDevice)(
IDXGIVkInteropSurface *This,
IDXGIVkInteropDevice **ppDevice);
HRESULT (STDMETHODCALLTYPE *GetVulkanImageInfo)(
IDXGIVkInteropSurface *This,
VkImage *pHandle,
VkImageLayout *pLayout,
VkImageCreateInfo *pInfo);
END_INTERFACE
} IDXGIVkInteropSurfaceVtbl;
interface IDXGIVkInteropSurface {
CONST_VTBL IDXGIVkInteropSurfaceVtbl* lpVtbl;
};
#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDXGIVkInteropSurface_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDXGIVkInteropSurface_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDXGIVkInteropSurface_Release(This) (This)->lpVtbl->Release(This)
/*** IDXGIVkInteropSurface methods ***/
#define IDXGIVkInteropSurface_GetVulkanImageInfo(This,pHandle,pLayout,pInfo) (This)->lpVtbl->GetVulkanImageInfo(This,pHandle,pLayout,pInfo)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDXGIVkInteropSurface_QueryInterface(IDXGIVkInteropSurface* This,REFIID riid,void **ppvObject) {
return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDXGIVkInteropSurface_AddRef(IDXGIVkInteropSurface* This) {
return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDXGIVkInteropSurface_Release(IDXGIVkInteropSurface* This) {
return This->lpVtbl->Release(This);
}
/*** IDXGIVkInteropSurface methods ***/
static FORCEINLINE HRESULT IDXGIVkInteropSurface_GetVulkanImageInfo(IDXGIVkInteropSurface* This,VkImage *pHandle,VkImageLayout *pLayout,VkImageCreateInfo *pInfo) {
return This->lpVtbl->GetVulkanImageInfo(This,pHandle,pLayout,pInfo);
}
#endif
#endif
#endif
#endif /* __IDXGIVkInteropSurface_INTERFACE_DEFINED__ */
/*****************************************************************************
* IDXGIVkInteropDevice interface
*/
#ifndef __IDXGIVkInteropDevice_INTERFACE_DEFINED__
#define __IDXGIVkInteropDevice_INTERFACE_DEFINED__
DEFINE_GUID(IID_IDXGIVkInteropDevice, 0xe2ef5fa5, 0xdc21, 0x4af7, 0x90,0xc4, 0xf6,0x7e,0xf6,0xa0,0x93,0x23);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("e2ef5fa5-dc21-4af7-90c4-f67ef6a09323")
IDXGIVkInteropDevice : public IUnknown
{
virtual void STDMETHODCALLTYPE GetVulkanHandles(
VkInstance *pInstance,
VkPhysicalDevice *pPhysDev,
VkDevice *pDevice) = 0;
virtual void STDMETHODCALLTYPE GetSubmissionQueue(
VkQueue *pQueue,
uint32_t *pQueueFamilyIndex) = 0;
virtual void STDMETHODCALLTYPE TransitionSurfaceLayout(
IDXGIVkInteropSurface *pSurface,
const VkImageSubresourceRange *pSubresources,
VkImageLayout OldLayout,
VkImageLayout NewLayout) = 0;
virtual void STDMETHODCALLTYPE FlushRenderingCommands(
) = 0;
virtual void STDMETHODCALLTYPE LockSubmissionQueue(
) = 0;
virtual void STDMETHODCALLTYPE ReleaseSubmissionQueue(
) = 0;
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDXGIVkInteropDevice, 0xe2ef5fa5, 0xdc21, 0x4af7, 0x90,0xc4, 0xf6,0x7e,0xf6,0xa0,0x93,0x23)
#endif
#else
typedef struct IDXGIVkInteropDeviceVtbl {
BEGIN_INTERFACE
/*** IUnknown methods ***/
HRESULT (STDMETHODCALLTYPE *QueryInterface)(
IDXGIVkInteropDevice *This,
REFIID riid,
void **ppvObject);
ULONG (STDMETHODCALLTYPE *AddRef)(
IDXGIVkInteropDevice *This);
ULONG (STDMETHODCALLTYPE *Release)(
IDXGIVkInteropDevice *This);
/*** IDXGIVkInteropDevice methods ***/
void (STDMETHODCALLTYPE *GetVulkanHandles)(
IDXGIVkInteropDevice *This,
VkInstance *pInstance,
VkPhysicalDevice *pPhysDev,
VkDevice *pDevice);
void (STDMETHODCALLTYPE *GetSubmissionQueue)(
IDXGIVkInteropDevice *This,
VkQueue *pQueue,
uint32_t *pQueueFamilyIndex);
void (STDMETHODCALLTYPE *TransitionSurfaceLayout)(
IDXGIVkInteropDevice *This,
IDXGIVkInteropSurface *pSurface,
const VkImageSubresourceRange *pSubresources,
VkImageLayout OldLayout,
VkImageLayout NewLayout);
void (STDMETHODCALLTYPE *FlushRenderingCommands)(
IDXGIVkInteropDevice *This);
void (STDMETHODCALLTYPE *LockSubmissionQueue)(
IDXGIVkInteropDevice *This);
void (STDMETHODCALLTYPE *ReleaseSubmissionQueue)(
IDXGIVkInteropDevice *This);
END_INTERFACE
} IDXGIVkInteropDeviceVtbl;
interface IDXGIVkInteropDevice {
CONST_VTBL IDXGIVkInteropDeviceVtbl* lpVtbl;
};
#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDXGIVkInteropDevice_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDXGIVkInteropDevice_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDXGIVkInteropDevice_Release(This) (This)->lpVtbl->Release(This)
/*** IDXGIVkInteropDevice methods ***/
#define IDXGIVkInteropDevice_GetVulkanHandles(This,pInstance,pPhysDev,pDevice) (This)->lpVtbl->GetVulkanHandles(This,pInstance,pPhysDev,pDevice)
#define IDXGIVkInteropDevice_GetSubmissionQueue(This,pQueue,pQueueFamilyIndex) (This)->lpVtbl->GetSubmissionQueue(This,pQueue,pQueueFamilyIndex)
#define IDXGIVkInteropDevice_TransitionSurfaceLayout(This,pSurface,pSubresources,OldLayout,NewLayout) (This)->lpVtbl->TransitionSurfaceLayout(This,pSurface,pSubresources,OldLayout,NewLayout)
#define IDXGIVkInteropDevice_FlushRenderingCommands(This) (This)->lpVtbl->FlushRenderingCommands(This)
#define IDXGIVkInteropDevice_LockSubmissionQueue(This) (This)->lpVtbl->LockSubmissionQueue(This)
#define IDXGIVkInteropDevice_ReleaseSubmissionQueue(This) (This)->lpVtbl->ReleaseSubmissionQueue(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDXGIVkInteropDevice_QueryInterface(IDXGIVkInteropDevice* This,REFIID riid,void **ppvObject) {
return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDXGIVkInteropDevice_AddRef(IDXGIVkInteropDevice* This) {
return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDXGIVkInteropDevice_Release(IDXGIVkInteropDevice* This) {
return This->lpVtbl->Release(This);
}
/*** IDXGIVkInteropDevice methods ***/
static FORCEINLINE void IDXGIVkInteropDevice_GetVulkanHandles(IDXGIVkInteropDevice* This,VkInstance *pInstance,VkPhysicalDevice *pPhysDev,VkDevice *pDevice) {
This->lpVtbl->GetVulkanHandles(This,pInstance,pPhysDev,pDevice);
}
static FORCEINLINE void IDXGIVkInteropDevice_GetSubmissionQueue(IDXGIVkInteropDevice* This,VkQueue *pQueue,uint32_t *pQueueFamilyIndex) {
This->lpVtbl->GetSubmissionQueue(This,pQueue,pQueueFamilyIndex);
}
static FORCEINLINE void IDXGIVkInteropDevice_TransitionSurfaceLayout(IDXGIVkInteropDevice* This,IDXGIVkInteropSurface *pSurface,const VkImageSubresourceRange *pSubresources,VkImageLayout OldLayout,VkImageLayout NewLayout) {
This->lpVtbl->TransitionSurfaceLayout(This,pSurface,pSubresources,OldLayout,NewLayout);
}
static FORCEINLINE void IDXGIVkInteropDevice_FlushRenderingCommands(IDXGIVkInteropDevice* This) {
This->lpVtbl->FlushRenderingCommands(This);
}
static FORCEINLINE void IDXGIVkInteropDevice_LockSubmissionQueue(IDXGIVkInteropDevice* This) {
This->lpVtbl->LockSubmissionQueue(This);
}
static FORCEINLINE void IDXGIVkInteropDevice_ReleaseSubmissionQueue(IDXGIVkInteropDevice* This) {
This->lpVtbl->ReleaseSubmissionQueue(This);
}
#endif
#endif
#endif
#endif /* __IDXGIVkInteropDevice_INTERFACE_DEFINED__ */
/* Begin additional prototypes for all interfaces */
/* End additional prototypes */
#ifdef __cplusplus
}
#endif
#endif /* __dxvk_interop_h__ */

View file

@ -15,6 +15,7 @@
#include "vrclient_private.h"
#include "initguid.h"
#include "dxvk-interop.h"
#include "wined3d-interop.h"
#include "cppIVRCompositor_IVRCompositor_021.h"
@ -447,11 +448,15 @@ EVRCompositorError ivrcompositor_submit(
ID3D11Device *device;
HRESULT hr;
IDXGIVkInteropSurface *dxvk_surface;
IDXGIVkInteropDevice *dxvk_device;
TRACE("%p, %#x, %p, %p, %#x\n", linux_side, eye, texture, bounds, flags);
switch (texture->eType)
{
case TextureType_DirectX:
{
TRACE("D3D11\n");
if (flags & (Submit_TextureWithPose | Submit_TextureWithDepth))
@ -463,63 +468,143 @@ EVRCompositorError ivrcompositor_submit(
texture_iface = texture->handle;
hr = texture_iface->lpVtbl->QueryInterface(texture_iface,
&IID_IWineD3D11Texture2D, (void **)&wine_texture);
if (FAILED(hr))
{
ERR("Invalid D3D11 texture %p.\n", texture);
return cpp_func(linux_side, eye, texture, bounds, flags);
}
if (SUCCEEDED(hr)) {
wine_texture->lpVtbl->GetDevice(wine_texture, &device);
if (user_data->d3d11_device != device)
{
if (user_data->d3d11_device)
FIXME("Previous submit was from different D3D11 device.\n");
user_data->d3d11_device = device;
if (SUCCEEDED(hr = device->lpVtbl->QueryInterface(device,
&IID_IWineD3D11Device, (void **)&wined3d_device)))
wine_texture->lpVtbl->GetDevice(wine_texture, &device);
if (user_data->d3d11_device != device)
{
user_data->wined3d_device = wined3d_device;
wined3d_device->lpVtbl->Release(wined3d_device);
}
else
{
ERR("Failed to get device, hr %#x.\n", hr);
user_data->wined3d_device = NULL;
}
if (user_data->d3d11_device)
FIXME("Previous submit was from different D3D11 device.\n");
TRACE("Enabling explicit timing mode.\n");
switch (version)
{
case 21:
cppIVRCompositor_IVRCompositor_021_SetExplicitTimingMode(linux_side,
VRCompositorTimingMode_Explicit_ApplicationPerformsPostPresentHandoff);
break;
case 22:
cppIVRCompositor_IVRCompositor_022_SetExplicitTimingMode(linux_side,
VRCompositorTimingMode_Explicit_ApplicationPerformsPostPresentHandoff);
break;
default:
FIXME("Version %u not supported.\n", version);
user_data->d3d11_device = device;
if (SUCCEEDED(hr = device->lpVtbl->QueryInterface(device,
&IID_IWineD3D11Device, (void **)&wined3d_device)))
{
user_data->wined3d_device = wined3d_device;
wined3d_device->lpVtbl->Release(wined3d_device);
}
else
{
ERR("Failed to get device, hr %#x.\n", hr);
user_data->wined3d_device = NULL;
break;
}
TRACE("Enabling explicit timing mode.\n");
switch (version)
{
case 21:
cppIVRCompositor_IVRCompositor_021_SetExplicitTimingMode(linux_side,
VRCompositorTimingMode_Explicit_ApplicationPerformsPostPresentHandoff);
break;
case 22:
cppIVRCompositor_IVRCompositor_022_SetExplicitTimingMode(linux_side,
VRCompositorTimingMode_Explicit_ApplicationPerformsPostPresentHandoff);
break;
default:
FIXME("Version %u not supported.\n", version);
user_data->wined3d_device = NULL;
break;
}
}
device->lpVtbl->Release(device);
submit_data.linux_side = linux_side;
submit_data.submit = cpp_func;
submit_data.eye = eye;
submit_data.texture = *texture;
submit_data.bounds = *bounds;
submit_data.flags = flags;
wine_texture->lpVtbl->access_gl_texture(wine_texture,
d3d11_texture_callback, &submit_data, sizeof(submit_data));
wine_texture->lpVtbl->Release(wine_texture);
return 0;
}
device->lpVtbl->Release(device);
submit_data.linux_side = linux_side;
submit_data.submit = cpp_func;
submit_data.eye = eye;
submit_data.texture = *texture;
submit_data.bounds = *bounds;
submit_data.flags = flags;
wine_texture->lpVtbl->access_gl_texture(wine_texture,
d3d11_texture_callback, &submit_data, sizeof(submit_data));
hr = texture_iface->lpVtbl->QueryInterface(texture_iface,
&IID_IDXGIVkInteropSurface, (void **)&dxvk_surface);
wine_texture->lpVtbl->Release(wine_texture);
if (SUCCEEDED(hr)) {
struct VRVulkanTextureData_t vkdata;
struct Texture_t vktexture;
VkImage image_handle;
VkImageLayout image_layout;
VkImageCreateInfo image_info;
VkImageSubresourceRange subresources;
EVRCompositorError err;
dxvk_surface->lpVtbl->GetDevice(
dxvk_surface, &dxvk_device);
user_data->dxvk_device = dxvk_device;
dxvk_device->lpVtbl->GetVulkanHandles(
dxvk_device,
&vkdata.m_pInstance,
&vkdata.m_pPhysicalDevice,
&vkdata.m_pDevice);
dxvk_device->lpVtbl->GetSubmissionQueue(
dxvk_device,
&vkdata.m_pQueue,
&vkdata.m_nQueueFamilyIndex);
// DXVK needs this to be initialized correctly
image_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
image_info.pNext = NULL;
dxvk_surface->lpVtbl->GetVulkanImageInfo(
dxvk_surface, &image_handle,
&image_layout, &image_info);
load_vk_unwrappers();
vkdata.m_nImage = (uint64_t)image_handle;
vkdata.m_pDevice = get_native_VkDevice(vkdata.m_pDevice);
vkdata.m_pPhysicalDevice = get_native_VkPhysicalDevice(vkdata.m_pPhysicalDevice);
vkdata.m_pInstance = get_native_VkInstance(vkdata.m_pInstance);
vkdata.m_pQueue = get_native_VkQueue(vkdata.m_pQueue);
vkdata.m_nWidth = image_info.extent.width;
vkdata.m_nHeight = image_info.extent.height;
vkdata.m_nFormat = image_info.format;
vkdata.m_nSampleCount = image_info.samples;
vktexture = *texture;
vktexture.handle = &vkdata;
vktexture.eType = TextureType_Vulkan;
subresources.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
subresources.baseMipLevel = 0;
subresources.levelCount = image_info.mipLevels;
subresources.baseArrayLayer = 0;
subresources.layerCount = image_info.arrayLayers;
dxvk_device->lpVtbl->TransitionSurfaceLayout(
dxvk_device, dxvk_surface, &subresources,
image_layout, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
dxvk_device->lpVtbl->FlushRenderingCommands(dxvk_device);
dxvk_device->lpVtbl->LockSubmissionQueue(dxvk_device);
err = cpp_func(linux_side, eye, &vktexture, bounds, flags);
dxvk_device->lpVtbl->ReleaseSubmissionQueue(dxvk_device);
dxvk_device->lpVtbl->TransitionSurfaceLayout(
dxvk_device, dxvk_surface, &subresources,
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, image_layout);
dxvk_device->lpVtbl->Release(dxvk_device);
dxvk_surface->lpVtbl->Release(dxvk_surface);
return err;
}
ERR("Invalid D3D11 texture %p.\n", texture);
return cpp_func(linux_side, eye, texture, bounds, flags);
}
return 0;
case TextureType_Vulkan:
{
@ -587,7 +672,13 @@ void ivrcompositor_post_present_handoff(void (*cpp_func)(void *),
return;
}
if (user_data->dxvk_device)
user_data->dxvk_device->lpVtbl->LockSubmissionQueue(user_data->dxvk_device);
cpp_func(linux_side);
if (user_data->dxvk_device)
user_data->dxvk_device->lpVtbl->ReleaseSubmissionQueue(user_data->dxvk_device);
}
struct explicit_timing_data
@ -631,8 +722,14 @@ EVRCompositorError ivrcompositor_wait_get_poses(
TRACE("%p, %p, %u, %p, %u\n", linux_side, render_poses, render_pose_count, game_poses, game_pose_count);
if (user_data->dxvk_device)
user_data->dxvk_device->lpVtbl->LockSubmissionQueue(user_data->dxvk_device);
r = cpp_func(linux_side, render_poses, render_pose_count, game_poses, game_pose_count);
if (user_data->dxvk_device)
user_data->dxvk_device->lpVtbl->ReleaseSubmissionQueue(user_data->dxvk_device);
if ((wined3d_device = user_data->wined3d_device))
{
TRACE("wined3d device %p\n", wined3d_device);

View file

@ -37,6 +37,7 @@ void *create_LinuxMatchmakingServerListResponse(void *win);
#ifndef __cplusplus
typedef struct ID3D11Device ID3D11Device;
typedef struct IWineD3D11Device IWineD3D11Device;
typedef struct IDXGIVkInteropDevice IDXGIVkInteropDevice;
struct generic_interface
{
@ -56,6 +57,7 @@ struct compositor_data
{
ID3D11Device *d3d11_device;
IWineD3D11Device *wined3d_device;
IDXGIVkInteropDevice *dxvk_device;
};
void destroy_compositor_data(struct compositor_data *data);