Merge vk-gkl-cts/vulkan-cts-1.1.2 into vk-gl-cts/vulkan-cts-1.1.3
authorAlexander Galazin <alexander.galazin@arm.com>
Tue, 26 Feb 2019 18:44:27 +0000 (19:44 +0100)
committerAlexander Galazin <alexander.galazin@arm.com>
Tue, 26 Feb 2019 18:44:27 +0000 (19:44 +0100)
Change-Id: I6acb7ecd862fd48e3602301e4d05394b4a34489a

24 files changed:
external/vulkancts/framework/vulkan/vkPlatform.cpp
external/vulkancts/framework/vulkan/vkPlatform.hpp
external/vulkancts/modules/vulkan/memory/vktMemoryPipelineBarrierTests.cpp
external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemWsiSwapchainTests.cpp
external/vulkancts/modules/vulkan/wsi/vktWsiColorSpaceTests.cpp
external/vulkancts/modules/vulkan/wsi/vktWsiDisplayTimingTests.cpp
external/vulkancts/modules/vulkan/wsi/vktWsiIncrementalPresentTests.cpp
external/vulkancts/modules/vulkan/wsi/vktWsiSharedPresentableImageTests.cpp
external/vulkancts/modules/vulkan/wsi/vktWsiSurfaceTests.cpp
external/vulkancts/modules/vulkan/wsi/vktWsiSwapchainTests.cpp
framework/platform/android/tcuAndroidPlatform.cpp
framework/platform/android/tcuAndroidPlatform.hpp
framework/platform/lnx/X11/tcuLnxX11.cpp
framework/platform/lnx/X11/tcuLnxX11.hpp
framework/platform/lnx/X11/tcuLnxX11Xcb.cpp
framework/platform/lnx/X11/tcuLnxX11Xcb.hpp
framework/platform/lnx/tcuLnxVulkanPlatform.cpp
framework/platform/lnx/tcuLnxVulkanPlatform.hpp
framework/platform/lnx/wayland/tcuLnxWayland.cpp
framework/platform/lnx/wayland/tcuLnxWayland.hpp
framework/platform/osx/tcuOSXVulkanPlatform.cpp
framework/platform/osx/tcuOSXVulkanPlatform.hpp
framework/platform/win32/tcuWin32VulkanPlatform.cpp
framework/platform/win32/tcuWin32VulkanPlatform.hpp

index 8ceb805..d2266f4 100644 (file)
@@ -78,6 +78,11 @@ wsi::Display* Platform::createWsiDisplay (wsi::Type) const
        TCU_THROW(NotSupportedError, "WSI not supported");
 }
 
+bool Platform::hasDisplay (wsi::Type) const
+{
+       return false;
+}
+
 void Platform::describePlatform (std::ostream& dst) const
 {
        dst << "vk::Platform::describePlatform() not implemented";
index 40159a7..1ec1f26 100644 (file)
@@ -141,6 +141,7 @@ public:
        virtual Library*                createLibrary           (void) const = 0;
 
        virtual wsi::Display*   createWsiDisplay        (wsi::Type wsiType) const;
+       virtual bool                    hasDisplay      (wsi::Type wsiType) const;
 
        virtual void                    getMemoryLimits         (PlatformMemoryLimits& limits) const = 0;
        virtual void                    describePlatform        (std::ostream& dst) const;
index 413ee45..1eb9a46 100644 (file)
@@ -181,6 +181,34 @@ enum Access
        ACCESS_LAST
 };
 
