diff --git a/garnet/bin/ui/meta/gfx_pixeltests.cmx b/garnet/bin/ui/meta/gfx_pixeltests.cmx
index dc1391372f42e0576a27fa0099b374abaf7a4565..140fe5083e6a0976142c7f604b223675e3db701e 100644
--- a/garnet/bin/ui/meta/gfx_pixeltests.cmx
+++ b/garnet/bin/ui/meta/gfx_pixeltests.cmx
@@ -1,15 +1,26 @@
 {
+    "facets": {
+        "fuchsia.test": {
+            "injected-services": {
+                "fuchsia.sysmem.Allocator": "fuchsia-pkg://fuchsia.com/sysmem_connector#meta/sysmem_connector.cmx",
+                "fuchsia.vulkan.loader.Loader": "fuchsia-pkg://fuchsia.com/vulkan_loader#meta/vulkan_loader.cmx"
+            }
+        }
+    },
     "program": {
         "binary": "test/gfx_pixeltests"
     },
     "sandbox": {
         "features": [
-            "system-temp"
+            "system-temp",
+            "vulkan"
         ],
         "services": [
             "fuchsia.scheduler.ProfileProvider",
             "fuchsia.sys.Environment",
-            "fuchsia.sys.Loader"
+            "fuchsia.sys.Loader",
+            "fuchsia.sysmem.Allocator",
+            "fuchsia.vulkan.loader.Loader"
         ]
     }
 }
diff --git a/garnet/lib/ui/gfx/tests/BUILD.gn b/garnet/lib/ui/gfx/tests/BUILD.gn
index 07cb385b25a50ab11e62b971b8dd994632c5230f..37f61fac96bb3155ae8053e44d6913f836d9717d 100644
--- a/garnet/lib/ui/gfx/tests/BUILD.gn
+++ b/garnet/lib/ui/gfx/tests/BUILD.gn
@@ -129,6 +129,7 @@ executable("pixeltests") {
   ]
   include_dirs = [ "//garnet/public/lib/escher" ]
   deps = [
+    ":testing_deps",
     "//garnet/lib/ui/util:glm_workaround",
     "//garnet/public/lib/escher",
     "//garnet/public/lib/fsl",
diff --git a/garnet/lib/ui/gfx/tests/pose_buffer_unit_test.cc b/garnet/lib/ui/gfx/tests/pose_buffer_unit_test.cc
index 80c3fbbeb9fc5f600e21d6e1ea9355db3c565a8f..54517f52b7ba78cb06161aff864209c2f37e4b70 100644
--- a/garnet/lib/ui/gfx/tests/pose_buffer_unit_test.cc
+++ b/garnet/lib/ui/gfx/tests/pose_buffer_unit_test.cc
@@ -5,6 +5,7 @@
 #include <zircon/syscalls.h>
 
 #include "garnet/lib/ui/gfx/tests/vk_session_test.h"
+#include "garnet/public/lib/escher/impl/vulkan_utils.h"
 #include "lib/ui/gfx/util/time.h"
 #include "lib/ui/scenic/cpp/commands.h"
 #include "public/lib/escher/test/gtest_vulkan.h"
@@ -27,20 +28,47 @@ VK_TEST_F(PoseBufferTest, Validation) {
   ASSERT_TRUE(Apply(scenic::NewCreateSceneCmd(scene_id)));
   ASSERT_TRUE(Apply(scenic::NewCreateCameraCmd(camera_id, scene_id)));
 
-  uint64_t vmo_size = PAGE_SIZE;
-  zx::vmo vmo;
-  zx_status_t status = zx::vmo::create(vmo_size, 0u, &vmo);
-  ASSERT_EQ(ZX_OK, status);
+  const size_t kVmoSize = PAGE_SIZE;
+
+  auto vulkan_queues = CreateVulkanDeviceQueues();
+  auto device = vulkan_queues->vk_device();
+  auto physical_device = vulkan_queues->vk_physical_device();
+
+  const vk::BufferUsageFlags kUsageFlags =
+      vk::BufferUsageFlagBits::eTransferSrc |
+      vk::BufferUsageFlagBits::eTransferDst |
+      vk::BufferUsageFlagBits::eStorageTexelBuffer |
+      vk::BufferUsageFlagBits::eStorageBuffer |
+      vk::BufferUsageFlagBits::eIndexBuffer |
+      vk::BufferUsageFlagBits::eVertexBuffer;
+
+  auto memory_requirements =
+      GetBufferRequirements(device, kVmoSize, kUsageFlags);
+  auto memory =
+      AllocateExportableMemory(device, physical_device, memory_requirements,
+                               vk::MemoryPropertyFlagBits::eDeviceLocal |
+                                   vk::MemoryPropertyFlagBits::eHostVisible);
+
+  // If we can't make memory that is both host-visible and device-local, we
+  // can't run this test.
+  if (!memory) {
+    FXL_LOG(INFO)
+        << "Could not find UMA compatible memory pool, aborting test.";
+    return;
+  }
+
+  zx::vmo vmo =
+      ExportMemoryAsVmo(device, vulkan_queues->dispatch_loader(), memory);
 
   zx_clock_t base_time = dispatcher_clock_now();
   uint64_t time_interval = 1024 * 1024;  // 1 ms
   uint32_t num_entries = 1;
 
   ASSERT_TRUE(Apply(scenic::NewCreateMemoryCmd(
-      memory_id, std::move(vmo), vmo_size,
+      memory_id, std::move(vmo), kVmoSize,
       fuchsia::images::MemoryType::VK_DEVICE_MEMORY)));
   ASSERT_TRUE(
-      Apply(scenic::NewCreateBufferCmd(buffer_id, memory_id, 0, vmo_size)));
+      Apply(scenic::NewCreateBufferCmd(buffer_id, memory_id, 0, kVmoSize)));
 
   // Actual Tests
 
@@ -68,6 +96,8 @@ VK_TEST_F(PoseBufferTest, Validation) {
   // num_entries too large
   EXPECT_FALSE(Apply(scenic::NewSetCameraPoseBufferCmd(
       camera_id, buffer_id, UINT32_MAX, base_time, time_interval)));
+
+  device.freeMemory(memory);
 }
 
 }  // namespace test
