2016-07-29 12 views
4

d3d10이 렌더링을 끝내기를 기다리는 API를 구현해야하는 몇 가지 기능을 구현하고 있습니다. 기본적으로 공유 텍스처에 대한 동기화 액세스를 구현하려고합니다. d3d10 이후의 텍스처는 backbuffer에 성공적으로 나타낼 수 있습니다. 이 블랙 박스 API를 호출함으로써 나는 이것이 달성 될 수 있다고 생각하며 glfinish()와 비슷한 것이 될 것이라고 생각합니다. 우리는 ID3D10Query 쿼리를 사용하여 동기화 액세스를 구현할 수 있음을 읽었습니다.d3d10 명령이 완료 될 때까지 기다리는 API 구현

D3D10_QUERY_DESC queryDesc; 

    ... // Fill out queryDesc structure 

    ID3D10Query * pQuery; 
    pDevice->CreateQuery(&queryDesc, &pQuery); 

    pQuery->Begin(); 

    ... // Issue graphis commands, do whatever 

    pQuery->End(); 

    UINT64 queryData; // This data type is different depending on the query type 

    while(S_OK != pQuery->GetData(&queryData, sizeof(UINT64), 0)) 
    { 
    } 

시작과 종료 사이에 몇 가지 더미 명령을 넣어야합니까? 공공 API로이 기능을 공개하고 싶습니다. waitforgraphiscompletion이라는 이름의 뭔가가 있습니다.

여기에 더미 명령이 있어야합니까?

답변

2

OpenGL에서 실행 CPU와 GPU를 동기화하려면 glFenceSync 다음에 glClientWaitSync을 사용합니다. Direct 10의 동등 물은 ID3D10Asynchronous::End이고 ID3D10Asynchronous::GetData입니다 (DX11에서는 인터페이스가 약간 다릅니다). 이것들은 GPU가 명령 버퍼를 특정 지점으로 처리하는 것을 언제인지 알려줍니다. 이를 통해 리소스에 대한 이전 읽기/쓰기 작업이 언제 완료되었는지 알 수 있으며 CPU가 추가 동기화없이 리소스에 안전하게 액세스 할 수 있습니다.

while 루프에는 명령을 입력 할 필요가 없습니다. 명령 버퍼는 결국 쿼리를 처리하고 S_OK (또는 처리하려는 오류 메시지)를 반환합니다. 그러나 이것은 CPU가 GPU를 기다리면서 회전하기 때문에 다소 낭비가 될 수 있으므로 가능한 경우 루프 내에서 몇 가지 유용한 작업을 수행해야합니다.

D3D10_ASYNC_GETDATA_DONOTFLUSH을 최종 매개 변수로 사용하면 '0'대신에 GetData이됩니다. 위의 경우는 없습니다. 명령 버퍼가 자동으로 시작된다는 보장이 없습니다. 무한 루프로 끝납니다 (권장 용도가 아닙니다).

+0

감사합니다. 이것이 나에게 완벽한 의미입니다. 그것에 대해 한두 가지 의문점이 있습니다. 어떻게 glfinish glFenceSync 다음에 glClientWaitSync 다른가요? D3D10에 대해서는 ID3D10Query (끝이 없다는 뜻)를 끝내고 ID3D10Query가 생성 된 장치에서 모든 명령이 실행될 때까지 기다릴뿐입니다. –

+0

glFinish는 프레임 버퍼에 쓰는 것을 포함하여 모든 OpenGL 작업이 완료 될 때까지 대기합니다. glClientWaitSync는 glFenceSync가 완료되기 전에 발행 된 GL 명령을 보증합니다. 일반적으로 특정 텍스처에 대한 액세스를 동기화하려는 경우에는 일반적으로 필요하지 않습니다. 사용자가 자신의 렌더링 코드에서 읽거나 쓰는 시점을 알아야합니다. – MuertoExcobito

+0

흠, 고마워. –