타일 풀에 대한 매핑

리소스를 스트리밍 리소스로 만들 때 리소스를 구성하는 타일은 타일 풀의 위치를 가리키는 것에서 시작합니다. 타일 풀은 메모리 풀로서 애플리케이션에 보이지 않는 장면 뒤에서 하나 이상의 할당으로 지원됩니다. 운영 체제 및 디스플레이 드라이버가 이 메모리 풀을 관리하고, 메모리 사용 공간은 애플리케이션이 쉽게 이해합니다. 스트리밍 리소스는 타일 풀 내 위치를 가리킴으로써 64KB 영역을 매핑합니다. 이러한 설정으로 인한 좋지 않은 결과 중 하나는 여러 리소스가 같은 타일을 공유 및 다시 사용할 수 있게 할 뿐 아니라, 원하는 경우 리소스 내 다른 위치에서 같은 타일을 다시 사용할 수 있게 한다는 것입니다.

타일 풀로 리소스용 타일을 채우는 유연성에 대해 치러야 할 비용은 타일 풀의 어떤 타일이 리소스에 필요한 타일을 나타낼지에 대한 매핑을 정의 및 유지하는 작업을 해야 한다는 것입니다. 타일 매핑은 변경할 수 있습니다. 또한 리소스의 모든 타일을 한 번에 매핑해야 하는 것은 아닙니다. 리소스는 NULL 매핑이 가능합니다. NULL 매핑은 타일에 액세스하는 리소스의 관점에서 사용할 수 없는 타일로 정의합니다.

타일 풀을 여러 개 만들 수 있으며, 스트리밍 리소스를 그 개수에 관계없이 모든 지정된 타일 풀에 동시에 매핑할 수 있습니다. 또한 타일 풀은 증가하거나 감소할 수 있습니다. 자세한 내용은 타일 풀 크기 조정을 참조하세요. 디스플레이 드라이버 및 런타임 구현을 간소화하는 것이 목적인 한 가지 제한 사항은 지정된 스트리밍 자원이 한 번에 최대 하나의 타일 풀에 매핑될 수 있다는 것입니다(여러 타일 풀에 동시에 매핑되는 것의 반대 경우).

스트리밍 리소스 자체(즉, 독립 타일 풀 메모리)와 연결된 스토리지의 공간은 특정 시각에 풀에 실제로 매핑되는 타일의 개수에 대략 비례합니다. 하드웨어에서 이 사실은 결국 페이지 테이블 스토리지용 메모리 사용 공간을 매핑되는 타일의 양으로 대략 크기 조정하는 것이 됩니다(예: 다단계 페이지 테이블 구성표를 적절하게 사용).

타일 풀은 Direct3D 애플리케이션이 낮은 수준 구현 세부 정보를 알 필요 없이(또는 포인터 주소를 직접 다룰 필요 없이) 그래픽 처리 디바이스(GPU)의 페이지 테이블을 효과적으로 프로그래밍할 수 있게 해주는 전적인 소프트웨어 추상화로 간주할 수 있습니다. 타일 풀은 하드웨어에서 추가 간접 수준을 전혀 적용하지 않습니다. 페이지 디렉터리와 같은 구조를 사용하여 단일 수준 페이지 테이블을 최적화하는 작업은 타일 풀 개념과는 관계가 없습니다.

실제로 구현에 필요한 것은 매핑된 것에 대략 비례하는 스토리지가 전부이지만, 최악의 경우 페이지 테이블 자체에 어떤 스토리지가 필요할 수 있는지 알아보겠습니다.

각 페이지 테이블 항목이 64비트라고 가정합니다.

Direct3D 11에 리소스 제한이 있는 조건에서 단일 표면에 최악의 페이지 테이블 크기가 할당된 경우, 스트리밍 리소스를 요소당 128비트 형식(예: RGBA 부동)을 사용하여 만든다고 가정하면, 64KB 타일에 4096픽셀만 포함됩니다. 64비트 테이블 항목을 사용하여 완전히 채우는 경우(mipmap은 포함하지 않음), 지원되는 최대 Texture2DArray 크기(16384\*16384\*2048)에는 페이지 테이블에 약 1GB의 스토리지가 필요합니다. mipmap을 추가하면 완전히 매핑된(최악의 경우) 페이지 테이블 스토리지가 1/3 정도, 즉 1.3GB까지 증가합니다.

이 경우 약 10.6 테라바이트의 주소 지정 가능 메모리에 액세스할 수 있습니다. 그러나 주소 지정 가능 메모리의 크기에 제한을 두어 테라바이트 범위 정도로 그 공간을 줄일 수 있습니다.

고려해야 할 또 다른 경우는 mipmap을 포함해 요소당 32비트 형식인 16384*16384의 Texture2D 스트리밍 리소스입니다. 완전히 채운 페이지 테이블에 필요한 공간은 64비트 테이블 항목을 포함해 대략 170KB입니다.

마지막으로 BC 형식을 사용하는 예, 즉 4x4 픽셀 타일당 128비트인 BC7의 경우를 고려합니다. 이는 픽셀당 1바이트입니다. mipmap을 포함해 16384*16384*2048인 Texture2DArray는 페이지 테이블에서 이 메모리를 완전히 채우려면 대략 85MB가 필요합니다. 이 경우 스트리밍 리소스 하나가 550기가픽셀(이 경우에는 512GB의 메모리)을 차지하도록 허용하는 것을 고려하면 나쁜 것은 아닙니다.

실제로는, 사용할 수 있는 물리적 메모리의 양이 한 번에 매핑 및 참조될 만큼의 양과는 거리가 먼 조건에서 이러한 전체 매핑을 정의하는 것은 합당하지 않은 일입니다. 그러나 타일 풀을 사용하면 애플리케이션이 타일 풀(즉, 페이지 테이블 매핑)을 메모리 압축 도구로 활용하여 타일을 다시 사용할 수 있습니다(간단한 예로, 이미지의 넓은 검은색 영역에 "검정색" 타일을 다시 사용).

페이지 테이블의 초기 내용은 모든 항목에 대해 NULL입니다. 또한 애플리케이션은 표면의 메모리 콘텐츠에 대한 초기 데이터를 전달할 수 없습니다. 왜냐하면 메모리 백업 없이 시작하기 때문입니다.

이 섹션의 내용

주제 설명

타일 풀 만들기

애플리케이션은 Direct3D 디바이스 하나당 1개 이상의 타일 풀을 만들 수 있습니다. 각 타일 풀의 총 크기는 Direct3D 11의 리소스 크기 제한(대략 GPU RAM의 1/4)의 적용을 받습니다.

타일 풀 크기 조정

애플리케이션이 매핑되는 스트리밍 리소스에 대해 더 많은 작업 집합이 필요한 경우에는 타일 풀의 크기를 조정하여 타일 풀을 늘리고, 더 적은 공간이 필요한 경우에는 타일 풀을 줄입니다.

위험 추적 대 타일 풀 리소스

비 스트리밍 리소스의 경우, Direct3D는 렌더링하는 동안 특정 위험 조건을 예방할 수 있지만, 위험 추적이 스트리밍 리소스에 대해 타일 수준에 있기 때문에 스트리밍 리소스 렌더링 중 위험 조건 추적에 너무 많은 리소스가 필요할 수 있습니다.

 

스트리밍 리소스 만들기