๐Ÿ™‡โ€โ™€๏ธ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๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

ComPtr

๊ทธ๋ž˜์„œ ์ผ๋ฐ˜์ ์ธ ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ์ฒ˜๋Ÿผ 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์™€ ์ด์ค‘ํฌ์ธํ„ฐ๋ฅผ ๋ฝ‘์•„์˜จ๋‹ค.
	// ์ž์ฃผ ์‚ฌ์šฉ๋  ์•„์ด
}

device ๊ตฌํ˜„๋ถ€

Init() ์—์„œ ์ดˆ๊ธฐํ™”๋ฅผํ•œ๋‹ค.
์ดˆ๊ธฐํ™”๋ฅผ ํ•˜๋Š”๊ฒŒ ๋‚ด๋ถ€ ๋ณ€์ˆ˜์˜€๋˜ _debugController, _dxgi, _device๋ฅผ ์ดˆ๊ธฐํ™”๋ฅผ ํ•œ๋‹ค๋Š” ๋œป.

Device ๋‚ด์šฉ์„ ๋ณด๋ฉด ์–‘์ด ๋งŽ์ง€ ์•Š์€๋ฐ

#ifdef _DEBUG
	::D3D12GetDebugInterface(IID_PPV_ARGS(&_debugController));
	_debugController->EnableDebugLayer();
#endif

API๋ฅผ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋“ฏ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ดˆ๊ธฐํ™”ํ•  ๊ฐ’์„ ๋„ฃ์–ด์ค˜์„œ ์ดˆ๊ธฐํ™”๋ฅผ ํ•œ๋‹ค.
์ผ๋ฐ˜์ ์œผ๋กœ ์ดˆ๊ธฐํ™”๋ฅผ ํ•œ๋‹ค๊ณ  ํ•˜๋ฉด = {์–ด์ฉŒ๊ตฌ ์ €์ฉŒ๊ตฌ}๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ ์ข€ ์‹ ๊ธฐํ–ˆ๋˜ ๋ถ€๋ถ„.

๊ทธ๋ฆฌ๊ณ  ๊ฐ•์˜์—์„œ IID_PPV_ARGS๊ฐ€ ์ž์ฃผ ์‚ฌ์šฉ๋  ์นœ๊ตฌ๋ผ๊ณ  ๋ˆˆ์—ฌ๊ฒจ ๋ด๋ผ๊ณ  ํ–ˆ๋‹ค.
ํƒ€๊ณ  ๋“ค์–ด๊ฐ€์„œ 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์—์„œ ๊ฐ€์žฅ ์ค‘์‹ฌ์ด ๋˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค๊ณ  ์ดํ•ดํ•˜๋ฉด ๋ ๊ฑฐ๊ฐ™๋‹ค.

ํƒœ๊ทธ:

์นดํ…Œ๊ณ ๋ฆฌ:

์—…๋ฐ์ดํŠธ: