diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-10-12 14:27:29 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-10-13 09:35:20 +0000 |
commit | c30a6232df03e1efbd9f3b226777b07e087a1122 (patch) | |
tree | e992f45784689f373bcc38d1b79a239ebe17ee23 /chromium/ui/gfx/gpu_fence.cc | |
parent | 7b5b123ac58f58ffde0f4f6e488bcd09aa4decd3 (diff) | |
download | qtwebengine-chromium-85-based.tar.gz |
BASELINE: Update Chromium to 85.0.4183.14085-based
Change-Id: Iaa42f4680837c57725b1344f108c0196741f6057
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'chromium/ui/gfx/gpu_fence.cc')
-rw-r--r-- | chromium/ui/gfx/gpu_fence.cc | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/chromium/ui/gfx/gpu_fence.cc b/chromium/ui/gfx/gpu_fence.cc index 7d38c0eb906..87fc6d10761 100644 --- a/chromium/ui/gfx/gpu_fence.cc +++ b/chromium/ui/gfx/gpu_fence.cc @@ -5,6 +5,8 @@ #include "ui/gfx/gpu_fence.h" #include "base/logging.h" +#include "base/notreached.h" +#include "base/time/time.h" #if defined(OS_LINUX) || defined(OS_ANDROID) #include <sync/sync.h> @@ -73,4 +75,49 @@ void GpuFence::Wait() { } } +// static +GpuFence::FenceStatus GpuFence::GetStatusChangeTime(int fd, + base::TimeTicks* time) { + DCHECK_NE(fd, -1); +#if defined(OS_LINUX) || defined(OS_ANDROID) + auto info = + std::unique_ptr<sync_fence_info_data, void (*)(sync_fence_info_data*)>{ + sync_fence_info(fd), sync_fence_info_free}; + if (!info) { + LOG(ERROR) << "sync_fence_info returned null for fd : " << fd; + return FenceStatus::kInvalid; + } + + // Not signalled yet. + if (info->status != 1) { + return FenceStatus::kNotSignaled; + } + + uint64_t timestamp_ns = 0u; + struct sync_pt_info* pt_info = nullptr; + while ((pt_info = sync_pt_info(info.get(), pt_info))) + timestamp_ns = std::max(timestamp_ns, pt_info->timestamp_ns); + + if (timestamp_ns == 0u) { + LOG(ERROR) << "No timestamp provided from sync_pt_info for fd : " << fd; + return FenceStatus::kInvalid; + } + *time = base::TimeTicks() + base::TimeDelta::FromNanoseconds(timestamp_ns); + return FenceStatus::kSignaled; +#endif + NOTREACHED(); + return FenceStatus::kInvalid; +} + +base::TimeTicks GpuFence::GetMaxTimestamp() const { + base::TimeTicks timestamp; +#if defined(OS_LINUX) || defined(OS_ANDROID) + FenceStatus status = GetStatusChangeTime(owned_fd_.get(), ×tamp); + DCHECK_EQ(status, FenceStatus::kSignaled); + return timestamp; +#endif + NOTREACHED(); + return timestamp; +} + } // namespace gfx |