diff options
Diffstat (limited to '')
-rw-r--r-- | src/libs/dxvk-native-1.9.2a/src/dxvk/dxvk_pipemanager.h | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/src/libs/dxvk-native-1.9.2a/src/dxvk/dxvk_pipemanager.h b/src/libs/dxvk-native-1.9.2a/src/dxvk/dxvk_pipemanager.h new file mode 100644 index 00000000..f32a8913 --- /dev/null +++ b/src/libs/dxvk-native-1.9.2a/src/dxvk/dxvk_pipemanager.h @@ -0,0 +1,121 @@ + +#pragma once + +#include <mutex> +#include <unordered_map> + +#include "dxvk_compute.h" +#include "dxvk_graphics.h" + +namespace dxvk { + + class DxvkStateCache; + + /** + * \brief Pipeline count + * + * Stores number of graphics and + * compute pipelines, individually. + */ + struct DxvkPipelineCount { + uint32_t numGraphicsPipelines; + uint32_t numComputePipelines; + }; + + + /** + * \brief Pipeline manager + * + * Creates and stores graphics pipelines and compute + * pipelines for each combination of shaders that is + * used within the application. This is necessary + * because DXVK does not expose the concept of shader + * pipeline objects to the client API. + */ + class DxvkPipelineManager { + friend class DxvkComputePipeline; + friend class DxvkGraphicsPipeline; + public: + + DxvkPipelineManager( + const DxvkDevice* device, + DxvkRenderPassPool* passManager); + + ~DxvkPipelineManager(); + + /** + * \brief Retrieves a compute pipeline object + * + * If a pipeline for the given shader stage object + * already exists, it will be returned. Otherwise, + * a new pipeline will be created. + * \param [in] shaders Shaders for the pipeline + * \returns Compute pipeline object + */ + DxvkComputePipeline* createComputePipeline( + const DxvkComputePipelineShaders& shaders); + + /** + * \brief Retrieves a graphics pipeline object + * + * If a pipeline for the given shader stage objects + * already exists, it will be returned. Otherwise, + * a new pipeline will be created. + * \param [in] shaders Shaders for the pipeline + * \returns Graphics pipeline object + */ + DxvkGraphicsPipeline* createGraphicsPipeline( + const DxvkGraphicsPipelineShaders& shaders); + + /* + * \brief Registers a shader + * + * Starts compiling pipelines asynchronously + * in case the state cache contains state + * vectors for this shader. + * \param [in] shader Newly compiled shader + */ + void registerShader( + const Rc<DxvkShader>& shader); + + /** + * \brief Retrieves total pipeline count + * \returns Number of compute/graphics pipelines + */ + DxvkPipelineCount getPipelineCount() const; + + /** + * \brief Checks whether async compiler is busy + * \returns \c true if shaders are being compiled + */ + bool isCompilingShaders() const; + + /** + * \brief Stops async compiler threads + */ + void stopWorkerThreads() const; + + private: + + const DxvkDevice* m_device; + Rc<DxvkPipelineCache> m_cache; + Rc<DxvkStateCache> m_stateCache; + + std::atomic<uint32_t> m_numComputePipelines = { 0 }; + std::atomic<uint32_t> m_numGraphicsPipelines = { 0 }; + + dxvk::mutex m_mutex; + + std::unordered_map< + DxvkComputePipelineShaders, + DxvkComputePipeline, + DxvkHash, DxvkEq> m_computePipelines; + + std::unordered_map< + DxvkGraphicsPipelineShaders, + DxvkGraphicsPipeline, + DxvkHash, DxvkEq> m_graphicsPipelines; + + }; + +}
\ No newline at end of file |