dEQP-VK.wsi.android.surface.query_capabilities
dEQP-VK.wsi.android.surface.query_capabilities2
dEQP-VK.wsi.android.surface.query_protected_capabilities
+dEQP-VK.wsi.android.surface.query_surface_counters
dEQP-VK.wsi.android.surface.query_formats
dEQP-VK.wsi.android.surface.query_formats2
dEQP-VK.wsi.android.surface.query_present_modes
dEQP-VK.wsi.macos.surface.query_capabilities
dEQP-VK.wsi.macos.surface.query_capabilities2
dEQP-VK.wsi.macos.surface.query_protected_capabilities
+dEQP-VK.wsi.macos.surface.query_surface_counters
dEQP-VK.wsi.macos.surface.query_formats
dEQP-VK.wsi.macos.surface.query_formats2
dEQP-VK.wsi.macos.surface.query_present_modes
dEQP-VK.wsi.display.create_display_mode
dEQP-VK.wsi.display.get_display_plane_capabilities
dEQP-VK.wsi.display.create_display_plane_surface
+dEQP-VK.wsi.display.surface_counters
dEQP-VK.wsi.display.get_display_properties2
dEQP-VK.wsi.display.get_display_plane_properties2
dEQP-VK.wsi.display.get_display_mode_properties2
return capabilities;
}
+VkSurfaceCapabilities2EXT getPhysicalDeviceSurfaceCapabilities2EXT (const InstanceInterface& vki,
+ VkPhysicalDevice physicalDevice,
+ VkSurfaceKHR surface)
+{
+ VkSurfaceCapabilities2EXT capabilities;
+
+ deMemset(&capabilities, 0, sizeof(capabilities));
+ capabilities.sType = VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_EXT;
+
+ VK_CHECK(vki.getPhysicalDeviceSurfaceCapabilities2EXT(physicalDevice, surface, &capabilities));
+
+ return capabilities;
+}
+
+bool sameSurfaceCapabilities (const VkSurfaceCapabilitiesKHR& khr,
+ const VkSurfaceCapabilities2EXT& ext)
+{
+ return ( khr.minImageCount == ext.minImageCount &&
+ khr.maxImageCount == ext.maxImageCount &&
+ khr.currentExtent.width == ext.currentExtent.width &&
+ khr.currentExtent.height == ext.currentExtent.height &&
+ khr.minImageExtent.width == ext.minImageExtent.width &&
+ khr.minImageExtent.height == ext.minImageExtent.height &&
+ khr.maxImageExtent.width == ext.maxImageExtent.width &&
+ khr.maxImageExtent.height == ext.maxImageExtent.height &&
+ khr.maxImageArrayLayers == ext.maxImageArrayLayers &&
+ khr.supportedTransforms == ext.supportedTransforms &&
+ khr.currentTransform == ext.currentTransform &&
+ khr.supportedCompositeAlpha == ext.supportedCompositeAlpha &&
+ khr.supportedUsageFlags == ext.supportedUsageFlags );
+}
+
std::vector<VkSurfaceFormatKHR> getPhysicalDeviceSurfaceFormats (const InstanceInterface& vki,
VkPhysicalDevice physicalDevice,
VkSurfaceKHR surface)
VkPhysicalDevice physicalDevice,
VkSurfaceKHR surface);
+VkSurfaceCapabilities2EXT getPhysicalDeviceSurfaceCapabilities2EXT(const InstanceInterface& vki,
+ VkPhysicalDevice physicalDevice,
+ VkSurfaceKHR surface);
+
+bool sameSurfaceCapabilities (const VkSurfaceCapabilitiesKHR& khr,
+ const VkSurfaceCapabilities2EXT& ext);
+
std::vector<VkSurfaceFormatKHR> getPhysicalDeviceSurfaceFormats (const InstanceInterface& vki,
VkPhysicalDevice physicalDevice,
VkSurfaceKHR surface);
#include "vkStrUtil.hpp"
#include "vkPrograms.hpp"
#include "vkRef.hpp"
+#include "vkQueryUtil.hpp"
+#include "vkWsiUtil.hpp"
#include "tcuDefs.hpp"
#include "tcuTestLog.hpp"
#include <set>
#include <map>
#include <limits>
+#include <sstream>
+#include <stdexcept>
namespace vkt
{
DISPLAY_TEST_INDEX_CREATE_DISPLAY_MODE,
DISPLAY_TEST_INDEX_GET_DISPLAY_PLANE_CAPABILITIES,
DISPLAY_TEST_INDEX_CREATE_DISPLAY_PLANE_SURFACE,
+ DISPLAY_TEST_INDEX_SURFACE_COUNTERS,
DISPLAY_TEST_INDEX_GET_DISPLAY_PROPERTIES2,
DISPLAY_TEST_INDEX_GET_DISPLAY_PLANES2,
DISPLAY_TEST_INDEX_GET_DISPLAY_MODE2,
tcu::TestStatus testGetDisplayModePropertiesKHR (void);
tcu::TestStatus testCreateDisplayModeKHR (void);
tcu::TestStatus testGetDisplayPlaneCapabilitiesKHR (void);
- tcu::TestStatus testCreateDisplayPlaneSurfaceKHR (void);
+
+ enum SurfaceTestKind
+ {
+ SURFACE_CREATE = 0,
+ SURFACE_COUNTERS,
+ SURFACE_TEST_KIND_MAX_ENUM
+ };
+
+ tcu::TestStatus testDisplaySurface (SurfaceTestKind testKind);
// VK_KHR_get_display_properties2 extension tests
tcu::TestStatus testGetPhysicalDeviceDisplayProperties2KHR (void);
case DISPLAY_TEST_INDEX_GET_DISPLAY_MODE: return testGetDisplayModePropertiesKHR(); break;
case DISPLAY_TEST_INDEX_CREATE_DISPLAY_MODE: return testCreateDisplayModeKHR(); break;
case DISPLAY_TEST_INDEX_GET_DISPLAY_PLANE_CAPABILITIES: return testGetDisplayPlaneCapabilitiesKHR(); break;
- case DISPLAY_TEST_INDEX_CREATE_DISPLAY_PLANE_SURFACE: return testCreateDisplayPlaneSurfaceKHR(); break;
+ case DISPLAY_TEST_INDEX_CREATE_DISPLAY_PLANE_SURFACE: return testDisplaySurface(SURFACE_CREATE); break;
+ case DISPLAY_TEST_INDEX_SURFACE_COUNTERS: return testDisplaySurface(SURFACE_COUNTERS); break;
case DISPLAY_TEST_INDEX_GET_DISPLAY_PROPERTIES2: return testGetPhysicalDeviceDisplayProperties2KHR(); break;
case DISPLAY_TEST_INDEX_GET_DISPLAY_PLANES2: return testGetPhysicalDeviceDisplayPlaneProperties2KHR(); break;
case DISPLAY_TEST_INDEX_GET_DISPLAY_MODE2: return testGetDisplayModeProperties2KHR(); break;
return tcu::TestStatus::pass("pass");
}
+namespace
+{
+ struct SurfaceCountersError : public std::runtime_error
+ {
+ SurfaceCountersError(const std::string& what) : std::runtime_error(what) {}
+ };
+}
+
/*--------------------------------------------------------------------*//*!
- * \brief Create display plane surface coverage test
+ * \brief Test display surface creation or counters.
+ *
+ * In the counter variant, it needs VK_EXT_display_surface_counter
+ * and checks the available surface counters.
*
* Throws an exception on fail.
*
* \return tcu::TestStatus::pass on success
*//*--------------------------------------------------------------------*/
-tcu::TestStatus DisplayCoverageTestInstance::testCreateDisplayPlaneSurfaceKHR (void)
+tcu::TestStatus DisplayCoverageTestInstance::testDisplaySurface (SurfaceTestKind testKind)
{
deUint32 planeCountReported = 0u;
deUint32 planeCountTested = 0u;
bool testPerformed = false;
DisplayVector displaysVector;
VkResult result;
+ std::string surfaceCountersErr;
+
+ DE_ASSERT(testKind >= 0 && testKind < SURFACE_TEST_KIND_MAX_ENUM);
+
+ // Check the needed extension.
+ if (testKind == SURFACE_COUNTERS && (!isInstanceExtensionSupported(m_context.getUsedApiVersion(), m_context.getInstanceExtensions(), "VK_EXT_display_surface_counter")))
+ TCU_THROW(NotSupportedError, "VK_EXT_display_surface_counter not supported");
// Get displays
if (!getDisplays(displaysVector))
if (surface == DE_NULL)
TCU_FAIL("Invalid surface handle returned");
+ if (testKind == SURFACE_COUNTERS)
+ {
+ // Check surface counters.
+ try
+ {
+ const vk::VkSurfaceCapabilities2EXT capsExt = vk::wsi::getPhysicalDeviceSurfaceCapabilities2EXT (m_vki, m_physicalDevice, surface);
+ const vk::VkSurfaceCapabilitiesKHR capsKhr = vk::wsi::getPhysicalDeviceSurfaceCapabilities (m_vki, m_physicalDevice, surface);
+
+ if (!vk::wsi::sameSurfaceCapabilities(capsKhr, capsExt))
+ {
+ throw SurfaceCountersError("KHR and EXT surface capabilities do not match");
+ }
+
+ for (deUint32 i = 0; i < sizeof(capsExt.supportedSurfaceCounters) * 8; ++i)
+ {
+ deUint32 mask = (1<<i);
+ if (capsExt.supportedSurfaceCounters & mask)
+ {
+ if (mask != static_cast<deUint32>(VK_SURFACE_COUNTER_VBLANK_EXT))
+ {
+ std::ostringstream msg;
+ msg << "Invalid bit set in supportedSurfaceCounters: 0x" << std::hex << mask;
+ throw SurfaceCountersError(msg.str());
+ }
+ }
+ }
+ }
+ catch(const SurfaceCountersError& err)
+ {
+ surfaceCountersErr = err.what();
+ }
+ }
+
m_vki.destroySurfaceKHR( instance, // VkInstance instance
surface, // VkSurfaceKHR* pSurface
DE_NULL); // const VkAllocationCallbacks* pAllocator
if (!testPerformed)
TCU_THROW(NotSupportedError, "Cannot find suitable parameters for the test");
- return tcu::TestStatus::pass("pass");
+ return ((surfaceCountersErr.empty()) ? tcu::TestStatus::pass("Pass") : tcu::TestStatus::fail(surfaceCountersErr));
}
/*--------------------------------------------------------------------*//*!
addTest(group, DISPLAY_TEST_INDEX_CREATE_DISPLAY_MODE, "create_display_mode", "Create display mode coverage test");
addTest(group, DISPLAY_TEST_INDEX_GET_DISPLAY_PLANE_CAPABILITIES, "get_display_plane_capabilities", "Display-plane capabilities coverage test");
addTest(group, DISPLAY_TEST_INDEX_CREATE_DISPLAY_PLANE_SURFACE, "create_display_plane_surface", "Create display plane surface coverage test");
+ addTest(group, DISPLAY_TEST_INDEX_SURFACE_COUNTERS, "surface_counters", "Display plane surface counters test");
// VK_KHR_get_display_properties2 extension tests
addTest(group, DISPLAY_TEST_INDEX_GET_DISPLAY_PROPERTIES2, "get_display_properties2", "Display enumeration coverage test using VK_KHR_get_display_properties2");
return tcu::TestStatus::pass("Creating surface succeeded");
}
+tcu::TestStatus querySurfaceCounterTest (Context& context, Type wsiType)
+{
+ const InstanceHelper instHelper (context, wsiType);
+ const NativeObjects native (context, instHelper.supportedExtensions, wsiType);
+ const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, instHelper.instance, wsiType, *native.display, *native.window));
+ const vk::InstanceInterface& vki = context.getInstanceInterface();
+ const vk::VkPhysicalDevice physicalDevice = context.getPhysicalDevice();
+
+ if (!isInstanceExtensionSupported(context.getUsedApiVersion(), context.getInstanceExtensions(), "VK_EXT_display_surface_counter"))
+ TCU_THROW(NotSupportedError, "VK_EXT_display_surface_counter not supported");
+
+ const vk::VkSurfaceCapabilities2EXT capsExt = getPhysicalDeviceSurfaceCapabilities2EXT (vki, physicalDevice, surface.get());
+ const vk::VkSurfaceCapabilitiesKHR capsKhr = getPhysicalDeviceSurfaceCapabilities (vki, physicalDevice, surface.get());
+
+ if (!sameSurfaceCapabilities(capsKhr, capsExt))
+ {
+ return tcu::TestStatus::fail("KHR and EXT surface capabilities do not match");
+ }
+
+ if (capsExt.supportedSurfaceCounters != 0)
+ {
+ return tcu::TestStatus::fail("supportedSurfaceCounters nonzero (" + de::toString(capsExt.supportedSurfaceCounters) + ") for non-display surface");
+ }
+
+ return tcu::TestStatus::pass("Pass");
+}
+
tcu::TestStatus createSurfaceCustomAllocatorTest (Context& context, Type wsiType)
{
AllocationCallbackRecorder allocationRecorder (getSystemAllocator());
addFunctionCase(testGroup, "query_capabilities", "Query surface capabilities", querySurfaceCapabilitiesTest, wsiType);
addFunctionCase(testGroup, "query_capabilities2", "Query extended surface capabilities", querySurfaceCapabilities2Test, wsiType);
addFunctionCase(testGroup, "query_protected_capabilities", "Query protected surface capabilities", querySurfaceProtectedCapabilitiesTest, wsiType);
+ addFunctionCase(testGroup, "query_surface_counters", "Query and check available surface counters", querySurfaceCounterTest, wsiType);
addFunctionCase(testGroup, "query_formats", "Query surface formats", querySurfaceFormatsTest, wsiType);
addFunctionCase(testGroup, "query_formats2", "Query extended surface formats", querySurfaceFormats2Test, wsiType);
addFunctionCase(testGroup, "query_present_modes", "Query surface present modes", querySurfacePresentModesTest, wsiType);
dEQP-VK.wsi.xlib.surface.query_capabilities
dEQP-VK.wsi.xlib.surface.query_capabilities2
dEQP-VK.wsi.xlib.surface.query_protected_capabilities
+dEQP-VK.wsi.xlib.surface.query_surface_counters
dEQP-VK.wsi.xlib.surface.query_formats
dEQP-VK.wsi.xlib.surface.query_formats2
dEQP-VK.wsi.xlib.surface.query_present_modes
dEQP-VK.wsi.xcb.surface.query_capabilities
dEQP-VK.wsi.xcb.surface.query_capabilities2
dEQP-VK.wsi.xcb.surface.query_protected_capabilities
+dEQP-VK.wsi.xcb.surface.query_surface_counters
dEQP-VK.wsi.xcb.surface.query_formats
dEQP-VK.wsi.xcb.surface.query_formats2
dEQP-VK.wsi.xcb.surface.query_present_modes
dEQP-VK.wsi.wayland.surface.query_capabilities
dEQP-VK.wsi.wayland.surface.query_capabilities2
dEQP-VK.wsi.wayland.surface.query_protected_capabilities
+dEQP-VK.wsi.wayland.surface.query_surface_counters
dEQP-VK.wsi.wayland.surface.query_formats
dEQP-VK.wsi.wayland.surface.query_formats2
dEQP-VK.wsi.wayland.surface.query_present_modes
dEQP-VK.wsi.android.surface.query_capabilities
dEQP-VK.wsi.android.surface.query_capabilities2
dEQP-VK.wsi.android.surface.query_protected_capabilities
+dEQP-VK.wsi.android.surface.query_surface_counters
dEQP-VK.wsi.android.surface.query_formats
dEQP-VK.wsi.android.surface.query_formats2
dEQP-VK.wsi.android.surface.query_present_modes
dEQP-VK.wsi.win32.surface.query_capabilities
dEQP-VK.wsi.win32.surface.query_capabilities2
dEQP-VK.wsi.win32.surface.query_protected_capabilities
+dEQP-VK.wsi.win32.surface.query_surface_counters
dEQP-VK.wsi.win32.surface.query_formats
dEQP-VK.wsi.win32.surface.query_formats2
dEQP-VK.wsi.win32.surface.query_present_modes
dEQP-VK.wsi.macos.surface.query_capabilities
dEQP-VK.wsi.macos.surface.query_capabilities2
dEQP-VK.wsi.macos.surface.query_protected_capabilities
+dEQP-VK.wsi.macos.surface.query_surface_counters
dEQP-VK.wsi.macos.surface.query_formats
dEQP-VK.wsi.macos.surface.query_formats2
dEQP-VK.wsi.macos.surface.query_present_modes
dEQP-VK.wsi.display.create_display_mode
dEQP-VK.wsi.display.get_display_plane_capabilities
dEQP-VK.wsi.display.create_display_plane_surface
+dEQP-VK.wsi.display.surface_counters
dEQP-VK.wsi.display.get_display_properties2
dEQP-VK.wsi.display.get_display_plane_properties2
dEQP-VK.wsi.display.get_display_mode_properties2
dEQP-VK.wsi.xlib.surface.query_capabilities
dEQP-VK.wsi.xlib.surface.query_capabilities2
dEQP-VK.wsi.xlib.surface.query_protected_capabilities
+dEQP-VK.wsi.xlib.surface.query_surface_counters
dEQP-VK.wsi.xlib.surface.query_formats
dEQP-VK.wsi.xlib.surface.query_formats2
dEQP-VK.wsi.xlib.surface.query_present_modes
dEQP-VK.wsi.xcb.surface.query_capabilities
dEQP-VK.wsi.xcb.surface.query_capabilities2
dEQP-VK.wsi.xcb.surface.query_protected_capabilities
+dEQP-VK.wsi.xcb.surface.query_surface_counters
dEQP-VK.wsi.xcb.surface.query_formats
dEQP-VK.wsi.xcb.surface.query_formats2
dEQP-VK.wsi.xcb.surface.query_present_modes
dEQP-VK.wsi.wayland.surface.query_capabilities
dEQP-VK.wsi.wayland.surface.query_capabilities2
dEQP-VK.wsi.wayland.surface.query_protected_capabilities
+dEQP-VK.wsi.wayland.surface.query_surface_counters
dEQP-VK.wsi.wayland.surface.query_formats
dEQP-VK.wsi.wayland.surface.query_formats2
dEQP-VK.wsi.wayland.surface.query_present_modes
dEQP-VK.wsi.android.surface.query_capabilities
dEQP-VK.wsi.android.surface.query_capabilities2
dEQP-VK.wsi.android.surface.query_protected_capabilities
+dEQP-VK.wsi.android.surface.query_surface_counters
dEQP-VK.wsi.android.surface.query_formats
dEQP-VK.wsi.android.surface.query_formats2
dEQP-VK.wsi.android.surface.query_present_modes
dEQP-VK.wsi.win32.surface.query_capabilities
dEQP-VK.wsi.win32.surface.query_capabilities2
dEQP-VK.wsi.win32.surface.query_protected_capabilities
+dEQP-VK.wsi.win32.surface.query_surface_counters
dEQP-VK.wsi.win32.surface.query_formats
dEQP-VK.wsi.win32.surface.query_formats2
dEQP-VK.wsi.win32.surface.query_present_modes
dEQP-VK.wsi.macos.surface.query_capabilities
dEQP-VK.wsi.macos.surface.query_capabilities2
dEQP-VK.wsi.macos.surface.query_protected_capabilities
+dEQP-VK.wsi.macos.surface.query_surface_counters
dEQP-VK.wsi.macos.surface.query_formats
dEQP-VK.wsi.macos.surface.query_formats2
dEQP-VK.wsi.macos.surface.query_present_modes
dEQP-VK.wsi.display.create_display_mode
dEQP-VK.wsi.display.get_display_plane_capabilities
dEQP-VK.wsi.display.create_display_plane_surface
+dEQP-VK.wsi.display.surface_counters
dEQP-VK.wsi.display.get_display_properties2
dEQP-VK.wsi.display.get_display_plane_properties2
dEQP-VK.wsi.display.get_display_mode_properties2