+Access accessFlagToAccess (vk::VkAccessFlagBits flag)
+{
+       switch (flag)
+       {
+       case vk::VK_ACCESS_INDIRECT_COMMAND_READ_BIT:                   return ACCESS_INDIRECT_COMMAND_READ_BIT;
+       case vk::VK_ACCESS_INDEX_READ_BIT:                                              return ACCESS_INDEX_READ_BIT;
+       case vk::VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT:                   return ACCESS_VERTEX_ATTRIBUTE_READ_BIT;
+       case vk::VK_ACCESS_UNIFORM_READ_BIT:                                    return ACCESS_UNIFORM_READ_BIT;
+       case vk::VK_ACCESS_INPUT_ATTACHMENT_READ_BIT:                   return ACCESS_INPUT_ATTACHMENT_READ_BIT;
+       case vk::VK_ACCESS_SHADER_READ_BIT:                                             return ACCESS_SHADER_READ_BIT;
+       case vk::VK_ACCESS_SHADER_WRITE_BIT:                                    return ACCESS_SHADER_WRITE_BIT;
+       case vk::VK_ACCESS_COLOR_ATTACHMENT_READ_BIT:                   return ACCESS_COLOR_ATTACHMENT_READ_BIT;
+       case vk::VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT:                  return ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
+       case vk::VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT:   return ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
+       case vk::VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT:  return ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
+       case vk::VK_ACCESS_TRANSFER_READ_BIT:                                   return ACCESS_TRANSFER_READ_BIT;
+       case vk::VK_ACCESS_TRANSFER_WRITE_BIT:                                  return ACCESS_TRANSFER_WRITE_BIT;
+       case vk::VK_ACCESS_HOST_READ_BIT:                                               return ACCESS_HOST_READ_BIT;
+       case vk::VK_ACCESS_HOST_WRITE_BIT:                                              return ACCESS_HOST_WRITE_BIT;
+       case vk::VK_ACCESS_MEMORY_READ_BIT:                                             return ACCESS_MEMORY_READ_BIT;
+       case vk::VK_ACCESS_MEMORY_WRITE_BIT:                                    return ACCESS_MEMORY_WRITE_BIT;
+
+       default:
+               DE_FATAL("Unknown access flags");
+               return ACCESS_LAST;
+       }
+}
+
 // Sequential stage enums
 enum PipelineStage
 {
@@ -203,9 +231,9 @@ enum PipelineStage
        PIPELINESTAGE_LAST
 };
 
-PipelineStage pipelineStageFlagToPipelineStage (vk::VkPipelineStageFlagBits flags)
+PipelineStage pipelineStageFlagToPipelineStage (vk::VkPipelineStageFlagBits flag)
 {
-       switch (flags)
+       switch (flag)
        {
                case vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT:                                             return PIPELINESTAGE_TOP_OF_PIPE_BIT;
                case vk::VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT:                                  return PIPELINESTAGE_BOTTOM_OF_PIPE_BIT;
@@ -7346,9 +7374,9 @@ private:
        const vk::VkPipelineStageFlags  m_allowedStages;
        const vk::VkAccessFlags                 m_allowedAccesses;
 
-       // [dstStage][srcStage] = srcAccesses
-       // In stage dstStage write srcAccesses from srcStage are not yet available
-       vk::VkAccessFlags                               m_unavailableWriteOperations[PIPELINESTAGE_LAST][PIPELINESTAGE_LAST];
+       // [dstStage][srcStage][dstAccess] = srcAccesses
+       // In stage dstStage write srcAccesses from srcStage are not yet available for dstAccess
+       vk::VkAccessFlags                               m_unavailableWriteOperations[PIPELINESTAGE_LAST][PIPELINESTAGE_LAST][ACCESS_LAST];
        // Latest pipeline transition is not available in stage
        bool                                                    m_unavailableLayoutTransition[PIPELINESTAGE_LAST];
        // [dstStage] = dstAccesses
@@ -7389,7 +7417,15 @@ CacheState::CacheState (vk::VkPipelineStageFlags allowedStages, vk::VkAccessFlag
 
                        // There are no write operations that are not yet available
                        // initially.
-                       m_unavailableWriteOperations[dstStage][srcStage] = 0;
+                       for (vk::VkAccessFlags dstAccess_ = 1; dstAccess_ <= m_allowedAccesses; dstAccess_ <<= 1)
+                       {
+                               const Access dstAccess = accessFlagToAccess((vk::VkAccessFlagBits)dstAccess_);
+
+                               if ((dstAccess_ & m_allowedAccesses) == 0)
+                                       continue;
+
+                               m_unavailableWriteOperations[dstStage][srcStage][dstAccess] = 0;
+                       }
                }
        }
 }
@@ -7440,8 +7476,16 @@ void CacheState::perform (vk::VkPipelineStageFlagBits    stage,
                        // Mark all accesses from all stages invisible
                        m_invisibleOperations[dstStage] |= m_allowedAccesses;
 
-                       // Mark write access from srcStage unavailable to all stages
-                       m_unavailableWriteOperations[dstStage][srcStage] |= access;
+                       // Mark write access from srcStage unavailable to all stages for all accesses
+                       for (vk::VkAccessFlags dstAccess_ = 1; dstAccess_ <= m_allowedAccesses; dstAccess_ <<= 1)
+                       {
+                               const Access dstAccess = accessFlagToAccess((vk::VkAccessFlagBits)dstAccess_);
+
+                               if ((dstAccess_ & m_allowedAccesses) == 0)
+                                       continue;
+
+                               m_unavailableWriteOperations[dstStage][srcStage][dstAccess] |= access;
+                       }
                }
        }
 }
