Fix use of pointer to stack allocated struct
authorTyler Schicke <tschicke@nvidia.com>
Wed, 15 Jan 2020 00:47:57 +0000 (16:47 -0800)
committerTyler Schicke <tschicke@nvidia.com>
Fri, 17 Jan 2020 00:55:05 +0000 (16:55 -0800)
The dEQP-VK.wsi.display_control.swapchain_counter test's
createSwapchainConfig was returning a struct containing a pointer to
another struct that was stack allocated, so after the return that
pointer is no longer valid.

This change stores the inner struct in the SwapchainCounterTestInstance
instead of on the stack of createSwapchainConfig, and uses a pointer to
that struct, which remains valid while the test runs.

Components: Vulkan

VK-GL-CTS issue: 2184

Affects:
dEQP-VK.wsi.display_control.swapchain_counter

Change-Id: I8e83f810427167113e5cee843cbafda237606dcf

external/vulkancts/modules/vulkan/wsi/vktWsiDisplayControlTests.cpp

index 39e66c0..5967b4c 100644 (file)
@@ -543,12 +543,24 @@ Move<VkPipelineLayout> createPipelineLayout (const DeviceInterface&       vkd,
        return createPipelineLayout(vkd, device, &createInfo);
 }
 
+VkSwapchainCounterCreateInfoEXT createSwapchainCounterConfig()
+{
+       const VkSwapchainCounterCreateInfoEXT swapchainCounterConfig =
+       {
+               VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT,
+               DE_NULL,
+               VK_SURFACE_COUNTER_VBLANK_EXT
+       };
+       return swapchainCounterConfig;
+}
+
 VkSwapchainCreateInfoKHR createSwapchainConfig (VkSurfaceKHR                                           surface,
                                                                                                deUint32                                                        queueFamilyIndex,
                                                                                                const VkSurfaceCapabilities2EXT&        properties,
                                                                                                const vector<VkSurfaceFormatKHR>&       formats,
                                                                                                const vector<VkPresentModeKHR>&         presentModes,
-                                                                                               VkPresentModeKHR                                        presentMode)
+                                                                                               VkPresentModeKHR                                        presentMode,
+                                                                                               VkSwapchainCounterCreateInfoEXT *swapchainCounterInfo)
 {
        if ((properties.supportedSurfaceCounters & VK_SURFACE_COUNTER_VBLANK_EXT) == 0)
                TCU_THROW(NotSupportedError, "vblank counter not supported");
@@ -584,13 +596,6 @@ VkSwapchainCreateInfoKHR createSwapchainConfig (VkSurfaceKHR                                               surface,
        }
 
        {
-               VkSwapchainCounterCreateInfoEXT swapchainCounterInfo =
-               {
-                       VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT,
-                       DE_NULL,
-                       VK_SURFACE_COUNTER_VBLANK_EXT
-               };
-
                const VkSurfaceTransformFlagBitsKHR     preTransform    = (VkSurfaceTransformFlagBitsKHR)transform;
                const VkCompositeAlphaFlagBitsKHR       compositeAlpha  = (VkCompositeAlphaFlagBitsKHR)alpha;
                const VkFormat                                          imageFormat             = formats[0].format;
@@ -598,7 +603,7 @@ VkSwapchainCreateInfoKHR createSwapchainConfig (VkSurfaceKHR                                                surface,
                const VkSwapchainCreateInfoKHR          createInfo              =
                {
                        VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR,
-                       &swapchainCounterInfo,
+                       swapchainCounterInfo,
                        0u,
                        surface,
                        properties.minImageCount,
@@ -673,6 +678,7 @@ private:
        std::vector<VkSemaphore>                        m_renderSemaphores;
        std::vector<VkFence>                            m_fences;
 
+       VkSwapchainCounterCreateInfoEXT         m_swapchainCounterConfig;
        VkSwapchainCreateInfoKHR                        m_swapchainConfig;
 
        const size_t                                            m_frameCount;
@@ -707,7 +713,8 @@ SwapchainCounterTestInstance::SwapchainCounterTestInstance (Context& context)
        , m_surfaceFormats                      (wsi::getPhysicalDeviceSurfaceFormats(m_vki, m_physicalDevice, m_surface))
        , m_presentModes                        (wsi::getPhysicalDeviceSurfacePresentModes(m_vki, m_physicalDevice, m_surface))
 
-       , m_swapchainConfig                     (createSwapchainConfig(m_surface, m_queueFamilyIndex, m_surfaceProperties, m_surfaceFormats, m_presentModes, VK_PRESENT_MODE_FIFO_KHR))
+       , m_swapchainCounterConfig      (createSwapchainCounterConfig())
+       , m_swapchainConfig                     (createSwapchainConfig(m_surface, m_queueFamilyIndex, m_surfaceProperties, m_surfaceFormats, m_presentModes, VK_PRESENT_MODE_FIFO_KHR, &m_swapchainCounterConfig))
 
        , m_frameCount                          (20u)
        , m_frameNdx                            (0u)