diff --git a/garnet/lib/ui/gfx/tests/scenic_pixel_test.cc b/garnet/lib/ui/gfx/tests/scenic_pixel_test.cc
index 1534216851c8c2420297efc5721f189e54c29a37..004f4d40632a84712a6aed502277c7b166467821 100644
--- a/garnet/lib/ui/gfx/tests/scenic_pixel_test.cc
+++ b/garnet/lib/ui/gfx/tests/scenic_pixel_test.cc
@@ -30,6 +30,9 @@
 #include "garnet/testing/views/background_view.h"
 #include "garnet/testing/views/coordinate_test_view.h"
 #include "garnet/testing/views/test_view.h"
+#include "garnet/public/lib/escher/impl/vulkan_utils.h"
+#include "garnet/lib/ui/gfx/tests/vk_session_test.h"
+#include "public/lib/escher/test/gtest_vulkan.h"
 
 namespace {
 
@@ -484,7 +487,8 @@ TEST_F(ScenicPixelTest, StereoCamera) {
 // At a high level this test puts a camera inside a cube where each face is a
 // different color, then uses a pose buffer to point the camera at different
 // faces, using the colors to verify the pose buffer is working as expected.
-TEST_F(ScenicPixelTest, PoseBuffer) {
+
+VK_TEST_F(ScenicPixelTest, PoseBuffer) {
   // Synchronously get display dimensions
   float display_width;
   float display_height;
@@ -554,12 +558,43 @@ TEST_F(ScenicPixelTest, PoseBuffer) {
 
   // Configure PoseBuffer
 
-  uint64_t vmo_size = PAGE_SIZE;
-  zx::vmo pose_buffer_vmo;
-  zx::vmo remote_vmo;
+  const size_t kVmoSize = PAGE_SIZE;
   zx_status_t status;
-  status = zx::vmo::create(vmo_size, 0u, &pose_buffer_vmo);
-  FXL_DCHECK(status == ZX_OK);
+
+  auto vulkan_queues =
+      scenic_impl::gfx::test::VkSessionTest::CreateVulkanDeviceQueues();
+  auto device = vulkan_queues->vk_device();
+  auto physical_device = vulkan_queues->vk_physical_device();
+
+  const vk::BufferUsageFlags kUsageFlags =
+      vk::BufferUsageFlagBits::eTransferSrc |
+      vk::BufferUsageFlagBits::eTransferDst |
+      vk::BufferUsageFlagBits::eStorageTexelBuffer |
+      vk::BufferUsageFlagBits::eStorageBuffer |
+      vk::BufferUsageFlagBits::eIndexBuffer |
+      vk::BufferUsageFlagBits::eVertexBuffer;
+
+  auto memory_requirements =
+      scenic_impl::gfx::test::VkSessionTest::GetBufferRequirements(
+          device, kVmoSize, kUsageFlags);
+  auto memory = scenic_impl::gfx::test::VkSessionTest::AllocateExportableMemory(
+      device, physical_device, memory_requirements,
+      vk::MemoryPropertyFlagBits::eDeviceLocal |
+          vk::MemoryPropertyFlagBits::eHostVisible);
+
+  // If we can't make memory that is both host-visible and device-local, we
+  // can't run this test.
+  if (!memory) {
+    FXL_LOG(INFO)
+        << "Could not find UMA compatible memory pool, aborting test.";
+    return;
+  }
+
+  zx::vmo pose_buffer_vmo =
+      scenic_impl::gfx::test::VkSessionTest::ExportMemoryAsVmo(
+          device, vulkan_queues->dispatch_loader(), memory);
+
+  zx::vmo remote_vmo;
   status = pose_buffer_vmo.duplicate(ZX_RIGHT_SAME_RIGHTS, &remote_vmo);
   FXL_DCHECK(status == ZX_OK);
 
@@ -570,9 +605,9 @@ TEST_F(ScenicPixelTest, PoseBuffer) {
   zx_time_t time_interval = 1;
   uint32_t num_entries = 1;
 
-  scenic::Memory mem(session, std::move(remote_vmo), vmo_size,
+  scenic::Memory mem(session, std::move(remote_vmo), kVmoSize,
                      fuchsia::images::MemoryType::VK_DEVICE_MEMORY);
-  scenic::Buffer pose_buffer(mem, 0, vmo_size);
+  scenic::Buffer pose_buffer(mem, 0, kVmoSize);
 
   camera.SetPoseBuffer(pose_buffer, num_entries, base_time, time_interval);
 
@@ -682,6 +717,7 @@ TEST_F(ScenicPixelTest, PoseBuffer) {
               get_color_at_coordinates(0.25, 0.5))
         << "i = " << i;
   }
+  device.freeMemory(memory);
 }
 
 }  // namespace