160 Commits

Author SHA1 Message Date
Chip Davis
4468f36bc6 Support the VK_EXT_host_query_reset extension.
This allows clients to reset query pools on the host, instead of with a
GPU command.

This updates Vulkan headers to 1.1.104... but, there's a problem. This
change has not been merged to `master` in the `Vulkan-Headers` repo yet,
because of an issue building the C++ binding headers. Luckily, we only
need the core C header.
2019-03-17 19:59:15 -05:00
Bill Hollings
19576e031b Update to latest SPIRV-Cross version. 2019-03-16 09:29:17 -04:00
Bill Hollings
a2b1e04e8d Update to latest SPIRV-Cross version.
Adapt to API changes resulting from the introduction of the SPIRV-Cross C API.
Update What's New document.
2019-03-15 20:25:55 -04:00
Chip Davis
4fa4941551 Update SPIRV-Cross yet again. 2019-03-11 14:19:49 -05:00
Chip Davis
ccc1a32426 Update SPIRV-Cross again to pull in some fixes. 2019-03-11 14:19:49 -05:00
Chip Davis
79d434553c Add support for tessellation.
At long last, tessellation comes to MoltenVK! With this change, clients
will now be able to specify tessellation shaders when creating
pipelines, and then draw tessellated patches with them.

Unfortunately, there seem to be a few gotchas with tessellation in
Metal. For one thing, tessellation pipelines in Metal are structured
very differently from Vulkan. There is no tessellation control or even
vertex stage. Instead, the tessellation evaluation shader takes the
place of the vertex function as a "post-tessellation vertex function."
The tessellation levels are supplied in a buffer to the tessellator,
which you are expected to populate. The most common way to do this is by
running a compute shader. MoltenVK thus runs the vertex shader and
tessellation control shader by themselves; a single `VkPipeline` object
then requires at least *three* `MTLPipelineState` objects.

But wait, there's more! The tessellation-control-as-compute stage uses
Metal's support for vertex-style stage input to a compute shader. But,
this support requires one to declare indexing *ahead of time*, when the
pipeline state is created. So a single `VkPipeline` object could have as
many as *five* `MTLPipelineState` objects.

Further, if there are more output than input control points for the
tessellation control stage, then later invocations may end up fetching
the wrong attributes! To get around this, this change uses index buffers
to ensure that all tessellation control shaders see the correct input.
Unfortunately, in the indexed draw case, this means that the incoming
index buffer needs to be munged.

Instancing is another pain point here. In Vulkan, as in OpenGL and
Direct3D, instancing is done in the vertex shader; but in Metal, it is
done at the tessellation evaluation stage. For this reason, only the
vertex stage of a tessellated draw supports instancing. Additional
memory is required to hold data for the extra vertices generated by
instancing. This also requires still more munging of index buffers for
indexed draws.

Indirect draws are even more painful. Because the number of vertices and
instances is unknown, storage for the maximum possible number of
vertices must be allocated. This change imposes a totally arbitrary
limit of 131072 vertices from a single draw, including all vertices
generated by instancing. On a Mac, this requires about 194-256 MB of
VRAM for all the temporary buffers.

There are some possible optimizations here. If we could prove that the
vertex shader's output doesn't depend on the instance ID, either
directly or through a per-instance attribute, then we could avoid
running the vertex and tess. control stages per instance, and take
advantage of Metal's support for tess. eval instancing. If we could
also prove that the vertex shader simply passes instance attributes
through (similarly with the tess. control shader), we could do this for
many more instanced draws as well. It should also be possible to cache
the output from the tess. control stage; if the draw comes up again, we
can then skip the vertex and tess. control stages entirely!

