1809 Commits

Author SHA1 Message Date
Bill Hollings
855c7a6c36 Merge branch 'visionOS' of https://github.com/nginetechnologies/MoltenVK into nginetechnologies-visionOS 2023-07-11 10:58:46 -04:00
Bill Hollings
dff64e956c
Merge pull request #1972 from cdavis5e/incremental-present
Support the `VK_KHR_incremental_present` extension.
2023-07-11 08:50:17 -04:00
Bill Hollings
1728f7fd81
Merge pull request #1968 from cdavis5e/pipeline-creation-feedback
Support the `VK_EXT_pipeline_creation_feedback` extension.
2023-07-11 08:25:13 -04:00
Chip Davis
561e14ba62 Support the VK_EXT_pipeline_creation_feedback extension.
This provides feedback that indicates:
* how long it took to compile each shader stage and the pipeline as a
  whole;
* whether or not the pipeline or any shader stage were found in any
  supplied pipeline cache; and
* whether or not any supplied base pipeline were used to accelerate
  pipeline creation.

This is similar to the performance statistics that MoltenVK already
collects.

Since we don't use any supplied base pipeline at all, this
implementation never sets
`VK_PIPELINE_CREATION_FEEDBACK_BASE_PIPELINE_ACCELERATION_BIT`. However,
I've identified several places where we could probably use the base
pipeline to accelerate pipeline creation. One day, I should probably
implement that.

Likewise, because we don't yet support using `MTLBinaryArchive`s,
`VK_PIPELINE_CREATION_FEEDBACK_APPLICATION_PIPELINE_CACHE_HIT_BIT` is
never set on the whole pipeline, though it *is* set for individual
stages, on the assumption that any shader found in a cache is likely to
be found in Metal's own implicit cache.

In this implementation, shader stage compilation time includes any time
needed to build the `MTLComputePipelineState`s needed for vertex and
tessellation control shaders in tessellated pipelines.

This patch also changes compilation of the vertex stage
`MTLComputePipelineState`s in tessellated pipelines to be eager instead
of lazy. We really ought to have been doing this anyway, in order to
report pipeline failures at creation time instead of draw time. I'm not
happy, though, that we now pay the cost of all three pipeline states all
the time, instead of just the ones that are used.

This also gets rid of some fields of `MVKGraphicsPipeline` that were
only used during pipeline construction, which should save some memory,
particularly for apps that create lots of pipelines.
2023-07-10 18:25:03 -07:00
Chip Davis
3914b0f07d Support the VK_KHR_incremental_present extension.
This extension allows apps to provide a hint to the presentation engine
indicating which parts of the surface need updating. To provide this
hint, we call `-[CALayer setNeedsDisplayInRect:]`, which indicates that
only the given rectangle needs updating.

I'm not sure if this will have any effect, especially if
`CAMetalLayer.presentsWithTransaction` is `NO`. Luckily for us, this is
only a hint, and it is permissible for the presentation engine to do
nothing with the hint.

The tests don't work because they apparently can't handle
`VK_SUBOPTIMAL_KHR` being returned.
2023-07-10 01:05:18 -07:00
Chip Davis
21ac7443b0 MVKDevice: Don't enable sample LoD depth array workaround for macOS Sonoma and up.
Apple have indicated to me that they have fixed the bug. I've confirmed
this.
2023-07-07 14:05:32 -07:00
Antarctic Coder
056dec80e6 Completed the support for MSL 3.1 enum
This commit adds some extra code that was needed to define to MSL 3.1 enum that was not included in the first commit. Based on PR: #1940
2023-07-05 13:20:59 -04:00
Antarctic Coder
6bca44c612 Added MSL Version 3.1 for switch case
In this commit, I've added support for Xcode 15, and added a case for MSL version 3.1. I added this because I noticed xcode was throwing some warnings about an unhandled switch case.
2023-07-05 09:47:38 -04:00
Bill Hollings
41dbd9d490
Merge pull request #1962 from billhollings/tri-fans
Add support for VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN.
2023-07-01 11:15:36 -04:00
Bill Hollings
c34bb54d48 Fix unreachable code in MVKDeferredOperation::join().
- Fix unreachable code in MVKDeferredOperation::join().
- Refactor code so deferred functions call back to MVKDeferredOperation
  instance to update current status, and deferred function execution
  returns result of individual thread execution.
- MVKDeferredOperation use MVKSmallVector for _functionParameters.
- MVKDeferredOperation use a single mutex lock.
- Add additional comments explaining design to developers of
  future extensions that use deferred operations.
2023-06-30 08:54:27 -04:00
Bill Hollings
e5d3939322 Add support for VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN.
To reduce complexity and repetitive copy-pasted spaghetti code,
the design approach here was to implement triangle fan conversion on
MVKCmdDrawIndexedIndirect, as the most general of the draw commands,
and then populate and invoke a synthetic MVKCmdDrawIndexedIndirect
command from the other draw commands.

