Properly dispose of the sw::Renderer object

This fixes a memory leak in the Queue object. The sw::Renderer
object has a non trivial destructor, which means we need to call
it before deallocating the Queue objects.

Bug b/117974925

Change-Id: I1e13c6108e77d5cdcbea337d572f72fdd32530a1
Reviewed-on: https://swiftshader-review.googlesource.com/c/23188
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Chris Forbes <chrisforbes@google.com>
diff --git a/src/Vulkan/VkDevice.cpp b/src/Vulkan/VkDevice.cpp
index 092b252..78a9e9c 100644
--- a/src/Vulkan/VkDevice.cpp
+++ b/src/Vulkan/VkDevice.cpp
@@ -58,6 +58,11 @@
 
 void Device::destroy(const VkAllocationCallbacks* pAllocator)
 {
+	for(uint32_t i = 0; i < queueCount; i++)
+	{
+		queues[i].destroy();
+	}
+
 	vk::deallocate(queues, pAllocator);
 }
 
diff --git a/src/Vulkan/VkQueue.cpp b/src/Vulkan/VkQueue.cpp
index 57f8605..cb704ae 100644
--- a/src/Vulkan/VkQueue.cpp
+++ b/src/Vulkan/VkQueue.cpp
@@ -21,8 +21,16 @@
 namespace vk
 {
 
-Queue::Queue(uint32_t pFamilyIndex, float pPriority) : context(), renderer(&context, sw::OpenGL, true), familyIndex(pFamilyIndex), priority(pPriority)
+Queue::Queue(uint32_t pFamilyIndex, float pPriority) : familyIndex(pFamilyIndex), priority(pPriority)
 {
+	context = new sw::Context();
+	renderer = new sw::Renderer(context, sw::OpenGL, true);
+}
+
+void Queue::destroy()
+{
+	delete context;
+	delete renderer;
 }
 
 void Queue::submit(uint32_t submitCount, const VkSubmitInfo* pSubmits, VkFence fence)
@@ -37,7 +45,7 @@
 
 		{
 			CommandBuffer::ExecutionState executionState;
-			executionState.renderer = &renderer;
+			executionState.renderer = renderer;
 			for(uint32_t j = 0; j < submitInfo.commandBufferCount; j++)
 			{
 				vk::Cast(submitInfo.pCommandBuffers[j])->submit(executionState);
diff --git a/src/Vulkan/VkQueue.hpp b/src/Vulkan/VkQueue.hpp
index f57ebdf..93e65b8 100644
--- a/src/Vulkan/VkQueue.hpp
+++ b/src/Vulkan/VkQueue.hpp
@@ -16,9 +16,14 @@
 #define VK_QUEUE_HPP_
 
 #include "VkObject.hpp"
-#include "Device/Renderer.hpp"
 #include <vulkan/vk_icd.h>
 
+namespace sw
+{
+	class Context;
+	class Renderer;
+}
+
 namespace vk
 {
 
@@ -35,11 +40,12 @@
 		return reinterpret_cast<VkQueue>(this);
 	}
 
+	void destroy();
 	void submit(uint32_t submitCount, const VkSubmitInfo* pSubmits, VkFence fence);
 
 private:
-	sw::Context context;
-	sw::Renderer renderer;
+	sw::Context* context = nullptr;
+	sw::Renderer* renderer = nullptr;
 	uint32_t familyIndex = 0;
 	float    priority = 0.0f;
 };