summaryrefslogtreecommitdiffstats
path: root/Whisper/D3D/createBuffer.cpp
diff options
context:
space:
mode:
authorKonstantin <const@const.me>2023-01-16 14:52:43 +0100
committerKonstantin <const@const.me>2023-01-16 14:52:43 +0100
commit8c4603c73675958efc960fbd4bb599a2909d106a (patch)
tree714dc6fc9a1672d5fd7f89676b97e10959662abc /Whisper/D3D/createBuffer.cpp
parent990a8d0dbaefc996244097397259e92758b15cce (diff)
Source codes
Diffstat (limited to 'Whisper/D3D/createBuffer.cpp')
-rw-r--r--Whisper/D3D/createBuffer.cpp51
1 files changed, 51 insertions, 0 deletions
diff --git a/Whisper/D3D/createBuffer.cpp b/Whisper/D3D/createBuffer.cpp
new file mode 100644
index 0000000..3fbb13e
--- /dev/null
+++ b/Whisper/D3D/createBuffer.cpp
@@ -0,0 +1,51 @@
+#include "stdafx.h"
+#include "createBuffer.h"
+
+#define CHECK( hr ) { const HRESULT __hr = ( hr ); if( FAILED( __hr ) ) return __hr; }
+
+HRESULT DirectCompute::createBuffer( eBufferUse use, size_t totalBytes, ID3D11Buffer** ppGpuBuffer, const void* rsi, ID3D11Buffer** ppStagingBuffer )
+{
+ if( totalBytes > INT_MAX )
+ return DISP_E_OVERFLOW;
+ if( nullptr == ppGpuBuffer )
+ return E_POINTER;
+
+ CD3D11_BUFFER_DESC bufferDesc{ (UINT)totalBytes, D3D11_BIND_SHADER_RESOURCE };
+ switch( use )
+ {
+ case eBufferUse::Immutable:
+ if( nullptr == rsi )
+ return E_INVALIDARG;
+ bufferDesc.Usage = D3D11_USAGE_IMMUTABLE;
+ break;
+ case eBufferUse::ReadWrite:
+ case eBufferUse::ReadWriteDownload:
+ bufferDesc.BindFlags |= D3D11_BIND_UNORDERED_ACCESS;
+ break;
+ case eBufferUse::Dynamic:
+ bufferDesc.Usage = D3D11_USAGE_DYNAMIC;
+ bufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
+ break;
+ }
+
+ D3D11_SUBRESOURCE_DATA srd;
+ D3D11_SUBRESOURCE_DATA* pSrd = nullptr;
+ if( nullptr != rsi )
+ {
+ srd.pSysMem = rsi;
+ srd.SysMemPitch = srd.SysMemSlicePitch = 0;
+ pSrd = &srd;
+ }
+
+ CHECK( device()->CreateBuffer( &bufferDesc, pSrd, ppGpuBuffer ) );
+
+ if( nullptr != ppStagingBuffer && use == eBufferUse::ReadWriteDownload )
+ {
+ bufferDesc.Usage = D3D11_USAGE_STAGING;
+ bufferDesc.BindFlags = 0;
+ bufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
+ CHECK( device()->CreateBuffer( &bufferDesc, nullptr, ppStagingBuffer ) );
+ }
+
+ return S_OK;
+} \ No newline at end of file