@@ -7501,7 +7545,7 @@ void CacheState::getFullBarrier (vk::VkPipelineStageFlags&        srcStages,
                        dstAccesses |= m_invisibleOperations[dstStage];
                }
 
-               // Make sure all write operations fro mall stages are available
+               // Make sure all write operations froall stages are available
                for (vk::VkPipelineStageFlags srcStage_ = 1; srcStage_ <= m_allowedStages; srcStage_ <<= 1)
                {
                        const PipelineStage srcStage = pipelineStageFlagToPipelineStage((vk::VkPipelineStageFlagBits)srcStage_);
@@ -7509,11 +7553,19 @@ void CacheState::getFullBarrier (vk::VkPipelineStageFlags&      srcStages,
                        if ((srcStage_ & m_allowedStages) == 0)
                                continue;
 
-                       if (m_unavailableWriteOperations[dstStage][srcStage])
+                       for (vk::VkAccessFlags dstAccess_ = 1; dstAccess_ <= m_allowedAccesses; dstAccess_ <<= 1)
                        {
-                               dstStages |= dstStage_;
-                               srcStages |= dstStage_;
-                               srcAccesses |= m_unavailableWriteOperations[dstStage][srcStage];
+                               const Access dstAccess = accessFlagToAccess((vk::VkAccessFlagBits)dstAccess_);
+
+                               if ((dstAccess_ & m_allowedAccesses) == 0)
+                                       continue;
+
+                               if (m_unavailableWriteOperations[dstStage][srcStage][dstAccess])
+                               {
+                                       dstStages |= dstStage_;
+                                       srcStages |= dstStage_;
+                                       srcAccesses |= m_unavailableWriteOperations[dstStage][srcStage][dstAccess];
+                               }
                        }
 
                        if (m_unavailableLayoutTransition[dstStage] && !m_unavailableLayoutTransition[srcStage])
@@ -7533,9 +7585,9 @@ void CacheState::getFullBarrier (vk::VkPipelineStageFlags&        srcStages,
 }
 
 void CacheState::checkImageLayoutBarrier (vk::VkPipelineStageFlags     srcStages,
-                                                                                vk::VkAccessFlags                      srcAccesses,
-                                                                                vk::VkPipelineStageFlags       dstStages,
-                                                                                vk::VkAccessFlags                      dstAccesses)
+                                                                                 vk::VkAccessFlags                     srcAccesses,
+                                                                                 vk::VkPipelineStageFlags      dstStages,
+                                                                                 vk::VkAccessFlags                     dstAccesses)
 {
        DE_ASSERT((srcStages & (~m_allowedStages)) == 0);
        DE_ASSERT((srcAccesses & (~m_allowedAccesses)) == 0);
@@ -7585,10 +7637,18 @@ void CacheState::checkImageLayoutBarrier (vk::VkPipelineStageFlags      srcStages,
                                if ((srcStage_ & m_allowedStages) == 0)
                                        continue;
 
-                               if (m_unavailableWriteOperations[dstStage][srcStage] != (getWriteAccessFlags() & m_allowedAccesses))
+                               for (vk::VkAccessFlags dstAccess_ = 1; dstAccess_ <= m_allowedAccesses; dstAccess_ <<= 1)
                                {
-                                       anyWriteAvailable = true;
-                                       break;
+                                       const Access dstAccess = accessFlagToAccess((vk::VkAccessFlagBits)dstAccess_);
+
+                                       if ((dstAccess_ & m_allowedAccesses) == 0)
+                                               continue;
+
+                                       if (m_unavailableWriteOperations[dstStage][srcStage][dstAccess] != (getWriteAccessFlags() & m_allowedAccesses))
+                                       {
+                                               anyWriteAvailable = true;
+                                               break;
+                                       }
                                }
                        }
                }
@@ -7629,7 +7689,15 @@ void CacheState::imageLayoutBarrier (vk::VkPipelineStageFlags    srcStages,
                                continue;
 
                        // All write operations are available after layout transition
-                       m_unavailableWriteOperations[dstStage][srcStage] = 0;
+                       for (vk::VkAccessFlags dstAccess_ = 1; dstAccess_ <= m_allowedAccesses; dstAccess_ <<= 1)
+                       {
+                               const Access dstAccess = accessFlagToAccess((vk::VkAccessFlagBits)dstAccess_);
+
+                               if ((dstAccess_ & m_allowedAccesses) == 0)
+                                       continue;
+
+                               m_unavailableWriteOperations[dstStage][srcStage][dstAccess] = 0;
+                       }
                }
        }
 }
