| // Copyright 2019 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 "utils.h" |
| |
| #include <inttypes.h> |
| |
| bool IsWriteUsage(const fuchsia_sysmem2::BufferUsage& buffer_usage) { |
| const uint32_t kCpuWriteBits = |
| fuchsia_sysmem2::kCpuUsageWriteOften | fuchsia_sysmem2::kCpuUsageWrite; |
| // This list may not be complete. |
| const uint32_t kVulkanWriteBits = fuchsia_sysmem2::kVulkanImageUsageTransferDst | |
| fuchsia_sysmem2::kVulkanImageUsageStorage | |
| fuchsia_sysmem2::kVulkanBufferUsageTransferDst | |
| fuchsia_sysmem2::kVulkanBufferUsageStorageBuffer; |
| // Display usages don't include any writing. |
| const uint32_t kDisplayWriteBits = 0; |
| const uint32_t kVideoWriteBits = |
| fuchsia_sysmem2::kVideoUsageHwDecoder | fuchsia_sysmem2::kVideoUsageHwDecoderInternal | |
| fuchsia_sysmem2::kVideoUsageDecryptorOutput | fuchsia_sysmem2::kVideoUsageHwEncoder; |
| |
| uint32_t cpu = buffer_usage.cpu().has_value() ? buffer_usage.cpu().value() : 0; |
| uint32_t vulkan = buffer_usage.vulkan().has_value() ? buffer_usage.vulkan().value() : 0; |
| uint32_t display = buffer_usage.display().has_value() ? buffer_usage.display().value() : 0; |
| uint32_t video = buffer_usage.video().has_value() ? buffer_usage.video().value() : 0; |
| |
| bool is_write_needed = (cpu & kCpuWriteBits) || (vulkan & kVulkanWriteBits) || |
| (display & kDisplayWriteBits) || (video & kVideoWriteBits); |
| |
| return is_write_needed; |
| } |
| |
| bool IsCpuUsage(const fuchsia_sysmem2::BufferUsage& buffer_usage) { |
| uint32_t cpu = buffer_usage.cpu().has_value() ? buffer_usage.cpu().value() : 0; |
| return cpu != 0; |
| } |
| |
| bool IsAnyUsage(const fuchsia_sysmem2::BufferUsage& buffer_usage) { |
| // none() is intentionally missing here |
| uint32_t cpu = buffer_usage.cpu().has_value() ? buffer_usage.cpu().value() : 0; |
| uint32_t vulkan = buffer_usage.vulkan().has_value() ? buffer_usage.vulkan().value() : 0; |
| uint32_t display = buffer_usage.display().has_value() ? buffer_usage.display().value() : 0; |
| uint32_t video = buffer_usage.video().has_value() ? buffer_usage.video().value() : 0; |
| return cpu || vulkan || display || video; |
| } |