1041 Commits

Author SHA1 Message Date
Bill Hollings
40d0427d31 Reduce memory requirements for commands in MVKCmdDraw.h/mm.
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.
2020-05-08 00:51:35 -04:00
Bill Hollings
8813aff12c Reduce memory requirements for commands in MVKCmdRenderPass.h/mm.
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.
2020-05-07 15:51:15 -04:00
Bill Hollings
7452c9316f Remove requirement for dedicated memory for external MTLBuffers. 2020-05-07 11:56:54 -04:00
Bill Hollings
1a1c1250b4 Remove abortive returns from calls in vulkan.mm to allow tracing to complete.
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.
2020-05-07 11:12:54 -04:00
Alexander Meißner
3da5ecf628 Adds support for VK_KHR_sampler_ycbcr_conversion formats and sampler.
However, the binding of descriptors for
multi-planar / disjoint images is still missing.
2020-05-07 16:02:10 +02:00
Bill Hollings
9c033ec92c Cleanup MVKResource::bindDeviceMemory2() calls.
Remove MVKResource::bindDeviceMemory2() and MVKBindDeviceMemoryInfo struct.
Add separate MVKBuffer::bindDeviceMemory2() and MVKImage::bindDeviceMemory2()
functions with distinct params, and delegate to MVKResource::bindDeviceMemory().
2020-05-06 21:01:11 -04:00
Bill Hollings
d343fed52e Add support for VK_KHR_external_memory extension.
Functions and functionality supported, but don't currently do anything
until Metal-friendly enumerations added to VkExternalMemoryHandleTypeFlagBits.
Updated What's New document.
2020-05-06 19:43:21 -04:00
Bill Hollings
2b3cf6f395 Standardize design pattern for enumerations of Vulkan struct pNext chains.
Consistently use for-loops, VkBaseInStructure and VkBaseOutStructure.
Remove redundant MVKVkAPIStructHeader structure.
Remove unnecessary null tests on incoming Vulkan struct pointers.
2020-05-06 11:15:50 -04:00
Bill Hollings
efde388cbd Add support for VK_KHR_external_memory_capabilities extension.
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.
2020-05-05 18:12:17 -04:00
Bill Hollings
2b5eb3e9f6 Shorten Vulkan extension declarations for brevity and clarity.
Shorten instance/device extension declarations for brevity.
Reformat platform extension tests for brevity and clarity.
2020-05-04 13:38:16 -04:00
Bill Hollings
445d30e41f Reduce common memory requirements of MVKCmdSetViewport and MVKCmdSetScissor.
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.
2020-04-24 22:14:05 -04:00
Bill Hollings
30c8ebb2f2 Automatically generate MVKCommand::getTypePool() implementations
for MVKCommand subclasses using MVKCommandTypePools.def file.
2020-04-24 14:13:58 -04:00
Bill Hollings
6ce5b00a1e MVKCommandPool uses def file to define and manage command type pool member variables. 2020-04-24 12:20:53 -04:00
Bill Hollings
471ba9bb39 Rename most MVKPixelFormats member functions to eliminate naming redundancy.
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.
2020-04-23 14:45:35 -04:00
Bill Hollings
432a63545e MVKPixelFormats add all iOS feat set caps for R23Uint and R23Sint. 2020-04-23 13:51:53 -04:00
Bill Hollings
8502d516e3 Merge branch 'master' of https://github.com/KhronosGroup/MoltenVK 2020-04-22 22:55:45 -04:00
Bill Hollings
e8b0ef879a MVKPixelFormats enables atomic capabilities only when applicable.
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.
2020-04-22 22:54:51 -04:00
Chip Davis
9260f5bfd5 MVKDevice: Support capturing GPU traces to a file.
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).
2020-04-22 18:38:08 -05:00
Bill Hollings
11bd75d521 MVKPixelFormats consolidate setting VkFormatProperties. 2020-04-22 17:29:11 -04:00
Bill Hollings
5d9cad350d In MVKCommand subclasses, replace holding Metal structs with Vulkan equivalents. 2020-04-22 14:35:37 -04:00
Bill Hollings
14a606854b Merge branch 'master' of https://github.com/KhronosGroup/MoltenVK 2020-04-22 13:43:01 -04:00
Bill Hollings
4a62300a1c
Merge pull request #863 from cdavis5e/image-atomics
MVKDescriptor: Pass buffers to shaders that do atomic image accesses.
2020-04-22 13:34:20 -04:00
Chip Davis
15e3dc041c MVKDescriptor: Pass buffers to shaders that do atomic image accesses.
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.
2020-04-22 11:13:00 -05:00
Bill Hollings
04865936c9 Reduce memory via just-in-time conversion to Metal viewports and scissors.
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.
2020-04-20 22:35:11 -04:00
Bill Hollings
5d9dd08353 Fix issue in setting depth bias introduced during recent MVKCommand redesign. 2020-04-19 16:31:38 -04:00
Bill Hollings
e4be6b836c Simplify MVKCommand and MVKCommandTypePool instantiation.
MVKCommand constructor not longer take MVKCommandTypePool.
Remove MVKCommand::returnToPool().
MVKCommandTypePool no longer track MVKCommandPool.
Remove MVKCommand.mm.
2020-04-18 22:52:40 -04:00
Bill Hollings
33dbc761c7 Remove MVKCommand::_pool iVar.
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.
2020-04-17 22:47:12 -04:00
Bill Hollings
b7c6f73c04 MVKCommand remove functions that access device and command pool.
MVKCommand subclasses access device and command pool through
MVKCommandEncoder and MVKCommandBuffer.
2020-04-17 14:32:25 -04:00
Bill Hollings
4ef21a2589 Remove MVKCommand from MVKConfigurableObject superclass.
MVKCommand subclass setContent() return VkResult
instead of calling setConfigurationResult().
MVKAddCmd() macro tests return error and doesn't add command to MVKCommandBuffer.
Remove MVKCommand::canEncode().
2020-04-16 18:07:42 -04:00
Bill Hollings
99fe5a07f2 Standardize MVKCommand creation and consolidate into vulkan.mm.
Add MVKAddCmd() macro to create MVKCommand subclass
instances and adding to a MVKCommandBuffer.
Remove all mvkCmd...() methods.
2020-04-16 13:50:43 -04:00
Bill Hollings
cfdf9b50da Move calls to MVKCommandBuffer::record...() inside setContent() functions.
Add MVKCmdEndRenderPass::setContent().
2020-04-15 22:09:19 -04:00
Bill Hollings
d3e548f3ee MVKCommand setContent() calls take MVKCommandBuffer parameter.
Remove MVKCommand::added().
2020-04-15 20:48:52 -04:00
Bill Hollings
6059efe0f1 MVKCommand remove reference to MVKCommandBuffer. 2020-04-15 16:46:34 -04:00
Bill Hollings
0074963ff9
Merge pull request #861 from cdavis5e/host-coherent-texel-buffers
MVKBuffer: Support texel buffers in "host-coherent" memory on Mac.
2020-04-15 16:23:27 -04:00
Bill Hollings
e581266cc7 vkQueuePresentKHR() returns VkResult for each swapchain.
Add MVKSwapchain::getSurfaceStatus().
2020-04-15 15:31:29 -04:00
Chip Davis
25a1e056db MVKBuffer: Support texel buffers in "host-coherent" memory on Mac.
According to the Vulkan spec:

