ShaderRenderCase: Add cleanup code for buffers and allocs
authorPeter Gal <pgal.u-szeged@partner.samsung.com>
Mon, 31 Aug 2015 17:59:38 +0000 (19:59 +0200)
committerPeter Gal <pgal.u-szeged@partner.samsung.com>
Thu, 12 Nov 2015 18:52:42 +0000 (19:52 +0100)
external/vulkancts/modules/vulkan/shaderrendercase/vktShaderRenderCase.cpp
external/vulkancts/modules/vulkan/shaderrendercase/vktShaderRenderCase.hpp

index 4211e68..47c6b47 100644 (file)
@@ -308,6 +308,21 @@ ShaderRenderCaseInstance::ShaderRenderCaseInstance (Context& context, const stri
 
 ShaderRenderCaseInstance::~ShaderRenderCaseInstance (void)
 {
+       const VkDevice                          vkDevice                        = m_context.getDevice();
+       const DeviceInterface&          vk                                      = m_context.getDeviceInterface();
+
+       for (size_t i = 0; i < m_vertexBuffers.size(); i++)
+       {
+               VK_CHECK(vk.freeMemory(vkDevice, m_vertexBufferAllocs[i]->getMemory()));
+               VK_CHECK(vk.destroyBuffer(vkDevice, m_vertexBuffers[i]));
+       }
+
+       for (size_t i = 0; i < m_uniformInfos.size(); i++)
+       {
+               VK_CHECK(vk.destroyBufferView(vkDevice, m_uniformInfos[i].view));
+               VK_CHECK(vk.freeMemory(vkDevice, m_uniformInfos[i].alloc->getMemory()));
+               VK_CHECK(vk.destroyBuffer(vkDevice, m_uniformInfos[i].buffer));
+       }
 }
 
 tcu::TestStatus ShaderRenderCaseInstance::iterate (void)
@@ -339,7 +354,7 @@ tcu::TestStatus ShaderRenderCaseInstance::iterate (void)
                return tcu::TestStatus::fail("Image mismatch");
 }
 
-void ShaderRenderCaseInstance::setupUniformData (deUint32 size, const void* dataPtr)
+void ShaderRenderCaseInstance::setupUniformData (deUint32 bindingLocation, deUint32 size, const void* dataPtr)
 {
        const VkDevice                          vkDevice                        = m_context.getDevice();
        const DeviceInterface&          vk                                      = m_context.getDeviceInterface();
@@ -377,10 +392,27 @@ void ShaderRenderCaseInstance::setupUniformData (deUint32 size, const void* data
                size                                                                            // VkDeviceSize range;
        };
 
-       m_uniformBufferViews.push_back(createBufferView(vk, vkDevice, &viewInfo).disown());
+       VkBufferView bufferView = createBufferView(vk, vkDevice, &viewInfo).disown();
+
+       const VkDescriptorInfo descriptor =
+       {
+               bufferView,                                                                     // VkBufferView         bufferView;
+               0,                                                                                      // VkSampler            sampler;
+               0,                                                                                      // VkImageView          imageView;
+               0,                                                                                      // VkAttachmentView     attachmentView;
+               (vk::VkImageLayout)0,                                           // VkImageLayout        imageLayout;
+       };
+
+       const UniformInfo uniformInfo =
+       {
+               buffer.disown(),                                                        // VkBuffer                     buffer;
+               alloc.release(),                                                        // Allocation*          alloc;
+               bufferView,                                                                     // VkBufferView         view;
+               descriptor,                                                                     // VkDescriptorInfo     descriptor
+               bindingLocation                                                         // deUint32             location;
+       };
 
-       m_uniformBuffers.push_back(buffer.disown());
-       m_uniformBufferAllocs.push_back(alloc.release());
+       m_uniformInfos.push_back(uniformInfo);
 }
 
 
@@ -620,9 +652,10 @@ void ShaderRenderCaseInstance::render (Surface& result, const QuadGrid& quadGrid
                m_descriptorPool = m_descriptorPoolBuilder.build(vk, vkDevice, VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT, 1u);
                m_descriptorSet = allocDescriptorSet(vk, vkDevice, *m_descriptorPool, VK_DESCRIPTOR_SET_USAGE_STATIC, *m_descriptorSetLayout);
 
-               for(deUint32 i = 0; i < m_uniformDescriptorInfos.size(); i++)
+               for(deUint32 i = 0; i < m_uniformInfos.size(); i++)
                {
-                       m_descriptorSetUpdateBuilder.writeSingle(*m_descriptorSet, DescriptorSetUpdateBuilder::Location::binding(m_uniformLocations[i]), VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &m_uniformDescriptorInfos[i]);
+                       deUint32 location = m_uniformInfos[i].location;
+                       m_descriptorSetUpdateBuilder.writeSingle(*m_descriptorSet, DescriptorSetUpdateBuilder::Location::binding(location), VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &m_uniformInfos[i].descriptor);
                }
 
                m_descriptorSetUpdateBuilder.update(vk, vkDevice);
index 547d954..35f759e 100644 (file)
@@ -227,7 +227,7 @@ protected:
 
 private:
 
-       void                                    setupUniformData                        (deUint32 size, const void* dataPtr);
+       void                                    setupUniformData                        (deUint32 bindingLocation, deUint32 size, const void* dataPtr);
        void                                    setupDefaultInputs                      (const QuadGrid& quadGrid);
 
        void                                    render                                          (tcu::Surface& result, const QuadGrid& quadGrid);
@@ -282,11 +282,15 @@ private:
        vk::DescriptorPoolBuilder                               m_descriptorPoolBuilder;
        vk::DescriptorSetUpdateBuilder                  m_descriptorSetUpdateBuilder;
 
-       std::vector<deUint32>   m_uniformLocations;
-       std::vector<vk::VkBuffer>                       m_uniformBuffers;
-       std::vector<vk::Allocation*>            m_uniformBufferAllocs;
-       std::vector<vk::VkBufferView>           m_uniformBufferViews;
-       std::vector<vk::VkDescriptorInfo>       m_uniformDescriptorInfos;
+       struct UniformInfo
+       {
+               vk::VkBuffer                            buffer;
+               vk::Allocation*                         alloc;
+               vk::VkBufferView                        view;
+               vk::VkDescriptorInfo            descriptor;
+               deUint32                                        location;
+       };
+       std::vector<UniformInfo>                m_uniformInfos;
 
        std::vector<vk::VkVertexInputBindingDescription>        m_vertexBindingDescription;
        std::vector<vk::VkVertexInputAttributeDescription>      m_vertexattributeDescription;
@@ -300,20 +304,7 @@ void ShaderRenderCaseInstance::addUniform (deUint32 bindingLocation, vk::VkDescr
        m_descriptorSetLayoutBuilder.addSingleBinding(descriptorType, vk::VK_SHADER_STAGE_VERTEX_BIT);
        m_descriptorPoolBuilder.addType(descriptorType);
 
-       setupUniformData(sizeof(T), &data);
-
-       const vk::VkDescriptorInfo view =
-       {
-               m_uniformBufferViews[m_uniformBufferViews.size() - 1],                                                                                  // VkBufferView         bufferView;
-               0,                                                                                      // VkSampler            sampler;
-               0,                                                                                      // VkImageView          imageView;
-               0,                                                                                      // VkAttachmentView     attachmentView;
-               (vk::VkImageLayout)0,                                                   // VkImageLayout        imageLayout;
-       };
-
-       m_uniformDescriptorInfos.push_back(view);
-
-       m_uniformLocations.push_back(bindingLocation);
+       setupUniformData(bindingLocation, sizeof(T), &data);
 }