blob: d258bb18d27ffa1d4cdad3ed1467c71ec3454b1c [file] [log] [blame]
/*
* Copyright 2021 Google LLC
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef skgpu_graphite_ResourceTypes_DEFINED
#define skgpu_graphite_ResourceTypes_DEFINED
#include "include/gpu/graphite/GraphiteTypes.h"
#include "include/private/base/SkTo.h"
#include "src/core/SkEnumBitMask.h"
namespace skgpu::graphite {
class Buffer;
enum class DepthStencilFlags : int {
kNone = 0b000,
kDepth = 0b001,
kStencil = 0b010,
kDepthStencil = kDepth | kStencil,
};
SK_MAKE_BITMASK_OPS(DepthStencilFlags);
/**
* What a GPU buffer will be used for
*/
enum class BufferType : int {
kVertex,
kIndex,
kXferCpuToGpu,
kXferGpuToCpu,
kUniform,
kStorage,
// GPU-only buffer types
kIndirect,
kVertexStorage,
kIndexStorage,
kLast = kIndexStorage,
};
static const int kBufferTypeCount = static_cast<int>(BufferType::kLast) + 1;
/**
* Data layout requirements on host-shareable buffer contents.
*/
enum class Layout {
kInvalid = 0,
kStd140,
kStd430,
kMetal,
};
/**
* When creating the memory for a resource should we use a memory type that prioritizes the
* effeciency of GPU reads even if it involves extra work to write CPU data to it. For example, we
* would want this for buffers that we cache to read the same data many times on the GPU.
*/
enum class PrioritizeGpuReads : bool {
kNo = false,
kYes = true,
};
/**
* Must the contents of the Resource be preserved af a render pass or can a more efficient
* representation be chosen when supported by hardware.
*/
enum class Discardable : bool {
kNo = false,
kYes = true
};
enum class Ownership {
kOwned,
kWrapped,
};
/** Uniquely identifies the type of resource that is cached with a GraphiteResourceKey. */
using ResourceType = uint32_t;
/**
* Can the resource be held by multiple users at the same time?
* For example, stencil buffers, pipelines, etc.
*/
enum class Shareable : bool {
kNo = false,
kYes = true,
};
/**
* This enum is used to notify the ResourceCache which type of ref just dropped to zero on a
* Resource.
*/
enum class LastRemovedRef {
kUsage,
kCommandBuffer,
kCache,
};
/*
* Struct that can be passed into bind buffer calls on the CommandBuffer. The ownership of the
* buffer and its usage in command submission must be tracked by the caller (e.g. as with
* buffers created by DrawBufferManager).
*/
struct BindBufferInfo {
const Buffer* fBuffer = nullptr;
size_t fOffset = 0;
operator bool() const { return SkToBool(fBuffer); }
bool operator==(const BindBufferInfo& o) const {
return fBuffer == o.fBuffer && (!fBuffer || fOffset == o.fOffset);
}
bool operator!=(const BindBufferInfo& o) const { return !(*this == o); }
};
}; // namespace skgpu::graphite
#endif // skgpu_graphite_ResourceTypes_DEFINED