Я только начинаю использовать Direct3D11 и пытаюсь создать динамическую текстуру, которую планирую обновлять новыми данными несколько раз в секунду. Моя проблема в том, что каждый раз, когда я обновляю текстуру новыми данными, я получаю эту ошибку от отладчика D3D:
D3D11: ОШИБКА: ID3D11DeviceContext :: Map: Этот ресурс уже сопоставлен!
[RESOURCE_MANIPULATION ERROR # 2097213: RESOURCE_MAP_ALREADYMAPPED]
Что в конечном итоге превращается в ошибку E_OUTOFMEMORY из вызова Map после некоторого запуска приложения.
Я создаю свою текстуру так:
D3D11_TEXTURE2D_DESC td;
td.ArraySize = 1;
td.BindFlags = D3D11_BIND_SHADER_RESOURCE;
td.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
td.Format = DXGI_FORMAT_B8G8R8X8_UNORM;
td.Height = height;
td.Width = width;
td.MipLevels = 1;
td.MiscFlags = 0;
td.SampleDesc.Count = 1;
td.SampleDesc.Quality = 0;
td.Usage = D3D11_USAGE_DYNAMIC;
HR(m_device->CreateTexture2D(&td, 0, &texture));
и обновлять свои данные так:
HR(m_deviceContext->Map(texture, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource));
BYTE* mappedData = reinterpret_cast<BYTE*>(mappedResource.pData);
for(UINT i = 0; i < height; ++i)
{
memcpy(mappedData, buffer,rowspan);
mappedData += mappedResource.RowPitch;
buffer += rowspan;
}
m_deviceContext->Unmap(texture, 0);
Перед тем, как создать текстуру и отобразить на ней данные, все, что я сделал в своей программе, - это инициализация устройств Direct3D. Я полностью озадачен тем, что я делаю неправильно. Я пытался прочитать на msdn как можно больше об этом, но ничто не помогло мне понять, что происходит не так. Согласно MSDN, я принимаю надлежащие меры:
http://msdn.microsoft.com/en-us/library/ff476905(v=vs.85).aspx#Dynamic
To fill a dynamic texture (one created with D3D11_USAGE_DYNAMIC):
Get a pointer to the texture memory by passing in D3D11_MAP_WRITE_DISCARD when calling
ID3D11DeviceContext::Map.
Write data to the memory.
Call ID3D11DeviceContext::Unmap when you are finished writing data.
Я вполне уверен, что правильно заполнил описание текстуры.
Может ли проблема быть связана с моей инициализацией моих d3d-устройств? Я неправильно использую функцию карты? Разве я не предоставил достаточно справочной информации? Есть идеи о том, что происходит?
Дополнительная информация: я получаю ту же ошибку "ресурс уже сопоставлен", когда пытаюсь отобразить данные в постоянный буфер для моего вершинного шейдера. Кроме того, я протестировал его на другом компьютере и получил те же проблемы с отображением.
Обновление:
Я скачал некоторый учебный код для D3D11, взял код создания и отображения текстур и добавил его сразу после того, как учебный код завершил инициализацию d3d. Я просто хотел посмотреть, получу ли я ошибку отображения. Как и ожидалось, я не получил ошибку «ресурс уже сопоставлен». Кроме того, когда я копирую код инициализации d3d из учебного пособия и заменяю его на свой, я все равно получаю ошибку уже сопоставленного ресурса, что еще больше смущает меня, поскольку все, что я делаю до инициализации d3d, - это создаю окно.