1873 Commits

Author SHA1 Message Date
Joshua Goins
b6c392541c
Check if metal device supports base vertex instance drawing
Co-authored-by: Bill Hollings <bill.hollings@brenwill.com>
2022-03-08 14:17:55 -05:00
Joshua Goins
d05537dbe5 Enable base vertex instance support in shader conversion 2022-03-06 17:07:54 -05:00
Bill Hollings
e42b33e593 Don't attempt to store the depth component of a stencil-only renderpass attachment.
For a combined depth-stencil format in a MVKImageView attachment with
VK_IMAGE_ASPECT_STENCIL_BIT, the attachment format may have been swizzled
to a stencil-only format. In this case, we want to guard against an attempt
to store the non-existent depth component.

Pass MVKImageView attachment to MVKRenderPassAttachment::encodeStoreAction()
and MVKRenderPassAttachment::populateMTLRenderPassAttachmentDescriptor() to
check attachment depth format component.

Consolidate calls to MVKImageView::populateMTLRenderPassAttachmentDescriptor() by calling
it from within MVKRenderPassAttachment::populateMTLRenderPassAttachmentDescriptor().
2022-02-24 11:42:12 -05:00
Bill Hollings
e28a16d76b Update MoltenVK version number to 1.1.9.
Adjust Whats_New.md to accommodate earlier
trivial 1.1.8 patch release for SDK 1.3.204.1.
2022-02-22 14:18:55 -05:00
Bill Hollings
afd997ab31 Align flattened shader inputs to previous stage output structs.
When flattening shader inputs for stage_in, which are to be read from a buffer
that was populated as nested structs during an earlier stage, the structs will
be aligned according to C++ rules, which can affect the alignment of the first
member of the flattened input struct.

Add SPIRVShaderOutput::firstStructMemberAlignment to track the alignment
requirements of the first member of a nested structure, and recursively
determine the alignment of the first member of each nested output structure.

Move sizeOfOutput() from MVKPipeline.mm to SPIRVReflection.h,
rename to getShaderOutputSize(), and add getShaderOutputAlignment()
to extract member alignment.
2022-02-22 12:17:15 -05:00
Bill Hollings
16408fd6ae Remove logged warning if MoltenVK does not support VkApplicationInfo::apiVersion value.
Update MoltenVK version to 1.1.8.
Minor spelling fixes in comments.
2022-02-09 13:36:08 -05:00
Bill Hollings
13a0f6abee Fix use of GPU counter sets on older versions of iOS running on the simulator.
Replace test for MVK_APPLE_SILICON with test for MVK_MACOS plus Apple1 GPU.
2022-02-05 12:23:05 -05:00
Nikita Fediuchin
4efb90b3c1 Update license year 2022-02-04 13:33:27 +02:00
Bill Hollings
9986e92f35
Merge pull request #1497 from billhollings/apple-silicon-deviceID
On Apple Silicon, set VkPhysicalDeviceProperties::deviceID from GPU capabilities.
2021-12-28 22:08:44 -05:00
Bill Hollings
7740d4f43a
Change scale of OSMin value in deviceID to 100.
Co-authored-by: Chip Davis <cdavis@codeweavers.com>
2021-12-28 19:58:10 -05:00
Bill Hollings
cd7c7fdfae Support MTLTimestamp on Xcode 11.7. 2021-12-28 18:12:25 -05:00
Bill Hollings
9633f4843d Improve accuracy of VkPhysicalDeviceLimits::timestampPeriod.
If using GPU counters, on all Apple GPUs lock timestampPeriod to 1.0,
since Apple GPUs use nanoseconds, and on non-Apple GPUs, dynamically
adapt value of timestampPeriod by correlating GPU ticks with GPU ticks.

If using CPU sync, set timestampPeriod to OS CPU timestamp tick period.
2021-12-28 17:19:11 -05:00
Bill Hollings
3a8975c21d Support Xcode 13.2 build settings. 2021-12-27 17:50:29 -05:00
Bill Hollings
df043487e4 On Apple Silicon, set VkPhysicalDeviceProperties::deviceID from GPU capabilities.
Previously, on Apple Silicon (iOS, tvOS & macOS M1), we tried to guess
deviceID from GPU parameters, but this is becoming harder as the types
of Apple Silicon is growing, and the actual device SoC itself is less
relevant that the GPU capabilities. So we now set deviceID from the
combination of OS version and GPU type.

