인프런 커뮤니티 질문&답변

dltmddnr05님의 프로필 이미지
dltmddnr05

작성한 질문수

D3D12 프로그래밍 - 기초편

코드에 대한질문있습니다.

작성

·

76

0

 

처음 디바이스 생성부분에서 어댑터를 순환하면서 Device 를 생성하는데

저같은경우에는 그래픽카드를 2개 사용중인데 1080과 4090을 사용중인데 첫번째 어댑터에 1080으로 인식되면서 1080을 이용해서 Device 를 생성하는것 같은데 , 이럴경우 문제가되지않나요? 4090 을 이용못하는거아닐까요?

	}	for (DWORD featerLevelIndex = 0; featerLevelIndex < FeatureLevelNum; featerLevelIndex++)

	{

		UINT adapterIndex = 0;

		while (DXGI_ERROR_NOT_FOUND != _factory->EnumAdapters1(adapterIndex, &pAdapter))

		{

			pAdapter->GetDesc1(&AdapterDesc);

			if (SUCCEEDED(D3D12CreateDevice(pAdapter.Get(), featureLevels[featerLevelIndex], IID_PPV_ARGS(&_device))))

			{

				break;

			}

			adapterIndex++;

		}

		if (_device)

		{

			break;

		}

답변 2

0

megayuchi님의 프로필 이미지
megayuchi
지식공유자

IDXGIAdapter::GetDesc()함수를 사용하면 Device ID를 얻을 수 있습니다.

RTX4090의 Device ID를 얻어서 다음과 같이 비교해서 4090이 아니면 스킵시키면 됩니다.

내부 코드로는 이 정도로 충분하고 배포를 한다면 그래픽 카드를 선택할 수 있는 옵션을 주는게 좋겠죠.

#define DEVICE_ID_RTX4090 XXXXXX

.

.

.

DXGI_ADAPTER_DESC desc;

pAdapter->GetDesc(&adapterDesc);

if (DEVICE_ID_RTX4090 != adapterDesc.DeviceId)

{

continue;

}

 

dltmddnr05님의 프로필 이미지
dltmddnr05
질문자

감사합니다. 추가질문있습니다!

1.어댑터를 어케고르느냐에 따라 성능차이가많이날까요? 예를들어 4090 이랑 1080 어댑터 차이 ..

2. 모든어댑터를 순회하면서 최고성능을 가진 어댑터를 이용하여 디바이스를 생성할수있도록 코드를 바꿨는데 , m_swapchain->setFullScreen 함수가 반복문의 첫번째 어댑터 가아니면은 작동을 안하는데 혹시 이유를 알수있을까요?

첫번째 꼽힌 1080으로 디바이스 생성을 하면 m_swapchain->setFullScreen 이 작동함.

두번째로 꼽힌 4090 으로 디바이스 를 생성시 m_swapchain->setFullScreen 이 브레이크 포인트에도 안걸림..

 

megayuchi님의 프로필 이미지
megayuchi
지식공유자

성능차이가 큽니다만 강좌의 예제 정도는 1080에서 돌리나 4090에서 돌리나 체감할만한 차이는 없습니다. 다만 D3D12에 추가된 기능은 Mesh Shader나 RayTracing은 1080에선 사용할 수 없습니다. SetFullScreen()함수가 실패하는 이유는 모르겠는데 D3D DebugLayer를 켜두셨다면 VS의 Ouput 윈도우에 실패 이유가 나와있을것 같네요.

dltmddnr05님의 프로필 이미지
dltmddnr05
질문자

감사합니다 ! 브레이크포인트에도 안걸려서 ... 이유를모르겠네요

0

안녕하세요, 인프런 AI 인턴입니다. dltmddnr05님.

그래픽 카드가 두 개 이상 있는 경우, 어떤 어댑터를 사용할지 명시적으로 제어하지 않으면 처음 발견된 어댑터가 선택될 수 있습니다. 따라서 현재 코드에서는 첫 번째로 발견된 어댑터(1080)를 사용하게 됩니다. 더 성능 좋은 4090을 사용하고 싶으시면 어댑터를 선택하는 과정에서 이를 반영해주는 로직이 필요합니다.

아래와 같은 방식으로 특정 어댑터(예, 4090의 VendorID 또는 DeviceID)를 찾게 하고, 해당 어댑터로 디바이스를 생성할 수 있습니다.

추천할 만한 유사한 답변:

  1. 디버깅 할 때 훨씬 직관적입니다. 이유가 따로 있나요? - DirectX 객체의 생성과 선택 과정에서 필요한 기초적인 정보를 확인할 수 있습니다.
  2. Comptr를 사용하는 대신 raw pointer를 사용할 이유가 있나요? - 메모리 관리와 관련하여 유사한 설명을 확인할 수 있습니다.

간단한 설명:

  • 어댑터 선택 로직 추가:

    IDXGIAdapter1* GetAdapter(IDXGIFactory1* pFactory, bool preferHighPerformanceAdapter)
    {
      IDXGIAdapter1* pAdapter = nullptr;
      IDXGIAdapter1* pTempAdapter = nullptr;
      DXGI_ADAPTER_DESC1 desc;
    
    
      for (UINT adapterIndex = 0; DXGI_ERROR_NOT_FOUND != pFactory->EnumAdapters1(adapterIndex, &pTempAdapter); ++adapterIndex)
      {
          pTempAdapter->GetDesc1(&desc);
          if (preferHighPerformanceAdapter)
          {
              // Replace with your own logic to select a high-performance GPU (e.g., by Vendor ID or by checking the adapter's description)
              if (desc.VendorId == YOUR_HIGH_PERFORMANCE_GPU_VENDOR_ID)
              {
                  pAdapter = pTempAdapter;
                  break;
              }
          }
          else
          {
              pAdapter = pTempAdapter;
              break;
          }
      }
      return pAdapter;
    }
    

    위 코드를 통해, 더 높은 성능의 어댑터를 선택할 수 있습니다.

  • 디바이스 생성 시 적용:

    IDXGIAdapter1* pAdapter = GetAdapter(_factory.Get(), true);
    if (pAdapter)
    {
      D3D12CreateDevice(pAdapter, featureLevels[featerLevelIndex], IID_PPV_ARGS(&_device));
    }
    

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

dltmddnr05님의 프로필 이미지
dltmddnr05

작성한 질문수

질문하기