Fixes #56 and #501.
2019-03-11 14:19:49 -05:00
Bill Hollings
fd8aa3c412 Update to latest dependency libraries to support SDK 1.1.101.
Remove SPRIV-Cross source files erroneously compiling into libglslang.a.
2019-02-27 11:56:31 -05:00
Bill Hollings
d83d934150 Update to latest version of SPIRV-Cross.
Track version of spvAux buffer struct in SPRIV-Cross and
fail build if different than version expected by MoltenVK.
Update MoltenVK version to 1.0.33.
Update What's New document.
2019-02-08 21:31:14 -05:00
Bill Hollings
f591fed43e Update to latest SPIRV-Cross version. 2019-01-28 19:58:32 -05:00
Bill Hollings
cb0c91cbd0 Update to latest SPIRV-Cross and update What's new document. 2019-01-27 21:18:47 -05:00
Bill Hollings
e5a890775b Add support for VK_EXTX_portability_subset extension.
Add KhronosGroup/Vulkan-Portability as external dependency repo.
Add ExternalRevisions/Vulkan-Portability_repo_revision.
Add vk_extx_portability_subset.h header file to mvk_vulkan.h.
MVKImageView allow constructor with no image or device.
Add mvkVkComponentMappingsMatch() & mvkVkComponentSwizzlesMatch() functions.
Cleanup some local var init warnings.
2019-01-27 19:52:59 -05:00
Bill Hollings
991a1944fe Update to latest dependency libraries for Vulkan SDK 1.1.97.
Update to latest SPIRV-Cross version:
2019-01-17 15:27:20 -05:00
Bill Hollings
7f03e1fb3b Pad fragment output to 4 components when needed.
Update to latest SPIRV-Cross.
2019-01-15 13:52:01 -05:00
Bill Hollings
02aeb0797a Add full texture swizzling to config, and disable it by default.
Add MVKConfiguration::fullTextureSwizzle and corresponding MVK_CONFIG_FULL_TEXTURE_SWIZZLE
env var & build setting, and set to false, to disable texture swizzling by default.
Add SPIRVToMSLConverterOptions::shouldSwizzleTextureSamples.
Lazily init queue families to allow time for specializedQueueFamilies config change.
Fix consistency of pipeline encoding state auxiliary buffer binding.
Improve documentation of MVKConfiguration environment variables and build settings.
2019-01-12 12:19:01 -05:00
Bill Hollings
d13e5d487c Support 4 queue families.
Add config setting to determine if queue families are general or specialized.
Update to latest SPIRV-Cross version.
Update VK_MVK_MOLTENVK_SPEC_VERSION to 16.
Update MoltenVK version to 1.0.31.
2019-01-07 19:25:20 -05:00
Bill Hollings
fe55930fd5 Update Brenwill copyright noticies to 2019. 2019-01-01 21:13:25 -05:00
Bill Hollings
d34b0812fe Allow building external libraries from fetchDependencies script or Xcode.
The fetchDependencies script puts build files in External/build directory.
Xcode puts build files in standard Library/.../DerivedData directory.
Copy compiled external static library files to External/build/iOS &
External/build/macOS regardless of location of intermediates.
2018-12-25 21:43:29 -05:00
Bill Hollings
9b42574249 Build external dependencies into static libraries in External/build when fetched.
Add separate ExternalDependencies Xcode project.
Move external dependencies to ExternalDependencies project.
The fetchDependencies script builds external dependencies libraries into External/build.
The fetchDependencies script prepares SPIRV-Tools without preparing glslang.
MoltenVK links to pre-built external dependency static libraries.
MoltenVK includes external library headers using full relative paths.
2018-12-24 19:11:15 -05:00
Bill Hollings
e6dfdca6c0 MSL don't emit memory_scope after MSL 2.0.
For each GPU, log MSL version and updated list of feature sets.
Add SPIRVToMSLConverterOptions::printMSLVersion() function.
Update to latest SPIRV-Cross version.
Update MoltenVK version to 1.0.29.
2018-12-11 18:27:01 -05:00
Chip Davis
f4295ab3f1 Support the VK_KHR_shader_float16_int8 extension.
Only the `shaderFloat16` feature is supported for now. The `shaderInt8`
feature may require additional work on SPIRV-Cross.

Update Vulkan-Headers to 1.1.95 to pull in the definitions for this new
extension.
2018-12-05 10:32:30 -06:00
Chip Davis
18fa43994f Force signedness of shader vertex attributes to match the host.
Based on a patch by Stefan Dösinger.

Metal cannot do signedness conversion on vertex attributes, and for good
reason. Putting a `uint4` into an `int4`, or a `char4` into a `uint4`,
would lose those values that are outside the range of the target type.
But putting a `uchar4` into a `short4` or an `int4`, or a `ushort4` into
an `int4`, should work. In that case, force the signedness in the shader
to match the declared type of the host.

