mirror of
https://git.suyu.dev/suyu/Yucom.git
synced 2026-01-05 22:18:03 +01:00
parent
e3798c1adb
commit
a3711d4747
4 changed files with 492 additions and 63 deletions
|
|
@ -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 =
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue