yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
f65d756bf
master
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{ 18if (sharedHandle .handleValue != 0 ) 19 { 20CloseHandle ((HANDLE )sharedHandle .handleValue ); 21 } 22} 23 24DeviceAddress BufferResourceImpl ::getDeviceAddress () 25{ 26return (DeviceAddress )m_resource .getResource ()-> GetGPUVirtualAddress (); 27} 28 29Result BufferResourceImpl ::getNativeResourceHandle (InteropHandle * outHandle ) 30{ 31outHandle -> handleValue = (uint64_t )m_resource .getResource (); 32outHandle -> api = InteropHandleAPI ::D3D12 ; 33return SLANG_OK ; 34} 35 36Result BufferResourceImpl ::getSharedHandle (InteropHandle * outHandle ) 37{ 38#if !SLANG_WINDOWS_FAMILY 39return SLANG_E_NOT_IMPLEMENTED ; 40#else 41// Check if a shared handle already exists for this resource. 42if (sharedHandle .handleValue != 0 ) 43 { 44* outHandle = sharedHandle ; 45return SLANG_OK ; 46 } 47 48// If a shared handle doesn't exist, create one and store it. 49ComPtr < ID3D12Device > pDevice ; 50auto pResource = m_resource .getResource (); 51pResource -> GetDevice (IID_PPV_ARGS (pDevice .writeRef ())); 52SLANG_RETURN_ON_FAIL (pDevice -> CreateSharedHandle ( 53pResource , 54NULL , 55GENERIC_ALL , 56nullptr , 57 (HANDLE * )& outHandle -> handleValue )); 58outHandle -> api = InteropHandleAPI ::D3D12 ; 59sharedHandle = * outHandle ; 60return SLANG_OK ; 61#endif 62} 63 64Result BufferResourceImpl ::map (MemoryRange * rangeToRead ,void ** outPointer ) 65{ 66D3D12_RANGE range = {}; 67if (rangeToRead ) 68 { 69range .Begin = (SIZE_T )rangeToRead -> offset ; 70range .End = (SIZE_T )(rangeToRead -> offset + rangeToRead -> size ); 71 } 72SLANG_RETURN_ON_FAIL ( 73m_resource .getResource ()-> Map (0 ,rangeToRead ?& range :nullptr ,outPointer )); 74return SLANG_OK ; 75} 76 77Result BufferResourceImpl ::unmap (MemoryRange * writtenRange ) 78{ 79D3D12_RANGE range = {}; 80if (writtenRange ) 81 { 82range .Begin = (SIZE_T )writtenRange -> offset ; 83range .End = (SIZE_T )(writtenRange -> offset + writtenRange -> size ); 84 } 85m_resource .getResource ()-> Unmap (0 ,writtenRange ?& range :nullptr ); 86return SLANG_OK ; 87} 88 89Result BufferResourceImpl ::setDebugName (const char * name ) 90{ 91Parent ::setDebugName (name ); 92m_resource .setDebugName (name ); 93return SLANG_OK ; 94} 95 96}// namespace d3d12 97}// namespace gfx