이전 내용은 DirectX11 기반 내용을 현재 DirectX12에 맞게 검색한 뒤 작성한 내용입니다.

이후 DirectX12 책을 구매하였고, 몇가지 내용이 추가되어 그 내용을 우선 작성합니다.

 

---------------------------------------------------------------------------------------------------

 

DXGI(DirectX Graphics Infrastructure)

  • DirectX3D와 함께 쓰이는 API로 여러 그래픽 API들에 공통인 그래픽 관련 작업들이 존재한다.

    • 예를 들어 SwapChain을 위한 대표적인 Interface인 IDXGISwapShain은 사실 DXGI API일부이다.

    • 그 밖에 Graphic System Data의 Enumeration. 그리고 지원되는 표현 형식들도 DXGI가 제공한다.

IDXGIFactory

  • 주로 IDXGISwapChain Interface 생성과 Display Adapter Enumeration에 쓰인다.

IDXGIAdapter

  • Display Adapter를 대표하는 Interface

Display Adapter

  • 그래픽 기능성을 구현하며, 일반적으로 하드웨어 장치(ex. Graphic Card)이다.

    • 하지만 하드웨어 그래픽 기능성을 흉내내는 소프트웨어 디스플레이 기능성도 존재한다.

  • 하나의 시스템은 여러개의 Adpater를 가질 수 있다.

IDXGIOutput

  • Display Output을 담당하는 Interface.

  • DXGI_MODE_DESC 구조체에는 하나의 Display Mode를 서술하는 여러 멤버들이 있다.

typedef struct DXGI_MODE_DESC {
  UINT                     Width;
  UINT                     Height;
  DXGI_RATIONAL            RefreshRate;
  DXGI_FORMAT              Format;
  DXGI_MODE_SCANLINE_ORDER ScanlineOrdering;
  DXGI_MODE_SCALING        Scaling;
} DXGI_MODE_DESC;

typedef struct DXGI_RATIONAL {
  UINT Numerator;
  UINT Denominator;
} DXGI_RATIONAL;

typedef enum DXGI_MODE_SCANLINE_ORDER { 
  DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED        = 0,
  DXGI_MODE_SCANLINE_ORDER_PROGRESSIVE        = 1,
  DXGI_MODE_SCANLINE_ORDER_UPPER_FIELD_FIRST  = 2,
  DXGI_MODE_SCANLINE_ORDER_LOWER_FIELD_FIRST  = 3
} DXGI_MODE_SCANLINE_ORDER;

typedef enum DXGI_MODE_SCALING { 
  DXGI_MODE_SCALING_UNSPECIFIED  = 0,
  DXGI_MODE_SCALING_CENTERED     = 1,
  DXGI_MODE_SCALING_STRETCHED    = 2
} DXGI_MODE_SCALING;

https://docs.microsoft.com/en-us/previous-versions/windows/desktop/legacy/bb173064(v=vs.85)

 

DXGI_MODE_DESC structure (Windows)

