DirectX11で地雷を踏みまくったので、自ら踏んだ地雷をここに貼っていきます。
ID3D11Buffer* m_pVertexBuffer;
ID3D11Buffer* m_pIndexBuffer;
//
D3D11_MAPPED_SUBRESOURCE msr = {};
HRESULT hr;
// vertices upload
hr = m_context->Map(m_pVertexBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &msr);
if (FAILED(hr))
return;
memcpy_s(msr.pData, sizeof(vtx_buf), vtx_buf, msr.RowPitch); // 頂点コピー msr.RowPitchで全体を書き換えないとまれに落ちる
m_context->Unmap(m_pVertexBuffer, 0);
// indices upload
D3D11_MAPPED_SUBRESOURCE ires = {};
hr = m_context->Map(m_pIndexBuffer 0, D3D11_MAP_WRITE_DISCARD, 0, &ires);
if (FAILED(hr))
return;
void* idxbuf = ires.pData;
if (idxbuf) {
// memcpy(idxbuf, idc_buf, sizeof(uint32_t) * m_idc_cnt); // 書き換えたインデックス数のコピーだとまれに落ちる
memcpy_s(idxbuf, sizeof(idc_buf), idc_buf, ires.RowPitch); // msr.RowPitchで全体を書き換えないと落ちる
m_context->Unmap(m_pIndexBuffer, 0);
}
VertexBufferとかIndexBufferをメインメモリからGPUメモリに転送するとき、何故かmemcpy関数の中で落ちるという、不可解な現象が起きました。 最初は書き換えたサイズだけ転送していたのですが、どうやらそれが原因だったみたい。
// indices upload
D3D11_MAPPED_SUBRESOURCE ires = {};
hr = m_context->Map(m_pIndexBuffer 0, D3D11_MAP_WRITE_DISCARD, 0, &ires);
if (FAILED(hr))
return;
void* idxbuf = ires.pData;
if (idxbuf) {
// memcpy(idxbuf, idc_buf, sizeof(uint32_t) * m_idc_cnt); // 書き換えたインデックス数のコピーだとまれに落ちる
memcpy_s(idxbuf, sizeof(idc_buf), idc_buf, ires.RowPitch); // msr.RowPitchで全体を書き換えないと落ちる
m_context->Unmap(m_pIndexBuffer, 0);
}
MapしたときのRowPitchのサイズでmemcpyしないと、何故かたまに落ちます。 理由はわかりませんが、これで動いているのでまぁよしとしましょう。