From 7de5a727ad1d6f775b517887101ae07b184c2be1 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Sat, 2 Dec 2017 11:46:25 +0100 Subject: [PATCH] [dxgi] Added proper initialization of the swap chain back buffer --- src/dxgi/dxgi_presenter.cpp | 10 ++++++++++ src/dxgi/dxgi_presenter.h | 7 +++++++ src/dxgi/dxgi_swapchain.cpp | 11 ++++++++--- src/dxvk/dxvk_cmdlist.cpp | 6 +++--- src/dxvk/dxvk_context.cpp | 2 +- tests/d3d11/test_d3d11_triangle.cpp | 25 ++++++++++++++++++++----- 6 files changed, 49 insertions(+), 12 deletions(-) diff --git a/src/dxgi/dxgi_presenter.cpp b/src/dxgi/dxgi_presenter.cpp index 18679712f..e76656401 100644 --- a/src/dxgi/dxgi_presenter.cpp +++ b/src/dxgi/dxgi_presenter.cpp @@ -100,6 +100,16 @@ namespace dxvk { } + void DxgiPresenter::initBackBuffer(const Rc& image) { + m_context->beginRecording( + m_device->createCommandList()); + m_context->initImage(image, nullptr); + m_device->submitCommandList( + m_context->endRecording(), + nullptr, nullptr); + } + + void DxgiPresenter::presentImage(const Rc& view) { m_context->beginRecording( m_device->createCommandList()); diff --git a/src/dxgi/dxgi_presenter.h b/src/dxgi/dxgi_presenter.h index cda3ab5dc..36d09283d 100644 --- a/src/dxgi/dxgi_presenter.h +++ b/src/dxgi/dxgi_presenter.h @@ -27,6 +27,13 @@ namespace dxvk { ~DxgiPresenter(); + /** + * \brief Initializes back buffer image + * \param [in] image Back buffer image + */ + void initBackBuffer( + const Rc& image); + /** * \brief Renders image to the screen * \param [in] view Source image view diff --git a/src/dxgi/dxgi_swapchain.cpp b/src/dxgi/dxgi_swapchain.cpp index bc8d6a227..821cfe33d 100644 --- a/src/dxgi/dxgi_swapchain.cpp +++ b/src/dxgi/dxgi_swapchain.cpp @@ -331,14 +331,15 @@ namespace dxvk { | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT; imageInfo.stages = VK_PIPELINE_STAGE_VERTEX_SHADER_BIT - | VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT - | VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT - | VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT +// | VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT +// | VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT +// | VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_TRANSFER_BIT; imageInfo.access = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT + | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_SHADER_READ_BIT; @@ -368,6 +369,10 @@ namespace dxvk { // that the device can use to access the image. if (FAILED(m_device->WrapSwapChainBackBuffer(resource.ptr(), &m_desc, &m_backBufferIface))) throw DxvkError("DxgiSwapChain::createBackBuffer: Failed to create back buffer interface"); + + // Initialize the image properly so that + // it can be used in a DXVK context + m_presenter->initBackBuffer(m_backBuffer); } } diff --git a/src/dxvk/dxvk_cmdlist.cpp b/src/dxvk/dxvk_cmdlist.cpp index b3ff05b76..149257f4a 100644 --- a/src/dxvk/dxvk_cmdlist.cpp +++ b/src/dxvk/dxvk_cmdlist.cpp @@ -242,10 +242,10 @@ namespace dxvk { uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier* pImageMemoryBarriers) { m_vkd->vkCmdPipelineBarrier(m_buffer, - dstStageMask, srcStageMask, dependencyFlags, - memoryBarrierCount, pMemoryBarriers, + srcStageMask, dstStageMask, dependencyFlags, + memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers, - imageMemoryBarrierCount, pImageMemoryBarriers); + imageMemoryBarrierCount, pImageMemoryBarriers); } diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index f7c7316f0..11baf2e8e 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -220,7 +220,7 @@ namespace dxvk { sr.baseMipLevel = 0; sr.levelCount = info.mipLevels; sr.baseArrayLayer = 0; - sr.levelCount = info.numLayers; + sr.layerCount = info.numLayers; m_barriers.initImage(image, sr, VK_IMAGE_LAYOUT_GENERAL, diff --git a/tests/d3d11/test_d3d11_triangle.cpp b/tests/d3d11/test_d3d11_triangle.cpp index 122bab5f4..c927814e1 100644 --- a/tests/d3d11/test_d3d11_triangle.cpp +++ b/tests/d3d11/test_d3d11_triangle.cpp @@ -48,23 +48,38 @@ public: if (FAILED(m_factory->CreateSwapChain(m_device.ptr(), &swapDesc, &m_swapChain))) throw DxvkError("Failed to create DXGI swap chain"); + if (FAILED(m_swapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), reinterpret_cast(&m_buffer)))) + throw DxvkError("Failed to get swap chain back buffer"); + + if (FAILED(m_device->CreateRenderTargetView(m_buffer.ptr(), nullptr, &m_bufferView))) + throw DxvkError("Failed to create render target view"); + } + ~TriangleApp() { } + void run() { + FLOAT color[4] = { 1.0f, 1.0f, 1.0f, 1.0f }; + + m_context->OMSetRenderTargets(1, &m_bufferView, nullptr); + m_context->ClearRenderTargetView(m_bufferView.ptr(), color); m_swapChain->Present(0, 0); } private: - Com m_factory; - Com m_adapter; - Com m_device; - Com m_context; - Com m_swapChain; + Com m_factory; + Com m_adapter; + Com m_device; + Com m_context; + Com m_swapChain; + + Com m_buffer; + Com m_bufferView; D3D_FEATURE_LEVEL m_featureLevel;