Make vk-unittests load/unload swiftshader only once per suite

Rather than load/unload the driver for each test run, only do so once
per suite. This is mainly a workaround for the memory leak bug
reported at b/173733181; however, it also speeds up running the tests.

Bug: b/173733181
Change-Id: I7d47f8eee2fe8010bbf06845877649abf6761256
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/50608
Kokoro-Result: kokoro <noreply+kokoro@google.com>
Tested-by: Antonio Maiorano <amaiorano@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/tests/VulkanUnitTests/unittests.cpp b/tests/VulkanUnitTests/unittests.cpp
index bc62e61..8470d4d 100644
--- a/tests/VulkanUnitTests/unittests.cpp
+++ b/tests/VulkanUnitTests/unittests.cpp
@@ -33,15 +33,60 @@
 }

 }  // anonymous namespace

 

-class SwiftShaderVulkanTest : public testing::Test

+enum class LoadDriver

+{

+	PerSuite,

+	PerTest

+};

+

+template<typename TestBase, LoadDriver loadDriver>

+class SwiftShaderTest : public TestBase

+{

+protected:

+	static Driver driver;

+

+	static void SetUpTestSuite()

+	{

+		if(loadDriver == LoadDriver::PerSuite)

+		{

+			ASSERT_TRUE(driver.loadSwiftShader());

+		}

+	}

+

+	static void TearDownTestSuite()

+	{

+		if(loadDriver == LoadDriver::PerSuite)

+		{

+			driver.unload();

+		}

+	}

+

+	virtual void SetUp()

+	{

+		if(loadDriver == LoadDriver::PerTest)

+		{

+			ASSERT_TRUE(driver.loadSwiftShader());

+		}

+	}

+

+	virtual void TearDown()

+	{

+		if(loadDriver == LoadDriver::PerTest)

+		{

+			driver.unload();

+		}

+	}

+};

+

+template<typename TestBase, LoadDriver loadDriver>

+Driver SwiftShaderTest<TestBase, loadDriver>::driver;

+

+class SwiftShaderVulkanTest : public SwiftShaderTest<testing::Test, LoadDriver::PerTest>

 {

 };

 

 TEST_F(SwiftShaderVulkanTest, ICD_Check)

 {

-	Driver driver;

-	ASSERT_TRUE(driver.loadSwiftShader());

-

 	auto createInstance = driver.vk_icdGetInstanceProcAddr(VK_NULL_HANDLE, "vkCreateInstance");

 	EXPECT_NE(createInstance, nullptr);

 

@@ -62,9 +107,6 @@
 

 TEST_F(SwiftShaderVulkanTest, Version)

 {

-	Driver driver;

-	ASSERT_TRUE(driver.loadSwiftShader());

-

 	uint32_t apiVersion = 0;

 	VkResult result = driver.vkEnumerateInstanceVersion(&apiVersion);

 	EXPECT_EQ(apiVersion, (uint32_t)VK_API_VERSION_1_1);

@@ -118,9 +160,6 @@
 /*

 TEST_F(SwiftShaderVulkanTest, UnsupportedDeviceExtension_DISABLED)

 {

-	Driver driver;

-	ASSERT_TRUE(driver.loadSwiftShader());

-

 	uint32_t apiVersion = 0;

 	VkResult result = driver.vkEnumerateInstanceVersion(&apiVersion);

 	EXPECT_EQ(apiVersion, (uint32_t)VK_API_VERSION_1_1);

@@ -257,7 +296,7 @@
 

 // Base class for compute tests that read from an input buffer and write to an

 // output buffer of same length.

-class SwiftShaderVulkanBufferToBufferComputeTest : public testing::TestWithParam<ComputeParams>

+class SwiftShaderVulkanBufferToBufferComputeTest : public SwiftShaderTest<testing::TestWithParam<ComputeParams>, LoadDriver::PerSuite>

 {

 public:

 	void test(const std::string &shader,

@@ -272,9 +311,6 @@
 {

 	auto code = compileSpirv(shader.c_str());

 

-	Driver driver;

-	ASSERT_TRUE(driver.loadSwiftShader());

-

 	const VkInstanceCreateInfo createInfo = {

 		VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,  // sType

 		nullptr,                                 // pNext