Rename MVKDevice::getHighestMTLFeatureSet() to getHighestGPUCapability().
2021-12-27 16:45:12 -05:00
Bill Hollings
5810772644 Fix merge conflicts and syntax build error in iOS build. 2021-12-26 18:30:31 -05:00
Bill Hollings
66a171a25d
Merge pull request #1490 from billhollings/strip-promoted-static-vulkan-symbols
Optionally hide additional static Vulkan linkage symbols.
2021-12-26 17:24:19 -05:00
Bill Hollings
92712e240a Fix memory leak of dummy MTLTexture in render subpasses that use no attachments.
Older Metal does not support rendering without subpass attachments.
In this case, a dummy attachment with a dummy MTLTexture is created
whenever the subpass begins, but was not being correctly used.

Move the creation, retaining, and releasing of the dummy MTLTexture to
MVKFramebuffer, where the extent and layer count is known and can be reused.

Pass framebuffer to MVKCommandEncoder::beginRenderpass() and remember
current framebuffer in MVKCommandEncoder.
Add getFramebufferExtent() and getFramebufferLayerCount() to MVKCommandEncoder.
Pass framebuffer to MVKRenderSubpass:populateMTLRenderPassDescriptor() and
retrieve dummy MTLTexture from framebuffer.
2021-12-25 16:18:18 -05:00
Bill Hollings
355bfed457 Fix Metal object retain-release errors in assignment operators. 2021-12-25 12:58:55 -05:00
Bill Hollings
52568efb27 Optionally hide additional static Vulkan linkage symbols.
Move the aliasing of promoted function pointers to the function pointer
lookup collection, because non-global function alias symbols are not
available in separately compiled object file.

Add public aliased Vulkan extension functions that were promoted to 1.1 to
the public symbols that are hidden when MVK_HIDE_VULKAN_SYMBOLS is enabled.

Add functions from the private VK_MVK_moltenvk extension that depend on
Vulkan object handles to the public symbols that are hidden when
MVK_HIDE_VULKAN_SYMBOLS is enabled, to discourage their use by apps that
are using the Vulkan Loader and Layers, because they are not supported by
the Vulkan Loader and Layers.

Update VK_MVK_MOLTENVK_SPEC_VERSION to version 33.
2021-12-18 14:00:37 -05:00
Bill Hollings
bc4ce5799c
Merge pull request #1485 from billhollings/rosetta2-and-msl24
Updates to better support Rosetta2 runtimes, and MSL 2.4 and 2.3 versions.
2021-12-02 16:40:48 -05:00
Bill Hollings
e74cf2f094 Fix build macros for tvOS, plus support MTLGPUFamilyApple8.
Don't use tests for MTLGPUFamilyApple6 and MTLGPUFamilyApple7 in tvOS build.
Advertise MTLGPUFamilyApple8 GPU and A15 SoC device if present.
2021-12-02 09:47:56 -05:00
Bill Hollings
479d55f2aa Wrap MTLGPUFamilyApple6 and MTLGPUFamilyApple7 in build macros for Xcode 11.7. 2021-12-01 19:13:29 -05:00
Bill Hollings
18642002ce Updates to better support Rosetta2 runtimes, and MSL 2.4 and 2.3 versions.
Do not use MTLEvent for VkSemaphore under Rosetta2.
Remove compile test for MVK_MACOS_APPLE_SILICON and MVK_APPLE_SILICON when testing
for Apple GPU families, to allow x86 builds to test for Apple GPU under Rosetta2.
Simplify identifying M1 GPU. All M1 SoCs currently support the A14 (Apple7) GPU.
Support compiling MSL 2.4 in runtime pipelines and MoltenVKShaderConverterTool.
Fix issue where MSL 2.3 only available on Apple Silicon, even on macOS.
Update to latest SPIRV-Cross (unrelated to Rosetta2).
2021-12-01 18:14:07 -05:00
Nikita Fediuchin
0da221f48c Fix documentation and header 2021-11-26 10:11:16 +02:00
Nikita Fediuchin
6ac92fbacf Clean up MVKLogging
* Replaced ASL levels with MVKConfigLogLevel.
* Moved MVKLogging.h to Utility/ directory.
* Added MVKConfigLogLevel Warning and Debug levels.
2021-11-25 09:47:43 +02:00
Bill Hollings
5de7f5551c Support building MoltenVK with static Vulkan linkage symbols hidden.
Add build environment variable MVK_HIDE_VULKAN_SYMBOLS. to allow MoltenVK
to be built with static Vulkan API symbols hidden, to avoid library linking
conflicts when bound to a Vulkan Loader that also exports identical symbols.

