From b9bfbb9ccc2d9339f738772dcdedb6acf50c68f8 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Thu, 4 Apr 2019 16:10:44 +0200 Subject: [PATCH] [dxvk] Fix move constructor of DxvkShaderModule --- src/dxvk/dxvk_shader.cpp | 33 +++++++++++++++++++-------------- src/dxvk/dxvk_shader.h | 10 +++++----- 2 files changed, 24 insertions(+), 19 deletions(-) diff --git a/src/dxvk/dxvk_shader.cpp b/src/dxvk/dxvk_shader.cpp index fab25c54..663e8cb2 100644 --- a/src/dxvk/dxvk_shader.cpp +++ b/src/dxvk/dxvk_shader.cpp @@ -39,17 +39,15 @@ namespace dxvk { DxvkShaderModule::DxvkShaderModule() - : m_vkd(nullptr), m_info { - VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, - nullptr, 0, VkShaderStageFlagBits(0), VK_NULL_HANDLE, nullptr, nullptr } { - + : m_vkd(nullptr), m_stage() { + } DxvkShaderModule::DxvkShaderModule(DxvkShaderModule&& other) - : m_vkd (std::move(other.m_vkd)), - m_info(std::exchange(m_info, VkPipelineShaderStageCreateInfo())) { - + : m_vkd(std::move(other.m_vkd)) { + this->m_stage = other.m_stage; + other.m_stage = VkPipelineShaderStageCreateInfo(); } @@ -57,9 +55,15 @@ namespace dxvk { const Rc& vkd, const Rc& shader, const SpirvCodeBuffer& code) - : m_vkd(vkd), m_info { - VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, - nullptr, 0, shader->stage(), VK_NULL_HANDLE, "main", nullptr } { + : m_vkd(vkd), m_stage() { + m_stage.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; + m_stage.pNext = nullptr; + m_stage.flags = 0; + m_stage.stage = shader->stage(); + m_stage.module = VK_NULL_HANDLE; + m_stage.pName = "main"; + m_stage.pSpecializationInfo = nullptr; + VkShaderModuleCreateInfo info; info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; info.pNext = nullptr; @@ -67,7 +71,7 @@ namespace dxvk { info.codeSize = code.size(); info.pCode = code.data(); - if (m_vkd->vkCreateShaderModule(m_vkd->device(), &info, nullptr, &m_info.module) != VK_SUCCESS) + if (m_vkd->vkCreateShaderModule(m_vkd->device(), &info, nullptr, &m_stage.module) != VK_SUCCESS) throw DxvkError("DxvkComputePipeline::DxvkComputePipeline: Failed to create shader module"); } @@ -75,14 +79,15 @@ namespace dxvk { DxvkShaderModule::~DxvkShaderModule() { if (m_vkd != nullptr) { m_vkd->vkDestroyShaderModule( - m_vkd->device(), m_info.module, nullptr); + m_vkd->device(), m_stage.module, nullptr); } } DxvkShaderModule& DxvkShaderModule::operator = (DxvkShaderModule&& other) { - m_vkd = std::move(other.m_vkd); - m_info = std::exchange(other.m_info, VkPipelineShaderStageCreateInfo()); + this->m_vkd = std::move(other.m_vkd); + this->m_stage = other.m_stage; + other.m_stage = VkPipelineShaderStageCreateInfo(); return *this; } diff --git a/src/dxvk/dxvk_shader.h b/src/dxvk/dxvk_shader.h index 111822e5..2193a5f6 100644 --- a/src/dxvk/dxvk_shader.h +++ b/src/dxvk/dxvk_shader.h @@ -297,9 +297,9 @@ namespace dxvk { */ VkPipelineShaderStageCreateInfo stageInfo( const VkSpecializationInfo* specInfo) const { - VkPipelineShaderStageCreateInfo info = m_info; - info.pSpecializationInfo = specInfo; - return info; + VkPipelineShaderStageCreateInfo stage = m_stage; + stage.pSpecializationInfo = specInfo; + return stage; } /** @@ -307,13 +307,13 @@ namespace dxvk { * \returns \c true if module is valid */ operator bool () const { - return m_info.module != VK_NULL_HANDLE; + return m_stage.module != VK_NULL_HANDLE; } private: Rc m_vkd; - VkPipelineShaderStageCreateInfo m_info; + VkPipelineShaderStageCreateInfo m_stage; };