- Rename pipeline factory shader cmdDrawIndexedIndirectMultiviewConvertBuffers()
  to cmdDrawIndexedIndirectConvertBuffers, and in addition to original support
  for modifying indirect content to support multiview, add support for
  converting triangle fan indirect content and indexes to triangle list.
- Modify MVKCmdDrawIndexedIndirect to track need to convert triangle fans
  to triangle list, and invoke kernel function when needed.
- Modify MVKCmdDraw, MVKCmdDrawIndexed, and MVKCmdDrawIndirect to populate
  and invoke a synthetic MVKCmdDrawIndexedIndirect command to convert triangle
  fans to triangle lists.
- Add pipeline factory shader cmdDrawIndirectPopulateIndexes() to convert
  non-indexed indirect content to indexed indirect content.
- MVKCmdDrawIndexedIndirect add support for zero divisor vertex buffers
  potentially coming from MVKCmdDraw and MVKCmdDrawIndexed.

- Rename pipeline factory shader cmdDrawIndexedIndirectConvertBuffers()
  to cmdDrawIndexedIndirectTessConvertBuffers() so it will be invoked from
  MVKCommandEncodingPool::getCmdDrawIndirectTessConvertBuffersMTLComputePipelineState()
  (unrelated).
2023-06-28 00:01:12 -04:00
Bill Hollings
96204ada46
Merge pull request #1961 from cdavis5e/legacy-subgroup
Support `VK_EXT_shader_subgroup_ballot` and `VK_EXT_shader_subgroup_vote`.
2023-06-26 18:38:30 -04:00
Bill Hollings
c85507b996
Merge pull request #1960 from cdavis5e/shader-non-semantic-info
Advertise the `VK_KHR_shader_non_semantic_info` extension.
2023-06-26 17:20:41 -04:00
Chip Davis
b74feb7c77 Support VK_EXT_shader_subgroup_ballot and VK_EXT_shader_subgroup_vote.
Update SPIRV-Cross to pull in the needed support for these extensions.
2023-06-26 13:40:34 -07:00
Chip Davis
5253e6f9e0 Advertise the VK_KHR_shader_non_semantic_info extension.
This just provides support for the `SPV_KHR_non_semantic_info`
extension, which supports extended instruction sets that do not affect
the semantics of a SPIR-V shader (e.g. debug info). SPIRV-Cross already
handles these instruction sets, so no additional work is required on our
part to support this extension.
2023-06-24 16:48:30 -07:00
Chip Davis
4e3ac69305 Support the VK_EXT_calibrated_timestamps extension.
This extension has a direct Metal equivalent in the
`-[MTLDevice sampleTimestamps:gpuTimestamp:]` method. However, that
method returns CPU timestamps in the Mach absolute time domain, which is
*not* that of `CLOCK_MONOTONIC_RAW` but of `CLOCK_UPTIME_RAW`. The
function that corresponds to `CLOCK_MONOTONIC_RAW` is
`mach_continuous_time()`. Therefore, this implementation uses the
`mach_continuous_time()` function for the CPU timestamp. Perhaps we
should lobby the WG for `VK_TIME_DOMAIN_CLOCK_UPTIME_RAW_EXT`.
2023-06-23 12:08:56 -07:00
Chip Davis
591eb6bdaa
Merge pull request #1955 from cdavis5e/4444-formats
Support the `VK_EXT_4444_formats` extension.
2023-06-23 13:07:10 -06:00
Filip Lundgren
67814ba3f3 Fix build with latest main 2023-06-23 10:51:28 -04:00
Filip Lundgren
d8b5a7df55 Merge branch 'main' of https://github.com/KhronosGroup/MoltenVK into visionOS 2023-06-23 10:29:57 -04:00
Filip Lundgren
16990efeb1 Support building for visionOS
Note: Internal naming is xrOS, but publicly it should be referred to as visionOS
2023-06-23 10:25:05 -04:00
Chip Davis
5d173d0e09 Support the VK_EXT_4444_formats extension.
This turned out to be a little bit more involved than I had hoped. But,
with this, we can now use the `VK_FORMAT_A4R4G4B4_UNORM_PACK16` and
`VK_FORMAT_A4B4G4R4_UNORM_PACK16` formats from shaders, use them as blit
sources, and even clear them. Storage images and render targets of these
formats aren't supported, however. To support the latter would require
the insertion of a swizzle into the fragment shader before returning.
The former cannot be reasonably supported.
2023-06-22 15:14:50 -07:00
Antarctic Coder
e5bfc2d66e C-Style Arrays instead of MVKSmallVector
This commit changes the MVKSmallVector to a C-Style array because the parameters array will not have to resize, and it seems that a C-Style array is just as capable of doing the job.
2023-06-21 11:00:15 -04:00
Antarctic Coder
fa19fcc962 Push to Compile MVKSmallVector with void*
Pushing to Github to compile with Github Actions to see if MVKVectors with void* can work
2023-06-20 13:11:54 -04:00
Antarctic Coder
c0705c8f7d Made some fixes for Deferred Operations
The changes are as follows:

