Device๋?
๐โโ๏ธDevice
๐ชDevice
DiectX์์์ Device๋ ์ธ๋ ฅ์ฌ๋ฌด์์ ๋น์ทํ๋ค.
GPU์ ์ง์ ํํ ์ญํ ์ ํ๋๋ฐ ๊ฐ์ข ๊ฐ์ฒด๋ฅผ ์์ฑ ๋ฑ์ ์ผ์ ํ๋ค.
DirecX9์์๋ ์ฌ๊ธฐ์ ๋ชจ๋ ์ผ์ ๋ด๋นํ๋๋ฐ DirectX๊ฐ ๋ฐ์ ํ๋ฉด์ CommandQueue, SwapChain ๋ฑ๋ฑ์ผ๋ก ๋๋์ด์ก๋ค.
Device.h ๋ถ์
class Device
{
public:
void Init();
ComPtr<IDXGIFactory> GetDXGI() { return _dxgi; }
ComPtr<ID3D12Device> GetDevice() { return _device; }
private:
// COM(Component Object Model)
// - DX์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด ๋
๋ฆฝ์ฑ๊ณผ ํ์ ํธํ์ฑ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ธฐ์
// - COM ๊ฐ์ฒด(COM ์ธํฐํ์ด์ค)๋ฅผ ์ฌ์ฉ. ์ธ๋ถ์ฌํญ์ ์ฐ๋ฆฌํํ
์จ๊ฒจ์ง
// - ComPtr ์ผ์ข
์ ์ค๋งํธ ํฌ์ธํฐ
ComPtr<ID3D12Debug> _debugController;
ComPtr<IDXGIFactory> _dxgi; // ํ๋ฉด ๊ด๋ จ ๊ธฐ๋ฅ๋ค
ComPtr<ID3D12Device> _device; // ๊ฐ์ข
๊ฐ์ฒด ์์ฑ
};
์์ผ๋ก ComPtr์ ์์ฃผ ์ฌ์ฉํ๊ฒ ๋๋๋ฐ COM์ด๋ Component Object Model์ ์ฝ์๋ก DirectX์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด ๋ ๋ฆฝ์ฑ๊ณผ ํ์ ํธํ์ฑ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ธฐ์ ์ด๋ผ๊ณ ํ๋ค.
์ดํดํ๊ธฐ ์ฝ๊ฒ ๋ค์ ์ค๋ช ํ๋ฉด ์ผ๋จ DirectX๋ ms์์ ๋ง๋ค์๋ค๋๊ฑธ ์์์ผํ๋ค.
๊ทธ๋ฐ๋ฐ GPU์ญ์ ms์์ ๋ง๋ ๊ฑด๊ฐ?? ์๋๋ค!
๊ทธ๋ผ ์ด๋ป๊ฒ GPU์ ๊ตฌ์กฐ๋ฅผ ์๊ณ ms์ DirectX๋ฅผ ํตํด์ GPU๋ฅผ ์กฐ์ํ๋๊ฒ์ผ๊น?
์ด๊ฒ์ ํ๊ฒ ํด์ฃผ๋๊ฒ COM์ธ ๊ฒ์ด๋ค!!
ms๋ GPU๋ฅผ ๋ง๋๋ ์ ์ฒด(์ธํ ๋ฑ๋ฑ)๊ณผ ํ์ ์ ํด์ DirectX๋ผ๋ ํต์ผ๋ ๊ท๊ฒฉ์ผ๋ก ์ปจํธ๋กค์ด ๊ฐ๋ฅํ๋๋ก ๋ง๋ค์ด์ค ๊ฒ์ด๋ค.
ComPtr์ ์ผ์กฐ์ผ์ด ์ค๋งํธ ํฌ์ธํฐ๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋๋ฐ, ComPtr์์ผ๋ก ๋ค์ด๊ฐ์ ํ์ธํด๋ณด๋ฉด RefCount๋ฅผ ๊ด๋ฆฌํ๋ ๊ฑธ ๋ณผ ์ ์๋ค.
๊ทธ๋์ ์ผ๋ฐ์ ์ธ ์ค๋งํธ ํฌ์ธํฐ์ฒ๋ผ new delete๋ฅผ ํด์ฃผ์ง ์๊ณ ํธํ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
(๋ฉ๋ชจ๋ฆฌ๊ฐ ๋์๋ ๊ฑฑ์ ์ ์ํด๋๋๋ค.)
์๋ฌดํผ ComPtr์ ์ค๋ช
์ ์ด๋ ๊ฒ ํ๊ณ ๋ด๋ถ ๋ณ์๋ก ์๋ ComPtr<ID3D12Debug> _debugController
, ComPtr<IDXGIFactory> _dxgi
, ComPtr<ID3D12Device> _device
๊ฐ Device์ ํต์ฌ ๋ด์ฉ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
_dxgi
๋ ์ฃผ์์์ ๋ณผ ์ ์๋ฏ ํ๋ฉด ๊ด๋ จ ๊ธฐ๋ฅ๋ค์ ๋ด๋นํ๊ณ , _divece
๊ฐ ๊ฐ์ข
๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
_debugController
๋ ๋๋ฒ๊ทธ๋ฅผ ์์ธํ๊ฒ ๋ณผ ์ ์๋๋กํ๋ค๊ณ ํจ.
๊ตฌํ๋ถ๋ก ๋์ด๊ฐ์ ๊ตฌํ๋ถ๋ฅผ ๋ถ์ํด๋ณด์.
device.cpp ๋ถ์
#include "pch.h"
#include "Device.h"
void Device::Init()
{
// D3D12 ๋๋ฒ๊ทธ์ธต ํ์ฑํ
// - VC++ ์ถ๋ ฅ์ฐฝ์ ์์ธํ ๋๋ฒ๊น
๋ฉ์์ง ์ถ๋ ฅ
// - riid : ๋๋ฐ์ด์ค์ COM ID
// - ppDevice : ์์ฑ๋ ์ฅ์น๊ฐ ๋งค๊ฐ๋ณ์์ ์ค์
#ifdef _DEBUG
::D3D12GetDebugInterface(IID_PPV_ARGS(&_debugController));
_debugController->EnableDebugLayer();
#endif
// DXGI (DirectX Graphics Infrastructure)
// Direct3D์ ํจ๊ป ์ฐ์ด๋ API
// - ์ ์ฒด ํ๋ฉด ๋ชจ๋ ์ ํ
// -์ง์๋๋ ๋์คํ๋ ์ด ๋ชจ๋ ์ด๊ฑฐ ๋ฑ
// CreateDXGIFactory
// - riid : ๋๋ฐ์ด์ค์ COM ID
// - ppDevice : ์์ฑ๋ ์ฅ์น๊ฐ ๋งค๊ฐ๋ณ์์ ์ค์
::CreateDXGIFactory(IID_PPV_ARGS(&_dxgi));
// CreateDevice
// - ๋์คํ๋ ์ด ์ด๋ํฐ(๊ทธ๋ํฝ ์นด๋)๋ฅผ ๋ํ๋ด๋ ๊ฐ์ฒด
// - pAdapter : nullptr ์ง์ ํ๋ฉด ์์คํ
๊ธฐ๋ณธ ๋์คํ๋ ์ด ์ด๋ํฐ
// - MinimumFeatureLevel : ์์ฉ ํ๋ก๊ทธ๋จ์ด ์๊ตฌํ๋ ์ต์ ๊ธฐ๋ฅ ์์ค (๊ตฌ๋ฅ๋ค๋ฆฌ ๊ฑธ๋ฌ๋ธ๋ค)
// - riid : ๋๋ฐ์ด์ค์ COM ID
// - ppDevice : ์์ฑ๋ ์ฅ์น๊ฐ ๋งค๊ฐ๋ณ์์ ์ค์
::D3D12CreateDevice(nullptr, D3D_FEATURE_LEVEL_11_0, IID_PPV_ARGS(&_device));
// IID_PPV_ARGS
// #define IID_PPV_ARGS(ppType) __uuidof(**(ppType)), IID_PPV_ARGS_Helper(ppType)
// ์ด๋ ๊ฒ ์ ์๋์ด ์๊ณ id์ ์ด์คํฌ์ธํฐ๋ฅผ ๋ฝ์์จ๋ค.
// ์์ฃผ ์ฌ์ฉ๋ ์์ด
}
Init()
์์ ์ด๊ธฐํ๋ฅผํ๋ค.
์ด๊ธฐํ๋ฅผ ํ๋๊ฒ ๋ด๋ถ ๋ณ์์๋ _debugController
, _dxgi
, _device
๋ฅผ ์ด๊ธฐํ๋ฅผ ํ๋ค๋ ๋ป.
Device ๋ด์ฉ์ ๋ณด๋ฉด ์์ด ๋ง์ง ์์๋ฐ
#ifdef _DEBUG
::D3D12GetDebugInterface(IID_PPV_ARGS(&_debugController));
_debugController->EnableDebugLayer();
#endif
API๋ฅผ ๋ณด๋ฉด ์ ์ ์๋ฏ ๋งค๊ฐ๋ณ์๋ก ์ด๊ธฐํํ ๊ฐ์ ๋ฃ์ด์ค์ ์ด๊ธฐํ๋ฅผ ํ๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ด๊ธฐํ๋ฅผ ํ๋ค๊ณ ํ๋ฉด = {์ด์ฉ๊ตฌ ์ ์ฉ๊ตฌ}
๋ผ๊ณ ์๊ฐํ๋๋ฐ ์ข ์ ๊ธฐํ๋ ๋ถ๋ถ.
๊ทธ๋ฆฌ๊ณ ๊ฐ์์์ IID_PPV_ARGS
๊ฐ ์์ฃผ ์ฌ์ฉ๋ ์น๊ตฌ๋ผ๊ณ ๋์ฌ๊ฒจ ๋ด๋ผ๊ณ ํ๋ค.
ํ๊ณ ๋ค์ด๊ฐ์ IID_PPV_ARGS
๊ฐ ์ด๋ป๊ฒ ์๊ฒผ๋์ง ์ดํด๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
define์ผ๋ก ์ ์ ๋์ด์๋๋ฐ ์ ๋ณด๋ฉด id๋ฅผ ๊ฐ์ ธ์ค๊ณ ๋ ๋ฒ์จฐ๋ก๋ ํด๋นํ์
์ ์ด์คํฌ์ธํฐ ๊ฐ์ ๊ฐ์ ธ์จ๋ค.
์ค์ ๋ก ::D3D12GetDebugInterface
๊ฐ ์๊ตฌํ๋ ๋งค๊ฐ๋ณ์๋ ๊ฐ์๊ฒ์ ํ์ธ ํ ์ ์์๋ค.
๊ทธ ๋ค์ DXGI!
DXGI (DirectX Graphics Infrastructure) ๋ง์ง๋ง์ ๋ฐ์์ด ์ธํ๋ผ์คํธ๋ญ์ฒ์ด๋ค.
์ฃผ์์์ ๋ณผ ์ ์๋ฏ Direct3D์ ํจ๊ป ์ฐ์ด๋ API์ด๋ค.
์ ์ฒด ํ๋ฉด ๋ชจ๋ ์ ํ, ์ง์๋๋ ๋์คํ๋ ์ด ๋ชจ๋ ์ด๊ฑฐ ๋ฑ์ ์ญํ ์ ํ๋ค.
CreateDevice
๋์คํ๋ ์ด ์ด๋ํฐ(๊ทธ๋ํฝ ์นด๋)๋ฅผ ๋ํ๋ด๋ ๊ฐ์ฒด์ด๋ค.
์ฒซ ๋ฒ์งธ ๋ณ์์ธ pAdapter
์ nullptr๋ก ์ง์ ํ๋ฉด ์์คํ
๊ธฐ๋ณธ ๋์คํ๋ ์ด ์ด๋ํฐ๊ฐ๋๋ค.
MinimumFeaturLevel
์ ์์ฉํ๋ก๊ทธ๋จ์ด ์๊ตฌํ๋ ์ต์ ๊ธฐ๋ฅ ์์ค์ ์ ํ๋ค.
๋๋ฌด ์์ข์ ์๋ฅ์ ์ปดํจํฐ๋ผ๋ฉด ๊ฑธ๋ฌ์ง๋ค.
riid
๋ ๋๋ฐ์ด์ค์ COM ID, ppDevice
๋ ์์ฑ๋ ์ฅ์น๊ฐ ๋งค๊ฐ๋ณ์์ ์ค์ ๋๋ค.
์ ๋ฆฌํ๋ฉด Device๊ฐ Engine์์ ๊ฐ์ฅ ์ค์ฌ์ด ๋๋ ์ญํ ์ ํ๋ค๊ณ ์ดํดํ๋ฉด ๋ ๊ฑฐ๊ฐ๋ค.