다음을 통해 공유


타일식 리소스 API

이 섹션에 설명된 API는 바둑판식 리소스 및 타일 풀에서 작동합니다.

타일 풀에서 리소스에 타일 할당

ID3D11DeviceContext2::UpdateTileMappingsID3D11DeviceContext2::CopyTileMappings API는 타일 매핑을 조작하고 쿼리합니다. 업데이트 호출은 호출에서 식별된 타일에만 영향을 줍니다. 다른 타일은 이전에 정의된 대로 남아 있습니다.

타일 풀의 지정된 타일은 리소스의 여러 위치와 여러 리소스에 매핑할 수 있습니다. 이 매핑에는 여러 Mipmap이 단일 타일로 함께 압축되는 구현 선택 레이아웃(Mipmap 패킹)이 있는 리소스의 타일이 포함됩니다. catch는 데이터가 하나의 매핑을 통해 타일에 기록되지만 다르게 구성된 매핑을 통해 읽는 경우 결과가 정의되지 않는다는 것입니다. 그러나 이러한 유연성을 신중하게 사용하는 것은 동시에 사용되지 않는 리소스 간에 타일을 공유하는 것과 같이 애플리케이션에 유용할 수 있습니다. 여기서 타일의 콘텐츠는 나중에 읽게 될 것과 동일한 리소스 매핑을 통해 항상 초기화됩니다. 마찬가지로, 동일한 표면 차원을 가진 여러 다른 리소스의 압축된 mipmap을 보관하도록 매핑된 타일이 제대로 작동합니다. 데이터는 두 매핑에서 동일하게 표시됩니다.

리소스에 대한 타일 할당을 즉시 또는 지연된 컨텍스트에서 언제든지 변경할 수 있습니다.

리소스 타일링 및 지원 쿼리

리소스 타일링을 쿼리하려면 ID3D11Device2::GetResourceTiling을 사용합니다.

다른 리소스 타일링 지원의 경우 ID3D11Device2::CheckMultisampleQualityLevels1을 사용합니다.

타일화된 데이터 복사

매핑되지 않은 영역에 대한 쓰기가 삭제되고 매핑되지 않은 영역에서 읽기가 0을 생성한다는 점을 제외하고, 타일식 리소스를 사용하여 데이터를 이동하는 Direct3D의 모든 메서드는 타일식 리소스와 함께 작동합니다. 대상 리소스의 여러 위치가 동일한 타일 메모리에 매핑되기 때문에 복사 작업에 동일한 메모리 위치에 여러 번 쓰는 경우 다중 매핑된 타일에 대한 쓰기는 비결정적이고 반복 불가능합니다. 즉, 하드웨어가 복사본을 실행하는 순서에 관계없이 액세스가 발생합니다.

Direct3D 11.2에는 다음과 같은 추가 복사 방법에 대한 메서드가 도입되었습니다.

이러한 메서드는 필요에 따라 swizzle/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 타일 내의 메모리에서 선형이며, 하드웨어 및 디스플레이 드라이버는 타일에서 타일로/바둑판식 리소스로 전송할 때 적절하게 타일당 swizzle/deswizzle을 만듭니다. MSAA(다중 샘플 앤티앨리어싱) 표면의 경우 각 픽셀의 샘플은 다음 픽셀로 이동하기 전에 샘플 인덱스 순서로 트래버스됩니다. 타일 너비가 픽셀 단위의 배수가 아닌 너비가 있는 표면의 경우 오른쪽에 부분적으로 채워진 타일의 경우 행 아래로 이동하는 피치/보폭은 타일이 가득 차면 타일에 맞는 숫자 픽셀의 전체 크기(바이트)입니다. 따라서 메모리의 각 픽셀 행 사이에 간격이 있을 수 있습니다. 사양 편의를 위해 타일보다 작은 Mipmap은 선형 레이아웃에 함께 압축되지 않습니다. 이는 메모리 공간을 낭비하는 것처럼 보이지만, 언급했듯이 복사를 통해 하드웨어 팩이 CopyTiles 또는 UpdateTiles를 통해 허용되지 않는다는 것을 mips로 복사할 수 있습니다. 이 애플리케이션은 일반 UpdateSubresource*() 또는 CopySubresource*() API를 사용하여 작은 mips를 개별적으로 복사할 수 있지만, CopySubresource*()의 경우 선형 메모리가 타일식 리소스와 동일해야 합니다. CopySubresource*()는 버퍼 리소스에서 instance 대한 Texture2D로 복사할 수 없습니다.

하드웨어 표준 스위즐이 정의되면 버퍼의 데이터를 해당 형식으로 해석해야 함을 나타내기 위해 플래그를 추가할 수 있지만(전송 시 스위즐 필요 없음) 애플리케이션이 타일 풀 메모리에 직접 액세스할 수 있도록 허용하는 등 데이터를 업로드하는 대체 방법도 합리적일 수 있습니다.

복사 작업은 즉시 또는 지연된 컨텍스트에서 수행할 수 있습니다.

타일 풀 크기 조정

타일 풀의 크기를 조정하려면 ID3D11DeviceContext2::ResizeTilePool을 사용합니다.

타일형 리소스 장벽

여러 타일식 리소스 간에 데이터 액세스 순서 제약 조건을 지정하려면 ID3D11DeviceContext2::TiledResourceBarrier를 사용합니다.

타일형 리소스