From 792f15680ab92a8d138afee96f5aec7af6c55b09 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Thu, 18 Jul 2019 18:18:39 +0200 Subject: [PATCH] [dxvk] Use new fullscreen shaders for meta copy operations --- src/dxvk/dxvk_context.cpp | 2 +- src/dxvk/dxvk_meta_copy.cpp | 42 +++++++++++++++++++++++-------------- src/dxvk/dxvk_meta_copy.h | 4 ++-- 3 files changed, 29 insertions(+), 19 deletions(-) diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index f2bb59abd..19409bf47 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -2838,7 +2838,7 @@ namespace dxvk { 0, sizeof(srcCoordOffset), &srcCoordOffset); - m_cmd->cmdDraw(1, tgtSubresource.layerCount, 0, 0); + m_cmd->cmdDraw(3, tgtSubresource.layerCount, 0, 0); m_cmd->cmdEndRenderPass(); m_execBarriers.accessImage( diff --git a/src/dxvk/dxvk_meta_copy.cpp b/src/dxvk/dxvk_meta_copy.cpp index c3b0d7754..84595e783 100644 --- a/src/dxvk/dxvk_meta_copy.cpp +++ b/src/dxvk/dxvk_meta_copy.cpp @@ -1,8 +1,10 @@ #include "dxvk_device.h" #include "dxvk_meta_copy.h" -#include -#include +#include +#include +#include + #include #include #include @@ -126,8 +128,6 @@ namespace dxvk { DxvkMetaCopyObjects::DxvkMetaCopyObjects(const DxvkDevice* device) : m_vkd (device->vkd()), m_sampler (createSampler()), - m_shaderVert (createShaderModule(dxvk_copy_vert)), - m_shaderGeom (createShaderModule(dxvk_copy_geom)), m_color { createShaderModule(dxvk_copy_color_1d), createShaderModule(dxvk_copy_color_2d), @@ -136,6 +136,13 @@ namespace dxvk { createShaderModule(dxvk_copy_depth_1d), createShaderModule(dxvk_copy_depth_2d), createShaderModule(dxvk_copy_depth_ms) } { + if (device->extensions().extShaderViewportIndexLayer) { + m_shaderVert = createShaderModule(dxvk_fullscreen_layer_vert); + } else { + m_shaderVert = createShaderModule(dxvk_fullscreen_vert); + m_shaderGeom = createShaderModule(dxvk_fullscreen_geom); + } + if (device->extensions().extShaderStencilExport) { m_depthStencil = { createShaderModule(dxvk_copy_depth_stencil_1d), @@ -393,8 +400,9 @@ namespace dxvk { auto aspect = imageFormatInfo(key.format)->aspectMask; std::array stages; + uint32_t stageCount = 0; - VkPipelineShaderStageCreateInfo& vsStage = stages[0]; + VkPipelineShaderStageCreateInfo& vsStage = stages[stageCount++]; vsStage.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; vsStage.pNext = nullptr; vsStage.flags = 0; @@ -403,16 +411,18 @@ namespace dxvk { vsStage.pName = "main"; vsStage.pSpecializationInfo = nullptr; - VkPipelineShaderStageCreateInfo& gsStage = stages[1]; - gsStage.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; - gsStage.pNext = nullptr; - gsStage.flags = 0; - gsStage.stage = VK_SHADER_STAGE_GEOMETRY_BIT; - gsStage.module = m_shaderGeom; - gsStage.pName = "main"; - gsStage.pSpecializationInfo = nullptr; + if (m_shaderGeom) { + VkPipelineShaderStageCreateInfo& gsStage = stages[stageCount++]; + gsStage.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; + gsStage.pNext = nullptr; + gsStage.flags = 0; + gsStage.stage = VK_SHADER_STAGE_GEOMETRY_BIT; + gsStage.module = m_shaderGeom; + gsStage.pName = "main"; + gsStage.pSpecializationInfo = nullptr; + } - VkPipelineShaderStageCreateInfo& psStage = stages[2]; + VkPipelineShaderStageCreateInfo& psStage = stages[stageCount++]; psStage.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; psStage.pNext = nullptr; psStage.flags = 0; @@ -469,7 +479,7 @@ namespace dxvk { iaState.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO; iaState.pNext = nullptr; iaState.flags = 0; - iaState.topology = VK_PRIMITIVE_TOPOLOGY_POINT_LIST; + iaState.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; iaState.primitiveRestartEnable = VK_FALSE; VkPipelineViewportStateCreateInfo vpState; @@ -559,7 +569,7 @@ namespace dxvk { info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO; info.pNext = nullptr; info.flags = 0; - info.stageCount = stages.size(); + info.stageCount = stageCount; info.pStages = stages.data(); info.pVertexInputState = &viState; info.pInputAssemblyState = &iaState; diff --git a/src/dxvk/dxvk_meta_copy.h b/src/dxvk/dxvk_meta_copy.h index 952323c17..688c3d8d5 100644 --- a/src/dxvk/dxvk_meta_copy.h +++ b/src/dxvk/dxvk_meta_copy.h @@ -145,8 +145,8 @@ namespace dxvk { VkSampler m_sampler; - VkShaderModule m_shaderVert; - VkShaderModule m_shaderGeom; + VkShaderModule m_shaderVert = VK_NULL_HANDLE; + VkShaderModule m_shaderGeom = VK_NULL_HANDLE; FragShaders m_color; FragShaders m_depth;