My Project
|
#include <LayoutUtils.h>
Public Types | |
using | Size = uint64_t |
Static Public Member Functions | |
static spirv::StructType | decorateType (spirv::StructType structType, Size &size, Size &alignment) |
static bool | isLegalType (Type type) |
According to the Vulkan spec "14.5.4. Offset and Stride Assignment": "There are different alignment requirements depending on the specific resources and on the features enabled on the device."
There are 3 types of alignment: scalar, base, extended. See the spec for details.
Note: Even if scalar alignment is supported, it is generally more performant to use the base alignment. So here the calculation is based on base alignment.
The memory layout must obey the following rules:
According to the SPIR-V spec: "The ArrayStride, MatrixStride, and Offset decorations must be large enough to hold the size of the objects they affect (that is, specifying overlap is invalid)."
using mlir::VulkanLayoutUtils::Size = uint64_t |
|
static |
Returns a new StructType with layout info. Assigns the type size in bytes to the size
. Assigns the type alignment in bytes to the alignment
.
|
static |
Checks whether a type is legal in terms of Vulkan layout info decoration. A type is dynamically illegal if it's a composite type in the StorageBuffer, PhysicalStorageBuffer, Uniform, and PushConstant Storage Classes without layout information.