2012-03-23 6 views
4

DirectX 11 API를 사용하는 게임 엔진을 디자인하고 있습니다. 특히 지연된 컨텍스트를 사용하고 있습니다. 기본 아이디어는 모든 장치 상태에 지연된 컨텍스트를 부여한 다음 모든 지오메트리가 렌더링 된 후 모든 지연 컨텍스트를 반복하고 즉시 컨텍스트에서 명령 목록을 실행하여 표시하는 것입니다. 필자는 와이어 프레임 쉐이더를 사용하여 화면에 두 개의 삼각형을 그리는 것으로 테스트했습니다. 모든 DirectX 호출은 PIX 디버그 보고서에서 볼 때 오류를 반환하지 않지만 IDXGISwapChain::Present(0,0이 호출되는 즉시 전체 화면이 검정색으로 돌아온 다음 반환됩니다. 디스플레이 드라이버가 "응답을 멈추고 성공적으로 복구되었습니다"라는 오류 상자가 화면 오른쪽 하단 모서리에 나타납니다. PIX 로그를 검토 한 결과, PIX 로그의 호출 전후 블록 사이에 "D3D11: Removing Device"이라는 한 줄을 발견했습니다. 게시물 블록에 표시된 반환 값은 DXGI_ERROR_DEVICE_REMOVED입니다. 나는 이것을 어떻게 만들지 잘 모르겠습니다. PIX 로그는 다음과 같습니다.IDXGISwapChain :: Present가 드라이버 충돌 및 장치 제거를 야기 함

Frame 000001 ........PRE: CreateDXGIFactory1(IID_IDXGIFactory1, 0x012E1E2C) 
Frame 000001 ............PRE: AddObject(DXGI Factory, 0x0040FF98, 0x0065B810) 
Frame 000001 ............POST: <TRUE> AddObject(DXGI Factory, 0x0040FF98, 0x0065B810) 
Frame 000001 ........POST: <S_OK> CreateDXGIFactory1(IID_IDXGIFactory1, 0x012E1E2C) 
Frame 000001 ........PRE: D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, 32, NULL, 0, 7, 0x0019F444, 0x012E1E5C, 0x012E1E54, 0x012E1E58, 0x012E1E60) 
Frame 000001 ............PRE: AddObject(D3D11 Device, 0x03666B38, 0x009E9940) 
Frame 000001 ............POST: <TRUE> AddObject(D3D11 Device, 0x03666B38, 0x009E9940) 
Frame 000001 ............PRE: AddObject(DXGI Factory, 0x03666B98, 0x0065BAB0) 
Frame 000001 ............POST: <TRUE> AddObject(DXGI Factory, 0x03666B98, 0x0065BAB0) 
Frame 000001 ............PRE: AddObject(DXGI Adapter, 0x03666BE8, 0x0065C940) 
Frame 000001 ............POST: <TRUE> AddObject(DXGI Adapter, 0x03666BE8, 0x0065C940) 
Frame 000001 ............PRE: AddObject(DXGI Device, 0x03666C40, 0x009E9718) 
Frame 000001 ............POST: <TRUE> AddObject(DXGI Device, 0x03666C40, 0x009E9718) 
Frame 000001 ............PRE: AddObject(DXGI Swap Chain, 0x03666CA0, 0x009EF940) 
Frame 000001 ............POST: <TRUE> AddObject(DXGI Swap Chain, 0x03666CA0, 0x009EF940) 
Frame 000001 ............PRE: AddObject(DXGI Surface, 0x03666D38, 0x009EFB9C) 
Frame 000001 ............POST: <TRUE> AddObject(DXGI Surface, 0x03666D38, 0x009EFB9C) 
Frame 000001 ............PRE: AddObject(D3D11 Texture2D, 0x03666D98, 0x009EFBD4) 
Frame 000001 ............POST: <TRUE> AddObject(D3D11 Texture2D, 0x03666D98, 0x009EFBD4) 
Frame 000001 ............PRE: AddObject(D3D11 Device Context, 0x036C1E08, 0x009F1840) 
Frame 000001 ............POST: <TRUE> AddObject(D3D11 Device Context, 0x036C1E08, 0x009F1840) 
Frame 000001 ........POST: <S_OK> D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, 32, NULL, 0, 7, 0x0019F444, 0x012E1E5C, 0x012E1E54, 0x012E1E58, 0x012E1E60) 
Frame 000001 ........PRE: <this=0x03666b38>ID3D11Device::CheckFeatureSupport(D3D11_FEATURE_THREADING, 0x0019F2C8, 8) 
Frame 000001 ........POST: <S_OK><this=0x03666b38> ID3D11Device::CheckFeatureSupport(D3D11_FEATURE_THREADING, 0x0019F2C8, 8) 
Frame 000001 ........PRE: <this=0x03666b38>ID3D11Device::CheckFeatureSupport(D3D11_FEATURE_D3D10_X_HARDWARE_OPTIONS, 0x0019F2BC, 4) 
Frame 000001 ........POST: <S_OK><this=0x03666b38> ID3D11Device::CheckFeatureSupport(D3D11_FEATURE_D3D10_X_HARDWARE_OPTIONS, 0x0019F2BC, 4) 
Frame 000001 ........PRE: <this=0x03666b38>ID3D11Device::CheckFormatSupport(DXGI_FORMAT_B8G8R8A8_UNORM, 0x0019F2B0) 
Frame 000001 ........POST: <S_OK><this=0x03666b38> ID3D11Device::CheckFormatSupport(DXGI_FORMAT_B8G8R8A8_UNORM, 0x0019F2B0) 
Frame 000001 ........PRE: <this=0x03666b38>ID3D11Device::GetCreationFlags() 
Frame 000001 ........POST: <32><this=0x03666b38> ID3D11Device::GetCreationFlags() 
Frame 000001 ........PRE: <this=0x03666b38>ID3D11Device::CreateDeferredContext(0, 0x0FB34BA4) 
Frame 000001 ............PRE: AddObject(D3D11 Device Context, 0x036C9C58, 0x009F7C38) 
Frame 000001 ............POST: <TRUE> AddObject(D3D11 Device Context, 0x036C9C58, 0x009F7C38) 
Frame 000001 ........POST: <S_OK><this=0x03666b38> ID3D11Device::CreateDeferredContext(0, 0x0FB34BA4) 
Frame 000001 ........PRE: <this=0x03666b38>ID3D11Device::CreateRasterizerState(0x0019F3F8, 0x0FB34BA0) 
Frame 000001 ............PRE: AddObject(D3D11 Rasterizer State, 0x03666E38, 0x009F0A98) 
Frame 000001 ............POST: <TRUE> AddObject(D3D11 Rasterizer State, 0x03666E38, 0x009F0A98) 
Frame 000001 ........POST: <S_OK><this=0x03666b38> ID3D11Device::CreateRasterizerState(0x0019F3F8, 0x0FB34BA0) 
Frame 000001 ........PRE: <this=0x03666b38>ID3D11Device::CreateInputLayout(0x0FB50158, 2, 0x009F0368, 568, 0x0FB35B3C) 
Frame 000001 ............PRE: AddObject(D3D11 Input Layout, 0x03666EB0, 0x009F0B18) 
Frame 000001 ............POST: <TRUE> AddObject(D3D11 Input Layout, 0x03666EB0, 0x009F0B18) 
Frame 000001 ........POST: <S_OK><this=0x03666b38> ID3D11Device::CreateInputLayout(0x0FB50158, 2, 0x009F0368, 568, 0x0FB35B3C) 
Frame 000001 ........PRE: <this=0x03666b38>ID3D11Device::CreateSamplerState(0x0019F418, 0x0019F46C) 
Frame 000001 ............PRE: AddObject(D3D11 Sampler State, 0x03666F10, 0x009EF8D8) 
Frame 000001 ............POST: <TRUE> AddObject(D3D11 Sampler State, 0x03666F10, 0x009EF8D8) 
Frame 000001 ........POST: <S_OK><this=0x03666b38> ID3D11Device::CreateSamplerState(0x0019F418, 0x0019F46C) 
Frame 000001 ........PRE: <this=0x03666f10>ID3D11SamplerState::AddRef() 
Frame 000001 ........POST: <2><this=0x03666f10> ID3D11SamplerState::AddRef() 
Frame 000001 ........PRE: <this=0x03666b38>ID3D11Device::AddRef() 
Frame 000001 ........POST: <8><this=0x03666b38> ID3D11Device::AddRef() 
Frame 000001 ........PRE: <this=0x03666b38>ID3D11Device::CreateVertexShader(0x009F0368, 568, NULL, 0x0FB3046C) 
Frame 000001 ............PRE: AddObject(D3D11 Vertex Shader, 0x03666F60, 0x009EFCB4) 
Frame 000001 ............POST: <TRUE> AddObject(D3D11 Vertex Shader, 0x03666F60, 0x009EFCB4) 
Frame 000001 ........POST: <S_OK><this=0x03666b38> ID3D11Device::CreateVertexShader(0x009F0368, 568, NULL, 0x0FB3046C) 
Frame 000001 ........PRE: <this=0x03666b38>ID3D11Device::CreatePixelShader(0x009F0958, 244, NULL, 0x0FB30470) 
Frame 000001 ............PRE: AddObject(D3D11 Pixel Shader, 0x03666FB8, 0x009E2CF4) 
Frame 000001 ............POST: <TRUE> AddObject(D3D11 Pixel Shader, 0x03666FB8, 0x009E2CF4) 
Frame 000001 ........POST: <S_OK><this=0x03666b38> ID3D11Device::CreatePixelShader(0x009F0958, 244, NULL, 0x0FB30470) 
Frame 000001 ........PRE: <this=0x03666b38>ID3D11Device::Release() 
Frame 000001 ........POST: <9><this=0x03666b38> ID3D11Device::Release() 
Frame 000001 ........PRE: <this=0x03666b38>ID3D11Device::CreateBuffer(0x0019F914, NULL, 0x0FB364A8) 
Frame 000001 ............PRE: AddObject(D3D11 Buffer, 0x036656F0, 0x009E2E14) 
Frame 000001 ............POST: <TRUE> AddObject(D3D11 Buffer, 0x036656F0, 0x009E2E14) 
Frame 000001 ........POST: <S_OK><this=0x03666b38> ID3D11Device::CreateBuffer(0x0019F914, NULL, 0x0FB364A8) 
Frame 000001 ........PRE: <this=0x03666b38>ID3D11Device::CreateBuffer(0x0019F914, NULL, 0x0FB3E1B0) 
Frame 000001 ............PRE: AddObject(D3D11 Buffer, 0x03665778, 0x009F03D4) 
Frame 000001 ............POST: <TRUE> AddObject(D3D11 Buffer, 0x03665778, 0x009F03D4) 
Frame 000001 ........POST: <S_OK><this=0x03666b38> ID3D11Device::CreateBuffer(0x0019F914, NULL, 0x0FB3E1B0) 
Frame 000001 ........PRE: <this=0x03666b38>ID3D11Device::CreateBuffer(0x0019F914, NULL, 0x0FB46E58) 
Frame 000001 ............PRE: AddObject(D3D11 Buffer, 0x03665800, 0x009E3994) 
Frame 000001 ............POST: <TRUE> AddObject(D3D11 Buffer, 0x03665800, 0x009E3994) 
Frame 000001 ........POST: <S_OK><this=0x03666b38> ID3D11Device::CreateBuffer(0x0019F914, NULL, 0x0FB46E58) 
Frame 000001 ........PRE: <this=0x036c1e08>ID3D11DeviceContext::RSSetViewports(1, 0x012E1EBC) 
Frame 000001 ........POST: <><this=0x036c1e08> ID3D11DeviceContext::RSSetViewports(1, 0x012E1EBC) 
Frame 000001 ........PRE: <this=0x036c9c58>ID3D11DeviceContext::IASetInputLayout(0x03666EB0) 
Frame 000001 ........POST: <><this=0x036c9c58> ID3D11DeviceContext::IASetInputLayout(0x03666EB0) 
Frame 000001 ........PRE: <this=0x036c9c58>ID3D11DeviceContext::AddRef() 
Frame 000001 ........POST: <2><this=0x036c9c58> ID3D11DeviceContext::AddRef() 
Frame 000001 ........PRE: <this=0x036c9c58>ID3D11DeviceContext::DrawIndexed(6, 0, 0) 
Frame 000001 ........POST: <><this=0x036c9c58> ID3D11DeviceContext::DrawIndexed(6, 0, 0) 
Frame 000001 ........PRE: <this=0x036c9c58>ID3D11DeviceContext::Release() 
Frame 000001 ........POST: <1><this=0x036c9c58> ID3D11DeviceContext::Release() 
Frame 000001 ........PRE: <this=0x036c9c58>ID3D11DeviceContext::FinishCommandList(FALSE, 0x0019F928) 
Frame 000001 ............PRE: AddObject(D3D11 Command List, 0x03665888, 0x009E3A94) 
Frame 000001 ............POST: <TRUE> AddObject(D3D11 Command List, 0x03665888, 0x009E3A94) 
Frame 000001 ........POST: <S_OK><this=0x036c9c58> ID3D11DeviceContext::FinishCommandList(FALSE, 0x0019F928) 
Frame 000001 ........PRE: <this=0x036c1e08>ID3D11DeviceContext::ExecuteCommandList(0x03665888, FALSE) 
Frame 000001 ........POST: <><this=0x036c1e08> ID3D11DeviceContext::ExecuteCommandList(0x03665888, FALSE) 
Frame 000001 ........PRE: <this=0x03666ca0>IDXGISwapChain::Present(0, 1) 
Frame 000001 ........POST: <S_OK><this=0x03666ca0> IDXGISwapChain::Present(0, 1) 
Frame 000001 ........PRE: <this=0x03666ca0>IDXGISwapChain::Present(0, 0) 
D3D11: Removing Device. 
Frame 000001 ........POST: <DXGI_ERROR_DEVICE_REMOVED><this=0x03666ca0> IDXGISwapChain::Present(0, 0) 
Frame 000001 ....POST: <> Frame(1) 

