From a42f03e32dee746a04c1ae668124dcad956b7ff8 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Sat, 23 Jun 2018 20:19:46 +0200 Subject: [PATCH] [dxbc] Add Xfb structures to DxbcModuleInfo --- src/d3d11/d3d11_device.cpp | 6 ++++++ src/dxbc/dxbc_compiler.cpp | 8 +++++++- src/dxbc/dxbc_compiler.h | 2 +- src/dxbc/dxbc_modinfo.h | 30 ++++++++++++++++++++++++++++++ src/dxvk/dxvk_device.cpp | 5 +++-- src/dxvk/dxvk_shader.cpp | 3 ++- src/dxvk/dxvk_shader.h | 22 ++++++++++++++++++++++ tests/dxbc/test_dxbc_compiler.cpp | 1 + 8 files changed, 72 insertions(+), 5 deletions(-) diff --git a/src/d3d11/d3d11_device.cpp b/src/d3d11/d3d11_device.cpp index b5e13a5d5..5bfcc955f 100644 --- a/src/d3d11/d3d11_device.cpp +++ b/src/d3d11/d3d11_device.cpp @@ -622,6 +622,7 @@ namespace dxvk { DxbcModuleInfo moduleInfo; moduleInfo.options = m_dxbcOptions; moduleInfo.tess = nullptr; + moduleInfo.xfb = nullptr; if (FAILED(this->CreateShaderModule(&module, pShaderBytecode, BytecodeLength, pClassLinkage, @@ -647,6 +648,7 @@ namespace dxvk { DxbcModuleInfo moduleInfo; moduleInfo.options = m_dxbcOptions; moduleInfo.tess = nullptr; + moduleInfo.xfb = nullptr; if (FAILED(this->CreateShaderModule(&module, pShaderBytecode, BytecodeLength, pClassLinkage, @@ -691,6 +693,7 @@ namespace dxvk { DxbcModuleInfo moduleInfo; moduleInfo.options = m_dxbcOptions; moduleInfo.tess = nullptr; + moduleInfo.xfb = nullptr; if (FAILED(this->CreateShaderModule(&module, pShaderBytecode, BytecodeLength, pClassLinkage, @@ -719,6 +722,7 @@ namespace dxvk { DxbcModuleInfo moduleInfo; moduleInfo.options = m_dxbcOptions; moduleInfo.tess = nullptr; + moduleInfo.xfb = nullptr; if (tessInfo.maxTessFactor >= 8.0f) moduleInfo.tess = &tessInfo; @@ -747,6 +751,7 @@ namespace dxvk { DxbcModuleInfo moduleInfo; moduleInfo.options = m_dxbcOptions; moduleInfo.tess = nullptr; + moduleInfo.xfb = nullptr; if (FAILED(this->CreateShaderModule(&module, pShaderBytecode, BytecodeLength, pClassLinkage, @@ -772,6 +777,7 @@ namespace dxvk { DxbcModuleInfo moduleInfo; moduleInfo.options = m_dxbcOptions; moduleInfo.tess = nullptr; + moduleInfo.xfb = nullptr; if (FAILED(this->CreateShaderModule(&module, pShaderBytecode, BytecodeLength, pClassLinkage, diff --git a/src/dxbc/dxbc_compiler.cpp b/src/dxbc/dxbc_compiler.cpp index 88d6b91c6..f3f36d03d 100644 --- a/src/dxbc/dxbc_compiler.cpp +++ b/src/dxbc/dxbc_compiler.cpp @@ -199,7 +199,12 @@ namespace dxvk { m_entryPointInterfaces.size(), m_entryPointInterfaces.data()); m_module.setDebugName(m_entryPointId, "main"); - + + DxvkShaderOptions shaderOptions = { }; + + if (m_moduleInfo.xfb != nullptr) + shaderOptions.rasterizedStream = m_moduleInfo.xfb->rasterizedStream; + // Create the shader module object return new DxvkShader( m_programInfo.shaderStage(), @@ -207,6 +212,7 @@ namespace dxvk { m_resourceSlots.data(), m_interfaceSlots, m_module.compile(), + shaderOptions, std::move(m_immConstData)); } diff --git a/src/dxbc/dxbc_compiler.h b/src/dxbc/dxbc_compiler.h index 20323335f..93ec819ba 100644 --- a/src/dxbc/dxbc_compiler.h +++ b/src/dxbc/dxbc_compiler.h @@ -488,7 +488,7 @@ namespace dxvk { // Inter-stage shader interface slots. Also // covers vertex input and fragment output. DxvkInterfaceSlots m_interfaceSlots; - + /////////////////////////////////// // Shader-specific data structures DxbcCompilerVsPart m_vs; diff --git a/src/dxbc/dxbc_modinfo.h b/src/dxbc/dxbc_modinfo.h index 565885465..13e733dde 100644 --- a/src/dxbc/dxbc_modinfo.h +++ b/src/dxbc/dxbc_modinfo.h @@ -14,6 +14,35 @@ namespace dxvk { float maxTessFactor; }; + /** + * \brief Xfb capture entry + * + * Stores an output variable to capture, + * as well as the buffer to write it to. + */ + struct DxbcXfbEntry { + const char* semanticName; + uint32_t semanticIndex; + uint32_t componentIndex; + uint32_t componentCount; + uint32_t streamId; + uint32_t bufferId; + uint32_t offset; + }; + + /** + * \brief Xfb info + * + * Stores capture entries and output buffer + * strides. This structure must only be + * defined if \c entryCount is non-zero. + */ + struct DxbcXfbInfo { + uint32_t entryCount; + DxbcXfbEntry entries[128]; + uint32_t strides[4]; + int32_t rasterizedStream; + }; /** * \brief Shader module info @@ -24,6 +53,7 @@ namespace dxvk { struct DxbcModuleInfo { DxbcOptions options; DxbcTessInfo* tess; + DxbcXfbInfo* xfb; }; } \ No newline at end of file diff --git a/src/dxvk/dxvk_device.cpp b/src/dxvk/dxvk_device.cpp index 930f92f60..ed59f0e32 100644 --- a/src/dxvk/dxvk_device.cpp +++ b/src/dxvk/dxvk_device.cpp @@ -186,8 +186,9 @@ namespace dxvk { const DxvkInterfaceSlots& iface, const SpirvCodeBuffer& code) { return new DxvkShader(stage, - slotCount, slotInfos, iface, - code, DxvkShaderConstData()); + slotCount, slotInfos, iface, code, + DxvkShaderOptions(), + DxvkShaderConstData()); } diff --git a/src/dxvk/dxvk_shader.cpp b/src/dxvk/dxvk_shader.cpp index c597240b4..ff22cc31f 100644 --- a/src/dxvk/dxvk_shader.cpp +++ b/src/dxvk/dxvk_shader.cpp @@ -81,9 +81,10 @@ namespace dxvk { const DxvkResourceSlot* slotInfos, const DxvkInterfaceSlots& iface, const SpirvCodeBuffer& code, + const DxvkShaderOptions& options, DxvkShaderConstData&& constData) : m_stage(stage), m_code(code), m_interface(iface), - m_constData(std::move(constData)) { + m_options(options), m_constData(std::move(constData)) { // Write back resource slot infos for (uint32_t i = 0; i < slotCount; i++) m_slots.push_back(slotInfos[i]); diff --git a/src/dxvk/dxvk_shader.h b/src/dxvk/dxvk_shader.h index b6d414b50..a86ccd8c5 100644 --- a/src/dxvk/dxvk_shader.h +++ b/src/dxvk/dxvk_shader.h @@ -50,6 +50,18 @@ namespace dxvk { }; + /** + * \brief Additional shader options + * + * Contains additional properties that should be + * taken into account when creating pipelines. + */ + struct DxvkShaderOptions { + /// Rasterized stream, or -1 + int32_t rasterizedStream; + }; + + /** * \brief Shader constants * @@ -107,6 +119,7 @@ namespace dxvk { const DxvkResourceSlot* slotInfos, const DxvkInterfaceSlots& iface, const SpirvCodeBuffer& code, + const DxvkShaderOptions& options, DxvkShaderConstData&& constData); ~DxvkShader(); @@ -164,6 +177,14 @@ namespace dxvk { return m_interface; } + /** + * \brief Shader options + * \returns Shader options + */ + DxvkShaderOptions shaderOptions() const { + return m_options; + } + /** * \brief Shader constant data * @@ -216,6 +237,7 @@ namespace dxvk { std::vector m_slots; std::vector m_idOffsets; DxvkInterfaceSlots m_interface; + DxvkShaderOptions m_options; DxvkShaderConstData m_constData; DxvkShaderKey m_key; diff --git a/tests/dxbc/test_dxbc_compiler.cpp b/tests/dxbc/test_dxbc_compiler.cpp index 0754dede9..1920819ff 100644 --- a/tests/dxbc/test_dxbc_compiler.cpp +++ b/tests/dxbc/test_dxbc_compiler.cpp @@ -43,6 +43,7 @@ int WINAPI WinMain(HINSTANCE hInstance, DxbcModuleInfo moduleInfo; moduleInfo.options = DxbcOptions(); + moduleInfo.xfb = nullptr; Rc shader = module.compile(moduleInfo, ifileName); std::ofstream ofile(str::fromws(argv[2]), std::ios::binary);