yum-mirror/slang

Making it easier to work with shaders

git clone https://git.yummers.dev/yum-mirror/slang

Ellie Hermaszewskaformatf65d756bf

master
2.9 KiB105 linesraw
1// vk-texture.cpp
2#include "vk-texture.h"
3
4namespace gfx
5{
6
7using namespace Slang;
8
9namespace vk
10{
11
12TextureResourceImpl::TextureResourceImpl(const Desc& desc, DeviceImpl* device)
13    : Parent(desc), m_device(device)
14{
15}
16
17TextureResourceImpl::~TextureResourceImpl()
18{
19    auto& vkAPI = m_device->m_api;
20    if (!m_isWeakImageReference)
21    {
22        vkAPI.vkFreeMemory(vkAPI.m_device, m_imageMemory, nullptr);
23        vkAPI.vkDestroyImage(vkAPI.m_device, m_image, nullptr);
24    }
25    if (sharedHandle.handleValue != 0)
26    {
27#if SLANG_WINDOWS_FAMILY
28        CloseHandle((HANDLE)sharedHandle.handleValue);
29#endif
30    }
31}
32
33Result TextureResourceImpl::getNativeResourceHandle(InteropHandle* outHandle)
34{
35    outHandle->handleValue = (uint64_t)m_image;
36    outHandle->api = InteropHandleAPI::Vulkan;
37    return SLANG_OK;
38}
39
40Result TextureResourceImpl::getSharedHandle(InteropHandle* outHandle)
41{
42    // Check if a shared handle already exists for this resource.
43    if (sharedHandle.handleValue != 0)
44    {
45        *outHandle = sharedHandle;
46        return SLANG_OK;
47    }
48
49    // If a shared handle doesn't exist, create one and store it.
50#if SLANG_WINDOWS_FAMILY
51    VkMemoryGetWin32HandleInfoKHR info = {};
52    info.sType = VK_STRUCTURE_TYPE_MEMORY_GET_WIN32_HANDLE_INFO_KHR;
53    info.pNext = nullptr;
54    info.memory = m_imageMemory;
55    info.handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT;
56
57    auto& api = m_device->m_api;
58    PFN_vkGetMemoryWin32HandleKHR vkCreateSharedHandle;
59    vkCreateSharedHandle = api.vkGetMemoryWin32HandleKHR;
60    if (!vkCreateSharedHandle)
61    {
62        return SLANG_FAIL;
63    }
64    SLANG_RETURN_ON_FAIL(
65        vkCreateSharedHandle(m_device->m_device, &info, (HANDLE*)&outHandle->handleValue) !=
66        VK_SUCCESS);
67#else
68    VkMemoryGetFdInfoKHR info = {};
69    info.sType = VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR;
70    info.pNext = nullptr;
71    info.memory = m_imageMemory;
72    info.handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT;
73
74    auto& api = m_device->m_api;
75    PFN_vkGetMemoryFdKHR vkCreateSharedHandle;
76    vkCreateSharedHandle = api.vkGetMemoryFdKHR;
77    if (!vkCreateSharedHandle)
78    {
79        return SLANG_FAIL;
80    }
81    SLANG_RETURN_ON_FAIL(
82        vkCreateSharedHandle(m_device->m_device, &info, (int*)&outHandle->handleValue) !=
83        VK_SUCCESS);
84#endif
85    outHandle->api = InteropHandleAPI::Vulkan;
86    return SLANG_OK;
87}
88Result TextureResourceImpl::setDebugName(const char* name)
89{
90    Parent::setDebugName(name);
91    auto& api = m_device->m_api;
92    if (api.vkDebugMarkerSetObjectNameEXT)
93    {
94        VkDebugMarkerObjectNameInfoEXT nameDesc = {};
95        nameDesc.sType = VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_NAME_INFO_EXT;
96        nameDesc.object = (uint64_t)m_image;
97        nameDesc.objectType = VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT;
98        nameDesc.pObjectName = name;
99        api.vkDebugMarkerSetObjectNameEXT(api.m_device, &nameDesc);
100    }
101    return SLANG_OK;
102}
103
104} // namespace vk
105} // namespace gfx