2016-02-28 751 views
0

当调用IDXGISwapChain::ResizeBuffer()时,调用失败并从HRESULT 0x887a0001返回此错误,否则返回DXGI_ERROR_INVALID_CALLIDXGISwapChain :: ResizeBuffers()0x887a0001 DXGI_ERROR_INVALID_CALL

在此通话之前会发生什么,我拨打ID3D11DeviceContext::ClearState()并发布ID3D11RenderTargetViewID3D11DepthStencilView

上面的视图是绑定到IDXGISwapChain的唯一视图。

我会后下面的代码展示给大家,如果有人可以帮我解决这个问题,将不胜感激:

void SRNTY_API Direct3D11::D3D11ResizeBuffers(void) 
{ 
    mResizing = true; 

    RECT rect; 
    GetWindowRect(mhWnd, &rect); 
    mRenderTargetWidth = rect.right - rect.left; 
    mRenderTargetHeight = rect.bottom - rect.top; 

    if (gDXGI.GetSwapChain() != NULL) 
    { 
     assert(mD3D11DeviceContext); 
     assert(mD3D11Device); 
     assert(gDXGI.GetSwapChain()); 

     if (mD3D11DeviceContext) 
      mD3D11DeviceContext->ClearState(); 

     if (mD3D11RenderTargetView) 
      if (FAILED(result = mD3D11RenderTargetView->Release())) 
      { 
       SRNTY::gErrorHandler->AddError(gErrors->ERRORCODE(_ERROR::ERRORCODES::ERR21_D3D11ResizeBuffers), 
        SRNTY::ErrorHandler::ErrorHeaderSelect::EHS_ERROR); 
      } 

     if (mD3D11DepthStencilView) 
      if (FAILED(result = mD3D11DepthStencilView->Release())) 
      { 
       SRNTY::gErrorHandler->AddError(gErrors->ERRORCODE(_ERROR::ERRORCODES::ERR22_D3D11ResizeBuffers), 
        SRNTY::ErrorHandler::ErrorHeaderSelect::EHS_ERROR); 
      } 

     if (FAILED(result = gDXGI.GetSwapChain()->ResizeBuffers(1, mRenderTargetWidth, mRenderTargetHeight, 
      DXGI_FORMAT_R8G8B8A8_UNORM, 0))) // the offending line 
     { 
      SRNTY::gErrorHandler->AddError(gErrors->ERRORCODE(_ERROR::ERRORCODES::ERR23_D3D11ResizeBuffers), 
       SRNTY::ErrorHandler::ErrorHeaderSelect::EHS_ERROR); 
     } 

     if (FAILED(result = gDXGI.GetSwapChain()->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&mD3D11RenderTargetView))) 
     { 
      SRNTY::gErrorHandler->AddError(gErrors->ERRORCODE(_ERROR::ERRORCODES::ERR24_D3D11ResizeBuffers), 
       SRNTY::ErrorHandler::ErrorHeaderSelect::EHS_ERROR); 
     } 

     if (FAILED(result = gDXGI.GetSwapChain()->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&mD3D11DepthStencilView))) 
     { 
      SRNTY::gErrorHandler->AddError(gErrors->ERRORCODE(_ERROR::ERRORCODES::ERR25_D3D11ResizeBuffers), 
       SRNTY::ErrorHandler::ErrorHeaderSelect::EHS_ERROR); 
     } 

     D3D11_VIEWPORT viewport; 
     ZeroMemory(&viewport, sizeof(D3D11_VIEWPORT)); 

     viewport.TopLeftX = 0; 
     viewport.TopLeftY = 0; 
     viewport.Width = mRenderTargetWidth; 
     viewport.Height = mRenderTargetHeight; 
     viewport.MinDepth = 0.0f; 
     viewport.MaxDepth = 1.0f; 

     if ((mD3D11DeviceContext != NULL) && (mD3D11RenderTargetView != NULL) && (mD3D11DepthStencilView != NULL)) 
     { 
      mD3D11DeviceContext->OMSetRenderTargets(1, &mD3D11RenderTargetView, mD3D11DepthStencilView); 
      mD3D11DeviceContext->RSSetViewports(1, &viewport); 
      mResizing = false; 
      return; 
     } 
     else 
     { 
      SRNTY::gErrorHandler->AddError(gErrors->ERRORCODE(_ERROR::ERRORCODES::ERR26_D3D11ResizeBuffers), 
       SRNTY::ErrorHandler::ErrorHeaderSelect::EHS_ERROR); 
      SRNTY::gErrorHandler->EmergencyShutDown(); 
      ERROR(gErrors->ERRORCODE(_ERROR::ERRORCODES::ERR26_D3D11ResizeBuffers).c_str()); 
      return; 
     }   
    } 
} 

请帮帮忙,如果有一些方法可以让我看到了什么是绑定在通话时使用调试器交换链,这将是伟大的。

感谢,希望帮助:)

回答

0

,如果您使用的是前后缓冲区的ResizeBuffers方法的第一个参数不能是1。将值更改为2或指定0以保持原始值。

+0

非常感谢您的回复。我试过你提到的解决方案,但是这对程序没有影响,并且仍然返回相同的HRESULT 0x887a0001。 –

相关问题