Replicate MVKVector.h and MVKVectorAllocator.h into MVKSmallVector.h and
MVKSmallVectorAllocator.h, and collapse class hierarchies.
Add MVKArrayRef struct to allow the contents of MVKSmallVector and MVKVector
to be passed between functions consistently.
Add contents() function to MVKVector to return MVKArrayRef.
MVKCmdCopyImage and MVKCmdBlitImage move passing MVKCommandUse
from setContent() to second encode() function.
MVKCmdPipelineBarrier reorder member variables.
MVKCmdCopyImage, MVKCmdBlitImage, MVKCmdResolveImage generate derivative
arrays inline during encoding instead of holding as member variables.
Separate MVKCmdBlitImage from MVKCmdCopyImage and derive from MVKCommand instead.
Convert to template classes MVKCmdCopyImage, MVKCmdBlitImage, MVKCmdResolveImage,
MVKCmdCopyBuffer, MVKCmdBufferImageCopy, MVKCmdClearAttachments, MVKCmdClearImage.
Add MVKAddCmdFrom3Thresholds and MVK_CMD_TYPE_POOLS_FROM_3_THRESHOLDS()
macros to support 3 template thresholds.
Add MVKCmdClearImage subclasses MVKCmdClearColorImage and MVKCmdClearDepthStencilImage.
MVKCmdClearAttachments consolidate clear value arrays.
Reorder member variables in commands to avoid internal memory gaps.
Set enum MVKCommandUse type to uint8_t.
MVKCmdPushConstants convert to a template class based on push constant size.
MVKCmdPushDescriptorSet reduce count of pre-allocated VkWriteDescriptorSets,
in recognition that numerous dynamic allocations necessarily happen anyway.
Cleanup member variable order in commands to avoid internal memory gaps.
Split MVKCmdBindDescriptorSetsStatic into separate subclasses,
depending on use of dynamic offsets, and make them template classes
based on descriptor set count.
Add MVKPipelineBarrier struct to consolidate barrier specs, reduce
memory use in each, and standardize barrier info into one collection.
MVKCmdPipelineBarrier uses templated collection sizes.
Add mvkPrintSizeOf() macro to simplify printing type sizes.
Use uint16_t instead of uint32_t for Metal resource indexes in binding structures.
MVKIndexMTLBufferBinding::mtlIndexType track MTLIndexType as uint8_t.
Convert MVKCmdBindVertexBuffers to template class.
Add MVKAddCmdFromTwoThresholds() macro in vulkan.mm.
Add MVK_CMD_TYPE_POOLS_FROM_TWO_THRESHOLDS() macro in MVKCommandTypePools.def.
Add second threshold to MVKCmdBeginRenderPass.
MVKCmdBeginRenderPass don't hold VkRenderPassBeginInfo.
Convert MVKCmdBeginRenderPass and MVKCmdExecuteCommands to template classes.
MVKCommandBuffer::recordBeginRenderPass() pass MVKLoadStoreOverrideMixin
instead of MVKCmdBeginRenderPass.
MVKCommandBuffer::recordEndRenderPass() pass nothing.
Add MVKAddCmdFromThreshold() macro in vulkan.mm.
Add MVK_CMD_TYPE_POOLS_FROM_THRESHOLD() macro in MVKCommandTypePools.def.
Move null tests on destroy calls from vulkan.mm to MVKDevice and MVKInstance.
Don't bother testing for null when spec says a param must not be null.
Invert remaining null tests so they don't abort.
Remove MVKResource::bindDeviceMemory2() and MVKBindDeviceMemoryInfo struct.
Add separate MVKBuffer::bindDeviceMemory2() and MVKImage::bindDeviceMemory2()
functions with distinct params, and delegate to MVKResource::bindDeviceMemory().
Functions and functionality supported, but don't currently do anything
until Metal-friendly enumerations added to VkExternalMemoryHandleTypeFlagBits.
Updated What's New document.
Capability functions and functionality supported, but don't currently do anything
until Metal-friendly enumerations added to VkExternalMemoryHandleTypeFlagBits.
Rename MVKPhysicalDevice::getPhysicalDeviceMemoryProperties() to
getMemoryProperties() for consistency.
Updated What's New document.
To allow these classes to contain reasonably-sized pre-allocated vectors,
make MVKCmdSetViewport & MVKCmdSetScissor template classes based on quantities.
Create two concrete implementations of each for 1 and 16 viewports or scissors.
vkCmdSetViewport() and vkCmdSetScissor() choose which concrete template class
implementation to use based on the number of viewports or scissors, respectively.
Update auto-generation of getTypePool() to support template classes when needed.
Many of the names of the MVKPixelFormats member functions where inherited from
function names in mvk_datatypes.h, which is a C API, therefore must have unique
function names, and uses parameter types as part of the names to distinguish.
Since MVKPixelFormats is a C++ class, we can do away with that and make use
of function overloading to simplify the function names.
I forgot to to this when creating MVKPixelFormats in the first place.
Start with no Vulkan atomic feature bits and add VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT
and VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT if Metal format supports it.
Currently only applies to formats MTLPixelFormatR32Uint and MTLPixelFormatR32Sint.
Enable for linear tiling only. Previously optimal was enabled too.
Add kMVKMTLFmtCapsAtomic.
Add kMVKVkFormatFeatureFlagsTexAtomic.
Add kMVKVkFormatFeatureFlagsBufAtomic.
Use MVK_CONFIG_AUTO_GPU_CAPTURE_OUTPUT_FILE to set the destination file.
This is useful for capturing traces where the program in question cannot
be run under Xcode's control; the captured trace can then be inspected
later with Xcode.
This new feature requires Metal 3.0 (macOS 10.15, iOS 13).
Special thanks to Epic Games for contributing the underlying support to
SPIRV-Cross.
Metal does not support atomic image accesses, but we can work around
that. For buffer views, and for linear image views, we can pass the
underlying buffer to the shader and do atomic accesses on that. For now,
we only support this for `VK_FORMAT_R32_UINT` and `VK_FORMAT_R32_SINT`,
as required by the Vulkan standard; it should theoretically be possible
to extend this to any format where the size of a pixel is 32 bits. Metal
does not yet support 16-bit or 8-bit atomic access, so those formats are
out for now.
Unfortunately, we cannot yet support this for optimal-tiled images, even
though Vulkan requires it. These images do not have a buffer backing
them. Possible alternatives and their downsides:
* Pass a buffer, probably the buffer backing the device memory, for
these images. But this would defeat the purpose of atomic access--the
buffer and image would not be consistent until afterward when their
contents were sync'd. Using a heap with aliased resources would
eliminate this problem... but, optimal tiling.
* Lie and create a linear image for a format supporting atomic image
access. But that only works for 1D and 2D images with one array slice
and one mip level. Also, this would likely hurt performance, because
the GPU can no longer rely on optimal layout.
Metal viewports and scissors are twice the size of the Vulkan equivalents,
and internal caches are preallocated for 16 of each to avoid dynamic allocations.
Hold the Vulkan viewports and scissors, and convert just before sending them to Metal.
MVKCommandEncoder::clipToRenderArea() use VkRect2D instead of MTLScissorRect.
MVKCommand constructor not longer take MVKCommandTypePool.
Remove MVKCommand::returnToPool().
MVKCommandTypePool no longer track MVKCommandPool.
Remove MVKCommand.mm.
Pass MVKCommandPool to MVKCommand::returnToPool() function.
Add pure virtual MVKCommand::getTypePool() to reference correct
type pool in MVKCommandPool for a subclass instance.
Add MVKFuncionOverride_getTypePool() macro template to define
MVKCommand::getTypePool() overrides in subclasses.
Rename MVKCommandPool::_cmdPushSetWithTemplatePool to
_cmdPushDescriptorSetWithTemplatePool for consistency
with macro template support.