summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Ekstrand <jason.ekstrand@intel.com>2017-02-18 15:21:04 -0800
committerEmil Velikov <emil.l.velikov@gmail.com>2017-03-15 14:39:55 +0000
commit71e4003981054b5828cabbecf65168171727eba4 (patch)
tree87d1c68853d4e21cd673fdb61b1ffd719cb0ec47
parentf43bed413a44bc7a9addfdcdba69ed2660e9acf9 (diff)
anv/query: Perform CmdResetQueryPool on the GPU
This fixes a some rendering corruption in The Talos Principle Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Cc: "13.0 17.0" <mesa-stable@lists.freedesktop.org> (cherry picked from commit 40087bcb517bda60e666428a7a8f85dfdcbd9a56)
-rw-r--r--src/intel/vulkan/anv_query.c22
-rw-r--r--src/intel/vulkan/genX_cmd_buffer.c30
2 files changed, 30 insertions, 22 deletions
diff --git a/src/intel/vulkan/anv_query.c b/src/intel/vulkan/anv_query.c
index da0deb86950..6fe94b0a4c2 100644
--- a/src/intel/vulkan/anv_query.c
+++ b/src/intel/vulkan/anv_query.c
@@ -169,25 +169,3 @@ VkResult anv_GetQueryPoolResults(
return VK_SUCCESS;
}
-
-void anv_CmdResetQueryPool(
- VkCommandBuffer commandBuffer,
- VkQueryPool queryPool,
- uint32_t firstQuery,
- uint32_t queryCount)
-{
- ANV_FROM_HANDLE(anv_query_pool, pool, queryPool);
-
- for (uint32_t i = 0; i < queryCount; i++) {
- switch (pool->type) {
- case VK_QUERY_TYPE_OCCLUSION:
- case VK_QUERY_TYPE_TIMESTAMP: {
- struct anv_query_pool_slot *slot = pool->bo.map;
- slot[firstQuery + i].available = 0;
- break;
- }
- default:
- assert(!"Invalid query type");
- }
- }
-}
diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c
index 3aead8663a0..45fefc9490e 100644
--- a/src/intel/vulkan/genX_cmd_buffer.c
+++ b/src/intel/vulkan/genX_cmd_buffer.c
@@ -1961,6 +1961,36 @@ emit_query_availability(struct anv_cmd_buffer *cmd_buffer,
}
}
+void genX(CmdResetQueryPool)(
+ VkCommandBuffer commandBuffer,
+ VkQueryPool queryPool,
+ uint32_t firstQuery,
+ uint32_t queryCount)
+{
+ ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
+ ANV_FROM_HANDLE(anv_query_pool, pool, queryPool);
+
+ for (uint32_t i = 0; i < queryCount; i++) {
+ switch (pool->type) {
+ case VK_QUERY_TYPE_OCCLUSION:
+ case VK_QUERY_TYPE_TIMESTAMP: {
+ anv_batch_emit(&cmd_buffer->batch, GENX(MI_STORE_DATA_IMM), sdm) {
+ sdm.Address = (struct anv_address) {
+ .bo = &pool->bo,
+ .offset = (firstQuery + i) * sizeof(struct anv_query_pool_slot) +
+ offsetof(struct anv_query_pool_slot, available),
+ };
+ sdm.DataDWord0 = 0;
+ sdm.DataDWord1 = 0;
+ }
+ break;
+ }
+ default:
+ assert(!"Invalid query type");
+ }
+ }
+}
+
void genX(CmdBeginQuery)(
VkCommandBuffer commandBuffer,
VkQueryPool queryPool,