> * If `buffer` is a `VkBuffer` not created with the
>   `VK_BUFFER_CREATE_SPARSE_BINDING_BIT` bit set[...] then the
>   `memoryTypeBits` member always contains at least one bit set
>   corresponding to a `VkMemoryType` with a `propertyFlags` that has
>   both the `VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT` bit and the
>   `VK_MEMORY_PROPERTY_HOST_COHERENT_BIT` bit set. In other words,
>   mappable coherent memory **can** always be attached to these
>   objects.

There is no exception for texel buffers. Even though desktop Metal
disallows textures in shared memory, even linear textures created from a
buffer, we have to advertise host-coherent memory for texel buffers.
Some applications actually depend on this behavior, so it's not just a
theoretical concern.

To support host-coherent texel buffers, we implicitly create a managed
buffer and copy data between the device memory and the managed buffer,
just like for a linear image.

Signed-off-by: Chip Davis <cdavis@codeweavers.com>
2020-04-15 14:31:14 -05:00
Chip Davis
adf63bbdc7 MVKPipeline: Disable fragment shader outputs for unused attachments.
Naturally, Metal complains when a fragment shader write to a
`[[depth]]` output, but there be no depth attachment. I imagine that it
will also complain if the shader write to ``[[stencil]]`` with no
stencil attachment, or it write to a ``[[color(n)]]`` output with no
corresponding attachment.
2020-04-14 14:32:00 -05:00
Bill Hollings
b582b9284b Set format capabilities for subpass input attachments to kMVKMTLFmtCapsRead. 2020-04-11 21:58:52 -04:00
Bill Hollings
7d779a1636 Reduce thread locking on performance statistics collection. 2020-04-10 12:18:25 -04:00
Bill Hollings
0904c49014 Alphabetize file sorting in Xcode Project Navigator. 2020-04-09 14:19:46 -04:00
Bill Hollings
dc7eab64ae Consolidate frame and non-frame performance reporting.
Added MVKQueuePerformance::frameInterval performance tracker.
Added MVKPerformanceTracker::latestDuration to track duration of most recent activity.
Swapchain performance can be retrieved with other activity performance through
vkGetPerformanceStatisticsMVK().
Performance logging of all activities can be performed periodically
on a frame-count basis, or inline as the activity occurs.
Add MVK_CONFIG_PERFORMANCE_LOGGING_INLINE env var to enable/disable
logging of performance of each activity when it happens.
Removed vkGetSwapchainPerformanceMVK() and MVKSwapchainPerformance from API.
Updated VK_MVK_MOLTENVK_SPEC_VERSION to 25.
Updated MoltenVK version to 1.0.42.
2020-04-09 14:02:08 -04:00
Bill Hollings
70bf788f9f Fix issue of reseting CAMetalDrawable and MTLTexture of peer swapchain images.
Add MVKPresentableSwapchainImage and MVKPeerSwapchainImage subclasses to
MVKSwapchainImage, with MVKPresentableSwapchainImage instances created inside
swapchain, and MVKPeerSwapchainImage instances created using vkCreateImage().
MVKPeerSwapchainImage retrieve and share CAMetalDrawable from corresponding
MVKPresentableSwapchainImage.
2020-04-05 15:15:24 -04:00
Bill Hollings
aa27fd6588 MVKSwapchainImage always retrieve MTLTexture directly from CAMetalDrawable. 2020-04-04 20:25:23 -04:00
Bill Hollings
c6b642db19 Fix acquisition ordering of swapchain images.
Remove obsolete MVKSwapchainImageAvailability::waitCount member that was initializing
randomly and corrupting swapchain image acquisition ordering evaluations.
Rename several member functions to clarify purpose.
2020-04-04 16:25:13 -04:00
Bill Hollings
d46b2f3036 Disable use of MTLHeap by default.
Add MVK_CONFIG_USE_MTLHEAP environment variable to enable use of MTLHeap if needed.
Minor fixes to consistent use of MVK_SET_FROM_ENV_OR_BUILD_BOOL().
2020-04-03 16:55:10 -04:00
Bill Hollings
d57c3c845e vkCreateInstance() return error on incompatible Vulkan version only if 1.0. 2020-04-02 19:40:44 -04:00
Bill Hollings
2037b6c007 Defer resetting MTLTexture in MVKSwapchainImage until request to acquire.
Move call to MVKSwapchainImage::resetMetalDrawable() from immediately after
presentation until request to acquire, to preserve image content for copying
after presentation in cases such as an app screen capture operation.

Testing indicates this deferral has little or no adverse effect on the performance
of retrieving the drawable when next needed.
2020-04-02 12:54:57 -04:00
Bill Hollings
fde9d515ca Remove secondary MVKSwapchainImage constructor. 2020-04-02 11:35:26 -04:00
Bill Hollings
6229582887 Move tracking of swapchain image availability from MVKSwapchain to MVKSwapchainImage. 2020-04-02 10:57:06 -04:00
Bill Hollings
68b5f72d86 Move tracking of CAMetalDrawable from MVKSwapchain to MVKSwapchainImage. 2020-04-01 21:33:29 -04:00