ich schreibe an der 2.Version vom Softcube Designer und habe auf DirectX11 umgestellt. Nun habe ich aber das Problem das sich das Programm nach tausenden Aufraufen von "pSurface->GetDC" oder bei "pDeviceContext->Map( *ppTexture, 0, D3D11_MAP_READ, 0, pSubResource )" aufhängt. Der Thread kommt einfach nicht aus einer der beiden Funktionen zurück. Es gibt keine Fehlermeldung, Exception oder ähnliches. Auch keine Meldungen von DirectX das etwas nicht stimmt.
Nachfolgend die beiden Funktionen
Code: Alles auswählen
bool fxgRenderTargetPresent::GetDC( HDC *pHDC, ID3D11Texture2D **ppBackBuffer, IDXGISurface1 **ppDXGISurface)
{
if (m_pSwapChain==NULL)
return false;
if (S_OK!=m_pSwapChain->GetBuffer( 0, __uuidof(ID3D11Texture2D), (void **)ppBackBuffer))
{
return false;
}
if (S_OK!=(*ppBackBuffer)->QueryInterface(__uuidof(IDXGISurface1), (void **)(ppDXGISurface)))
{
(*ppBackBuffer)->Release();
return false;
}
// hier hängt er sich dann auf ************************************************************
if (S_OK!=(*ppDXGISurface)->GetDC( false, pHDC ))
{
(*ppDXGISurface)->Release();
(*ppBackBuffer)->Release();
return false;
}
return true;
}
Code: Alles auswählen
bool fxgRenderTargetPickup::GetBuffer(ID3D11Texture2D **ppTexture,D3D11_TEXTURE2D_DESC *pTexDescr,D3D11_MAPPED_SUBRESOURCE *pSubResource)
{
ID3D11Texture2D *pPresentBackBuffer;
GetRenderTargetPresent()->UnSetRenderTargets();
if ( !GetRenderTargetPresent()->GetBuffer( &pPresentBackBuffer ))
return false;
pPresentBackBuffer->GetDesc(pTexDescr);
pTexDescr->CPUAccessFlags = D3D11_CPU_ACCESS_READ;
pTexDescr->Usage = D3D11_USAGE_STAGING;
pTexDescr->BindFlags = 0;
pTexDescr->MiscFlags = 0;
if (S_OK!=GetRenderDevice()->GetD3DDevice()->CreateTexture2D( pTexDescr, NULL, ppTexture ))
{
pPresentBackBuffer->Release();
return false;
}
GetRenderDevice()->GetDeviceContext()->CopyResource( *ppTexture, pPresentBackBuffer );
// hier ist der andere Funktionsaufruf bei der er nicht zurück kommt *****************************************************************
if (S_OK!=GetRenderDevice()->GetDeviceContext()->Map( *ppTexture, 0, D3D11_MAP_READ, /*D3D11_MAP_FLAG_DO_NOT_WAIT*/0, pSubResource ))
{
GetRenderDevice()->GetApplication()->Trace("Map Error");
(*ppTexture)->Release();
pPresentBackBuffer->Release();
return false;
}
pPresentBackBuffer->Release();
return true;
}
Wie bereits geschrieben hängt er sich erst nach einiger Zeit auf. Deshalb kann ich den Fehler nur schwer reproduzieren.
Hat jemand Tipps oder eine Idee ?