다른 것이 필요한 경우 알려주십시오. 코드를 게시하지 않은 이유는 거의 20 개의 개별 클래스로 확장 되었기 때문에 버퍼 내용, HLSL 및 논리 뒤에 설명을 게시 할 수 있기 때문입니다.

UPDATE : I 다소 부분적인 이유 때문에 모든 쉐이더없이 색인 버퍼없는 정점 버퍼, 어떤 일정한 버퍼를 설정주지 않을 가능성이 있었다, 상기 문제를 해결 한

. 원래의 문제는 여전히 해결되지 않았지만이 작업을하는 동안 새로운 생각이 들려 왔습니다. 나는 결코 ID3D11DeviceContext::Begin(0)라고 불렀다. 그러나 장치 상태 클래스에서 장치 컨텍스트를 가져오고 해당 컨텍스트에서 Begin을 호출하면 액세스 위반이 발생하고 ID3D11DeviceContext 개체에 대한 포인터가 0으로 설정됩니다. 이것은 Begin에 대한 호출에서만 발생하며 호출을 제거하면 동작이 중지됩니다. DirectX SDK의 예제 코드를 살펴보면 언제든지 시작할 수있는 명시 적 호출을 찾을 수 없습니다. 이 전화가 필요한가요? 이것은 약간의 주제로 보일지 모르지만 명령 목록이 그것 때문에 엉망이되면 Present이 장치를 제거하는 이유 일 수 있습니다.

