blob: d523a5ebfba9fd1b544ff4725377cbababe9f9fe [file] [log] [blame]
// 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;
}