radv: move calculating primgroup_size to pipeline.
[mesa.git] / src / amd / vulkan / radv_descriptor_set.c
index b608063d0706afe533cacb493738dc5322a220fe..314ab5a96d04bdde12747e7c5d74d22713446095 100644 (file)
@@ -66,6 +66,7 @@ VkResult radv_CreateDescriptorSetLayout(
 
        set_layout->binding_count = max_binding + 1;
        set_layout->shader_stages = 0;
+       set_layout->dynamic_shader_stages = 0;
        set_layout->size = 0;
 
        memset(set_layout->binding, 0, size - sizeof(struct radv_descriptor_set_layout));
@@ -317,7 +318,6 @@ radv_descriptor_set_create(struct radv_device *device,
                        }
 
                        if (pool->size - offset < layout_size) {
-                               vk_free2(&device->alloc, NULL, set->dynamic_descriptors);
                                vk_free2(&device->alloc, NULL, set);
                                return vk_error(VK_ERROR_OUT_OF_POOL_MEMORY_KHR);
                        }
@@ -527,7 +527,7 @@ VkResult radv_FreeDescriptorSets(
        for (uint32_t i = 0; i < count; i++) {
                RADV_FROM_HANDLE(radv_descriptor_set, set, pDescriptorSets[i]);
 
-               if (set)
+               if (set && !pool->host_memory_base)
                        radv_descriptor_set_destroy(device, pool, set, true);
        }
        return VK_SUCCESS;
@@ -603,11 +603,18 @@ write_image_descriptor(struct radv_device *device,
                       struct radv_cmd_buffer *cmd_buffer,
                       unsigned *dst,
                       struct radeon_winsys_bo **buffer_list,
+                      VkDescriptorType descriptor_type,
                       const VkDescriptorImageInfo *image_info)
 {
        RADV_FROM_HANDLE(radv_image_view, iview, image_info->imageView);
-       memcpy(dst, iview->descriptor, 8 * 4);
-       memcpy(dst + 8, iview->fmask_descriptor, 8 * 4);
+
+       if (descriptor_type == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) {
+               memcpy(dst, iview->storage_descriptor, 8 * 4);
+               memcpy(dst + 8, iview->storage_fmask_descriptor, 8 * 4);
+       } else {
+               memcpy(dst, iview->descriptor, 8 * 4);
+               memcpy(dst + 8, iview->fmask_descriptor, 8 * 4);
+       }
 
        if (cmd_buffer)
                device->ws->cs_add_buffer(cmd_buffer->cs, iview->bo, 7);
@@ -620,12 +627,13 @@ write_combined_image_sampler_descriptor(struct radv_device *device,
                                        struct radv_cmd_buffer *cmd_buffer,
                                        unsigned *dst,
                                        struct radeon_winsys_bo **buffer_list,
+                                       VkDescriptorType descriptor_type,
                                        const VkDescriptorImageInfo *image_info,
                                        bool has_sampler)
 {
        RADV_FROM_HANDLE(radv_sampler, sampler, image_info->sampler);
 
-       write_image_descriptor(device, cmd_buffer, dst, buffer_list, image_info);
+       write_image_descriptor(device, cmd_buffer, dst, buffer_list, descriptor_type, image_info);
        /* copy over sampler state */
        if (has_sampler)
                memcpy(dst + 16, sampler->state, 16);
@@ -696,10 +704,12 @@ void radv_update_descriptor_sets(
                        case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
                        case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
                                write_image_descriptor(device, cmd_buffer, ptr, buffer_list,
+                                                      writeset->descriptorType,
                                                       writeset->pImageInfo + j);
                                break;
                        case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
                                write_combined_image_sampler_descriptor(device, cmd_buffer, ptr, buffer_list,
+                                                                       writeset->descriptorType,
                                                                        writeset->pImageInfo + j,
                                                                        !binding_layout->immutable_samplers_offset);
                                if (copy_immutable_samplers) {
@@ -866,10 +876,12 @@ void radv_update_descriptor_set_with_template(struct radv_device *device,
                        case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
                        case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
                                write_image_descriptor(device, cmd_buffer, pDst, buffer_list,
+                                                      templ->entry[i].descriptor_type,
                                                       (struct VkDescriptorImageInfo *) pSrc);
                                break;
                        case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
                                write_combined_image_sampler_descriptor(device, cmd_buffer, pDst, buffer_list,
+                                                                       templ->entry[i].descriptor_type,
                                                                        (struct VkDescriptorImageInfo *) pSrc,
                                                                        templ->entry[i].has_sampler);
                                if (templ->entry[i].immutable_samplers)