DXGI_MODE_DESC structure 05/18/2018 2 minutes to read In this article --> Describes a display mode. Syntax typedef struct DXGI_MODE_DESC { UINT                     Width; UINT                     Height; DXGI_RATIONA

docs.microsoft.com

  • 이러한 Display Mode Enumeration은 전체 화면 모드로 갈 때 특히 중요하다.

    • 성능을 극대화 하려면 지정된 Display Mode가 반드시 모니터가 지원하는 Display Mode와 일치해야 한다.

    • 모니터가 지원하는 Display Mode들을 열거해 그 중 하나를 지정하면 이러한 일치성이 보장된다.

Display Output

  • 모니터와 같이 화면을 출력하는 장치.

기능 지원 점검

  • ID3D12Device::CheckFeatureSupport 메서드는 Graphic Driver의 MultiSampling 지원 여부를

    점검할 수 있다고 소개했다.

    • 하지만 이는 CheckFeatureSupport가 확인할 수 있는 수 많은 기능들 중 하나일 뿐이다.

  • CheckFeatureSupport의 서명은 다음과 같다.

HRESULT CheckFeatureSupport(
  D3D12_FEATURE Feature,
  void          *pFeatureSupportData,
  UINT          FeatureSupportDataSize
);
  • Feature는 이 메서드로 지원 여부를 점검할 기능들의 종류를 나타낸다.

  • pFeatureSupportData는 기능 지원 정보가 설정될 구조체를 가르키는 포인터이다.

    • 이는 Feature 값에 따라 구체적인 형식이 다르다.

  • FeatureSupportDataSize는 pFeatureSupportData에 전달한 구조체의 크기를 나타낸다.

D3D12_FEATURE_D3D12_OPTIONS

  • Direct3D 12의 여러 기능들을 점검한다.

  • pFeatureSupportData에는 D3D12_FEATURE_DATA_D3D12_OPTIONS 인스턴스를 가르키는 포인터를 넣어야 한다.

DED12_FEATURE_ARCHITECTURE

  • Hardware Architecture 기능들을 점검한다.

  • pFeatureSupportData에 D3D12_FEATURE_DATA_ARCHITECTURE 인스턴스를 가르키는 포인터를 넣어야 한다.

D3D12_FEATURE_FEATURE_LEVELS

  • 기능 수준들을 점검한다.

  • D3D12_FEATURE_DATA_FEATURE_LEVELS 인스턴스를 가리키는 포인터를 넣어야 한다.

D3D12_FEATURE_FORMAT_SUPPORT

  • 주어진 Texture 형식에 대한 기능들을 점검한다.

  • D3D12_FEATURE_DATA_FORMAT_SUPPORT 인스턴스를 가르키는 포인터를 넣어야 한다.

D3D12_FEATURE_MULTICAMPLE_QUALITY_LEVELS

  • MultiSampling 기능들을 점검한다.

  • D3D12_FEATURE_DATA_MULTISAMPLING_QUALITY_LEVELS 인스턴스를 가르키는 포인터를 넣어야 한다.

상주성(Residency)

  • 게임에 사용되는 모든 자원이 GPU를 필요로 하는 것은 아니다.

  • 때문에 Direct3D 12의 Application은 Resource를 GPU 메모리로부터 내리거나 올려서
    Residency를 관리한다.

    • 이러한 작업의 핵심은 GPU Memory 점유율을 최소화 하는 것이다.

  • 성능적 측면에서 한가지 주의해야 할 점이 있다.

    • Application은 같은 자원을 짧은 시간에 GPU Memory에 넣었다 뺐다 하는 상황을 피해야 한다.

    • 이러한 활동에는 비용이 따르기 때문이다.

  • 이상적으로, 한동안 사용하지 않는 Resource들만 GPU Memory에서 내려야 한다.

  • Residency을 변경하는 대표적인 예로는 Level이나 Area가 바뀌는 시점을 들 수 있다.

  • 보통은 Resource를 생성하면 GPU Memory에 올라가고, 파괴되면 Memory에서 내려간다.

    • 하지만 다음 메서드들을 이용해 Application이 직접 Residency를 제어할 수 있다.

HRESULT ID3D12Device::MakeResident(
  UINT           NumObjects,
  ID3D12Pageable * const *ppObjects
);

HRESULT ID3D12Device::Evict(
  UINT           NumObjects,
  ID3D12Pageable * const *ppObjects
);

https://docs.microsoft.com/en-us/windows/win32/api/d3d12/nf-d3d12-id3d12device-makeresident

 

ID3D12Device::MakeResident (d3d12.h) - Win32 apps

Makes objects resident for the device.

docs.microsoft.com

https://docs.microsoft.com/en-us/windows/win32/api/d3d12/nf-d3d12-id3d12device-evict

 

ID3D12Device::Evict (d3d12.h) - Win32 apps

Enables the page-out of data, which precludes GPU access of that data.

docs.microsoft.com

 

+ Recent posts