From 5415b685de2a7ebb95c24f4195d3e14306ec76b2 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Tue, 19 Dec 2017 18:12:18 +0100 Subject: [PATCH] [dxbc] Implemented type conversion instructions --- src/d3d11/d3d11_context.cpp | 3 +- src/d3d11/d3d11_device.cpp | 8 +++--- src/dxbc/dxbc_compiler.cpp | 22 +++++++++++++++ src/dxbc/dxbc_defs.cpp | 20 +++++++++++--- src/dxgi/dxgi_presenter.cpp | 4 +-- src/dxvk/dxvk_framebuffer.cpp | 10 +++++++ src/dxvk/dxvk_framebuffer.h | 6 ++++ src/spirv/spirv_module.cpp | 52 +++++++++++++++++++++++++++++++++++ src/spirv/spirv_module.h | 16 +++++++++++ 9 files changed, 130 insertions(+), 11 deletions(-) diff --git a/src/d3d11/d3d11_context.cpp b/src/d3d11/d3d11_context.cpp index 59bd4f0c..28eee86a 100644 --- a/src/d3d11/d3d11_context.cpp +++ b/src/d3d11/d3d11_context.cpp @@ -1272,7 +1272,8 @@ namespace dxvk { if (m_state.om.depthStencilView != nullptr) attachments.setDepthTarget(m_state.om.depthStencilView->GetDXVKImageView()); - framebuffer = m_device->createFramebuffer(attachments); + if (attachments.hasAttachments()) + framebuffer = m_device->createFramebuffer(attachments); } // Bind the framebuffer object to the context diff --git a/src/d3d11/d3d11_device.cpp b/src/d3d11/d3d11_device.cpp index 731f0e07..df112bd5 100644 --- a/src/d3d11/d3d11_device.cpp +++ b/src/d3d11/d3d11_device.cpp @@ -338,8 +338,8 @@ namespace dxvk { viewInfo.type = VK_IMAGE_VIEW_TYPE_2D_ARRAY; viewInfo.minLevel = 0; viewInfo.numLevels = 1; - viewInfo.minLayer = desc.Texture2DArray.FirstArraySlice; - viewInfo.numLayers = desc.Texture2DArray.ArraySize; + viewInfo.minLayer = desc.Texture2DMSArray.FirstArraySlice; + viewInfo.numLayers = desc.Texture2DMSArray.ArraySize; break; default: @@ -432,8 +432,8 @@ namespace dxvk { viewInfo.type = VK_IMAGE_VIEW_TYPE_2D_ARRAY; viewInfo.minLevel = 0; viewInfo.numLevels = 1; - viewInfo.minLayer = desc.Texture2DArray.FirstArraySlice; - viewInfo.numLayers = desc.Texture2DArray.ArraySize; + viewInfo.minLayer = desc.Texture2DMSArray.FirstArraySlice; + viewInfo.numLayers = desc.Texture2DMSArray.ArraySize; break; default: diff --git a/src/dxbc/dxbc_compiler.cpp b/src/dxbc/dxbc_compiler.cpp index 3678125c..d52fbefb 100644 --- a/src/dxbc/dxbc_compiler.cpp +++ b/src/dxbc/dxbc_compiler.cpp @@ -809,6 +809,28 @@ namespace dxvk { src.at(0).id, src.at(1).id); break; + /////////////////////////// + // Conversion instructions + case DxbcOpcode::ItoF: + dst.id = m_module.opConvertStoF( + typeId, src.at(0).id); + break; + + case DxbcOpcode::UtoF: + dst.id = m_module.opConvertUtoF( + typeId, src.at(0).id); + break; + + case DxbcOpcode::FtoI: + dst.id = m_module.opConvertFtoS( + typeId, src.at(0).id); + break; + + case DxbcOpcode::FtoU: + dst.id = m_module.opConvertFtoU( + typeId, src.at(0).id); + break; + default: Logger::warn(str::format( "DxbcCompiler: Unhandled instruction: ", diff --git a/src/dxbc/dxbc_defs.cpp b/src/dxbc/dxbc_defs.cpp index ef405208..2481af63 100644 --- a/src/dxbc/dxbc_defs.cpp +++ b/src/dxbc/dxbc_defs.cpp @@ -99,9 +99,15 @@ namespace dxvk { /* Frc */ { }, /* FtoI */ - { }, + { 2, DxbcInstClass::VectorAlu, { + { DxbcOperandKind::DstReg, DxbcScalarType::Sint32 }, + { DxbcOperandKind::SrcReg, DxbcScalarType::Float32 }, + } }, /* FtoU */ - { }, + { 2, DxbcInstClass::VectorAlu, { + { DxbcOperandKind::DstReg, DxbcScalarType::Uint32 }, + { DxbcOperandKind::SrcReg, DxbcScalarType::Float32 }, + } }, /* Ge */ { 3, DxbcInstClass::VectorCmp, { { DxbcOperandKind::DstReg, DxbcScalarType::Uint32 }, @@ -178,7 +184,10 @@ namespace dxvk { /* IShr */ { }, /* ItoF */ - { }, + { 2, DxbcInstClass::VectorAlu, { + { DxbcOperandKind::DstReg, DxbcScalarType::Float32 }, + { DxbcOperandKind::SrcReg, DxbcScalarType::Sint32 }, + } }, /* Label */ { }, /* Ld */ @@ -334,7 +343,10 @@ namespace dxvk { /* UShr */ { }, /* UtoF */ - { }, + { 2, DxbcInstClass::VectorAlu, { + { DxbcOperandKind::DstReg, DxbcScalarType::Float32 }, + { DxbcOperandKind::SrcReg, DxbcScalarType::Uint32 }, + } }, /* Xor */ { 3, DxbcInstClass::VectorAlu, { { DxbcOperandKind::DstReg, DxbcScalarType::Uint32 }, diff --git a/src/dxgi/dxgi_presenter.cpp b/src/dxgi/dxgi_presenter.cpp index 663c4bd1..8cadfeaa 100644 --- a/src/dxgi/dxgi_presenter.cpp +++ b/src/dxgi/dxgi_presenter.cpp @@ -22,7 +22,7 @@ namespace dxvk { // Create swap chain for the surface DxvkSwapchainProperties swapchainProperties; swapchainProperties.preferredSurfaceFormat = this->pickFormat(bufferFormat); - swapchainProperties.preferredPresentMode = VK_PRESENT_MODE_FIFO_KHR; + swapchainProperties.preferredPresentMode = VK_PRESENT_MODE_IMMEDIATE_KHR; swapchainProperties.preferredBufferSize.width = bufferWidth; swapchainProperties.preferredBufferSize.height = bufferHeight; @@ -266,7 +266,7 @@ namespace dxvk { DXGI_FORMAT bufferFormat) { DxvkSwapchainProperties swapchainProperties; swapchainProperties.preferredSurfaceFormat = this->pickFormat(bufferFormat); - swapchainProperties.preferredPresentMode = VK_PRESENT_MODE_FIFO_KHR; + swapchainProperties.preferredPresentMode = VK_PRESENT_MODE_IMMEDIATE_KHR; swapchainProperties.preferredBufferSize.width = bufferWidth; swapchainProperties.preferredBufferSize.height = bufferHeight; diff --git a/src/dxvk/dxvk_framebuffer.cpp b/src/dxvk/dxvk_framebuffer.cpp index b1d7a46b..1521edd9 100644 --- a/src/dxvk/dxvk_framebuffer.cpp +++ b/src/dxvk/dxvk_framebuffer.cpp @@ -53,6 +53,16 @@ namespace dxvk { } + bool DxvkRenderTargets::hasAttachments() const { + bool result = m_depthTarget != nullptr; + + for (uint32_t i = 0; (i < MaxNumRenderTargets) && !result; i++) + result |= m_colorTargets.at(i) != nullptr; + + return result; + } + + DxvkFramebufferSize DxvkRenderTargets::renderTargetSize( const Rc& renderTarget) const { auto extent = renderTarget->image()->info().extent; diff --git a/src/dxvk/dxvk_framebuffer.h b/src/dxvk/dxvk_framebuffer.h index b4fa9d0d..328dff2e 100644 --- a/src/dxvk/dxvk_framebuffer.h +++ b/src/dxvk/dxvk_framebuffer.h @@ -94,6 +94,12 @@ namespace dxvk { */ DxvkFramebufferSize getImageSize() const; + /** + * \brief Checks whether any attachments are defined + * \returns \c false if no attachments are defined + */ + bool hasAttachments() const; + private: std::array, MaxNumRenderTargets> m_colorTargets; diff --git a/src/spirv/spirv_module.cpp b/src/spirv/spirv_module.cpp index 495c1c93..2bbafe12 100644 --- a/src/spirv/spirv_module.cpp +++ b/src/spirv/spirv_module.cpp @@ -641,6 +641,58 @@ namespace dxvk { } + uint32_t SpirvModule::opConvertFtoS( + uint32_t resultType, + uint32_t operand) { + uint32_t resultId = this->allocateId(); + + m_code.putIns (spv::OpConvertFToS, 4); + m_code.putWord(resultType); + m_code.putWord(resultId); + m_code.putWord(operand); + return resultId; + } + + + uint32_t SpirvModule::opConvertFtoU( + uint32_t resultType, + uint32_t operand) { + uint32_t resultId = this->allocateId(); + + m_code.putIns (spv::OpConvertFToU, 4); + m_code.putWord(resultType); + m_code.putWord(resultId); + m_code.putWord(operand); + return resultId; + } + + + uint32_t SpirvModule::opConvertStoF( + uint32_t resultType, + uint32_t operand) { + uint32_t resultId = this->allocateId(); + + m_code.putIns (spv::OpConvertSToF, 4); + m_code.putWord(resultType); + m_code.putWord(resultId); + m_code.putWord(operand); + return resultId; + } + + + uint32_t SpirvModule::opConvertUtoF( + uint32_t resultType, + uint32_t operand) { + uint32_t resultId = this->allocateId(); + + m_code.putIns (spv::OpConvertUToF, 4); + m_code.putWord(resultType); + m_code.putWord(resultId); + m_code.putWord(operand); + return resultId; + } + + uint32_t SpirvModule::opNot( uint32_t resultType, uint32_t operand) { diff --git a/src/spirv/spirv_module.h b/src/spirv/spirv_module.h index fed925d3..55b85bf8 100644 --- a/src/spirv/spirv_module.h +++ b/src/spirv/spirv_module.h @@ -236,6 +236,22 @@ namespace dxvk { uint32_t operand1, uint32_t operand2); + uint32_t opConvertFtoS( + uint32_t resultType, + uint32_t operand); + + uint32_t opConvertFtoU( + uint32_t resultType, + uint32_t operand); + + uint32_t opConvertStoF( + uint32_t resultType, + uint32_t operand); + + uint32_t opConvertUtoF( + uint32_t resultType, + uint32_t operand); + uint32_t opNot( uint32_t resultType, uint32_t operand);