In D3D11_SUBRESOURCE_DATA
, we have a const void*
that is meant to be used for the initial data of a ID3D11Buffer
.
When we use Map
, we receive back a void*
. Can I safely use a cast to get an object representation of what I initially put into the D3D11_SUBRESOURCE_DATA
?
template <typename CBuff>
class ConstantBuffer {
ComPtr<ID3D11Buffer> buffer;
public:
ConstantBuffer() = default;
ConstantBuffer(ID3D11Device* device, CBuff& bufferData) {
D3D11_BUFFER_DESC desc = {};
desc.ByteWidth = sizeof(CBuff);
/* setting usage etc*/
D3D11_SUBRESOURCE_DATA data{}; // initial buffer data
data.SysMemPitch = sizeof(CBuff);
data.pSysMem = &bufferData; // use passed buffer data
Utils::throwIfFailed(device->CreateBuffer(&desc, &data, buffer.GetAddressOf()));
}
void updateData(CBuff& data,ID3D11DeviceContext* ctx) {
D3D11_MAPPED_SUBRESOURCE mappedResource;
HRESULT res = ctx->Map(buffer.Get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
if (SUCCEEDED(res)) {
CBuff* dataPtr = static_cast<CBuff*>(mappedResource.pData); // static_cast or any other cast here
//do something with dataPtr, like setting members
ctx->Unmap(buffer.Get(), 0);
}
}
};