2016-10-18 7 views
0

Когда я пытаюсь установить своп цепи с поддержкой MSAA я получаю DXGI_ERROR_INVALID_CALL ошибку - вот код, который создает своп цепи:Создание свопа цепи с MSAA терпит неудачу

// Describe and create the swap chain. 
DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {}; 
swapChainDesc.BufferCount = frameCount_; 
swapChainDesc.Width = static_cast<UINT>(rsd.width); 
swapChainDesc.Height = static_cast<UINT>(rsd.height); 
swapChainDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; 
swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; 
swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD; 
swapChainDesc.SampleDesc.Count = 1; 
swapChainDesc.SampleDesc.Quality = 0; 

if (rsd.enableMSAA) { 
    swapChainDesc.SampleDesc = findBestMSAASetttings(swapChainDesc.Format); 
} 

ComPtr<IDXGISwapChain1> swapChain; 

HRESULT hr = factory_->CreateSwapChainForHwnd(commandQueue_.Get(), // Swap chain needs the queue so that it can force a flush on it. 
                hWnd, &swapChainDesc, nullptr, nullptr, &swapChain); 

метод, чтобы найти лучший доступные настройки MSAA выглядит следующим образом:

DXGI_SAMPLE_DESC D3D12RenderSystem::findBestMSAASetttings(DXGI_FORMAT format) 
{ 
    HRESULT hr = S_FALSE; 

    // The default sampler mode, with no anti-aliasing, has a count of 1 and a quality level of 0. 
    UINT maxQualityLevel = 0; 
    UINT respectiveSampleCount = 1; 

    // If anti-aliasing is activated the best possible sample and quality level is chosen. 
    // Find highest available sample count and quality level 
    for (UINT sampleCount = 1; sampleCount <= D3D12_MAX_MULTISAMPLE_SAMPLE_COUNT; sampleCount++) { 
     D3D12_FEATURE_DATA_MULTISAMPLE_QUALITY_LEVELS msaaQualityDesc{}; 
     msaaQualityDesc.SampleCount = sampleCount; 
     msaaQualityDesc.Format = format; // DXGI_FORMAT_R8G8B8A8_UNORM; 
     msaaQualityDesc.Flags = D3D12_MULTISAMPLE_QUALITY_LEVELS_FLAG_NONE; 
     msaaQualityDesc.NumQualityLevels = 0; 

     hr = device_->CheckFeatureSupport(D3D12_FEATURE_MULTISAMPLE_QUALITY_LEVELS, &msaaQualityDesc, sizeof(msaaQualityDesc)); 
     if (hr != S_OK) { 
      BLUE_LOG(error) << "CheckMultisampleQualityLevels failed."; 
     } 
     if (msaaQualityDesc.NumQualityLevels > 0) { 
      BLUE_LOG(trace) << "MSAA with sampleCount " << msaaQualityDesc.SampleCount << " and qualtiy level " << msaaQualityDesc.NumQualityLevels << " supported."; 

      if (maxQualityLevel <= msaaQualityDesc.NumQualityLevels) { 
       maxQualityLevel = msaaQualityDesc.NumQualityLevels; 
       respectiveSampleCount = sampleCount; 
      } 
     } 
    } 

    BLUE_ASSERT(hr == S_OK, "find best MSAA setting failed.") 

    DXGI_SAMPLE_DESC sd; 
    sd.Count = respectiveSampleCount; 
    sd.Quality = maxQualityLevel; 

    return sd; 
} 

Когда rsd.enableMSAA является false все работает отлично.

Мое устройство создается следующим образом (я использую адаптер искривления, так как у меня нет аппаратной поддержки):

throwIfFailed(factory_->EnumWarpAdapter(IID_PPV_ARGS(&warpAdapter))); 
      throwIfFailed(D3D12CreateDevice(warpAdapter.Get(), featureLevel_, IID_PPV_ARGS(&device_))); 

мой журнал говорит:

trace | D3D12RenderSystem::findBestMSAASetttings | MSAA with sampleCount 1 and qualtiy level 1 supported. 
trace | D3D12RenderSystem::findBestMSAASetttings | MSAA with sampleCount 2 and qualtiy level 1 supported. 
trace | D3D12RenderSystem::findBestMSAASetttings | MSAA with sampleCount 4 and qualtiy level 1 supported. 
trace | D3D12RenderSystem::findBestMSAASetttings | MSAA with sampleCount 8 and qualtiy level 1 supported. 
trace | D3D12RenderSystem::findBestMSAASetttings | MSAA with sampleCount 16 and qualtiy level 1 supported. 

ответ

4

https://github.com/Microsoft/DirectXTK12/wiki/Simple-rendering говорит:

Direct3D 12 не поддерживает создание цепочек обмена MSAA - попытки создать цепочку подкачки с Sam pleDesc.Count> 1 не удастся. Вместо этого вы создаете свою собственную точку рендеринга MSAA и явно разрешаете задний буфер для DXGI для представления, как показано здесь.

+1

Это относится и к универсальной платформе Windows при использовании DirectX 11 или DirectX 12. См. [Техническая заметка] (https://github.com/Microsoft/DirectXTK12/wiki/Simple-rendering#technical-note) в приведенной выше ссылке. –