프로그래밍 2023. 1. 10. 11:22

 

엔진 라이브러리에,

DxGraphicDevice 클래스를 만들고, 그 안의 함수들을 만들고 있다

(D3D12Hello 튜토리얼을 참조&분석,

튜토리얼에 포함된 폴더이름은 DirectX 12-Graphics-Samples-master)

 

먼저, 가장 먼저 해야될 작업인, 디바이스 생성을 따라가보자

m_pDevice 를 생성하기위해서는, 그 전에 몇가지 작업이 필요하다.

 

이 과정의 맨처음에는,

factory 라는 것을 생성해야 한다

이 factory 는 DX9 로 치자면, IDirect3D9 클래스에 해당한다

 

DXGI - DirectX Graphic Interface

//DXGI 팩터리를 사용하여 
//어댑터를 열거하고, 
//스왑 체인을 만들고,

//전체 화면 표시 모드로 전환하기 위한 alt+Enter 키 시퀀스와 창을 연결하는 개체를 생성합니다.

 

ComPtr<IDXGIFactory4> factory;

ComPtr 스마트 포인터를 사용하여, 해제 (release) 를 굳이 신경쓰지 않아도 된다

포인터를 가져오기 위해서는, factory.Get() 등의 정해진 인터페이스를 사용

 

나의 경우는, 좀더 직관적으로 사용하기 위해서

주요 인터페이스들은 모두 IDXGIFactory4* m_pfactory4;

이런식으로 사용하였다

이런 경우에는 프로그램이 끝날때,

명시적으로 m_pfactory4->Release() 가 필요해진다

 

몇몇의 함수는,

x64 에서는 문제가 없으나, x86 프로젝트에서는 링크에러를 뱉어낸다

주의하자!   

 

 

공부하면서 하는 것이라, 찾아본 설명, 주석을 많이 달아놓았다

코드 분석에 도움이 될수있으니, 참고해보자

 

 

void 
DxGraphicDevice::Step1_CreateDXGI_Factory( void )
{
    UINT dxgiFactoryFlags = 0;

#if defined(_DEBUG)
    //추가된 디버그 인터페이스, 좀 깊숙한 추적이 가능해 지려나?
    //실행과는 상관없다

    // Enable the debug layer (requires the Graphics Tools "optional feature").
    // NOTE: Enabling the debug layer after device creation will invalidate the active device.     
    ComPtr<ID3D12Debug> debugController;
    if( SUCCEEDED( D3D12GetDebugInterface( IID_PPV_ARGS(&debugController )) ) )
    {
        debugController->EnableDebugLayer();

        // Enable additional debug layers.
        dxgiFactoryFlags |= DXGI_CREATE_FACTORY_DEBUG;
        //DXGI_CREATE_FACTORY_DEBUG
    }
#endif

    /*
    //Engine 라이브러리 -> 일반 -> 추가종속성
    dxgi.lib
    d3d12.lib
    d3dcompiler.lib
    */

    //C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22621.0\um\x86
    //windows 의 dxgi.dll 필요한듯
    //ComPtr<IDXGIFactory4> factory;

    //checkhr( CreateDXGIFactory2( dxgiFactoryFlags, IID_PPV_ARGS(&factory) ) ); //dxgi1_3.h 
    //링크에러가 계속 뜬다, win32 프로젝트에서는 지원하지 않는 함수인듯
    //x64 프로젝트에서만 사용가능한 함수

    /*
    다른 DXGI 객체를 생성하는 데 사용할 수 있는 DXGI 팩토리를 생성합니다.
    Windows 8에서는 DXGIDebug.dll이 시스템에 있는 동안 생성된 모든 DXGI 팩터리가 로드되어 사용됩니다. 
    Windows 8.1부터 앱은 대신 DXGIDebug.dll을 로드하도록 명시적으로 요청합니다. 
    CreateDXGIFactory2를 사용하고 DXGI_CREATE_FACTORY_DEBUG 플래그를 지정하여 DXGIDebug.dll을 

    요청합니다. 
    DLL이 시스템에 있으면 로드됩니다.   
    */
    checkhr( CreateDXGIFactory1( IID_PPV_ARGS(&m_pFactory4) ) ); //x86
    //checkhr( CreateDXGIFactory2( dxgiFactoryFlags, IID_PPV_ARGS(&m_pFactory4) ) ); //x64

    //DXGI 팩터리를 사용하여 
    //어댑터를 열거하고, 
    //스왑 체인을 만들고, 전체 화면 표시 모드로 전환하기 위한 alt+Enter 키 시퀀스와 창을 연결하는 개체를 생성합니다.

    /* ComPtr 스마트포인터 사용안해도 된다
    IDXGIFactory4* factory4;
    CreateDXGIFactory1( IID_PPV_ARGS(&factory4) );
    */
}

 

posted by BK dddDang
: