Vulkan: Support multiple vertex outputs.

This is a bit of a hack, similar to how D3D11 works. We need to write
output locations in the GLSL shader before we send them to glslang,
so we wait until the link call, then string-replace some hard-coded
identifeir code to the attribute location determined by ANGLE.

This CL also fills in some of the vertex format conversion tables in
formatutilsvk.cpp.

BUG=angleproject:2167

Change-Id: I2424d0d990bdbcd831a4dd130e61e87d8f8f479f
Reviewed-on: https://chromium-review.googlesource.com/677555
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Frank Henigman <fjhenigman@chromium.org>
diff --git a/src/libANGLE/renderer/vulkan/ProgramVk.cpp b/src/libANGLE/renderer/vulkan/ProgramVk.cpp
index c767447..f2fe557 100644
--- a/src/libANGLE/renderer/vulkan/ProgramVk.cpp
+++ b/src/libANGLE/renderer/vulkan/ProgramVk.cpp
@@ -66,17 +66,11 @@
     RendererVk *renderer           = context->getRenderer();
     GlslangWrapper *glslangWrapper = renderer->getGlslangWrapper();
 
-    const std::string &vertexSource =
-        mState.getAttachedVertexShader()->getTranslatedSource(glContext);
-    const std::string &fragmentSource =
-        mState.getAttachedFragmentShader()->getTranslatedSource(glContext);
-
     std::vector<uint32_t> vertexCode;
     std::vector<uint32_t> fragmentCode;
     bool linkSuccess = false;
-    ANGLE_TRY_RESULT(
-        glslangWrapper->linkProgram(vertexSource, fragmentSource, &vertexCode, &fragmentCode),
-        linkSuccess);
+    ANGLE_TRY_RESULT(glslangWrapper->linkProgram(glContext, mState, &vertexCode, &fragmentCode),
+                     linkSuccess);
     if (!linkSuccess)
     {
         return false;