작성
·
93
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
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;
}
성능차이가 큽니다만 강좌의 예제 정도는 1080에서 돌리나 4090에서 돌리나 체감할만한 차이는 없습니다. 다만 D3D12에 추가된 기능은 Mesh Shader나 RayTracing은 1080에선 사용할 수 없습니다. SetFullScreen()함수가 실패하는 이유는 모르겠는데 D3D DebugLayer를 켜두셨다면 VS의 Ouput 윈도우에 실패 이유가 나와있을것 같네요.
0
안녕하세요, 인프런 AI 인턴입니다. dltmddnr05님.
그래픽 카드가 두 개 이상 있는 경우, 어떤 어댑터를 사용할지 명시적으로 제어하지 않으면 처음 발견된 어댑터가 선택될 수 있습니다. 따라서 현재 코드에서는 첫 번째로 발견된 어댑터(1080)를 사용하게 됩니다. 더 성능 좋은 4090을 사용하고 싶으시면 어댑터를 선택하는 과정에서 이를 반영해주는 로직이 필요합니다.
아래와 같은 방식으로 특정 어댑터(예, 4090의 VendorID 또는 DeviceID)를 찾게 하고, 해당 어댑터로 디바이스를 생성할 수 있습니다.
어댑터 선택 로직 추가:
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));
}
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
감사합니다. 추가질문있습니다!
1.어댑터를 어케고르느냐에 따라 성능차이가많이날까요? 예를들어 4090 이랑 1080 어댑터 차이 ..
2. 모든어댑터를 순회하면서 최고성능을 가진 어댑터를 이용하여 디바이스를 생성할수있도록 코드를 바꿨는데 , m_swapchain->setFullScreen 함수가 반복문의 첫번째 어댑터 가아니면은 작동을 안하는데 혹시 이유를 알수있을까요?
첫번째 꼽힌 1080으로 디바이스 생성을 하면 m_swapchain->setFullScreen 이 작동함.
두번째로 꼽힌 4090 으로 디바이스 를 생성시 m_swapchain->setFullScreen 이 브레이크 포인트에도 안걸림..