yum-mirror/slang

Making it easier to work with shaders

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

Ellie Hermaszewskaformatf65d756bf

master
2.4 KiB97 linesraw
1// d3d12-buffer.cpp
2#include "d3d12-buffer.h"
3
4namespace gfx
5{
6namespace d3d12
7{
8
9using namespace Slang;
10
11BufferResourceImpl::BufferResourceImpl(const Desc& desc)
12    : Parent(desc), m_defaultState(D3DUtil::getResourceState(desc.defaultState))
13{
14}
15
16BufferResourceImpl::~BufferResourceImpl()
17{
18    if (sharedHandle.handleValue != 0)
19    {
20        CloseHandle((HANDLE)sharedHandle.handleValue);
21    }
22}
23
24DeviceAddress BufferResourceImpl::getDeviceAddress()
25{
26    return (DeviceAddress)m_resource.getResource()->GetGPUVirtualAddress();
27}
28
29Result BufferResourceImpl::getNativeResourceHandle(InteropHandle* outHandle)
30{
31    outHandle->handleValue = (uint64_t)m_resource.getResource();
32    outHandle->api = InteropHandleAPI::D3D12;
33    return SLANG_OK;
34}
35
36Result BufferResourceImpl::getSharedHandle(InteropHandle* outHandle)
37{
38#if !SLANG_WINDOWS_FAMILY
39    return SLANG_E_NOT_IMPLEMENTED;
40#else
41    // Check if a shared handle already exists for this resource.
42    if (sharedHandle.handleValue != 0)
43    {
44        *outHandle = sharedHandle;
45        return SLANG_OK;
46    }
47
48    // If a shared handle doesn't exist, create one and store it.
49    ComPtr<ID3D12Device> pDevice;
50    auto pResource = m_resource.getResource();
51    pResource->GetDevice(IID_PPV_ARGS(pDevice.writeRef()));
52    SLANG_RETURN_ON_FAIL(pDevice->CreateSharedHandle(
53        pResource,
54        NULL,
55        GENERIC_ALL,
56        nullptr,
57        (HANDLE*)&outHandle->handleValue));
58    outHandle->api = InteropHandleAPI::D3D12;
59    sharedHandle = *outHandle;
60    return SLANG_OK;
61#endif
62}
63
64Result BufferResourceImpl::map(MemoryRange* rangeToRead, void** outPointer)
65{
66    D3D12_RANGE range = {};
67    if (rangeToRead)
68    {
69        range.Begin = (SIZE_T)rangeToRead->offset;
70        range.End = (SIZE_T)(rangeToRead->offset + rangeToRead->size);
71    }
72    SLANG_RETURN_ON_FAIL(
73        m_resource.getResource()->Map(0, rangeToRead ? &range : nullptr, outPointer));
74    return SLANG_OK;
75}
76
77Result BufferResourceImpl::unmap(MemoryRange* writtenRange)
78{
79    D3D12_RANGE range = {};
80    if (writtenRange)
81    {
82        range.Begin = (SIZE_T)writtenRange->offset;
83        range.End = (SIZE_T)(writtenRange->offset + writtenRange->size);
84    }
85    m_resource.getResource()->Unmap(0, writtenRange ? &range : nullptr);
86    return SLANG_OK;
87}
88
89Result BufferResourceImpl::setDebugName(const char* name)
90{
91    Parent::setDebugName(name);
92    m_resource.setDebugName(name);
93    return SLANG_OK;
94}
95
96} // namespace d3d12
97} // namespace gfx