2011-07-16 21 views
5

Estoy comenzando a usar Direct3D11 y estoy tratando de crear una textura dinámica que planeo actualizar con nuevos datos varias veces por segundo. Mi problema es que cada vez que actualizo la textura con los datos nuevos, obtengo este error del D3D Debugger:Asignación de una textura dinámica que causa "Error ya asignado"

D3D11: ERROR: ID3D11DeviceContext :: Map: ¡Este recurso ya está mapeado! [RESOURCE_MANIPULATION ERROR # 2097213: RESOURCE_MAP_ALREADYMAPPED]

que con el tiempo se convierte en un error de la llamada E_OUTOFMEMORY Mapa después de ejecutar la aplicación por un tiempo.

estoy creando mi textura de la siguiente manera:

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)); 

y la actualización de sus datos de esta manera:

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); 

antes de crear la textura y el mapa los datos en él, todo lo que he hecho en mi programa inicializa los dispositivos Direct3D. Estoy completamente perplejo por lo que estoy haciendo mal. He estado tratando de leer todo lo que puedo sobre msdn sobre esto, pero nada me ha ayudado a descubrir qué está pasando mal. De acuerdo con MSDN, estoy tomando las medidas adecuadas para:

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. 

estoy bastante seguro de que he de llenar la descripción de las texturas correctamente también.

¿Podría ser el problema derivado de mi inicialización de mis dispositivos d3d? ¿Estoy abusando de la función de mapa? ¿No proporcioné suficiente información de fondo? ¿Alguna idea sobre qué está pasando?

Información adicional: Obtengo el mismo error de "recurso ya correlacionado" cuando trato de asignar datos a un búfer constante para mi sombreador de vértices. Además, lo probé en una computadora diferente y obtuve los mismos problemas de mapeo.

Actualización: He descargado un código de tutorial para D3D11 y tomé mi creación de textura y el código de mapeo y lo puse justo después de que el código del tutorial terminara de inicializar d3d. Solo quería ver si obtendría un error de mapeo. Como era de esperar, no obtuve un error de "recurso ya asignado". Además, cuando copio el código de inicialización d3d del tutorial y lo reemplazo por el mío, todavía obtengo el error de recurso ya mapeado que incluso me confunde aún más porque todo lo que hago antes de inicializar d3d es crear una ventana.

Respuesta

2

Es curioso cómo cuando empiezas a hacer preguntas sobre algo en lo que te quedas atascado, es más fácil encontrar el problema jaja.

Descubrí cuál era el problema. Era mi macro de recursos humanos con la que estaba rodeando la llamada del mapa.

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

no tengo ni idea de por qué lo haría la raíz del problema, pero definitivamente me gustaría saber cómo esta macro tendría problema con la llamada mapa.

+4

El problema es que está ejecutando la función dos veces. Deberías hacerlo: HRESULT hr = (x); if (FAILED (hr)) – notabene

Cuestiones relacionadas