@@ -7647,7 +7715,7 @@ void CacheState::barrier (vk::VkPipelineStageFlags        srcStages,
        // Transitivity
        {
                vk::VkPipelineStageFlags                oldIncompleteOperations[PIPELINESTAGE_LAST];
-               vk::VkAccessFlags                               oldUnavailableWriteOperations[PIPELINESTAGE_LAST][PIPELINESTAGE_LAST];
+               vk::VkAccessFlags                               oldUnavailableWriteOperations[PIPELINESTAGE_LAST][PIPELINESTAGE_LAST][ACCESS_LAST];
                bool                                                    oldUnavailableLayoutTransition[PIPELINESTAGE_LAST];
 
                deMemcpy(oldIncompleteOperations, m_incompleteOperations, sizeof(oldIncompleteOperations));
@@ -7682,7 +7750,15 @@ void CacheState::barrier (vk::VkPipelineStageFlags       srcStages,
                                                continue;
 
                                        // Writes that are available in srcStage are also available in dstStage
-                                       m_unavailableWriteOperations[dstStage][sharedStage] &= oldUnavailableWriteOperations[srcStage][sharedStage];
+                                       for (vk::VkAccessFlags sharedAccess_ = 1; sharedAccess_ <= m_allowedAccesses; sharedAccess_ <<= 1)
+                                       {
+                                               const Access sharedAccess = accessFlagToAccess((vk::VkAccessFlagBits)sharedAccess_);
+
+                                               if ((sharedAccess_ & m_allowedAccesses) == 0)
+                                                       continue;
+
+                                               m_unavailableWriteOperations[dstStage][sharedStage][sharedAccess] &= oldUnavailableWriteOperations[srcStage][sharedStage][sharedAccess];
+                                       }
                                }
                        }
                }
@@ -7707,12 +7783,20 @@ void CacheState::barrier (vk::VkPipelineStageFlags      srcStages,
                        if ((srcStage_ & m_allowedStages) == 0)
                                continue;
 
-                       // Make srcAccesses from srcStage available in dstStage
-                       if ((srcStage_ & srcStages) != 0)
-                               m_unavailableWriteOperations[dstStage][srcStage] &= ~srcAccesses;
+                       // Make srcAccesses from srcStage available in dstStage for dstAccess
+                       for (vk::VkAccessFlags dstAccess_ = 1; dstAccess_ <= m_allowedAccesses; dstAccess_ <<= 1)
+                       {
+                               const Access dstAccess = accessFlagToAccess((vk::VkAccessFlagBits)dstAccess_);
+
+                               if ((dstAccess_ & m_allowedAccesses) == 0)
+                                       continue;
 
-                       if (m_unavailableWriteOperations[dstStage][srcStage] != 0)
-                               allWritesAvailable = false;
+                               if (((srcStage_ & srcStages) != 0) && ((dstAccess_ & dstAccesses) != 0))
+                                       m_unavailableWriteOperations[dstStage][srcStage][dstAccess] &= ~srcAccesses;
+
+                               if (m_unavailableWriteOperations[dstStage][srcStage][dstAccess] != 0)
+                                       allWritesAvailable = false;
+                       }
                }
 
                // If all writes are available in dstStage make dstAccesses also visible
@@ -7749,9 +7833,17 @@ bool CacheState::isClean (void) const
                        if ((srcStage_ & m_allowedStages) == 0)
                                continue;
 
-                       // Some write operations are not available yet
-                       if (m_unavailableWriteOperations[dstStage][srcStage] != 0)
-                               return false;
+                       for (vk::VkAccessFlags dstAccess_ = 1; dstAccess_ <= m_allowedAccesses; dstAccess_ <<= 1)
+                       {
+                               const Access dstAccess = accessFlagToAccess((vk::VkAccessFlagBits)dstAccess_);
+
+                               if ((dstAccess_ & m_allowedAccesses) == 0)
+                                       continue;
+
+                               // Some write operations are not available yet
+                               if (m_unavailableWriteOperations[dstStage][srcStage][dstAccess] != 0)
+                                       return false;
+                       }
                }
        }
 
