1
0
mirror of https://github.com/EduApps-CDG/OpenDX synced 2024-12-30 09:45:37 +01:00
OpenDX/src/dxvk/dxvk_query_manager.h
2018-10-10 13:05:37 +02:00

128 lines
3.2 KiB
C++

#pragma once
#include <vector>
#include "dxvk_cmdlist.h"
#include "dxvk_query.h"
#include "dxvk_query_pool.h"
namespace dxvk {
/**
* \brief Query manager
*
* Manages Vulkan query pools
* and the current query state.
*/
class DxvkQueryManager {
public:
DxvkQueryManager(const Rc<vk::DeviceFn>& vkd);
~DxvkQueryManager();
/**
* \brief Allocates a Vulkan query
*
* Creates a query pool of the correct type if
* necessary, and allocates one query from it.
* \param [in] cmd The context's command list
* \param [in] query The DXVK query revision
* \returns Allocated query handle
*/
DxvkQueryHandle allocQuery(
const Rc<DxvkCommandList>& cmd,
const DxvkQueryRevision& query);
/**
* \brief Enables a query
*
* Starts tracking a query. Depending on the
* query type, unterlying Vulkan queries will
* begin and end on render pass boundaries.
* \param [in] cmd The context's command list
* \param [in] query The query to enable
*/
void enableQuery(
const Rc<DxvkCommandList>& cmd,
const DxvkQueryRevision& query);
/**
* \brief Disables a query
*
* Ends the query if it is currently active,
* and stops tracking any further state changes.
* \param [in] cmd The context's command list
* \param [in] query The query to enable
*/
void disableQuery(
const Rc<DxvkCommandList>& cmd,
const DxvkQueryRevision& query);
/**
* \brief Begins active queries
*
* Creates a Vulkan query for each enabled
* query of the given types and begins them.
* \param [in] cmd The context's command list
* \param [in] types Query types to begin
*/
void beginQueries(
const Rc<DxvkCommandList>& cmd,
VkQueryType type);
/**
* \brief Ends active queries
*
* Ends active queries of the given types.
* \param [in] cmd The context's command list
* \param [in] types Query types to begin
*/
void endQueries(
const Rc<DxvkCommandList>& cmd,
VkQueryType type);
/**
* \brief Tracks query pools
*
* Adds all current non-empty query pools to
* the query tracker of the given command list.
* \param [in] cmd The context's command list
*/
void trackQueryPools(
const Rc<DxvkCommandList>& cmd);
private:
const Rc<vk::DeviceFn> m_vkd;
uint32_t m_activeTypes = 0;
Rc<DxvkQueryPool> m_occlusion;
Rc<DxvkQueryPool> m_pipeStats;
Rc<DxvkQueryPool> m_timestamp;
Rc<DxvkQueryPool> m_xfbStream;
std::vector<DxvkQueryRevision> m_activeQueries;
void trackQueryPool(
const Rc<DxvkCommandList>& cmd,
const Rc<DxvkQueryPool>& pool);
void beginVulkanQuery(
const Rc<DxvkCommandList>& cmd,
const DxvkQueryRevision& query);
void endVulkanQuery(
const Rc<DxvkCommandList>& cmd,
const DxvkQueryRevision& query);
Rc<DxvkQueryPool>& getQueryPool(
VkQueryType type);
static uint32_t getDxvkQueryTypeBit(
VkQueryType type);
};
}