Question

I'm new to direct3d and graphics programming in general, the program I'm writing changes vertices once per frame after applying non trivial computation per frame, according to this Direct3d programming tips

I should use dynamic buffers for such task, but it says that it's performance is expectable, searching the web I found Fastest way to update vertex buffer

Scroll down to Xoofx answer(Designer of Sharpdx) according to him updating a subresource is better than using dynamic buffers and as far as I know updating a subresource is used only with default buffers.

Which usage should I go with and what is (staging) ?

If I decide to use C++ AMP to do the computation (I understand that it uses the gpu as a processor) is there any way to set the buffer usage to default and still access it through the cpu using C++ AMP?

Was it helpful?

Solution

Your program can create a C++ AMP array associated with an existing Direct3D buffer using the make_array() function.

template<typename T, int N>
array<T,N> make_array(const extent& ext, IUnknown* buffer);

The Direct3D buffer must implement the ID3D11Buffer interface. It must support raw views (D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS) and allow SHADER_RESOURCE and UNORDERED_ACCESS binding. The buffer itself must be of the correct size, the size of the extent multiplied by the size of the buffer type.

The get_buffer() function supports the reverse operation, getting a Direct3D buffer interface from an array. As when getting a device, the returned IUnknown must be queried for the desired interface.

HRESULT hr = S_OK;
array<int, 1> arr(1024);
CComPtr<ID3D11Buffer> buffer;
IUnknown* unkBuf = get_buffer(arr);
hr = unkBuf->QueryInterface(__uuidof(ID3D11Buffer), reinterpret_cast<LPVOID*>(&buffer));
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top