2017-02-16 5 views
0

균일 버퍼 업데이트를 동기화 :이()vkCmdPipelineBarrier라고위한 VULKAN에서의 난 (간체) 다음과 같은 코드를 가정 해 봅시다 금속

id<MTLBuffer> uniforms = ...; 
MTLRenderCommandEncoder encoder = ...; 

[uniforms contents] = some_data; 
[encoder setVertexbuffer: uniforms ...]; 

DrawSomethingWithShader("myshader"); 

[uniforms contents] = some_other_data; // WRONG! overwrites previous draw call's uniforms 
[encoder setVertexbuffer: uniforms ...]; 

DrawSomethingElseWithShader("myshader"); 

이 메커니즘이 있습니다. 그러나, 나는 금속에서 비슷한 것을 발견 할 수 없었다. (MTLFence이 후보자이지만 다른 종류의 것들에도 사용된다.)

제 질문은이 버퍼 업데이트를 동기화하는 방법입니다.

(PS 현재의 내 생각은 버퍼에 대한 수정을 추적하고 다른 위치로 "초 균일 한 데이터"를 복사하는 것입니다 .:하지만 강력한 방법으로 구현하기가 다소 복잡 할 것이다)

답변

1

에게 당신을 는 명령 버퍼에 인코딩 된 모든 그리기 호출에 대한 균일 데이터가 인코딩을 끝낼 때까지만 액세스 할 수 있지만 명령 버퍼 자체가 완료 될 때까지 액세스 할 수 있어야합니다.

이것은 버퍼의 내용 포인터에 오프셋을 추가하고 연속적인 draw 호출에 대한 균일 데이터를 버퍼의 연속 부분에 써야 함을 의미합니다. 완료 될 때까지이 프레임에 해당하는 버퍼 영역에 쓰지 않아야합니다.

인코딩이 완료되는 프레임 전에 다음 프레임을 그리는 콜백을 얻을 가능성이 높으므로 버퍼 풀을 사용하여 이들 사이를 순환하여 카운팅 세마포어로 액세스를 제어해야합니다. 이 권장 사항은 Metal Best Practices Guide에 자세히 설명되어 있습니다.

+0

그게 내가 두려웠 던 이유입니다 ... 어쨌든 고마워요. (ps : 며칠 동안 질문을 공개합니다.) – Asylum