summaryrefslogtreecommitdiffstats
path: root/Whisper/D3D/createBuffer.cpp
diff options
context:
space:
mode:
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