매핑이 타일 풀에 있습니다.
D3D11_RESOURCE_MISC_TILED 플래그를 사용하여 리소스를 만들 때 리소스를 구성하는 타일은 타일 풀의 위치를 가리키는 것에서 비롯됩니다. 타일 풀은 메모리 풀입니다(애플리케이션에서 볼 수 없는 백그라운드에서 하나 이상의 할당으로 지원됨). 운영 체제 및 디스플레이 드라이버는 이 메모리 풀을 관리하며, 메모리 공간은 애플리케이션에서 쉽게 이해할 수 있습니다. 타일식 리소스는 타일 풀의 위치를 가리켜 64KB 지역을 매핑합니다. 이 설정의 한 가지 실패는 여러 리소스가 동일한 타일을 공유하고 재사용할 수 있으며, 원하는 경우 리소스 내의 다른 위치에서 동일한 타일을 다시 사용할 수 있다는 것입니다.
타일 풀에서 리소스에 대한 타일을 유연하게 채우는 데 드는 비용은 리소스가 타일 풀의 타일이 리소스에 필요한 타일을 나타내는 매핑을 정의하고 유지 관리하는 작업을 수행해야 한다는 것입니다. 타일 매핑을 변경할 수 있습니다. 또한 리소스의 모든 타일을 한 번에 매핑해야 하는 것은 아닙니다. 리소스에는 NULL 매핑이 있을 수 있습니다. NULL 매핑은 타일에 액세스하는 리소스의 관점에서 타일을 사용할 수 없는 것으로 정의합니다.
여러 타일 풀을 만들 수 있으며, 타일된 리소스의 수는 지정된 타일 풀에 동시에 매핑될 수 있습니다. 타일 풀을 늘리거나 축소할 수도 있습니다. 자세한 내용은 타일 풀 크기 조정참조하세요. 디스플레이 드라이버 및 런타임 구현을 간소화하기 위해 존재하는 한 가지 제약 조건은 지정된 바둑판식 리소스가 한 번에 최대 하나의 타일 풀에 매핑을 가질 수 있다는 것입니다(여러 타일 풀에 동시 매핑하는 것이 아니라).
바둑판식 리소스 자체(즉, 독립 타일 풀 메모리)와 연결된 스토리지의 양은 지정된 시간에 실제로 풀에 매핑된 타일 수에 비례합니다. 하드웨어에서 이 사실은 매핑된 타일의 양(예: 다단계 페이지 테이블 구성표를 적절하게 사용)을 사용하여 페이지 테이블 스토리지의 메모리 공간을 대략적으로 스케일링하는 것으로 귀결됩니다.
타일 풀은 Direct3D 애플리케이션이 낮은 수준의 구현 세부 정보를 알거나 포인터 주소를 직접 처리하지 않고도 GPU(그래픽 처리 장치)에서 페이지 테이블을 효과적으로 프로그래밍할 수 있도록 하는 완전히 소프트웨어 추상화라고 생각할 수 있습니다. 타일 풀은 하드웨어에서 추가 수준의 간접 참조를 적용하지 않습니다. 페이지 디렉터리 같은 구문을 사용하여 단일 수준 페이지 테이블의 최적화는 타일 풀 개념과 독립적입니다.
최악의 경우 페이지 테이블 자체에 필요할 수 있는 스토리지를 살펴보겠습니다(실제로 구현에서는 매핑된 항목에 비례하는 스토리지만 필요).
각 페이지 테이블 항목이 64비트라고 가정합니다.
Direct3D 11의 리소스 제한을 감안할 때 단일 표면에 대한 최악의 페이지 테이블 크기 적중의 경우 타일식 리소스가 요소당 128비트 형식(예: RGBA float)으로 만들어지므로 64KB 타일에는 4096픽셀만 포함됩니다. 지원되는 최대 Texture2DArray 크기는 16384*16384*2048(단 하나의 mipmap만 있음)으로 64비트 테이블 항목을 사용하여 완전히 채워진 경우 페이지 테이블에 약 1GB의 스토리지가 필요합니다(밉맵 포함 안 함). Mipmap을 추가하면 완전히 매핑된(최악의 경우) 페이지 테이블 스토리지가 약 3분의 1, 약 1.3GB로 증가합니다.
이 경우 주소 지정 가능한 메모리의 약 10.6테라바이트에 액세스할 수 있습니다. 그러나 주소 지정 가능한 메모리의 양에 제한이 있을 수 있습니다., 이러한 금액을 줄일 것 이다, 아마도 테라바이트 범위 주위.
고려해야 할 또 다른 사례는 mipmap을 포함하여 요소당 32비트 형식의 단일 Texture2D 타일식 리소스 16384*16384입니다. 완전히 채워진 페이지 테이블에 필요한 공간은 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는 렌더링 중에 특정 위험 조건을 방지할 수 있지만, 타일식 리소스의 경우 위험 추적이 타일 수준에 있기 때문에 타일식 리소스를 렌더링하는 동안 위험 조건을 추적하는 데 비용이 너무 많이 들 수 있습니다. |