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