|  | // Copyright 2017 The Fuchsia Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include <fcntl.h> | 
|  | #include <lib/fdio/unsafe.h> | 
|  | #include <lib/zx/vmo.h> | 
|  |  | 
|  | #include <thread> | 
|  |  | 
|  | #include <gtest/gtest.h> | 
|  |  | 
|  | #include "../vkreadback/vkreadback.h" | 
|  | #include "helper/test_device_helper.h" | 
|  | #include "magma.h" | 
|  | #include "magma_vendor_queries.h" | 
|  | #include "src/lib/fxl/test/test_settings.h" | 
|  |  | 
|  | int main(int argc, char** argv) { | 
|  | if (!fxl::SetTestSettings(argc, argv)) { | 
|  | return EXIT_FAILURE; | 
|  | } | 
|  |  | 
|  | testing::InitGoogleTest(&argc, argv); | 
|  | return RUN_ALL_TESTS(); | 
|  | } | 
|  |  | 
|  | TEST(VulkanTimerQuery, TimerQuery) { | 
|  | magma::TestDeviceBase test_device(MAGMA_VENDOR_ID_MALI); | 
|  | ; | 
|  |  | 
|  | uint64_t is_supported = 0; | 
|  | EXPECT_EQ(MAGMA_STATUS_OK, | 
|  | magma_query2(test_device.device(), MAGMA_QUERY_IS_TOTAL_TIME_SUPPORTED, &is_supported)); | 
|  |  | 
|  | // Every Mali driver should support querying GPU time. | 
|  | EXPECT_TRUE(is_supported); | 
|  |  | 
|  | zx::vmo result_vmo; | 
|  | EXPECT_EQ(MAGMA_STATUS_OK, | 
|  | magma_query_returns_buffer2(test_device.device(), MAGMA_QUERY_TOTAL_TIME, | 
|  | result_vmo.reset_and_get_address())); | 
|  | magma_total_time_query_result result; | 
|  | EXPECT_EQ(ZX_OK, result_vmo.read(&result, 0u, sizeof(result))); | 
|  |  | 
|  | VkReadbackTest test; | 
|  | ASSERT_TRUE(test.Initialize()); | 
|  | ASSERT_TRUE(test.Exec()); | 
|  | ASSERT_TRUE(test.Readback()); | 
|  |  | 
|  | EXPECT_EQ(MAGMA_STATUS_OK, | 
|  | magma_query_returns_buffer2(test_device.device(), MAGMA_QUERY_TOTAL_TIME, | 
|  | result_vmo.reset_and_get_address())); | 
|  | magma_total_time_query_result result2; | 
|  | EXPECT_EQ(ZX_OK, result_vmo.read(&result2, 0u, sizeof(result2))); | 
|  |  | 
|  | // Both GPU and CPU time should have passed. | 
|  | EXPECT_LT(result.gpu_time_ns, result2.gpu_time_ns); | 
|  | EXPECT_LT(result.monotonic_time_ns, result2.monotonic_time_ns); | 
|  | } |