다음을 통해 공유


메모리 앨리어싱 및 데이터 상속

배치 및 예약된 리소스는 힙 내의 실제 메모리를 앨리어싱할 수 있습니다. 힙에 공유된 플래그가 설정되거나 앨리어싱된 리소스에 완전히 정의된 메모리 레이아웃이 있는 경우 배치된 리소스를 사용하면 예약된 리소스보다 더 많은 데이터 상속 시나리오가 가능해집니다.

별칭 지정

앨리어싱 장벽은 데이터 상속을 원하지 않더라도 동일한 물리적 메모리를 공유하는 두 리소스의 사용 간에 실행되어야 합니다. 간단한 사용 모델이라고 해도 이러한 작업에 포함되는 대상 리소스를 반드시 나타내야 합니다. 자세한 내용 및 고급 사용 모델에 대해서는 CreatePlacedResource를 참조하세요.

리소스에 액세스한 후에, 데이터 상속이 허용되지 않을 경우 해당 리소스와 물리적 메모리를 공유하는 모든 리소스는 무효화됩니다. 무효화된 리소스를 읽으면 정의되지 않은 리소스 콘텐츠가 표시됩니다. 무효화된 리소스에 쓰는 경우에도 다음 두 가지 조건이 충족되지 않으면 정의되지 않은 리소스 콘텐츠가 표시됩니다.

  • 리소스에 D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET 또는 D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL 없습니다.
  • 쓰기가 전체 하위 리소스 또는 타일에 대한 복사 또는 지우기 작업입니다. 타일 초기화는 64KB_TILE_UNDEFINED_SWIZZLE 및 64KB_TILE_STANDARD_SWIZZLE 있는 리소스에만 사용할 수 있습니다.

중복 무효화는 레이아웃이 텍셀 데이터의 위치 정보를 제공하며 리소스가 특정 장벽 전환 상태에 있을 때 좀 더 세분화되어 적용됩니다. 그러나 무효화의 세분성이 리소스 맞춤의 세분성보다 더 높을 수는 없습니다.

버퍼 맞춤 세분성은 64KB이며 좀 더 큰 맞춤 세분성이 우선적으로 적용됩니다. 이러한 측면은 여러 개의 4KB 텍스처가 서로 중복되지 않는 상태로 64KB 영역에 상주할 수 있으므로 4KB 텍스처를 고려할 때 중요합니다. 그러나 동일한 64KB 영역을 앨리어싱하는 버퍼를 해당 4KB 텍스처와 함께 사용할 수 없습니다. GPU는 정의되지 않은 패턴으로 64KB 영역 내에서 4KB 텍스처 데이터를 혼합할 수 있으므로, 애플리케이션이 버퍼에 대한 액세스가 4KB 텍스처와 교차하지 않도록 보장할 수 없습니다.

64KB_TILE_UNDEFINED_SWIZZLE, 64KB_TILE_STANDARD_SWIZZLE 및 ROW_MAJOR 텍스처 레이아웃은 겹치는 맞춤 세분성이 유효하지 않은지 애플리케이션에 알릴 수 있습니다. 예를 들어 애플리케이션은 배열 조각 2개, 단일 밉 수준 및 64KB_TILE_UNDEFINED_SWIZZLE 레이아웃을 사용하여 2D 렌더링 대상 텍스처 배열을 만들 수 있습니다. 애플리케이션이 각 배열 슬라이스가 100개의 64KB 타일을 차지할 것으로 이해한다고 가정합니다. 애플리케이션은 배열 조각 0 사용을 포기하고 해당 메모리를 ~6MB 버퍼, 정의되지 않은 레이아웃이 있는 ~6MB 텍스처 등에 다시 사용할 수 있습니다. 더 나아가 애플리케이션에 배열 조각 1의 첫 번째 타일이 더 이상 필요하지 않다고 가정합니다. 그러면 애플리케이션은 렌더링을 위해 배열 슬라이스 1의 첫 번째 타일이 다시 필요할 때까지 해당 위치에서 64KB 버퍼를 찾을 수도 있습니다. 애플리케이션은 텍스처 배열을 갖는 첫 번째 타일을 다시 사용하기 위해 전체 타일 지우기 또는 복사를 수행해야 할 수 있습니다.

그러나 레이아웃이 정의된 텍스처라도 여전히 문제가 발생할 수 있습니다. 일부 어댑터 아키텍처는 일반적인 렌더링 시나리오 동안 유효 대역폭을 줄이기 위해 텍스처에 대해 추가 메모리를 할당하기 때문에, 텍스처 리소스 크기가 애플리케이션이 자체적으로 계산할 수 있는 크기와 크게 다를 수 있습니다. 해당 추가 메모리 영역에 대한 모든 무효화는 전체 리소스가 무효화되도록 합니다. 자세한 내용은 GetResourceAllocationInfo를 참조하세요.

데이터 상속

배치된 리소스는 정의되지 않은 메모리 레이아웃을 사용하더라도 텍스처에 대한 데이터 상속 대부분을 허용합니다. 애플리케이션은 공유 힙의 동일한 오프셋에서 동일한 리소스 속성을 갖는 두 텍스처를 찾아 커밋된 공유 리소스가 지원하는 데이터 상속 기능을 모방할 수 있습니다. 최적화된 지우기 값 및 리소스 생성 방법의 유형(배치 또는 예약)을 비롯한 전체 리소스 설명이 동일해야 합니다. 하지만 두 리소스의 초기 전환 장벽 상태가 다를 수 있습니다.

예약된 리소스는 타일별 데이터 상속을 허용하지만, 리소스의 장벽 전환 상태에 대한 제한 사항도 존재합니다.

데이터를 상속하려면 두 리소스가 모두 호환되는 리소스 장벽 전환 상태여야 합니다.

  • 버퍼, 동시 액세스 텍스처 및 어댑터 간 텍스처의 경우, 리소스 전환 상태는 중요하지 않으며 모든 상태가 "호환 가능"합니다.
  • 64KB_TILE_UNDEFINED_SWIZZLE 또는 64KB_TILE_STANDARD_SWIZZLE 통해 이전 속성이나 다른 타일별 데이터 상속이 없는 예약된 텍스처의 경우 타일을 포함한 리소스 전환 장벽 상태는 공통 상태여야 합니다.
  • 리소스 설명이 정확히 일치하는 다른 모든 텍스처의 경우 각 해당 하위 리소스 쌍에 대한 리소스 전환 장벽 상태는 다음을 수행해야 합니다.
    • 공통된 상태일 수 있습니다.
    • 상태가 동일한 GPU-쓰기 플래그를 포함할 때 동일합니다.

GPU가 표준 혼합을 지원할 경우 버퍼 및 표준 혼합 텍스처가 동일한 메모리로 앨리어싱되고 서로 간에 데이터를 상속합니다. 표준 혼합 패턴은 메모리에서 텍셀이 배치되는 방식을 설명하므로 애플리케이션이 버퍼 표현의 텍셀을 조작할 수 있습니다. CPU 표시 혼합 패턴은 버퍼에 표시되는 GPU 표시 혼합 패턴과 동일합니다.

힙 내 하위 할당