@@ -8020,7 +8112,7 @@ void getAvailableOps (const State& state, bool supportsBuffers, bool supportsIma
                {
                        ops.push_back(OP_PIPELINE_BARRIER_GLOBAL);
 
-                       if (state.hasImage)
+                       if (state.hasImage && (state.imageLayout != vk::VK_IMAGE_LAYOUT_UNDEFINED))
                                ops.push_back(OP_PIPELINE_BARRIER_IMAGE);
 
                        if (state.hasBuffer)
index 509851f..b53979f 100644 (file)
@@ -115,7 +115,8 @@ de::MovePtr<vk::wsi::Display> createDisplay (const vk::Platform&    platform,
        }
        catch (const tcu::NotSupportedError& e)
        {
-               if (isExtensionSupported(supportedExtensions, vk::RequiredExtension(getExtensionName(wsiType))))
+               if (isExtensionSupported(supportedExtensions, vk::RequiredExtension(getExtensionName(wsiType))) &&
+                   platform.hasDisplay(wsiType))
                {
                        // If VK_KHR_{platform}_surface was supported, vk::Platform implementation
                        // must support creating native display & window for that WSI type.
index ca87f61..d2f65cc 100644 (file)
@@ -261,7 +261,8 @@ MovePtr<Display> createDisplay (const vk::Platform& platform,
        }
        catch (const tcu::NotSupportedError& e)
        {
-               if (isExtensionSupported(supportedExtensions, RequiredExtension(getExtensionName(wsiType))))
+               if (isExtensionSupported(supportedExtensions, RequiredExtension(getExtensionName(wsiType))) &&
+                   platform.hasDisplay(wsiType))
                {
                        // If VK_KHR_{platform}_surface was supported, vk::Platform implementation
                        // must support creating native display & window for that WSI type.
index 2a6045c..f67a818 100644 (file)
@@ -192,7 +192,8 @@ de::MovePtr<vk::wsi::Display> createDisplay (const vk::Platform&    platform,
        }
        catch (const tcu::NotSupportedError& e)
        {
-               if (isExtensionSupported(supportedExtensions, vk::RequiredExtension(getExtensionName(wsiType))))
+               if (isExtensionSupported(supportedExtensions, vk::RequiredExtension(getExtensionName(wsiType))) &&
+                   platform.hasDisplay(wsiType))
                {
                        // If VK_KHR_{platform}_surface was supported, vk::Platform implementation
                        // must support creating native display & window for that WSI type.
index c367554..9b851b2 100644 (file)
@@ -194,7 +194,8 @@ de::MovePtr<vk::wsi::Display> createDisplay (const vk::Platform&    platform,
        }
        catch (const tcu::NotSupportedError& e)
        {
-               if (isExtensionSupported(supportedExtensions, vk::RequiredExtension(getExtensionName(wsiType))))
+               if (isExtensionSupported(supportedExtensions, vk::RequiredExtension(getExtensionName(wsiType))) &&
+                   platform.hasDisplay(wsiType))
                {
                        // If VK_KHR_{platform}_surface was supported, vk::Platform implementation
                        // must support creating native display & window for that WSI type.
index cf1eb7d..bc7c3de 100644 (file)
@@ -200,7 +200,8 @@ de::MovePtr<vk::wsi::Display> createDisplay (const vk::Platform&    platform,
        }
        catch (const tcu::NotSupportedError& e)
        {
-               if (isExtensionSupported(supportedExtensions, vk::RequiredExtension(getExtensionName(wsiType))))
+               if (isExtensionSupported(supportedExtensions, vk::RequiredExtension(getExtensionName(wsiType))) &&
+                   platform.hasDisplay(wsiType))
                {
                        // If VK_KHR_{platform}_surface was supported, vk::Platform implementation
                        // must support creating native display & window for that WSI type.
index 046b2c0..2501d39 100644 (file)
@@ -238,7 +238,8 @@ MovePtr<Display> createDisplay (const vk::Platform& platform,
        }
        catch (const tcu::NotSupportedError& e)
        {
-               if (isExtensionSupported(supportedExtensions, RequiredExtension(getExtensionName(wsiType))))
+               if (isExtensionSupported(supportedExtensions, RequiredExtension(getExtensionName(wsiType))) &&
+                   platform.hasDisplay(wsiType))
                {
                        // If VK_KHR_{platform}_surface was supported, vk::Platform implementation
                        // must support creating native display & window for that WSI type.
index 318f9ab..98fdbae 100644 (file)
@@ -258,7 +258,8 @@ MovePtr<Display> createDisplay (const vk::Platform& platform,
        }
        catch (const tcu::NotSupportedError& e)
        {
-               if (isExtensionSupported(supportedExtensions, RequiredExtension(getExtensionName(wsiType))))
+               if (isExtensionSupported(supportedExtensions, RequiredExtension(getExtensionName(wsiType))) &&
+                   platform.hasDisplay(wsiType))
                {
                        // If VK_KHR_{platform}_surface was supported, vk::Platform implementation
                        // must support creating native display & window for that WSI type.
index 2aa0920..8556bb0 100644 (file)
@@ -347,5 +347,13 @@ vk::wsi::Display* Platform::createWsiDisplay (vk::wsi::Type wsiType) const
                TCU_THROW(NotSupportedError, "WSI type not supported on Android");
 }
 
+bool Platform::hasDisplay (vk::wsi::Type wsiType) const
+{
+       if (wsiType == vk::wsi::TYPE_ANDROID)
+               return true;
+
+       return false;
+}
+
 } // Android
 } // tcu
index 1798777..a10cef8 100644 (file)
@@ -55,6 +55,7 @@ public:
        void                                                    describePlatform        (std::ostream& dst) const;
        void                                                    getMemoryLimits         (vk::PlatformMemoryLimits& limits) const;
        vk::wsi::Display*                               createWsiDisplay        (vk::wsi::Type wsiType) const;
+       bool                                            hasDisplay              (vk::wsi::Type wsiType) const;
 
 private:
        NativeActivity&                                 m_activity;
index 1dd2a3d..dfe09d0 100644 (file)
@@ -52,6 +52,24 @@ WindowBase::~WindowBase (void)
 {
 }
 
+XlibDisplay::DisplayState XlibDisplay::s_displayState = XlibDisplay::DISPLAY_STATE_UNKNOWN;
+
+bool XlibDisplay::hasDisplay (const char* name)
+{
+       if (s_displayState == DISPLAY_STATE_UNKNOWN)
+       {
+               XInitThreads();
+               Display *display = XOpenDisplay((char*)name);
+               if (display)
+               {
+                       s_displayState = DISPLAY_STATE_AVAILABLE;
+                       XCloseDisplay(display);
+               } else
+                       s_displayState = DISPLAY_STATE_UNAVAILABLE;
+       }
+       return s_displayState == DISPLAY_STATE_AVAILABLE ? true : false;
+}
+
 XlibDisplay::XlibDisplay (EventState& eventState, const char* name)
        : DisplayBase   (eventState)
 {
index 10d7fc0..b6abe1b 100644 (file)
@@ -47,6 +47,13 @@ public:
        virtual                 ~DisplayBase    (void);
        virtual void    processEvents   (void) = 0;
 
+       enum DisplayState
+       {
+               DISPLAY_STATE_UNKNOWN = -1,
+               DISPLAY_STATE_UNAVAILABLE,
+               DISPLAY_STATE_AVAILABLE
+       };
+
 protected:
        EventState&             m_eventState;
 
@@ -90,6 +97,9 @@ public:
        bool                    getVisualInfo   (VisualID visualID, XVisualInfo& dst);
        void                    processEvents   (void);
        void                    processEvent    (XEvent& event);
+       static bool             hasDisplay      (const char* name);
+
+       static DisplayState     s_displayState;
 
 protected:
        ::Display*              m_display;
index de87b0c..2820cbc 100644 (file)
@@ -31,6 +31,23 @@ namespace lnx
 namespace x11
 {
 
+XcbDisplay::DisplayState XcbDisplay::s_displayState = XcbDisplay::DISPLAY_STATE_UNKNOWN;
+
+bool XcbDisplay::hasDisplay (const char* name)
+{
+       if (s_displayState == DISPLAY_STATE_UNKNOWN)
+       {
+               xcb_connection_t *connection = xcb_connect(name, NULL);
+               if (connection)
+               {
+                       s_displayState = DISPLAY_STATE_AVAILABLE;
+                       xcb_disconnect(connection);
+               } else
+                       s_displayState = DISPLAY_STATE_UNAVAILABLE;
+       }
+       return s_displayState == DISPLAY_STATE_AVAILABLE ? true : false;
+}
+
 XcbDisplay::XcbDisplay (EventState& platform, const char* name)
        : DisplayBase   (platform)
 {
index c00c413..0d5472f 100644 (file)
@@ -43,7 +43,9 @@ public:
        xcb_connection_t*       getConnection   (void) { return m_connection;   }
 
        void                            processEvents   (void);
+       static bool                     hasDisplay      (const char* name);
 
+       static DisplayState     s_displayState;
 protected:
        xcb_screen_t*           m_screen;
        xcb_connection_t*       m_connection;
index 642af34..b933dad 100644 (file)
@@ -40,10 +40,12 @@ using de::UniquePtr;
 #      if defined (DEQP_SUPPORT_XCB)
 #              include "tcuLnxX11Xcb.hpp"
 #      endif // DEQP_SUPPORT_XCB
+#      define X11_DISPLAY ""
 #endif // DEQP_SUPPORT_X11
 
 #if defined (DEQP_SUPPORT_WAYLAND)
 #      include "tcuLnxWayland.hpp"
+#      define WAYLAND_DISPLAY DE_NULL
 #endif // DEQP_SUPPORT_WAYLAND
 
 namespace tcu
@@ -211,17 +213,17 @@ vk::wsi::Display* VulkanPlatform::createWsiDisplay (vk::wsi::Type wsiType) const
        {
 #if defined (DEQP_SUPPORT_X11)
        case vk::wsi::TYPE_XLIB:
-               return new VulkanDisplayXlib(MovePtr<x11::DisplayBase>(new x11::XlibDisplay(m_eventState,"")));
+               return new VulkanDisplayXlib(MovePtr<x11::DisplayBase>(new x11::XlibDisplay(m_eventState,X11_DISPLAY)));
                break;
 #endif // DEQP_SUPPORT_X11
 #if defined (DEQP_SUPPORT_XCB)
        case vk::wsi::TYPE_XCB:
-               return new VulkanDisplayXcb(MovePtr<x11::DisplayBase>(new x11::XcbDisplay(m_eventState,"")));
+               return new VulkanDisplayXcb(MovePtr<x11::DisplayBase>(new x11::XcbDisplay(m_eventState,X11_DISPLAY)));
                break;
 #endif // DEQP_SUPPORT_XCB
 #if defined (DEQP_SUPPORT_WAYLAND)
        case vk::wsi::TYPE_WAYLAND:
-               return new VulkanDisplayWayland(MovePtr<wayland::Display>(new wayland::Display(m_eventState, DE_NULL)));
+               return new VulkanDisplayWayland(MovePtr<wayland::Display>(new wayland::Display(m_eventState, WAYLAND_DISPLAY)));
                break;
 #endif // DEQP_SUPPORT_WAYLAND
 
@@ -230,7 +232,27 @@ vk::wsi::Display* VulkanPlatform::createWsiDisplay (vk::wsi::Type wsiType) const
 
        };
 }
+bool VulkanPlatform::hasDisplay (vk::wsi::Type wsiType) const
+{
+       switch(wsiType)
+       {
+#if defined (DEQP_SUPPORT_X11)
+       case vk::wsi::TYPE_XLIB:
+               return x11::XlibDisplay::hasDisplay(X11_DISPLAY);
+#endif // DEQP_SUPPORT_X11
+#if defined (DEQP_SUPPORT_XCB)
+       case vk::wsi::TYPE_XCB:
+               return x11::XcbDisplay::hasDisplay(X11_DISPLAY);
+#endif // DEQP_SUPPORT_XCB
+#if defined (DEQP_SUPPORT_WAYLAND)
+       case vk::wsi::TYPE_WAYLAND:
+               return wayland::Display::hasDisplay(WAYLAND_DISPLAY);
+#endif // DEQP_SUPPORT_WAYLAND
+       default:
+               return false;
 
+       };
+}
 vk::Library* VulkanPlatform::createLibrary (void) const
 {
        return new VulkanLibrary();
index b025f55..6d4c2e9 100644 (file)
@@ -39,6 +39,7 @@ public:
                                                VulkanPlatform          (EventState& eventState);
        vk::wsi::Display*       createWsiDisplay        (vk::wsi::Type wsiType) const;
        vk::Library*            createLibrary           (void) const;
+       bool                            hasDisplay              (vk::wsi::Type wsiType) const;
        void                            describePlatform        (std::ostream& dst) const;
        void                            getMemoryLimits         (vk::PlatformMemoryLimits& limits) const;
 
index 6d12543..bea6835 100644 (file)
@@ -42,6 +42,8 @@ const struct wl_registry_listener Display::s_registryListener =
        Display::handleGlobalRemove
 };
 
+Display::DisplayState Display::s_displayState = Display::DISPLAY_STATE_UNKNOWN;
+
 const struct wl_shell_surface_listener Window::s_shellSurfaceListener =
 {
        Window::handlePing,
@@ -68,6 +70,21 @@ void Display::handleGlobalRemove (void* data, struct wl_registry* registry, uint
        DE_UNREF(name);
 }
 
+bool Display::hasDisplay (const char* name)
+{
+       if (s_displayState == DISPLAY_STATE_UNKNOWN)
+       {
+               struct wl_display *display = wl_display_connect(name);
+               if (display)
+               {
+                       s_displayState = DISPLAY_STATE_AVAILABLE;
+                       wl_display_disconnect(display);
+               } else
+                       s_displayState = DISPLAY_STATE_UNAVAILABLE;
+       }
+       return s_displayState == DISPLAY_STATE_AVAILABLE ? true : false;
+}
+
 Display::Display (EventState& eventState, const char* name)
        : m_eventState  (eventState)
        , m_display             (DE_NULL)
index b5d1f9e..b7c540a 100644 (file)
@@ -51,6 +51,15 @@ public:
        struct wl_shell*                getShell                                (void) { return m_shell;                }
 
        void                                    processEvents                   (void);
+       static bool                             hasDisplay                      (const char* name);
+
+       enum DisplayState
+       {
+               DISPLAY_STATE_UNKNOWN = -1,
+               DISPLAY_STATE_UNAVAILABLE,
+               DISPLAY_STATE_AVAILABLE
+       };
+       static DisplayState             s_displayState;
 
 protected:
        EventState&                             m_eventState;
index b1fde87..61822dd 100644 (file)
@@ -108,6 +108,13 @@ vk::wsi::Display* VulkanPlatform::createWsiDisplay (vk::wsi::Type wsiType) const
        return new VulkanDisplay();
 }
 
+bool VulkanPlatform::hasDisplay (vk::wsi::Type wsiType)  const
+{
+       if (wsiType != vk::wsi::TYPE_MACOS)
+               return false;
+
+       return true;
+}
 vk::Library* VulkanPlatform::createLibrary (void) const
 {
        return new VulkanLibrary();
index f288425..5044d5b 100644 (file)
@@ -38,6 +38,7 @@ public:
                                                VulkanPlatform          ();
        vk::wsi::Display*       createWsiDisplay        (vk::wsi::Type wsiType) const;
        vk::Library*            createLibrary           (void) const;
+       bool                            hasDisplay              (vk::wsi::Type wsiType) const;
        void                            describePlatform        (std::ostream& dst) const;
        void                            getMemoryLimits         (vk::PlatformMemoryLimits& limits) const;
 };
index 78edfac..a72a36e 100644 (file)
@@ -294,5 +294,13 @@ vk::wsi::Display* VulkanPlatform::createWsiDisplay (vk::wsi::Type wsiType) const
        return new VulkanDisplay(m_instance);
 }
 
+bool VulkanPlatform::hasDisplay (vk::wsi::Type wsiType)  const
+{
+       if (wsiType != vk::wsi::TYPE_WIN32)
+               return false;
+
+       return true;
+}
+
 } // win32
 } // tcu
index 26d9fb4..4fb7f81 100644 (file)
@@ -40,6 +40,7 @@ public:
 
        vk::Library*            createLibrary           (void) const;
        vk::wsi::Display*       createWsiDisplay        (vk::wsi::Type wsiType) const;
+       bool                            hasDisplay      (vk::wsi::Type wsiType) const;
 
        void                            getMemoryLimits         (vk::PlatformMemoryLimits& limits) const;
        void                            describePlatform        (std::ostream& dst) const;