2013-09-27 7 views
0

Direct3D11을 많이 읽었습니다 (스택 오버플로를 포함하여 여기를 포함하여). 그리고 모든 연구에서 나는이 질문에 결정적으로 대답 할 수 없었습니다.Direct3D11은 어디에서 리소스 객체를 할당합니까?

리소스 객체 (즉, 버퍼 또는 텍스처 객체)가 생성됩니다 (예 : pDevice-> CreateBuffer()). 시스템 RAM 또는 GPU의 Video-RAM? 아니면 내가 자원 객체의 근본적인 본질을 완전히 오해하고 있는가?

리소스를 채우는 데이터 (예 : 버텍스 및 인덱스 배열)는 프로그래머가 배치 한 위치에 저장되지만 일단 데이터를 복사 한 곳의 리소스에 매핑하면 분명히 저장됩니다. (필자는 리소스가 읽기/쓰기 보호를 위해 매핑되고 매핑되지 않아야하므로 매핑 된 데이터가 실제로 VRAM에 복사된다는 것을 전제로합니다). 또한 Resource 객체 자체는 어디에서 인스턴스화됩니까?

미리 도움을 청하십시오!

+0

당신이 몰라서 알아낼 수없는 사실은 DirectX에 대한 핵심입니다. 그래서 GPU 대신 소프트웨어 렌더러를 사용하고, 예를 들어 충분한 메모리가없는 비디오 카드를 다루는 것과 같은 일을 할 수 있습니다. 이 질문에 대한 답을 알기를 원하지는 않습니다. 구현 세부 사항을 추상화하는 것은 좋은 API의 핵심입니다. –

+0

좋은 점은 DirectX 또는 다른 API를 사용하여 작업 할 때 반드시 염두에 두어야 할 점입니다. 감사! 질문은 물론 실용적인 것만 큼 순수하게 학술적 인 질문이었습니다. –

답변

1

리소스 생성 중에 Create * 호출은 D3D 런타임 UMD (사용자 모드 그래픽 드라이버) & KMD (커널 모드)를 거칩니다. KMD는 페이지 테이블 관리를 담당합니다 (공유 가상 메모리의 경우 운영 체제와 대화 할 수 있지만이를 무시할 수 있음). 리소스가 SVM을 사용하지 않으면 그래픽 메모리에 blitted됩니다.

프로세서 그래픽 용 그래픽 메모리 (예 : Intel Iris)는 시스템 RAM입니다. 따라서 응용 프로그램 가상 주소 공간에서 KMD로 복사됩니다.

개별 그래픽 카드의 경우 데이터는 카드의 비디오 RAM에 있습니다. GPU는 비디오 RAM에서만 작동 할 수 있습니다. (이산 그래픽을위한 공유 가상 메모리가 어떻게 작동하는지 모르겠습니다.)

+0

그건 완벽하게 이해할 수 있고 의심스러운 것입니다. 그러나 명확한 설명은 톤을 돕습니다. 도와 주셔서 정말 감사합니다! –

+0

문제 없습니다. http://fgiesen.wordpress.com/2011/07/09/a-trip-through-the-graphics-pipeline-2011-index/에서 살펴보십시오. – Raja