#pragma once #include #include #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& 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; private: const DxvkDevice* m_device; Rc m_cache; Rc m_stateCache; std::atomic m_numComputePipelines = { 0 }; std::atomic m_numGraphicsPipelines = { 0 }; std::mutex m_mutex; std::unordered_map< DxvkComputePipelineShaders, DxvkComputePipeline, DxvkHash, DxvkEq> m_computePipelines; std::unordered_map< DxvkGraphicsPipelineShaders, DxvkGraphicsPipeline, DxvkHash, DxvkEq> m_graphicsPipelines; }; }