Update SPIRV-Cross to pull in the corresponding change. Bump MoltenVK
version.
2018-12-04 15:04:10 -06:00
Bill Hollings
fa73cdb441 Update glslang to version compatible with Vulkan SDK 1.1.92. 2018-11-16 00:57:39 +01:00
Bill Hollings
d99984e064 Align MoltenVK with Vulkan SDK 1.1.92.
Update to latest dependency libraries for Vulkan SDK 1.1.92.
Generate Hologram demo dispatch files in fetchDependencies and remove them from git.
Update MoltenVK version to 1.0.27.
Update What's New document.
2018-11-15 17:40:15 +01:00
Bill Hollings
38160b3eb3 MoltenVK 1.0.26.
Fixes to create_dylib.sh to cleanup bitcode and architecture support.
Update to latest SPIRV-Cross version.
Update MoltenVK version to 1.0.26.
Update Xcode projects to Xcode 10.1.
Update What's New document.
2018-11-06 16:01:36 -05:00
Chip Davis
082d282b28 Support arbitrary swizzles of image data.
The swizzles are passed to shaders that need them using an "auxiliary
buffer", for which there must be room in the function argument table.
Code is inserted into the shaders to swizzle reads from sampled
textures--per the Vulkan spec, component mappings must only be applied
to sampled images.

Update SPIRV-Cross to pull in some fixes for handling swizzled image
data. Bump MoltenVK version.
2018-10-16 11:33:13 -05:00
Bill Hollings
209ed01acc Update VulkanSamples to latest version, and update What's New document. 2018-10-09 15:18:48 -04:00
Bill Hollings
cded63b008 Merge branch 'master' of https://github.com/KhronosGroup/MoltenVK 2018-09-27 18:21:05 -04:00
Bill Hollings
9f28854a2a Update glslang version and What's New document. 2018-09-27 18:20:20 -04:00
Chip Davis
fcbbdc1948 Support the shader{Sampled,Storage}ImageArrayDynamicIndexing feature.
Update SPIRV-Cross to support dynamic indexing on iOS 10... and to
actually support arrays of input buffers (which should've been present
before I flipped the `shader{Uniform,Storage}BufferArrayDynamicIndexing`
switch).

Bump patch version.

Fixes #96.
2018-09-27 13:11:55 -05:00
Bill Hollings
dfa27ecc61 Update SPRIV-Cross version. 2018-09-25 13:47:43 -04:00
Bill Hollings
7051582859 Update library dependencies for Vulkan SDK. 2018-09-20 21:02:39 -04:00
Chip Davis
f0db0c746a Fix SPIRV-Cross update that I bungled.
(Do I have to bump the patch version again...?)
2018-09-20 18:19:25 -05:00
Chip Davis
801ce71108 Support the VK_EXT_shader_viewport_index_layer extension.
Update SPIRV-Cross to support the `ViewportIndex` builtin, and pull in a
fix for the `Layer` builtin. Bump `MVK_VERSION_PATCH`.
2018-09-20 10:00:21 -05:00
Chip Davis
eeca918c92 Support the sampleRateShading feature.
This is for fragment shaders that run per-sample instead of
per-fragment. It implies that the `SampleId`, `SampleMask`, and
`SamplePosition` builtins, as well as per-sample interpolation, are all
available--using any of these causes the frag shader to run once per
sample. (In Metal, reading the color buffers may also cause a frag
shader to run per-sample.)

