VkResult radv_CreateDescriptorPool( VkDevice _device, const VkDescriptorPoolCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDescriptorPool* pDescriptorPool) { RADV_FROM_HANDLE(radv_device, device, _device); struct radv_descriptor_pool *pool; int size = sizeof(struct radv_descriptor_pool); uint64_t bo_size = 0, bo_count = 0, range_count = 0; for (unsigned i = 0; i < pCreateInfo->poolSizeCount; ++i) { if (pCreateInfo->pPoolSizes[i].type != VK_DESCRIPTOR_TYPE_SAMPLER) bo_count += pCreateInfo->pPoolSizes[i].descriptorCount; switch(pCreateInfo->pPoolSizes[i].type) { case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC: case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC: range_count += pCreateInfo->pPoolSizes[i].descriptorCount; break; case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER: case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER: case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER: case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER: case VK_DESCRIPTOR_TYPE_SAMPLER: /* 32 as we may need to align for images */ bo_size += 32 * pCreateInfo->pPoolSizes[i].descriptorCount; break; case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE: case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE: case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT: bo_size += 64 * pCreateInfo->pPoolSizes[i].descriptorCount; break; case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: bo_size += 96 * pCreateInfo->pPoolSizes[i].descriptorCount; break; default: unreachable("unknown descriptor type\n"); break; } } if (!(pCreateInfo->flags & VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT)) { uint64_t host_size = pCreateInfo->maxSets * sizeof(struct radv_descriptor_set); host_size += sizeof(struct radeon_winsys_bo*) * bo_count; host_size += sizeof(struct radv_descriptor_range) * range_count; size += host_size; } else { size += sizeof(struct radv_descriptor_pool_entry) * pCreateInfo->maxSets; } pool = vk_alloc2(&device->alloc, pAllocator, size, 8, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); if (!pool) return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); memset(pool, 0, sizeof(*pool)); if (!(pCreateInfo->flags & VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT)) { pool->host_memory_base = (uint8_t*)pool + sizeof(struct radv_descriptor_pool); pool->host_memory_ptr = pool->host_memory_base; pool->host_memory_end = (uint8_t*)pool + size; } if (bo_size) { pool->bo = device->ws->buffer_create(device->ws, bo_size, 32, RADEON_DOMAIN_VRAM, RADEON_FLAG_NO_INTERPROCESS_SHARING | RADEON_FLAG_READ_ONLY); pool->mapped_ptr = (uint8_t*)device->ws->buffer_map(pool->bo); } pool->size = bo_size; pool->max_entry_count = pCreateInfo->maxSets; *pDescriptorPool = radv_descriptor_pool_to_handle(pool); return VK_SUCCESS; }
VkResult radv_CreateDescriptorPool( VkDevice _device, const VkDescriptorPoolCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDescriptorPool* pDescriptorPool) { RADV_FROM_HANDLE(radv_device, device, _device); struct radv_descriptor_pool *pool; unsigned max_sets = pCreateInfo->maxSets * 2; int size = sizeof(struct radv_descriptor_pool) + max_sets * sizeof(struct radv_descriptor_pool_free_node); uint64_t bo_size = 0; pool = vk_alloc2(&device->alloc, pAllocator, size, 8, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); if (!pool) return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); memset(pool, 0, sizeof(*pool)); pool->free_list = -1; 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; for (unsigned i = 0; i < pCreateInfo->poolSizeCount; ++i) { switch(pCreateInfo->pPoolSizes[i].type) { case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC: case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC: break; case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER: case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER: case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER: case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER: case VK_DESCRIPTOR_TYPE_SAMPLER: /* 32 as we may need to align for images */ bo_size += 32 * pCreateInfo->pPoolSizes[i].descriptorCount; break; case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE: case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE: case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT: bo_size += 64 * pCreateInfo->pPoolSizes[i].descriptorCount; break; case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: bo_size += 96 * pCreateInfo->pPoolSizes[i].descriptorCount; break; default: unreachable("unknown descriptor type\n"); break; } } if (bo_size) { pool->bo = device->ws->buffer_create(device->ws, bo_size, 32, RADEON_DOMAIN_VRAM, 0); pool->mapped_ptr = (uint8_t*)device->ws->buffer_map(pool->bo); } pool->size = bo_size; list_inithead(&pool->descriptor_sets); *pDescriptorPool = radv_descriptor_pool_to_handle(pool); return VK_SUCCESS; }