Vulkan: Don't store device handles in wrapped objects.

BUG=angleproject:1684

Change-Id: I0ec11ec79f2e9893600a8ffd8cdbfc6040fb6f70
Reviewed-on: https://chromium-review.googlesource.com/426402
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
diff --git a/src/libANGLE/renderer/vulkan/ProgramVk.cpp b/src/libANGLE/renderer/vulkan/ProgramVk.cpp
index 4a6b7ce..d9767da 100644
--- a/src/libANGLE/renderer/vulkan/ProgramVk.cpp
+++ b/src/libANGLE/renderer/vulkan/ProgramVk.cpp
@@ -25,6 +25,15 @@
 {
 }
 
+void ProgramVk::destroy(const ContextImpl *contextImpl)
+{
+    VkDevice device = GetAs<ContextVk>(contextImpl)->getDevice();
+
+    mLinkedFragmentModule.destroy(device);
+    mLinkedVertexModule.destroy(device);
+    mPipelineLayout.destroy(device);
+}
+
 LinkResult ProgramVk::load(const ContextImpl *contextImpl,
                            gl::InfoLog &infoLog,
                            gl::BinaryInputStream *stream)
@@ -66,8 +75,9 @@
         return false;
     }
 
-    vk::ShaderModule vertexModule(renderer->getDevice());
-    vk::ShaderModule fragmentModule(renderer->getDevice());
+    vk::ShaderModule vertexModule;
+    vk::ShaderModule fragmentModule;
+    VkDevice device = renderer->getDevice();
 
     {
         VkShaderModuleCreateInfo vertexShaderInfo;
@@ -76,7 +86,7 @@
         vertexShaderInfo.flags    = 0;
         vertexShaderInfo.codeSize = vertexCode.size() * sizeof(uint32_t);
         vertexShaderInfo.pCode    = vertexCode.data();
-        ANGLE_TRY(vertexModule.init(vertexShaderInfo));
+        ANGLE_TRY(vertexModule.init(device, vertexShaderInfo));
     }
 
     {
@@ -87,11 +97,11 @@
         fragmentShaderInfo.codeSize = fragmentCode.size() * sizeof(uint32_t);
         fragmentShaderInfo.pCode    = fragmentCode.data();
 
-        ANGLE_TRY(fragmentModule.init(fragmentShaderInfo));
+        ANGLE_TRY(fragmentModule.init(device, fragmentShaderInfo));
     }
 
-    mLinkedVertexModule   = std::move(vertexModule);
-    mLinkedFragmentModule = std::move(fragmentModule);
+    mLinkedVertexModule.retain(device, std::move(vertexModule));
+    mLinkedFragmentModule.retain(device, std::move(fragmentModule));
 
     return true;
 }
@@ -274,7 +284,7 @@
 
 gl::ErrorOrResult<vk::PipelineLayout *> ProgramVk::getPipelineLayout(VkDevice device)
 {
-    vk::PipelineLayout newLayout(device);
+    vk::PipelineLayout newLayout;
 
     // TODO(jmadill): Descriptor sets.
     VkPipelineLayoutCreateInfo createInfo;
@@ -286,9 +296,8 @@
     createInfo.pushConstantRangeCount = 0;
     createInfo.pPushConstantRanges    = nullptr;
 
-    ANGLE_TRY(newLayout.init(createInfo));
-
-    mPipelineLayout = std::move(newLayout);
+    ANGLE_TRY(newLayout.init(device, createInfo));
+    mPipelineLayout.retain(device, std::move(newLayout));
 
     return &mPipelineLayout;
 }