관련 코드 :

if(FAILED(devstate->BeginDraw(inlayout,&dc))) 
{ 
    return ACERROR_ALREADYDRAWING; //error handling block. 
} 
//dc->Begin(0); //access violation: error accessing location 0x00000024 
for(UINT i=Shader_Vertex;i<Shader_Count;i++) 
{ 
    //set all relevant shaders to the device. 
    (dc->*(vtbls[i].ShaderSet))(shaders[i],0,0); 
} 
+0

나는 드라이버가 충돌하고 스스로를 리셋하는 경우 이것을 얻은다고 생각한다. 그래서 이것이 드라이버 버그 일 수있다 ... 레퍼런스 장치를 사용하여 코드를 좁히려 고 시도 할까? – jcoder

+0

참조 장치에서 프로그램을 테스트했으며 동일한 버그가 발생했습니다. 그러나 나는 두 개의 눈부신 (바보 읽기) 오류를 보았습니다. 상수 버퍼, 버텍스 쉐이더 및 픽셀 쉐이더를 생성 했음에도 불구하고 결코 장치에 설정하지 않았습니다. 따라서 런타임이 삼각형을 렌더링 할 때 쉐이더 코드가없고 월드/뷰/프로젝션 행렬에 대한 상수 버퍼가 없습니다. 적절한 클래스에서이 버그를 수정하려고했습니다. – Alex

+0

여기에 답변이 없으면 gamedev.stackexchange.com이 더 좋을 것입니까, 아니면 gamedev.net의 포럼일까요? – jcoder

답변

2

지난 육일 동안 코드를 검토 한 후, 나는 이상한 발견을했습니다 : 다이렉트 X 11에서 코딩 다이렉트 X 9.0c를 내 지식의 모든이며,에도 불구하고 ... .. 다르다. 코드에서 몇 가지 어리석은 실수를 발견 한 후에는 하드웨어 장치에서 오류를 수정했지만 이상하게도 ref 장치에서는 오류를 해결했습니다. 현재 배경을 매우 쉽게 지울 수있는 이유를 알아 내기 전에 DirectX 11 파이프 라인 변경 사항을 조사하고 있지만 지연된 컨텍스트가있는 삼각형을 그리려는 시도가 전혀 작동하지 않습니다.

도움을 주신 모든 분들의 제안에 감사드립니다.