타일 풀에 대한 매핑
D3D11_RESOURCE_MISC_TILED 플래그를 사용하여 리소스를 만들 때 리소스를 구성하는 타일은 타일 풀의 위치를 가리키는 것에서 비롯됩니다. 타일 풀은 메모리 풀로서 애플리케이션에 보이지 않는 장면 뒤에서 하나 이상의 할당으로 지원됩니다. 운영 체제 및 디스플레이 드라이버가 이 메모리 풀을 관리하고, 메모리 사용 공간은 애플리케이션이 쉽게 이해합니다. 타일식 리소스는 타일 풀의 위치를 가리켜 64KB 지역을 매핑합니다. 이러한 설정으로 인한 좋지 않은 결과 중 하나는 여러 리소스가 같은 타일을 공유 및 다시 사용할 수 있게 할 뿐 아니라, 원하는 경우 리소스 내 다른 위치에서 같은 타일을 다시 사용할 수 있게 한다는 것입니다.
타일 풀로 리소스용 타일을 채우는 유연성에 대해 치러야 할 비용은 타일 풀의 어떤 타일이 리소스에 필요한 타일을 나타낼지에 대한 매핑을 정의 및 유지하는 작업을 해야 한다는 것입니다. 타일 매핑은 변경할 수 있습니다. 또한 리소스의 모든 타일을 한 번에 매핑해야 하는 것은 아닙니다. 리소스는 NULL 매핑이 가능합니다. NULL 매핑은 타일에 액세스하는 리소스의 관점에서 사용할 수 없는 타일로 정의합니다.
여러 타일 풀을 만들 수 있으며 타일된 리소스의 수는 지정된 타일 풀에 동시에 매핑될 수 있습니다. 또한 타일 풀은 증가하거나 감소할 수 있습니다. 자세한 내용은 타일 풀 크기 조정을 참조하세요. 디스플레이 드라이버 및 런타임 구현을 간소화하기 위해 존재하는 한 가지 제약 조건은 지정된 바둑판식 리소스가 한 번에 최대 하나의 타일 풀에 대한 매핑만 가질 수 있다는 것입니다(여러 타일 풀에 동시 매핑하는 것이 아니라).
타일식 리소스 자체(즉, 독립적인 타일 풀 메모리)와 연결된 스토리지의 양은 지정된 시간에 실제로 풀에 매핑된 타일 수에 거의 비례합니다. 하드웨어에서 이 사실은 결국 페이지 테이블 스토리지용 메모리 사용 공간을 매핑되는 타일의 양으로 대략 크기 조정하는 것이 됩니다(예: 다단계 페이지 테이블 구성표를 적절하게 사용).
타일 풀은 Direct3D 애플리케이션이 낮은 수준 구현 세부 정보를 알 필요 없이(또는 포인터 주소를 직접 다룰 필요 없이) 그래픽 처리 디바이스(GPU)의 페이지 테이블을 효과적으로 프로그래밍할 수 있게 해주는 전적인 소프트웨어 추상화로 간주할 수 있습니다. 타일 풀은 하드웨어에서 추가 간접 수준을 전혀 적용하지 않습니다. 페이지 디렉터리와 같은 구조를 사용하여 단일 수준 페이지 테이블을 최적화하는 작업은 타일 풀 개념과는 관계가 없습니다.
실제로 구현에 필요한 것은 매핑된 것에 대략 비례하는 스토리지가 전부이지만, 최악의 경우 페이지 테이블 자체에 어떤 스토리지가 필요할 수 있는지 알아보겠습니다.
각 페이지 테이블 항목이 64비트라고 가정합니다.
Direct3D 11의 리소스 한도를 감안할 때 단일 표면에 대한 최악의 경우 타일식 리소스가 요소당 128비트 형식(예: RGBA float)으로 만들어지므로 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입니다. 또한 애플리케이션은 표면의 메모리 콘텐츠에 대한 초기 데이터를 전달할 수 없습니다. 왜냐하면 메모리 백업 없이 시작하기 때문입니다.
섹션 내용
항목 | 설명 |
---|---|
타일 풀 만들기 |
타일 풀은 pDesc 매개 변수가 가리키는 D3D11_BUFFER_DESC구조체의 MiscFlags 멤버에 D3D11_RESOURCE_MISC_TILE_POOL 플래그를 전달하여 ID3D11Device::CreateBuffer API를 통해 만들어집니다. |
타일 풀 크기 조정 |
타일 풀에 매핑되는 타일 리소스에 대해 더 많은 작업 집합이 필요하거나 공간이 더 적은 경우 축소하려면 ID3D11DeviceContext2::ResizeTilePool API를 사용하여 타일 풀을 확장합니다. |
위험 추적 및 타일 풀 리소스 |
타일이 없는 리소스의 경우 Direct3D는 렌더링 중에 특정 위험 조건을 방지할 수 있지만 위험 추적이 타일형 리소스의 타일 수준에 있기 때문에 타일식 리소스를 렌더링하는 동안 위험 조건을 추적하는 데 너무 비쌀 수 있습니다. |