이 섹션에 설명된 API는 타일식 리소스 및 타일 풀에서 작동합니다.
- 타일 풀에서 리소스 타일 할당
- 리소스 타일링 쿼리 및 지원
- 타일형 데이터 복사
- 타일 풀 크기 조정
- 타일형 리소스 장벽
- 관련 항목
타일 풀에서 리소스에 타일 할당
ID3D11DeviceContext2::UpdateTileMappings 및 ID3D11DeviceContext2::CopyTileMappings API가 타일 매핑을 조작하고 쿼리합니다. 업데이트 호출은 호출에서 식별된 타일에만 영향을 줍니다. 다른 타일은 이전에 정의된 대로 남아 있습니다.
타일 풀의 지정된 타일은 리소스의 여러 위치와 여러 리소스에 매핑될 수 있습니다. 이 매핑에는 여러 밉맵이 단일 타일로 함께 압축되는 구현 선택 레이아웃(Mipmap 압축)이 있는 리소스의 타일이 포함됩니다. 캐치는 데이터가 하나의 매핑을 통해 타일에 기록되지만 다르게 구성된 매핑을 통해 읽는 경우 결과가 정의되지 않는다는 것입니다. 이러한 유연성을 신중하게 사용하는 것은 동시에 사용되지 않는 리소스 간에 타일을 공유하는 것과 같이 애플리케이션에 유용할 수 있습니다. 여기서 타일의 콘텐츠는 나중에 읽는 것과 동일한 리소스 매핑을 통해 항상 초기화됩니다. 마찬가지로, 동일한 표면 차원을 가진 여러 리소스의 압축된 mipmap을 보관하도록 매핑된 타일이 제대로 작동합니다. 데이터는 두 매핑에서 동일하게 표시됩니다.
리소스에 대한 타일 할당에 대한 변경 내용은 즉시 또는 지연된 컨텍스트에서 언제든지 수행할 수 있습니다.
리소스 타일링 및 지원 쿼리
리소스 타일링을 쿼리하려면 ID3D11Device2::GetResourceTiling사용합니다.
다른 리소스 타일링 지원의 경우 ID3D11Device2::CheckMultisampleQualityLevels1사용합니다.
타일형 데이터 복사
매핑되지 않은 영역에 대한 쓰기가 삭제되고 매핑되지 않은 영역에서 읽기가 0을 생성한다는 점을 제외하고 타일식 리소스를 사용하여 데이터를 이동하는 Direct3D의 모든 메서드는 타일식 리소스를 사용하여 작동합니다. 대상 리소스의 여러 위치가 동일한 타일 메모리에 매핑되기 때문에 복사 작업에 동일한 메모리 위치에 여러 번 쓰는 작업이 필요한 경우 다중 매핑된 타일에 대한 쓰기는 비결정적이며 반복할 수 없습니다. 즉, 하드웨어에서 복사본을 실행하는 순서에 관계없이 액세스가 발생합니다.
Direct3D 11.2에는 다음과 같은 추가 복사 방법에 대한 메서드가 도입되었습니다.
- 타일식 리소스의 타일(64KB 타일 세분성)과 GPU(그래픽 처리 장치) 메모리(또는 스테이징 리소스)의 버퍼 간 복사 - ID3D11DeviceContext2::CopyTiles
- 애플리케이션 제공 메모리에서 타일식 리소스의 타일로 복사 - ID3D11DeviceContext2::UpdateTiles
이러한 메서드는 필요에 따라 스위즐/deswizzle하고 호출자가 대상 메모리가 진행 중인 GPU 작업에서 참조되지 않는다고 약속할 때 D3D11_TILE_COPY_NO_OVERWRITE 플래그를 허용합니다.
복사본에 포함된 타일에는 압축된 Mipmap이 포함되거나 정의되지 않은 결과가 있는 타일이 포함될 수 없습니다. 하드웨어가 하나의 타일로 압축하는 mipmap 간에 데이터를 전송하려면 표준(타일별이 아닌) 복사/업데이트 API 또는 ID3D11DeviceContext::GenerateMips 전체 밉 체인에 사용해야 합니다.
GenerateMips대한 참고: 부분적으로 매핑된 타일이 있는 리소스에서 ID3D11DeviceContext::GenerateMips 사용하면 하드웨어 및 디스플레이 드라이버가 GenerateMips 데 사용하는 알고리즘에 적용되는 NULL 읽고 쓰는 규칙을 따르는 결과가 생성됩니다. 따라서 NULL 매핑이 있는 영역(및 생성 단계 동안 다른 mips에 미치는 영향)이 애플리케이션이 신경 쓰는 표면 부분에 아무런 영향을 미치지 않는 한 애플리케이션에서 이 작업을 수행하는 것이 특히 유용하지 않습니다.
예를 들어 스테이징 화면 또는 애플리케이션 메모리에서 타일 데이터를 복사하면 디스크에서 스트리밍되었을 수 있는 타일을 업로드할 수 있습니다. 디스크에서 스트리밍할 때의 변형은 일종의 압축된 데이터를 GPU 메모리에 업로드한 다음 GPU에서 디코딩하는 것입니다. 디코딩 대상은 GPU 메모리의 버퍼 리소스일 수 있으며, 이 리소스는 CopyTiles 실제 바둑판형 리소스에 복사됩니다. 이 복사 단계를 사용하면 스위즐 패턴을 알 수 없는 경우 GPU를 스위즐할 수 있습니다. 바일링된 리소스 자체가 버퍼 리소스인 경우(예: 질감이 아닌) 스위즐링이 필요하지 않습니다.
복사의 타일이 아닌 버퍼 리소스 쪽에 있는 타일의 메모리 레이아웃은 단순히 64KB 타일 내의 메모리에서 선형이며, 하드웨어 및 디스플레이 드라이버는 타일 리소스로/바둑판식 리소스로 전송할 때 적절하게 타일당 스위즐/deswizzle을 합니다. MSAA(다중 샘플링 앤티앨리어싱) 표면의 경우 각 픽셀의 샘플은 다음 픽셀로 이동하기 전에 샘플 인덱스 순서로 트래버스됩니다. 오른쪽에 부분적으로 채워진 타일의 경우(너비가 타일 너비의 배수가 아닌 표면의 경우 픽셀) 행 아래로 이동하는 피치/보폭은 타일이 가득 찬 경우 타일에 맞는 숫자 픽셀의 전체 크기(바이트)입니다. 따라서 메모리의 각 픽셀 행 사이에 간격이 있을 수 있습니다. 사양 편의를 위해 타일보다 작은 Mipmap은 선형 레이아웃에 함께 압축되지 않습니다. 이는 메모리 공간 낭비인 것 같지만, 언급했듯이 CopyTiles 또는 updateTiles통해 하드웨어 팩을 함께 사용할 수 없다는 것을 mips에 복사하는 것은 허용되지 않습니다. 애플리케이션은 일반 UpdateSubresource*() 또는 CopySubresource*() API를 사용하여 작은 mips를 개별적으로 복사할 수 있지만, CopySubresource*()의 경우 선형 메모리가 타일식 리소스와 동일한 차원이어야 합니다. CopySubresource*()는 버퍼 리소스에서 Texture2D로 복사할 수 없습니다.
하드웨어 표준 스위즐이 정의된 경우 버퍼의 데이터를 해당 형식으로 해석해야 함을 나타내기 위해 플래그를 추가할 수 있지만(전송 시 스위즐 필요 없음), 애플리케이션이 타일 풀 메모리에 직접 액세스하도록 허용하는 등 데이터를 업로드하는 다른 방법도 합리적일 수 있습니다.
복사 작업은 즉시 또는 지연된 컨텍스트에서 수행할 수 있습니다.
타일 풀 크기 조정
타일 풀의 크기를 조정하려면 ID3D11DeviceContext2::ResizeTilePool사용합니다.
타일형 리소스 장벽
여러 타일식 리소스 간에 데이터 액세스 순서 지정 제약 조건을 지정하려면 ID3D11DeviceContext2::TiledResourceBarrier사용합니다.
관련 항목