* Moved the code around to fit with the ordering system
* Added a function to get available cpu cores
* Renamed variables with _ in front of them
* Added mutexes and lock guards for the getters and setters of the max concurrency and result variables
* Made max concurrency dynamic by returning 0 when the operation is finished
2023-06-20 10:19:29 -04:00
Antarctic Coder
ab7087165a
Fixed comments for deferred operations
Co-authored-by: Chip Davis <cdavis5x@gmail.com>
2023-06-20 08:28:59 -04:00
Antarctic Coder
33cd6f24c4 Implemented Deferred Host Operations
Implemented deferred host operations in this commit. It was pretty simple with nothing Metal specific. I am a bit concerned on the return types of MVKDeferredOperation::join and about how to store the operation to be executed for later.
2023-06-19 15:18:15 -04:00
Bill Hollings
9356c89bd5
Merge pull request #1949 from billhollings/swap-system-GPU-fix
Don't call MTLCreateSystemDefaultDevice() on every swapchain creation.
2023-06-16 09:00:02 -04:00
Bill Hollings
e69c249348 Log more info about SPIR-V to MSL conversion errors.
Remove unhelpful "Shader module does not contain
an entry point named 'main0'" error message.
2023-06-15 19:56:36 -04:00
Bill Hollings
425505da47 Don't call MTLCreateSystemDefaultDevice() on every swapchain creation.
- When forcing the window system to use the same high-power GPU as the app,
  move the call to MTLCreateSystemDefaultDevice() to MVKDevice constructor,
  instead of MVKDevice::createSwapchain(), and test whether the
  VK_KHR_swapchain extension is enabled to determine the need to swap GPUs.

- After calling MTLCreateSystemDefaultDevice() the GPU will already be
  the same high-power GPU, so remove attempting to replace the MTLDevice.

- Remove MVKPhysicalDevice::replaceMTLDevice() as no longer used.

- Remove many unnecessary inline declarations in MVKDevice.h (unrelated).
2023-06-15 17:24:50 -04:00
Bill Hollings
4a9bf78e03
Merge pull request #1946 from billhollings/no-rendpass-no-dyn-rend-info
Allow both renderPass and VkPipelineRenderingCreateInfo to be missing.
2023-06-15 10:34:57 -04:00
Bill Hollings
b94553dbb3 Allow both renderPass and VkPipelineRenderingCreateInfo to be missing.
This avoids crashes in CTS when creating a graphics pipeline.
2023-06-14 18:49:40 -04:00
Raafat Akkad
e7243572d7 Allows maximizing the concurrent executing compilation tasks.
https://developer.apple.com/videos/play/wwdc2023/10127/?time=540
On an M1 Pro Macbook Pro 16" maximumConcurrentCompilationTaskCount goes from 2 to 8
2023-06-14 20:17:53 +01:00
Bill Hollings
4949c34b4d
Merge pull request #1936 from billhollings/present-imm-mode-unless-present-time
Support VK_PRESENT_MODE_IMMEDIATE_KHR if VkPresentTimeGOOGLE::desiredPresentTime is zero.
2023-06-07 18:41:57 -04:00
Chip Davis
750adcaae2 Advertise the VK_EXT_shader_demote_to_helper_invocation extension.
As of macOS Big Sur and iOS/tvOS 14, the `discard_fragment()` function
in MSL is defined to have demote semantics; that is, fragment shader
output is discarded, but the fragment shader thread continues to run as
a helper invocation. This is very useful for Direct3D emulation, since
this is the semantic that HLSL `discard` has.

Signed-off-by: Chip Davis <chip@holochip.com>
2023-06-07 12:48:02 -07:00
Bill Hollings
6fb53471b1 Support VK_PRESENT_MODE_IMMEDIATE_KHR if VkPresentTimeGOOGLE::desiredPresentTime is zero.
- [MTLDrawable presentAtTime:] syncs to display vsync. To support
  VK_PRESENT_MODE_IMMEDIATE_KHR while using VkPresentTimeGOOGLE::presentID,
  only call presentAtTime: if VkPresentTimeGOOGLE::desiredPresentTime has
  been explicitly set to a non-zero value.