The default value of MVK_HIDE_VULKAN_SYMBOLS is 0,
meaning Vulkan static symbols are exposed by default.

Add MVK_PUBLIC_VULKAN_SYMBOL directive to mark each Vulkan call symbols
for exporting or hiding.

Update the MoltenVK Xcode project to add the MVK_HIDE_VULKAN_SYMBOLS build
setting, and set the ENABLE_TESTABILITY build setting to NO, because it
conflicts with stripping symbols.

Update MoltenVK version to 1.1.7.
2021-11-17 18:22:33 -05:00
Bill Hollings
a5d0464a43 Update BC1_RGB swizzle to accommodate RGB values swizzled to or from alpha. 2021-11-10 13:41:07 -05:00
Bill Hollings
6e054ad5db Restore support for BC1_RGB compressed format.
For Vulkan BC1_RGB formats, swizzle alpha of substituted
Metal BC1_RGBA to 1.0, to return value expected by Vulkan.
2021-11-09 12:13:51 -05:00
Bill Hollings
bab17a52b7 Remove advertised support for BC1_RGB texel formats.
Metal does not provide direct support for BC1_RGB formats
(VK_FORMAT_BC1_RGB_UNORM_BLOCK & VK_FORMAT_BC1_RGB_SRGB_BLOCK).
We have been faking it by mapping these Vulkan formats to Metal
formats containing alpha (MTLPixelFormatBC7_RGBAUnorm &
MTLPixelFormatBC7_RGBAUnorm_sRGB, respectively),
and advertising support for BC1_RGB formats.

However, this triggers CTS failures, because the BC1_RGBA formats can return
an alpha value of 0.0 when constructed that way, whereas the BC1_RGB formats
always expect 1.0 (opaque) to be returned.

