From 8a4fa0b1b89208ca41202a04de32eabcf2869304 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Thu, 8 Feb 2018 19:32:53 +0100 Subject: [PATCH] [dxvk] Added Query stub --- src/dxvk/dxvk_cmdlist.h | 34 ++++++++++++++++++++++++++++++++++ src/dxvk/dxvk_limits.h | 1 + src/dxvk/dxvk_query.cpp | 38 ++++++++++++++++++++++++++++++++++++++ src/dxvk/dxvk_query.h | 41 +++++++++++++++++++++++++++++++++++++++++ src/dxvk/meson.build | 1 + 5 files changed, 115 insertions(+) create mode 100644 src/dxvk/dxvk_query.cpp create mode 100644 src/dxvk/dxvk_query.h diff --git a/src/dxvk/dxvk_cmdlist.h b/src/dxvk/dxvk_cmdlist.h index c961719d7..cb1068bf5 100644 --- a/src/dxvk/dxvk_cmdlist.h +++ b/src/dxvk/dxvk_cmdlist.h @@ -96,6 +96,15 @@ namespace dxvk { } + void cmdBeginQuery( + VkQueryPool queryPool, + uint32_t query, + VkQueryControlFlags flags) { + m_vkd->vkCmdBeginQuery(m_buffer, + queryPool, query, flags); + } + + void cmdBeginRenderPass( const VkRenderPassBeginInfo* pRenderPassBegin, VkSubpassContents contents) { @@ -300,6 +309,13 @@ namespace dxvk { } + void cmdEndQuery( + VkQueryPool queryPool, + uint32_t query) { + m_vkd->vkCmdEndQuery(m_buffer, queryPool, query); + } + + void cmdEndRenderPass() { m_vkd->vkCmdEndRenderPass(m_buffer); } @@ -344,6 +360,15 @@ namespace dxvk { } + void cmdResetQueryPool( + VkQueryPool queryPool, + uint32_t firstQuery, + uint32_t queryCount) { + m_vkd->vkCmdResetQueryPool(m_buffer, + queryPool, firstQuery, queryCount); + } + + void cmdResolveImage( VkImage srcImage, VkImageLayout srcImageLayout, @@ -399,6 +424,15 @@ namespace dxvk { } + void cmdWriteTimestamp( + VkPipelineStageFlagBits pipelineStage, + VkQueryPool queryPool, + uint32_t query) { + m_vkd->vkCmdWriteTimestamp(m_buffer, + pipelineStage, queryPool, query); + } + + DxvkStagingBufferSlice stagedAlloc( VkDeviceSize size); diff --git a/src/dxvk/dxvk_limits.h b/src/dxvk/dxvk_limits.h index db58ea685..ecf2f8693 100644 --- a/src/dxvk/dxvk_limits.h +++ b/src/dxvk/dxvk_limits.h @@ -13,6 +13,7 @@ namespace dxvk { MaxNumResourceSlots = 1096, MaxNumActiveBindings = 128, MaxNumQueuedCommandBuffers = 8, + MaxNumQueryCountPerPool = 16, MaxVertexBindingStride = 2048, MaxPushConstantSize = 128, }; diff --git a/src/dxvk/dxvk_query.cpp b/src/dxvk/dxvk_query.cpp new file mode 100644 index 000000000..9d591408b --- /dev/null +++ b/src/dxvk/dxvk_query.cpp @@ -0,0 +1,38 @@ +#include "dxvk_query.h" + +namespace dxvk { + + DxvkQuery::DxvkQuery( + const Rc& vkd, + VkQueryType type) + : m_vkd(vkd), m_type(type) { + VkQueryPoolCreateInfo info; + info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO; + info.pNext = nullptr; + info.flags = 0; + info.queryType = type; + info.queryCount = MaxNumQueryCountPerPool; + info.pipelineStatistics + = VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT + | VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT + | VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT + | VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT + | VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT + | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT + | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT + | VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT + | VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT + | VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT + | VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT; + + if (m_vkd->vkCreateQueryPool(m_vkd->device(), &info, nullptr, &m_queryPool) != VK_SUCCESS) + throw DxvkError("DXVK: Failed to create query pool"); + } + + + DxvkQuery::~DxvkQuery() { + m_vkd->vkDestroyQueryPool( + m_vkd->device(), m_queryPool, nullptr); + } + +} \ No newline at end of file diff --git a/src/dxvk/dxvk_query.h b/src/dxvk/dxvk_query.h new file mode 100644 index 000000000..aa4923692 --- /dev/null +++ b/src/dxvk/dxvk_query.h @@ -0,0 +1,41 @@ +#pragma once + +#include "dxvk_limits.h" + +namespace dxvk { + + /** + * \brief DXVK query object + * + * Creates a Vulkan query pool that acts as if it + * were a single query. This approach is necessary + * in order to keep evaluating the query across + * multiple command submissions. + */ + class DxvkQuery { + + public: + + DxvkQuery( + const Rc& vkd, + VkQueryType type); + ~DxvkQuery(); + + /** + * \brief Query pool handle + * \returns Query pool handle + */ + VkQueryPool handle() const { + return m_queryPool; + } + + private: + + Rc m_vkd = nullptr; + VkQueryType m_type = VK_QUERY_TYPE_END_RANGE; + VkQueryPool m_queryPool = VK_NULL_HANDLE; + uint32_t m_queryId = 0; + + }; + +} \ No newline at end of file diff --git a/src/dxvk/meson.build b/src/dxvk/meson.build index ed476a407..c4fab4019 100644 --- a/src/dxvk/meson.build +++ b/src/dxvk/meson.build @@ -28,6 +28,7 @@ dxvk_src = files([ 'dxvk_pipecache.cpp', 'dxvk_pipelayout.cpp', 'dxvk_pipemanager.cpp', + 'dxvk_query.cpp', 'dxvk_queue.cpp', 'dxvk_renderpass.cpp', 'dxvk_resource.cpp',