diff --git a/docs/features.txt b/docs/features.txt index de421cbd5ec..0747e5b3bfc 100644 --- a/docs/features.txt +++ b/docs/features.txt @@ -466,7 +466,7 @@ Vulkan 1.2 -- all DONE: anv VK_KHR_uniform_buffer_standard_layout DONE (anv, lvp, radv) VK_KHR_vulkan_memory_model DONE (anv, radv) VK_EXT_descriptor_indexing DONE (anv/gen9+, radv) - VK_EXT_host_query_reset DONE (anv, radv, tu) + VK_EXT_host_query_reset DONE (anv, lvp, radv, tu) VK_EXT_sampler_filter_minmax DONE (anv/gen9+, lvp, radv, tu) VK_EXT_scalar_block_layout DONE (anv, lvp, radv/gfx7+) VK_EXT_separate_stencil_usage DONE (anv) diff --git a/src/gallium/frontends/lavapipe/lvp_device.c b/src/gallium/frontends/lavapipe/lvp_device.c index 8457ac17475..6c17d20154d 100644 --- a/src/gallium/frontends/lavapipe/lvp_device.c +++ b/src/gallium/frontends/lavapipe/lvp_device.c @@ -120,6 +120,7 @@ static const struct vk_device_extension_table lvp_device_extensions_supported = .EXT_calibrated_timestamps = true, .EXT_conditional_rendering = true, .EXT_extended_dynamic_state = true, + .EXT_host_query_reset = true, .EXT_index_type_uint8 = true, .EXT_post_depth_coverage = true, .EXT_private_data = true, @@ -518,6 +519,12 @@ VKAPI_ATTR void VKAPI_CALL lvp_GetPhysicalDeviceFeatures2( features->scalarBlockLayout = true; break; } + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT: { + VkPhysicalDeviceHostQueryResetFeaturesEXT *features = + (VkPhysicalDeviceHostQueryResetFeaturesEXT *)ext; + features->hostQueryReset = true; + break; + } default: break; } diff --git a/src/gallium/frontends/lavapipe/lvp_query.c b/src/gallium/frontends/lavapipe/lvp_query.c index 7bf4346a46e..b0bd1f2c862 100644 --- a/src/gallium/frontends/lavapipe/lvp_query.c +++ b/src/gallium/frontends/lavapipe/lvp_query.c @@ -193,3 +193,22 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_GetQueryPoolResults( } return vk_result; } + +VKAPI_ATTR void VKAPI_CALL lvp_ResetQueryPool( + VkDevice _device, + VkQueryPool queryPool, + uint32_t firstQuery, + uint32_t queryCount) +{ + LVP_FROM_HANDLE(lvp_device, device, _device); + LVP_FROM_HANDLE(lvp_query_pool, pool, queryPool); + + for (uint32_t i = 0; i < queryCount; i++) { + uint32_t idx = i + firstQuery; + + if (pool->queries[idx]) { + device->queue.ctx->destroy_query(device->queue.ctx, pool->queries[idx]); + pool->queries[idx] = NULL; + } + } +}