summaryrefslogtreecommitdiffstats
path: root/tools/gfx/d3d12/d3d12-texture.cpp
blob: fdd9aab1b1971cbb9ec53dd5bfff73cbf3910d3f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
// d3d12-texture.cpp
#include "d3d12-texture.h"

namespace gfx
{
namespace d3d12
{

using namespace Slang;

TextureResourceImpl::TextureResourceImpl(const Desc& desc)
    : Parent(desc), m_defaultState(D3DUtil::getResourceState(desc.defaultState))
{
}

TextureResourceImpl::~TextureResourceImpl()
{
    if (sharedHandle.handleValue != 0)
    {
        CloseHandle((HANDLE)sharedHandle.handleValue);
    }
}

Result TextureResourceImpl::getNativeResourceHandle(InteropHandle* outHandle)
{
    outHandle->handleValue = (uint64_t)m_resource.getResource();
    outHandle->api = InteropHandleAPI::D3D12;
    return SLANG_OK;
}

Result TextureResourceImpl::getSharedHandle(InteropHandle* outHandle)
{
#if !SLANG_WINDOWS_FAMILY
    return SLANG_E_NOT_IMPLEMENTED;
#else
    // Check if a shared handle already exists for this resource.
    if (sharedHandle.handleValue != 0)
    {
        *outHandle = sharedHandle;
        return SLANG_OK;
    }

    // If a shared handle doesn't exist, create one and store it.
    ComPtr<ID3D12Device> pDevice;
    auto pResource = m_resource.getResource();
    pResource->GetDevice(IID_PPV_ARGS(pDevice.writeRef()));
    SLANG_RETURN_ON_FAIL(pDevice->CreateSharedHandle(
        pResource,
        NULL,
        GENERIC_ALL,
        nullptr,
        (HANDLE*)&outHandle->handleValue));
    outHandle->api = InteropHandleAPI::D3D12;
    return SLANG_OK;
#endif
}

Result TextureResourceImpl::setDebugName(const char* name)
{
    Parent::setDebugName(name);
    m_resource.setDebugName(name);
    return SLANG_OK;
}

} // namespace d3d12
} // namespace gfx