summaryrefslogtreecommitdiff
path: root/tools/gfx/d3d12/d3d12-buffer.cpp
blob: ee078bb3dd6dcfb7852aef81397fb53620b9cb32 (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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
// d3d12-buffer.cpp
#include "d3d12-buffer.h"

namespace gfx
{
namespace d3d12
{

using namespace Slang;

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

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

DeviceAddress BufferResourceImpl::getDeviceAddress()
{
    return (DeviceAddress)m_resource.getResource()->GetGPUVirtualAddress();
}

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

Result BufferResourceImpl::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;
    sharedHandle = *outHandle;
    return SLANG_OK;
#endif
}

Result BufferResourceImpl::map(MemoryRange* rangeToRead, void** outPointer)
{
    D3D12_RANGE range = {};
    if (rangeToRead)
    {
        range.Begin = (SIZE_T)rangeToRead->offset;
        range.End = (SIZE_T)(rangeToRead->offset + rangeToRead->size);
    }
    SLANG_RETURN_ON_FAIL(
        m_resource.getResource()->Map(0, rangeToRead ? &range : nullptr, outPointer));
    return SLANG_OK;
}

Result BufferResourceImpl::unmap(MemoryRange* writtenRange)
{
    D3D12_RANGE range = {};
    if (writtenRange)
    {
        range.Begin = (SIZE_T)writtenRange->offset;
        range.End = (SIZE_T)(writtenRange->offset + writtenRange->size);
    }
    m_resource.getResource()->Unmap(0, writtenRange ? &range : nullptr);
    return SLANG_OK;
}

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

} // namespace d3d12
} // namespace gfx