// Copyright 2018 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.

library fuchsia.sysmem;

// Describes how a client will access the contents of a buffer.
// TODO(fxbug.dev/32119): change struct to table
[ForDeprecatedCBindings]
struct BufferUsage {
    uint32 none;
    uint32 cpu;
    uint32 vulkan;
    uint32 display;
    uint32 video;
};

// TODO(fxbug.dev/55935): Consts should use upper snake case per FIDL style guide.
// We should reformat the naming of consts in this FIDL file.

// Flag for "none" usage.
//
// This bit indicates that there is no direct usage from the participant, and
// that the participant hasn't forgotten to set usage.
const uint32 noneUsage = 1;

// Flags for "cpu" usage.
// The "often" variants prefer cacheable memory.
const uint32 cpuUsageRead = 1;
const uint32 cpuUsageReadOften = 2;
const uint32 cpuUsageWrite = 4;
const uint32 cpuUsageWriteOften = 8;

// Flags for "vulkan" usage.

// Vulkan image usage flags.
// Based on https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkImageUsageFlagBits.html
const uint32 VULKAN_IMAGE_USAGE_TRANSFER_SRC = 0X0001;
const uint32 VULKAN_IMAGE_USAGE_TRANSFER_DST = 0X0002;
const uint32 VULKAN_IMAGE_USAGE_SAMPLED = 0X0004;
const uint32 VULKAN_IMAGE_USAGE_STORAGE = 0X0008;
const uint32 VULKAN_IMAGE_USAGE_COLOR_ATTACHMENT = 0X0010;
const uint32 VULKAN_IMAGE_USAGE_STENCIL_ATTACHMENT = 0X0020;
const uint32 VULKAN_IMAGE_USAGE_TRANSIENT_ATTACHMENT = 0X0040;
const uint32 VULKAN_IMAGE_USAGE_INPUT_ATTACHMENT = 0X0080;

// Deprecated. Use |VULKAN_IMAGE_USAGE_*| instead.
const uint32 vulkanUsageTransferSrc = 0x0001;
const uint32 vulkanUsageTransferDst = 0x0002;
const uint32 vulkanUsageSampled = 0x0004;
const uint32 vulkanUsageStorage = 0x0008;
const uint32 vulkanUsageColorAttachment = 0x0010;
const uint32 vulkanUsageStencilAttachment = 0x0020;
const uint32 vulkanUsageTransientAttachment = 0x0040;
const uint32 vulkanUsageInputAttachment = 0x0080;

// Vulkan buffer usage flags.
// Based on https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VkBufferUsageFlagBits.html
const uint32 VULKAN_BUFFER_USAGE_TRANSFER_SRC = 0X00010000;
const uint32 VULKAN_BUFFER_USAGE_TRANSFER_DST = 0X00020000;
const uint32 VULKAN_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER = 0X00040000;
const uint32 VULKAN_BUFFER_USAGE_STORAGE_TEXEL_BUFFER = 0X00080000;
const uint32 VULKAN_BUFFER_USAGE_UNIFORM_BUFFER = 0X00100000;
const uint32 VULKAN_BUFFER_USAGE_STORAGE_BUFFER = 0X00200000;
const uint32 VULKAN_BUFFER_USAGE_INDEX_BUFFER = 0X00400000;
const uint32 VULKAN_BUFFER_USAGE_VERTEX_BUFFER = 0X00800000;
const uint32 VULKAN_BUFFER_USAGE_INDIRECT_BUFFER = 0X01000000;

// Flags for "display" usage.
const uint32 displayUsageLayer = 1;
const uint32 displayUsageCursor = 2;

// Flags for "video" usage.
// TODO(fxbug.dev/32118): Add more specific HwDecoder flags if needed.
const uint32 videoUsageHwDecoder = 1;
const uint32 videoUsageHwEncoder = 2;
// TODO(fxbug.dev/34192): This bit is redundant with secure_required and supported heaps.  This bit will
// not be carried forward.
const uint32 videoUsageHwProtected = 4;
const uint32 videoUsageCapture = 8;
// videoUsageDecryptorOutput is for the output of a decryptor; such buffers will contain decrypted
// encoded access units.  The decryptor output may be in secure memory (controlled separately via
// secure_required).
//
// TODO(fxbug.dev/34192): Overhaul usage so we can add usage categories without breaking client struct init
// code repeatedly.  For now, this value is in the "video" category but to some degree isn't really
// video; this usage can be used for the output of any secure decryptor.  Also, other usages should
// include input vs. output as those are separate buffer collections and are really separate usages.
//
// We have this as a separate usage because each participant that needs VMO handles needs to specify
// a usage that isn't nonUsage, and the decryptor output participant shouldn't be specifying
// videoUsageHwDecoder because the decryptor isn't the decoder.
const uint32 videoUsageDecryptorOutput = 16;
// This usage is for a HW video decoder's internal buffers that aren't shared with other
// particpants.  These are allocated via sysmem becuase sysmem pre-reserves contiguous SYSTEM_RAM
// as appropriate, and is the only way to allocate secure memory.
const uint32 videoUsageHwDecoderInternal = 32;