- Clarify initially clearing MVKImagePresentInfo to all zeros.
2023-06-05 19:17:10 -04:00
Bill Hollings
107be116b7 Add support for VK_PRESENT_MODE_IMMEDIATE_KHR to macOS Cube demo.
- Only log performance stats on FPS logging if logging style is explicitly
  set to MVK_CONFIG_ACTIVITY_PERFORMANCE_LOGGING_STYLE_FRAME_COUNT (unrelated).
2023-05-30 21:11:02 -04:00
Bill Hollings
83a1811230 Ensure compute encoding state is marked dirty for non-dispatch commands.
The same compute encoder is used across dispatches and other commands,
which may override compute state, and end up breaking subsequent dispatches.

- Mark compute encoding state dirty when following commands,
  which use Metal compute encoders, are issued:
  - vkCmdCopyBuffer()
  - vkCmdClearColorImage()
  - vkCmdClearDepthStencilImage()
  - vkCmdFillBuffer()
  - vkCmdCopyQueryPoolResults()

- MVKCommandEncoder move marking compute state dirty from
  endCurrentMetalEncoding() to getMTLComputeEncoder().
- For efficiency, don't prematurely force end of query copy compute encoder
  used on renderpass end, in case compute dispatches follow.

- Update MoltenVK to 1.2.5 (unrelated).
2023-05-26 00:06:40 -04:00
Bill Hollings
b26ce32a60 Advertise VK_KHR_depth_stencil_resolve extension on all devices.
Advertise VK_KHR_depth_stencil_resolve extension on early iOS devices,
since VK_RESOLVE_MODE_SAMPLE_ZERO_BIT is supported on all devices,
even if other resolve modes are not, and makes it consistent with
Vulkan 1.2 mandatory support for VK_RESOLVE_MODE_SAMPLE_ZERO_BIT.
2023-05-23 19:01:31 -04:00
Bill Hollings
b863ecef4d Accumulate render stages when a resource is used by multiple descriptor bindings. 2023-05-23 13:13:19 -04:00
Italo Mandara
0125e5b739 Revert "Allow to disable Explicit LOD Workaround"
This reverts commit 6f3a2b709fbfcfdf7dc077b80b12f02463cc07b1.
2023-05-21 00:27:16 +01:00
Evan Tang
75b4d26fbc Check if shader compiled before adding it to a pipeline
Prevents Metal from aborting when you try to set a null function on the descriptor
2023-05-17 15:47:47 -05:00
Bill Hollings
ae0ee6a012
Merge pull request #1908 from billhollings/fix-deviceUUID
Populate deviceUUID from MTLDevice location and peer group info.
2023-05-17 15:09:46 -04:00
Bill Hollings
665ef6df13 Improve support for deviceUUID and deviceLUID.
- MTLDevice registryID is not constant across OS reboots,
  which is not conformant with deviceUUID requirements.
- Replace with combination of MTLDevice location, locationNumber,
  peerGroupID, and peerIndex, which should define uniqueness,
  and should be constant across OS reboots.
- Populate deviceLUID from MTLDevice registryID.
2023-05-17 14:50:48 -04:00
Bill Hollings
d29092ab78 Do not fail on request for timestamp query pool that is too large.
- Report error, but do not fail on request for timestamp query pool
  that is too large for MTLCounterSampleBuffer.
- Change reported error to VK_ERROR_OUT_OF_DEVICE_MEMORY and clarify
  text of error reported when timestamp query pool is too large.
- Clarify error reported for occlusion query pool errors (unrelated).
2023-05-16 17:26:26 -04:00
Bill Hollings
65ce195a6f Ensure swapchain image presented time is always populated when requested.
If Metal reports zero presentedTime, and desired presentation
time has not been set by app, use the current time.
2023-05-15 18:47:22 -04:00
Bill Hollings
4893f78b29 Identify each unsupported device feature flag that the app attempts to be enable.
- Make MVKDevice::enableFeatures() functions into templates to pass struct type.
- Add mvkGetAddressOfFirstMember() to retrieve the address of the first member of
  a struct, taking into consideration whether the struct has a Vulkan pNext member.
- Add mvk::getTypeName() and mvk::getOrdinalSuffix() string functions.
2023-05-15 15:14:30 -04:00
Bill Hollings
7d4f5745f7
Merge pull request #1903 from ChibiDenDen/simulator_feature_discovery_fix
Fix simulator feature discovery
2023-05-13 12:28:07 -04:00
ChibiDenDen
0139b95849 Fix simulator feature discovery
Fix depth clamp and texture swizzle feature discovery on simulator builds

Both of these features are not supported by the iphone simulator
and leads to crashes when used
2023-05-12 23:41:46 +03:00
Evan Tang
47ce47ad4c Fix reorder-ctor warning 2023-05-12 14:10:14 -05:00
Evan Tang
1b6750bef8 Respect the bind point supplied to vkCmdBindDescriptorSets 2023-05-12 13:00:06 -05:00