radv: track and report if a logical device is lost
[mesa.git] / src / amd / vulkan / radv_query.c
index 07a1c3871871aa91ddf156303fbc618b165b1e71..feeb5d845123e531029d9f075695409d1e56cd9c 100644 (file)
@@ -1269,6 +1269,17 @@ radv_query_pool_needs_gds(struct radv_device *device,
               (pool->pipeline_stats_mask & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT);
 }
 
+static void
+radv_destroy_query_pool(struct radv_device *device,
+                       const VkAllocationCallbacks *pAllocator,
+                       struct radv_query_pool *pool)
+{
+       if (pool->bo)
+               device->ws->buffer_destroy(pool->bo);
+       vk_object_base_finish(&pool->base);
+       vk_free2(&device->vk.alloc, pAllocator, pool);
+}
+
 VkResult radv_CreateQueryPool(
        VkDevice                                    _device,
        const VkQueryPoolCreateInfo*                pCreateInfo,
@@ -1276,13 +1287,15 @@ VkResult radv_CreateQueryPool(
        VkQueryPool*                                pQueryPool)
 {
        RADV_FROM_HANDLE(radv_device, device, _device);
-       struct radv_query_pool *pool = vk_alloc2(&device->alloc, pAllocator,
+       struct radv_query_pool *pool = vk_alloc2(&device->vk.alloc, pAllocator,
                                               sizeof(*pool), 8,
                                               VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
 
        if (!pool)
                return vk_error(device->instance, VK_ERROR_OUT_OF_HOST_MEMORY);
 
+       vk_object_base_init(&device->vk, &pool->base,
+                           VK_OBJECT_TYPE_QUERY_POOL);
 
        switch(pCreateInfo->queryType) {
        case VK_QUERY_TYPE_OCCLUSION:
@@ -1311,17 +1324,14 @@ VkResult radv_CreateQueryPool(
        pool->bo = device->ws->buffer_create(device->ws, pool->size,
                                             64, RADEON_DOMAIN_GTT, RADEON_FLAG_NO_INTERPROCESS_SHARING,
                                             RADV_BO_PRIORITY_QUERY_POOL);
-
        if (!pool->bo) {
-               vk_free2(&device->alloc, pAllocator, pool);
+               radv_destroy_query_pool(device, pAllocator, pool);
                return vk_error(device->instance, VK_ERROR_OUT_OF_DEVICE_MEMORY);
        }
 
        pool->ptr = device->ws->buffer_map(pool->bo);
-
        if (!pool->ptr) {
-               device->ws->buffer_destroy(pool->bo);
-               vk_free2(&device->alloc, pAllocator, pool);
+               radv_destroy_query_pool(device, pAllocator, pool);
                return vk_error(device->instance, VK_ERROR_OUT_OF_DEVICE_MEMORY);
        }
 
@@ -1340,8 +1350,7 @@ void radv_DestroyQueryPool(
        if (!pool)
                return;
 
-       device->ws->buffer_destroy(pool->bo);
-       vk_free2(&device->alloc, pAllocator, pool);
+       radv_destroy_query_pool(device, pAllocator, pool);
 }
 
 VkResult radv_GetQueryPoolResults(
@@ -1359,6 +1368,9 @@ VkResult radv_GetQueryPoolResults(
        char *data = pData;
        VkResult result = VK_SUCCESS;
 
+       if (radv_device_is_lost(device))
+               return VK_ERROR_DEVICE_LOST;
+
        for(unsigned i = 0; i < queryCount; ++i, data += stride) {
                char *dest = data;
                unsigned query = firstQuery + i;
@@ -1673,7 +1685,7 @@ void radv_CmdResetQueryPool(
        RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
        RADV_FROM_HANDLE(radv_query_pool, pool, queryPool);
        uint32_t value = pool->type == VK_QUERY_TYPE_TIMESTAMP
-                        ? TIMESTAMP_NOT_READY : 0;
+                        ? (uint32_t)TIMESTAMP_NOT_READY : 0;
        uint32_t flush_bits = 0;
 
        /* Make sure to sync all previous work if the given command buffer has
@@ -1708,7 +1720,7 @@ void radv_ResetQueryPool(
        RADV_FROM_HANDLE(radv_query_pool, pool, queryPool);
 
        uint32_t value = pool->type == VK_QUERY_TYPE_TIMESTAMP
-                        ? TIMESTAMP_NOT_READY : 0;
+                        ? (uint32_t)TIMESTAMP_NOT_READY : 0;
        uint32_t *data =  (uint32_t*)(pool->ptr + firstQuery * pool->stride);
        uint32_t *data_end = (uint32_t*)(pool->ptr + (firstQuery + queryCount) * pool->stride);