Update SPIRV-Cross to pull in a change that properly translates the
`SamplePosition` builtin to a form that Metal can understand.
2018-09-18 09:58:56 -05:00
Bill Hollings
e7cb8b35da Update MoltenVK to v1.0.21.
Update to latest version of SPRIV-Cross.
Update What's New document.
2018-09-08 18:38:32 -04:00
Bill Hollings
c369da1cdd Update to What's New document.
Update to latest version of SPIRV-Cross.
2018-09-01 18:27:07 -04:00
Chip Davis
ccb1afe42b Support the VK_KHR_shader_draw_parameters extension.
Update SPIRV-Cross to support shaders which use the builtins provided by
this extension.
2018-08-30 09:10:47 -05:00
Bill Hollings
c8a9841d8c Support pre-linking on both Xcode 9 & 10. Update library dependencies.
Remove linking MoltenVKSPIRVToMSLConverter from Build Phase in favour of PreLink.
Update to Vulkan header 1.1.83.
Update to latest version of library dependencies.
2018-08-23 14:02:05 -04:00
Bill Hollings
bd177633ca Update to latest SPIRV-Cross, glslang & SPIRV-Tools.
Update MoltenVK version to 1.0.18.
2018-08-11 16:20:58 -04:00
Karl Schultz
1fd666632a build: Update to get Vulkan 1.1.82 headers 2018-07-30 15:40:00 -06:00
Bill Hollings
0b592f5b4a Update to latest library dependencies. 2018-07-29 17:41:14 -04:00
Bill Hollings
1b6289d5b7 Disable rasterization and return void from vertex shaders that write to resources.
Add SPIRVToMSLConverterOptions::isRasterizationDisabled to allow pipeline
and vertex shader to communicate rasterization status.
Update to latest SPIRV-Cross version.
Update MoltenVK version to 1.0.17.
2018-07-29 15:50:51 -04:00
Bill Hollings
2d4de6db68 Fixes to attachment and image clearing to pass CTS tests.
MVKCmdClearAttachments support clearing multiple attachment layers.
MVKCmdClearImage use renderpass clear, and support clearning multiple image layers.
Rename mvkCmdClearImage() to mvkCmdClearColorImage().
MVKDevice add getFormatIsSupported() to allow devices to test for format support.
MVKFramebuffer support multiple layers.
mvk_datatypes.h support both 2D and 3D mipmap calculations and allow
mvkMTLPrimitiveTopologyClassFromVkPrimitiveTopology() in iOS.
Remove support for VK_FORMAT_B10G11R11_UFLOAT_PACK32 & VK_FORMAT_E5B9G9R9_UFLOAT_PACK32
since format components are reversed on Metal.
Move OS extension source files to new OS directory.
Update to latest SPIRV-Cross version.
Update MoltenVK version to 1.0.16.
2018-07-23 20:12:57 -04:00
Bill Hollings
86bb51554b Support IOSurface on iOS only if IPHONEOS_DEPLOYMENT_TARGET is at least iOS 11.0.
On iOS, only compile IOSurface support, and link IOSurface framework to
libMoltenVK.dylib, if IPHONEOS_DEPLOYMENT_TARGET is at least iOS 11.0.
Update to latest version of SPIRV-Cross.
Update MoltenVK version to 1.0.15.
2018-07-12 18:26:54 -04:00
Bill Hollings
e203b93285 Fix compute shader workgroup size specialization.
Support separate specialization for each workgroup dimension.
Support zero as a specialization ID value.
Cleanup MoltenVKShaderConverterTool.
Update to latest SPIRV-Cross version.
Update MoltenVK version to 1.0.14.
2018-07-03 13:57:53 -04:00
Bill Hollings
e959b9d9a6 Support larger VkBufferViews by using 2D Metal textures.
Map 1D buffer view contents to 2D Metal texture.
Add MVKPhysicalDeviceMetalFeatures::maxTextureDimension element.
Set VkPhysicalDeviceLimits::maxTexelBufferElements to maxTextureDimension ^ 2.
Shaders accessing buffer view use special function to map 1D buffer view coordinates
to 2D Metal texture coordinates.
Pass maxTextureDimension to shader.
Update to latest SPIRV-Cross version for appropriate shaders.
Update MoltenVK version to 1.0.13.
2018-06-27 18:03:30 -04:00
Bill Hollings
10a023debe Update to latest library dependencies to match Vulkan SDK 1.1.77.
Update MoltenVK version to 1.0.12.
2018-06-15 15:14:59 -04:00
danginsburg
f5a3b9072f Update to latest SPIRV-Cross to fix MSL compilation failures on macOS 10.14 Mojave Beta (KhronosGroup/SPIRV-Cross#603). Fixes Dota 2 on Mojave.
Also update MoltenVK to 1.0.11 so that VkPipelineCache UUID changes and shaders get regenerated by applications.
2018-06-12 08:24:56 -04:00
Bill Hollings
8654923cb2 Fix PR merge conflict. 2018-05-28 10:16:22 -04:00
Bill Hollings
c833cc544d Replace dependency on Vulkan-LoaderAndValidationLayers with Vulkan-Headers and Vulkan-Tools.
Update to latest versions of Vulkan-Headers, SPIRV-Cross, glslang, Vulkan-Tools, and VulkanSamples.
2018-05-28 08:33:46 -04:00