1
0
mirror of https://github.com/EduApps-CDG/OpenDX synced 2024-12-30 09:45:37 +01:00
OpenDX/src/dxvk/dxvk_pipemanager.h
Philip Rebohle 35a8cedbc2 [dxvk] Move shader set hash/eq functions into respective structs
Makes it easier to use them outside the pipeline manager.
2019-09-30 03:42:20 +02:00

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;
};
}