This change moves to indirect support for BC1_RGB formats. They will still
be covered by MTLPixelFormatBC7_RGBAUnorm & MTLPixelFormatBC7_RGBAUnorm_sRGB,
and will effectively work (except transparency), but are no longer advertised
through physical device format and image format queries.
2021-10-31 19:00:25 -04:00
Jan Sikorski
99dcaaa070 MVKImage: Select proper base layer and mipmap for attachment if not using view because of swizzling. 2021-10-26 10:19:12 +02:00
Nikita Fediuchin
fae1bb53a6 Fix apiVersion check condition 2021-10-06 21:25:01 +03:00
Nikita Fediuchin
c8813898cf Add MVKLogWarning, apiVersion warning
* Added MVKLogWarning logger, and updated header comments.
* Added greater _appInfo.apiVersion  than MoltenVK version warning.
2021-10-04 12:03:36 +03:00
Nikita Fediuchin
a22dfba076 Fix spacing 2021-10-04 00:17:51 +03:00
Nikita Fediuchin
a001c4344e Add VkInstance apiVersion warning 2021-10-04 00:13:14 +03:00
Bill Hollings
cc10af04c9 Ensure dynamic pipeline state always respects pipeline dynamic flags.
Dynamic pipeline state set before the pipeline is set was reading
dynamic flags from previous pipeline. This is fixed here by accepting
the dynamic state, but deferring the decision to use either dynamic
or static state until the pipeline is encoded.
2021-09-30 21:09:07 -04:00
Bill Hollings
36fae88ee2 Move multilayer-rendering validation from MVKImage to MVKImageView.
An MVKImageView that renders to only one layer of a multilayer MVKImage
is not performing multilayer-rendering. Only validate multilayer-rendering
when it is definitely requested in an MVKImageView, instead of presuming
when a multilayer MVKImage is marked for rendering.
2021-09-30 15:30:23 -04:00
Bill Hollings
ba9623cad5 Update to latest version of SPIRV-Cross.
Add additional SPIRV-Cross header files to ExternalDependencies.xcodeproj
to allow browsing these files in Xcode.
2021-09-30 13:45:54 -04:00
Jerran Schmidt
8c97b360e1 Added vkGetMTLCommandQueueMVK function to expose underlying MTLCommandQueue object 2021-09-17 12:47:10 +10:00
Bill Hollings
4ad5930263 Improved checks for timestamp GPU counter support on older devices.
Check that appropriate GPU counter set is supported on
the device before creating GPU counter sample buffer.
Don't attempt to timestamp using GPU counters unless
a GPU sample counter buffer has been created.
2021-09-13 17:20:00 -04:00
Bill Hollings
0cf396a70f Add MTLFence between Metal encoders and timestamp stage counter BLIT encoder
to ensure previous work is finished before being timestamped.
2021-09-13 16:08:16 -04:00
Bill Hollings
e36b9e60d5 Set maximum point primitive size based on GPU vendor ID. 2021-09-09 14:33:30 -04:00
Bill Hollings
333084f739 Several updates for CTS test fixes.
Support maximum point primitive size of 511.
Update to latest SPIRV-Cross version to add support
for OpSpecConstantOp ops OpQuantizeToF16 and OpSRem.
Update MoltenVK version to 1.1.6.
2021-09-08 12:05:08 -04:00
StarbucksDave
b4d98aa77e
Add SetWorkGroupSize function type 2021-09-01 17:23:40 +02:00
Bill Hollings
bb7af644ee Remove use of the MTLMaxBlitPassSampleBuffers Metal API definition.
MTLMaxBlitPassSampleBuffers was available in Xcode 12 and had a value of 4.
According to Apple, the definition will be removed from the API in Xcode 13.
For now, assume a value of 1, until we can accurately determine the
appropriate value per platform.
2021-08-30 15:37:49 -04:00
Bill Hollings
2412b97998 Fix from PR code review.
Remove unused MVKCommandUse::kMVKCommandUseBeginMultiViewPass.
2021-08-23 18:43:59 -04:00
Bill Hollings
8a7e20d348 Fix GPU race condition when clearing a renderpass input attachment on Apple GPUs.
Apple GPUs do not support rendering/writing to an attachment and then reading
from that attachment within a single Metal renderpass. On Apple Silicon, restart
the Metal renderpass if an input attachment is cleared inside renderpass.

Don't clear render area when restarting Metal renderpass, as it should not occur,
and itself causes a recursive loop restarting the renderpass as a result.

Add MVKCommandUse::kMVKCommandUseRestartSubpass.
MVKCommandEncoder::beginMetalRenderPass() pass MVKCommandUse to help determine
Metal renderpass attachment load and clearing options.
2021-08-23 14:28:20 -04:00
Bill Hollings
ff7ea713f6 Fix depth/stencil clearing broken during recent fix.
A recent change for resolving color formats mistakenly
broke clearing depth and stencil formats.
Remove optionality of all function arguments in
MVKRenderPassAttachment::populateMTLRenderPassAttachmentDescriptor()
to avoid bad calls being masked by optional function arguments.
Add appropriate canResolveFormat values for all calls to that function.
2021-08-20 13:58:32 -04:00
Bill Hollings
ce583f4f3d Support stencil-only partial attachment clearing.
Rename MVKRenderPassAttachment::shouldUseClearAttachment() to
shouldClearAttachment(), pass whether testing for stencil clearing,
and check stencil clearing distinct from depth clearing.
Refactor MVKRenderSubpass::populateClearAttachments() to work with this.
Remove MVKRenderPassAttachment::getAttachmentStencilLoadOp() as obsolete.
2021-08-19 17:22:29 -04:00
Bill Hollings
77c31cd0da
Merge pull request #1418 from billhollings/vulkan-semaphores-via-mtlevents
Prefer MTLEvent for VkSemaphore, except on NVIDIA, prefer emulation.
2021-08-10 13:51:47 -04:00
Bill Hollings
8c7db31cd7 Prefer MTLEvent for VkSemaphore, except on NVIDIA, prefer emulation.
Disable MVK_ALLOW_METAL_FENCES by default.
Disable use of MTLEvent on NVIDIA.
By default, use MTLEvent for VkSemaphore everywhere except NVIDIA.
By default, use CPU synchronization on NVIDIA.

These changes fix a large number of CTS synchronization test failures.
2021-08-10 11:32:21 -04:00