radv: Never try to create more than max_sets descriptor sets.

We only use the freed ones after all free space has been used. If
the app only allocates small descriptor sets, we might go over
max_sets before the memory is full.

Signed-off-by: Bas Nieuwenhuizen <basni@google.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
CC: <mesa-stable@lists.freedesktop.org>
Fixes: f4e499ec79147f4172f3669ae9dafd941aaeeb65
(cherry picked from commit f4487016226c3337fa5fb2244c75ce298093c3ce)
diff --git a/src/amd/vulkan/radv_descriptor_set.c b/src/amd/vulkan/radv_descriptor_set.c
index eb8b5d6..41cbd11 100644
--- a/src/amd/vulkan/radv_descriptor_set.c
+++ b/src/amd/vulkan/radv_descriptor_set.c
@@ -275,12 +275,13 @@
 		uint32_t layout_size = align_u32(layout->size, 32);
 		set->size = layout->size;
 		if (!cmd_buffer) {
-			if (pool->current_offset + layout_size <= pool->size) {
+			if (pool->current_offset + layout_size <= pool->size &&
+			    pool->allocated_sets < pool->max_sets) {
 				set->bo = pool->bo;
 				set->mapped_ptr = (uint32_t*)(pool->mapped_ptr + pool->current_offset);
 				set->va = device->ws->buffer_get_va(set->bo) + pool->current_offset;
 				pool->current_offset += layout_size;
-
+				++pool->allocated_sets;
 			} else {
 				int entry = pool->free_list, prev_entry = -1;
 				uint32_t offset;
@@ -417,6 +418,7 @@
 	pool->full_list = 0;
 	pool->free_nodes[max_sets - 1].next = -1;
 	pool->max_sets = max_sets;
+	pool->allocated_sets = 0;
 
 	for (int i = 0; i  + 1 < max_sets; ++i)
 		pool->free_nodes[i].next = i + 1;
@@ -494,6 +496,7 @@
 		radv_descriptor_set_destroy(device, pool, set, false);
 	}
 
+	pool->allocated_sets = 0;
 	pool->current_offset = 0;
 	pool->free_list = -1;
 	pool->full_list = 0;
diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
index 0b8f50a..ff7ded1 100644
--- a/src/amd/vulkan/radv_private.h
+++ b/src/amd/vulkan/radv_private.h
@@ -543,6 +543,7 @@
 	int free_list;
 	int full_list;
 	uint32_t max_sets;
+	uint32_t allocated_sets;
 	struct radv_descriptor_pool_free_node free_nodes[];
 };