2016-10-03 26 views
1

메탈 버텍스 쉐이더 A이 버퍼 buf을 업데이트했다고 가정합니다. 또한 A 뒤에 인코딩 된 두 번째 버텍스 쉐이더 B이 있다고 가정합니다. B을 사용하여 buf의 결과를 사용하거나 A이 완료되기 전에 B이 실행되기 시작할 수 있습니까? 즉, 버퍼의 내용이 준비되지 않았습니까?금속에서 다음 버텍스 셰이더가 실행되기 전에 하나의 버텍스 셰이더가 완료됩니까?

+0

하나의 렌더링 명령 엔코더에 기록 된 내용은 후속 명령 엔코더에서 볼 수 있습니다. 드로우 콜 레벨에서는 그러한 보장이 없습니다. – warrenm

+0

버텍스 쉐이더 출력 포인트. 또한 조각 쉐이더로 보간 될 데이터를 생성 할 수있는 기회로 사용할 수 있습니다. 버퍼에 쓰는 데 사용하지 않습니다.셰이더에서 쓰고있는 버퍼는 무엇입니까? 버텍스 쉐이더는 버퍼를 어떻게 업데이트합니까? 버텍스 쉐이더가 아닌 컴퓨팅 쉐이더에 대해 물어보십시오. –

+0

계산 쉐이더에서와 마찬가지로 버텍스 쉐이더에서 장치 버퍼에 쓸 수 있습니다. 전용 컴퓨팅 쉐이더를 작성하는 대신 버텍스 쉐이더에서 일부 버퍼를 업데이트하여 약간의 오버 헤드를 줄일 수 있습니다. 이전 그리기 명령을 완료하기 전에 GPU가 다음 그리기 명령을 처리하기 시작하는지 확실하지 않아서 버텍스 쉐이더에서 업데이트되는 장치 버퍼의 내용을 예측할 수 없게 만듭니다. Apple docs는 정점 쉐이더의 일반적인 사용법을 따르지 않으므로이 문제를 해결하지 못합니다. – gloo

답변

0

두 번째 버텍스 쉐이더 B은 동일한 MTLRenderCommandEncoder으로 인코딩 된 버텍스 쉐이더 A보다 먼저 자유롭게 실행될 수 있습니다. A의 결과를 B으로 읽으려면 MTLRenderCommandEncoder의 코드로 인코딩해야합니다.

MTLComputeCommandEncoder 내에서 이 아니고이 참이어야합니다. relevant part of the doc 상태 : threadsPerThreadgroup : 컴퓨 명령

실행

는 dispatchThreadgroups 호출 컴퓨 기능을 실행하는 명령을 인코딩하는 방법 MTLComputeCommandEncoder의 을 상기 쓰레드 그룹 기준 및 에게 threadgroups 수를 지정 . threadExecutionWidth 및 MTLComputePipelineState의 maxTotalThreadsPerThreadgroup 속성을 으로 쿼리하면이 장치에서 계산 기능이 최적화됩니다. threadExecutionWidth의 배수 방법 threadsPerThreadgroup :

는 연산 기능의 대부분을 효율적으로 수행하기 위해 상기 합계 dispatchThreadgroups에 threadsPerThreadgroup 인수에 의해 지정된 스레드 수 세트. 스레드 그룹의 총 스레드 수는 threadsPerThreadgroup의 구성 요소 제품 : threadsPerThreadgroup.width * threadsPerThreadgroup.height * threadsPerThreadgroup.depth입니다. maxTotalThreadsPerThreadgroup 속성은 장치에서이 계산 기능을 실행하기 위해 단일 스레드 그룹 에있을 수있는 최대 스레드 수를 지정합니다.

계산 명령은 명령 버퍼에 으로 인코딩 된 순서대로 실행됩니다. 명령과 관련된 모든 스레드 그룹이 실행을 완료하고 모든 결과가 메모리에 기록 될 때 compute 명령 실행이 완료됩니다. 이 시퀀싱으로 인해 의 명령 명령은 명령 버퍼에서 이후에 인코딩 된 모든 명령에서 사용할 수 있습니다.

계산 명령 엔코더의 인코딩 명령을 끝내려면 MTLComputeCommandEncoder의 endEncoding 메서드를 호출하십시오. 이전 명령 인코더를 끝낸 후 명령 버퍼에 추가 명령을 인코딩하는 모든 유형의 새 명령 인코더를 만들 수 있습니다.