vrclient_x64: Support submitting D3D12 textures.

CW-Bug-Id: #23542
This commit is contained in:
Yuxuan Shui 2024-04-15 11:00:19 +01:00 committed by Arkadiusz Hiler
parent e3798c1adb
commit a3711d4747
4 changed files with 492 additions and 63 deletions

View file

@ -13,6 +13,7 @@
#include "initguid.h"
#define COBJMACROS
#include "d3d11_4.h"
#include "vkd3d-proton-interop.h"
#include "dxvk-interop.h"
#include "vrclient_private.h"
@ -311,6 +312,7 @@ static void *ivrclientcore_get_generic_interface( void *object, const char *name
static void destroy_compositor_data(void)
{
TRACE("Destroying compositor data.\n");
free_compositor_data_d3d12_device();
memset(&compositor_data, 0, sizeof(compositor_data));
}
@ -367,6 +369,58 @@ w_Texture_t vrclient_translate_texture_dxvk( const w_Texture_t *texture, w_VRVul
return vktexture;
}
w_Texture_t vrclient_translate_texture_d3d12( const w_Texture_t *texture, w_VRVulkanTextureData_t *vkdata,
ID3D12DXVKInteropDevice *d3d12_device, ID3D12Resource *d3d12_resource,
ID3D12CommandQueue *d3d12_queue, VkImageLayout *image_layout,
VkImageCreateInfo *image_info )
{
w_Texture_t vktexture;
VkImage image_handle;
UINT64 buffer_offset;
D3D12_RESOURCE_DESC resource_desc;
VkFormat vk_format = VK_FORMAT_UNDEFINED;
TRACE("%p %p %p %p %p %p\n", texture, vkdata, d3d12_device, d3d12_resource, d3d12_queue, image_layout);
d3d12_resource->lpVtbl->GetDesc(d3d12_resource, &resource_desc);
switch (resource_desc.Format)
{
case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: vk_format = VK_FORMAT_R8G8B8A8_SRGB; break;
case DXGI_FORMAT_R8G8B8A8_UNORM: vk_format = VK_FORMAT_R8G8B8A8_UNORM; break;
default:
ERR("Unsupported DXGI format %#x.\n", resource_desc.Format);
return *texture;
}
if (resource_desc.Dimension != D3D12_RESOURCE_DIMENSION_TEXTURE2D)
{
ERR("Unsupported resource dimension %#x.\n", resource_desc.Dimension);
return *texture;
}
TRACE("DXGI format: %#x, width: %I64u, height: %u, mip levels: %u, array size: %u, sample count: %u, VkFormat %#x.\n",
resource_desc.Format, resource_desc.Width, resource_desc.Height, resource_desc.MipLevels,
resource_desc.DepthOrArraySize, resource_desc.SampleDesc.Count, vk_format);
d3d12_device->lpVtbl->GetVulkanHandles(d3d12_device, &vkdata->m_pInstance, &vkdata->m_pPhysicalDevice, &vkdata->m_pDevice);
d3d12_device->lpVtbl->GetVulkanQueueInfo(d3d12_device, d3d12_queue, &vkdata->m_pQueue, &vkdata->m_nQueueFamilyIndex);
d3d12_device->lpVtbl->GetVulkanImageLayout(d3d12_device, d3d12_resource, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE, image_layout);
d3d12_device->lpVtbl->GetVulkanResourceInfo(d3d12_device, d3d12_resource, (UINT64*)&image_handle, &buffer_offset);
/* For now, only these fields are used. */
image_info->mipLevels = resource_desc.MipLevels;
image_info->arrayLayers = resource_desc.DepthOrArraySize;
vkdata->m_nImage = (uint64_t)image_handle;
vkdata->m_nWidth = resource_desc.Width;
vkdata->m_nHeight = resource_desc.Height;
vkdata->m_nFormat = vk_format;
vkdata->m_nSampleCount = resource_desc.SampleDesc.Count;
vktexture = *texture;
vktexture.handle = vkdata;
vktexture.eType = TextureType_Vulkan;
return vktexture;
}
uint32_t __thiscall winIVRClientCore_IVRClientCore_002_Init( struct w_steam_iface *_this, uint32_t eApplicationType )
{
struct IVRClientCore_IVRClientCore_002_Init_params params =