diff --git a/src/dxgi/dxgi_presenter.cpp b/src/dxgi/dxgi_presenter.cpp index 18679712..e7665640 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 cda3ab5d..36d09283 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 bc8d6a22..821cfe33 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 b3ff05b7..149257f4 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 f7c7316f..11baf2e8 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 122bab5f..c927814e 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;