Отображение динамической текстуры, вызывающее «Alpped Mapped Error» - PullRequest
5 голосов
/ 17 июля 2011

Я только начинаю использовать 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, - это создаю окно.

1 Ответ

2 голосов
/ 18 июля 2011

Забавно, что когда вы начинаете задавать вопросы о чем-то, на чем вы застряли, становится легче найти проблему, ха-ха.Это был мой макрос HR, которым я окружал вызов карты.

#define HR(x)                                                   
{                                                               
    HRESULT hr = (x);                                           
    if(FAILED(x))                                               
    {                                                           
        DXTrace(__FILE__, (DWORD)__LINE__, hr, L#x, true);  
    }                                                       
}   

Я понятия не имею, почему это является причиной проблемы, но я определенно хотел бы знать, как этот макрос будет иметь проблемыКарта вызова.

...