| // 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; | |
| } | |
| bool IsNoneUsagePermitAllocation(const fuchsia_sysmem2::BufferUsage& buffer_usage) { | |
| uint32_t none = buffer_usage.none().has_value() ? buffer_usage.none().value() : 0; | |
| uint32_t none_permit_allocation = none & fuchsia_sysmem2::kNoneUsagePermitAllocation; | |
| return !!none_permit_allocation; | |
| } |