diff options
author | Jason Ekstrand <jason.ekstrand@intel.com> | 2017-02-18 15:21:04 -0800 |
---|---|---|
committer | Emil Velikov <emil.l.velikov@gmail.com> | 2017-03-15 14:39:55 +0000 |
commit | 71e4003981054b5828cabbecf65168171727eba4 (patch) | |
tree | 87d1c68853d4e21cd673fdb61b1ffd719cb0ec47 | |
parent | f43bed413a44bc7a9addfdcdba69ed2660e9acf9 (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.c | 22 | ||||
-rw-r--r-- | src/intel/vulkan/genX_cmd_buffer.c | 30 |
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, |