본문 바로가기

DirectX/Direct2D,DirectWrite

Direct2D Resources Overview

https://docs.microsoft.com/en-us/windows/win32/direct2d/resources-and-resource-domains

 

Resources Overview - Win32 apps

Describes Direct2D resources and how they can be shared.

docs.microsoft.com

 

Direct2D 리소스는 그리기에 사용되는 개체이며 ID2D1Geometry 또는 ID2D1RenderTarget과 같은 Direct2D 인터페이스로 표시됩니다 . 

이 항목에서는 Direct2D 리소스의 종류와 공유 방법에 대해 설명합니다.

 

About Direct2D Resources

 

많은 하드웨어 가속 2D API들은 CPU-focused resource model이다.

그래서 CPU에서 렌더링이 잘 작동한다.

그리하여 몇 가지 하드웨어 가속 API는 CPU 리소스와 GPU 리소스를 매핑해주는 리소스 매니저가 필요하다.

GPU의 한계로 인해 이러한 동작은 모든 상황에서 가속될 수 없다.

이러한 경우 리소스 매니저는 CPU와 GPU간 커뮤니케이션을 시켜줘 CPU 렌더링으로 전환해주는 역할을 한다.

어떤 경우에는 렌더링이 CPU로 완전히 돌아가도록 예기치 않게 강제 할 수 있다.

또한 단순해 보이는 렌더링 작업에서 API를 통해 노출되지 않고 GPU리소스가 필요한 임시 중간 렌더링 단계가 필요할 수 도 있다.

 

Direct2D는 GPU를 최대한 활용하기 위해 보다 직접적인 매핑을 제공한다.

Direct2D는 장치 독립적 또는 장치 종속 두 가지 종류의 리소스를 제공한다.

 

  • 장치 독립적인 리소스CPU에서 유지
  • 장치 종속적인 리소스는 하드웨어 가속이 가능할 때 GPU 리소스에 직접적으로 매핑된다.
    렌더링 호출은 지오메트리의 정점 및 커버리지 정보를 장치 종속 리소스에서 생성된 텍스처링 정보와 결합하여 수행된다.

 

장치 종속 리소스를 생성하면 장치가 생성될 때 시스템 리소스 (사용 가능한 경우 GPU 또는 CPU)가 할당되며 렌더링 작업간에 변경되지 않는다. 

이 상황에서는 리소스 관리자가 필요하지 않다.

리소스 관리자 제거로 일반적인 성능이 향상되는 것 외에도 장치 종속 리소스를 사용하면 중간 렌더링을 직접 제어할 수도 있다.

 

Direct2D는 리소스에대한 많은 제어를 제공하기 때문에 다양한 종류의 리소스함께 사용할 수 있는 시기이해해야한다.



Device-Independent Resources

 

장치 독립적인 리소스는 항상 CPU에 상주하며 하드웨어 렌더링 장치와 연결되지 않는다.

 

  • ID2D1DrawingStateBlock
  • ID2D1Factory
  • ID2D1Geometry 및 여기서 상속되는 인터페이스
  • ID2D1GeometrySink 및 ID2D1SimplifiedGeometrySink
  • ID2D1StrokeStyle

 

장치 독립적인 리소스인 ID2D1Factory를 사용하여 장치 독립적인 리소스를 만든다.

 

렌더 타깃을 제외하고 Factory에서 생성된 모든 리소스는 장치 독립적이다. (렌더 타깃은 장치 종속적인 리소스)

 

Device-Dependent Resources

 

장치 종속 리소스특정 렌더링 장치와 연결된다.

하드웨어 가속을 사용할 수 있는 Device는 GPU이고 그렇지 않다면 CPU이다.

 

대부분의 장치 종속적 리소스를 생성할 때 렌더 타깃을 사용한다.

렌더 타깃을 생성하기 위해서는 factory를 사용한다.

 

장치 종속 리소스의 예

 

  • ID2D1Brush : 렌더타깃을 이용해 생성
  • ID2D1Layer : 렌더타깃을 이용해 생성
  • ID2D1RenderTarget : 렌더 타깃을 생성하기 위해서 factory를 사용하거나 다른 렌더 타깃을 사용한다.

 

장치 종속 리소스연결된 렌더링 디바이스가 사용할 수 없게 될 때 쓸모없어지게 된다.

이는 당신이 렌더타깃에 대해 D2DERR_RECREATE_TARGET 에러를 수신할 경우 렌더타깃과 모든 리소스를 다시 생성해야 한다는 것을 의미한다.



Sharing Factory Resources

 

factory에서 생성한 장치 독립적 리소스는 같은 factory가 생성한 모든 다른 리소스(디바이스 독립, 종속 모두)와 공유할 수 있다.

예를 들어 만약 같은 factory에서 생성된 것이라면 이 2개의 ID2D1RenderTarget을 사용하여 같은 ID2D1RectangleGeometry에 그릴 수 있다.

 

싱크 인터페이스 ( ID2D1SimplifiedGeometrySink , ID2D1GeometrySink 및 ID2D1TessellationSink)는 모든 factory에서 만든 리소스와 공유 할 수 있다. 

Direct2D의 다른 인터페이스와 달리 싱크 인터페이스의 모든 구현을 사용할 수 있다. 

Sharing Render Target Resources

 

렌더 타깃에서 만든 리소스를 공유하는 기능은 렌더타깃의 종류에 따라 다르다.

D2D1_RENDER_TARGET_TYPE_DEFAULT 유형의 렌더타깃을 만들 때 해당 렌더타깃에서 만든 리소스는 해당 렌더타깃에서만 사용할 수 있다.

이는 렌더타깃이 사용하게 될 장치를 모르기 때문에 발생한다.

 

다음 섹션에서는 하나의 렌더 타깃에서 만든 리소스를 다른 렌더 타깃과 공유할 수 있는 상황에 대해 설명한다.



Hardware Render Targets

 

원격 모드가 호환된다면 모든 하드웨어를 사용하는 렌더타깃 사이에서 리소스를 공유할 수 있다.

원격 모드는 오직 렌더타깃이 둘 모두 D2D1_RENDER_TARGET_USAGE_FORCE_BITMAP_REMOTING 또는 D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE usage flag를 사용할 때

또는 둘 다 flag를 지정하지 않았을 때만 서로 호환되는 것을 보장해준다.

이러한 설정은 리소스가 항상 같은 컴퓨터에 위치할 것을 보장해준다.

사용 모드를 지정하려면 렌더타깃을 생성하는데 사용하는 D2D1_RENDER_TARGET_PROPERTIES 구조체의 usage filed를 하나 이상의 D2D1_RENDER_TARGET_USAGE flags를 지정해야 한다.



DXGI Surface Render Targets

 

DXGI surface render target에 의해 만들어진 리소스는 동일한 기본 Direct3D device를 사용하는 또 다른 DXGI surface render target과 공유할 수 있다. 



Compatible Render Targets and Shared Bitmaps

 

렌더타깃과 해당 렌더타깃에 의해 생성된 호환 가능한 렌더타깃 간에 리소스를 공유할 수 있다.

호환되는 렌더타깃을 만들려면 ID2D1RenderTarget :: CreateCompatibleRenderTarget 메서드를 사용한다.

 

ID2D1Bitmap을 생성하기 위해  ID2D1RenderTarget::CreateSharedBitmap 메서드를 사용할 수 있고 메서드가 성공하면 메서드 호출에 지정된 두 렌더타겟 사이에서 ID2D1Bitmap이 공유될 수 있다.

이 메서드는 두 렌더타깃이 렌더링이 동일한 기본 device를 사용한다면 정상적으로 수행된다.