mirror of
https://github.com/EduApps-CDG/OpenDX
synced 2024-12-30 09:45:37 +01:00
116 lines
2.9 KiB
C++
116 lines
2.9 KiB
C++
|
|
#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;
|
|
|
|
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 };
|
|
|
|
std::mutex m_mutex;
|
|
|
|
std::unordered_map<
|
|
DxvkComputePipelineShaders,
|
|
DxvkComputePipeline,
|
|
DxvkHash, DxvkEq> m_computePipelines;
|
|
|
|
std::unordered_map<
|
|
DxvkGraphicsPipelineShaders,
|
|
DxvkGraphicsPipeline,
|
|
DxvkHash, DxvkEq> m_graphicsPipelines;
|
|
|
|
};
|
|
|
|
} |