Reinstate VulkanSamples API-Samples demo apps.
MVKShaderConverterTool add support to output SPIR-V as header (.h) files. Add MVKShaderConverterTool Xcode target. Add MVKShaderConverterTool Package Xcode scheme. fetchDependencies builds MVKShaderConverterTool and runs it on shader files in VulkanSamples API-Samples directory.
This commit is contained in:
parent
7d779a1636
commit
eb99488f04
@ -24,6 +24,9 @@
|
|||||||
|
|
||||||
namespace mvk {
|
namespace mvk {
|
||||||
|
|
||||||
|
#pragma mark -
|
||||||
|
#pragma mark Strings
|
||||||
|
|
||||||
static std::string _mvkDefaultWhitespaceChars = " \f\n\r\t\v";
|
static std::string _mvkDefaultWhitespaceChars = " \f\n\r\t\v";
|
||||||
|
|
||||||
/** Returns a string with whitespace trimmed from the right end of the specified string. */
|
/** Returns a string with whitespace trimmed from the right end of the specified string. */
|
||||||
@ -45,6 +48,21 @@ namespace mvk {
|
|||||||
return ( (startPos != std::string::npos) && (endPos != std::string::npos) ) ? s.substr(startPos, endPos + 1) : "";
|
return ( (startPos != std::string::npos) && (endPos != std::string::npos) ) ? s.substr(startPos, endPos + 1) : "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Cleanse variable name by replacing any illegal chars and leading digit with underscores. */
|
||||||
|
inline std::string cleanseVarName(const std::string& name) {
|
||||||
|
std::string varName(name);
|
||||||
|
size_t cCnt = varName.length();
|
||||||
|
for (size_t cIdx = 0; cIdx < cCnt; cIdx++) {
|
||||||
|
char& c = varName[cIdx];
|
||||||
|
if ( !(c == '_' || isalpha(c) || (isdigit(c) && cIdx > 0)) ) { c = '_'; }
|
||||||
|
}
|
||||||
|
return varName;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#pragma mark -
|
||||||
|
#pragma mark Streams
|
||||||
|
|
||||||
/** A memory-based stream buffer. */
|
/** A memory-based stream buffer. */
|
||||||
class membuf : public std::streambuf {
|
class membuf : public std::streambuf {
|
||||||
public:
|
public:
|
||||||
@ -65,6 +83,19 @@ namespace mvk {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** A stream buffer underpinned by a vector<char>. */
|
||||||
|
class charvectorbuf : public std::streambuf {
|
||||||
|
public:
|
||||||
|
charvectorbuf(std::vector<char>* pVec) : _pVec(pVec) {}
|
||||||
|
private:
|
||||||
|
std::streamsize xsputn (const char* s, std::streamsize n) override {
|
||||||
|
_pVec->insert(_pVec->end(), s, s + n);
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<char>* _pVec;
|
||||||
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
3
Demos/Demos.xcworkspace/contents.xcworkspacedata
generated
3
Demos/Demos.xcworkspace/contents.xcworkspacedata
generated
@ -13,5 +13,8 @@
|
|||||||
<FileRef
|
<FileRef
|
||||||
location = "group:LunarG-VulkanSamples/Hologram/Hologram.xcodeproj">
|
location = "group:LunarG-VulkanSamples/Hologram/Hologram.xcodeproj">
|
||||||
</FileRef>
|
</FileRef>
|
||||||
|
<FileRef
|
||||||
|
location = "group:LunarG-VulkanSamples/API-Samples/API-Samples.xcodeproj">
|
||||||
|
</FileRef>
|
||||||
</Group>
|
</Group>
|
||||||
</Workspace>
|
</Workspace>
|
||||||
|
@ -39,6 +39,8 @@
|
|||||||
|
|
||||||
|
|
||||||
#ifdef MVK_SAMP_15_draw_cube
|
#ifdef MVK_SAMP_15_draw_cube
|
||||||
|
# define _5_draw_cube_vert __draw_cube_vert
|
||||||
|
# define _5_draw_cube_frag __draw_cube_frag
|
||||||
# include "../VulkanSamples/API-Samples/15-draw_cube/15-draw_cube.cpp"
|
# include "../VulkanSamples/API-Samples/15-draw_cube/15-draw_cube.cpp"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -18,8 +18,8 @@ Table of Contents
|
|||||||
|
|
||||||
- [LunarG Vulkan Samples](#lunarg-vulkan-samples)
|
- [LunarG Vulkan Samples](#lunarg-vulkan-samples)
|
||||||
- [*Cube*](#lunarg-vulkan-samples-cube)
|
- [*Cube*](#lunarg-vulkan-samples-cube)
|
||||||
- [*API-Samples*](#lunarg-vulkan-samples-api)
|
|
||||||
- [*Hologram*](#lunarg-vulkan-samples-hologram)
|
- [*Hologram*](#lunarg-vulkan-samples-hologram)
|
||||||
|
- [*API-Samples*](#lunarg-vulkan-samples-api)
|
||||||
- [Sascha Willems Vulkan Samples](#sascha-willems-vulkan-samples)
|
- [Sascha Willems Vulkan Samples](#sascha-willems-vulkan-samples)
|
||||||
- [Installing the *Sascha Willems* Library](#sascha-willems-install)
|
- [Installing the *Sascha Willems* Library](#sascha-willems-install)
|
||||||
- [Cinder Vulkan Samples](#cinder-vulkan-samples)
|
- [Cinder Vulkan Samples](#cinder-vulkan-samples)
|
||||||
@ -60,15 +60,33 @@ the **MoltenVK** *dynamic library* is embedded in the application, but it could
|
|||||||
as a system library instead.
|
as a system library instead.
|
||||||
|
|
||||||
|
|
||||||
|
<a name="lunarg-vulkan-samples-hologram"></a>
|
||||||
|
### *Hologram*
|
||||||
|
|
||||||
|
> **_Note:_** In order to build the `Hologram` demo, you must have *Python3* installed
|
||||||
|
> on your build computer.
|
||||||
|
|
||||||
|
This is a sophisticated particle demo that populates command buffers from multiple threads.
|
||||||
|
|
||||||
|
This demo can be found in the `LunarG-VulkanSamples/Hologram` folder, and in the
|
||||||
|
`LunarG-VulkanSamples/Hologram` group in the *Xcode Project Navigator* in the
|
||||||
|
`Demos.xcworkspace` *Xcode* workspace.
|
||||||
|
|
||||||
|
To run this demo, run either the `Hologram-iOS` or `Hologram-macOS` *Scheme* from within *Xcode*.
|
||||||
|
|
||||||
|
On *macOS*, once the demo is open, you can use the *Up-arrow* and *Down-arrow* keys on the
|
||||||
|
keyboard to zoom the camera in and out of the scene. Zooming out will show more items on screen.
|
||||||
|
|
||||||
|
The demo allows some customization, by modifying the arguments passed to the demo at startup.
|
||||||
|
To customize, modify the arguments created in the `DemoViewController viewDidLoad` method
|
||||||
|
found in the `iOS/DemoViewController.mm` or `macOS/DemoViewController.mm` file.
|
||||||
|
|
||||||
|
The `Hologram` demo is a simple example of installing **MoltenVK** as a *static library*.
|
||||||
|
|
||||||
|
|
||||||
<a name="lunarg-vulkan-samples-api"></a>
|
<a name="lunarg-vulkan-samples-api"></a>
|
||||||
### *API-Samples*
|
### *API-Samples*
|
||||||
|
|
||||||
> **_Note:_** The `Vulkan-Samples API-Samples` have recently changed to use a different build
|
|
||||||
process that involves converting GLSL to SPIR-V via scripts. This upgrade has not yet been
|
|
||||||
integrated into the *Xcode*-based build environment used to build these demos here.
|
|
||||||
As a result, the `API-Samples` demos have been disabled here until this can be corrected.
|
|
||||||
|
|
||||||
This *Xcode* project contains a large number of modular demos, with each demo
|
This *Xcode* project contains a large number of modular demos, with each demo
|
||||||
demonstrating a particular *Vulkan* feature, or suite of calls.
|
demonstrating a particular *Vulkan* feature, or suite of calls.
|
||||||
|
|
||||||
@ -93,30 +111,6 @@ To see descriptions and screenshots of each of the demos, open
|
|||||||
The `API-Samples` demo is a simple example of installing **MoltenVK** as a *static framework*.
|
The `API-Samples` demo is a simple example of installing **MoltenVK** as a *static framework*.
|
||||||
|
|
||||||
|
|
||||||
<a name="lunarg-vulkan-samples-hologram"></a>
|
|
||||||
### *Hologram*
|
|
||||||
|
|
||||||
> **_Note:_** In order to build the `Hologram` demo, you must have *Python3* installed
|
|
||||||
> on your build computer.
|
|
||||||
|
|
||||||
This is a sophisticated particle demo that populates command buffers from multiple threads.
|
|
||||||
|
|
||||||
This demo can be found in the `LunarG-VulkanSamples/Hologram` folder, and in the
|
|
||||||
`LunarG-VulkanSamples/Hologram` group in the *Xcode Project Navigator* in the
|
|
||||||
`Demos.xcworkspace` *Xcode* workspace.
|
|
||||||
|
|
||||||
To run this demo, run either the `Hologram-iOS` or `Hologram-macOS` *Scheme* from within *Xcode*.
|
|
||||||
|
|
||||||
On *macOS*, once the demo is open, you can use the *Up-arrow* and *Down-arrow* keys on the
|
|
||||||
keyboard to zoom the camera in and out of the scene. Zooming out will show more items on screen.
|
|
||||||
|
|
||||||
The demo allows some customization, by modifying the arguments passed to the demo at startup.
|
|
||||||
To customize, modify the arguments created in the `DemoViewController viewDidLoad` method
|
|
||||||
found in the `iOS/DemoViewController.mm` or `macOS/DemoViewController.mm` file.
|
|
||||||
|
|
||||||
The `Hologram` demo is a simple example of installing **MoltenVK** as a *static library*.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="sascha-willems-vulkan-samples"></a>
|
<a name="sascha-willems-vulkan-samples"></a>
|
||||||
Sascha Willems Vulkan Samples
|
Sascha Willems Vulkan Samples
|
||||||
|
@ -33,6 +33,18 @@
|
|||||||
name = "MoltenVK-macOS";
|
name = "MoltenVK-macOS";
|
||||||
productName = Package;
|
productName = Package;
|
||||||
};
|
};
|
||||||
|
A9AD700D2440ED3B00B9E254 /* MVKShaderConverterTool */ = {
|
||||||
|
isa = PBXAggregateTarget;
|
||||||
|
buildConfigurationList = A9AD70132440ED3B00B9E254 /* Build configuration list for PBXAggregateTarget "MVKShaderConverterTool" */;
|
||||||
|
buildPhases = (
|
||||||
|
A9AD70122440ED3B00B9E254 /* Package MoltenVK */,
|
||||||
|
);
|
||||||
|
dependencies = (
|
||||||
|
A9AD70102440ED3B00B9E254 /* PBXTargetDependency */,
|
||||||
|
);
|
||||||
|
name = MVKShaderConverterTool;
|
||||||
|
productName = Package;
|
||||||
|
};
|
||||||
A9FEADBC1F3517480010240E /* MoltenVK */ = {
|
A9FEADBC1F3517480010240E /* MoltenVK */ = {
|
||||||
isa = PBXAggregateTarget;
|
isa = PBXAggregateTarget;
|
||||||
buildConfigurationList = A9FEADDC1F3517480010240E /* Build configuration list for PBXAggregateTarget "MoltenVK" */;
|
buildConfigurationList = A9FEADDC1F3517480010240E /* Build configuration list for PBXAggregateTarget "MoltenVK" */;
|
||||||
@ -125,6 +137,13 @@
|
|||||||
remoteGlobalIDString = A93903C71C57E9ED00FE90DC;
|
remoteGlobalIDString = A93903C71C57E9ED00FE90DC;
|
||||||
remoteInfo = "MoltenVKSPIRVToMSLConverter-macOS";
|
remoteInfo = "MoltenVKSPIRVToMSLConverter-macOS";
|
||||||
};
|
};
|
||||||
|
A9AD70112440ED3B00B9E254 /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = A92DB40E1CE0F89600FBC835 /* MoltenVKShaderConverter.xcodeproj */;
|
||||||
|
proxyType = 1;
|
||||||
|
remoteGlobalIDString = A9092A8C1A81717B00051823;
|
||||||
|
remoteInfo = MoltenVKShaderConverter;
|
||||||
|
};
|
||||||
A9AFC25F2184EEF60084B396 /* PBXContainerItemProxy */ = {
|
A9AFC25F2184EEF60084B396 /* PBXContainerItemProxy */ = {
|
||||||
isa = PBXContainerItemProxy;
|
isa = PBXContainerItemProxy;
|
||||||
containerPortal = A90B2B1D1A9B6170008EE819 /* Project object */;
|
containerPortal = A90B2B1D1A9B6170008EE819 /* Project object */;
|
||||||
@ -280,6 +299,7 @@
|
|||||||
A9FEADBC1F3517480010240E /* MoltenVK */,
|
A9FEADBC1F3517480010240E /* MoltenVK */,
|
||||||
A975D5782140585200D4834F /* MoltenVK-iOS */,
|
A975D5782140585200D4834F /* MoltenVK-iOS */,
|
||||||
A975D58B2140586700D4834F /* MoltenVK-macOS */,
|
A975D58B2140586700D4834F /* MoltenVK-macOS */,
|
||||||
|
A9AD700D2440ED3B00B9E254 /* MVKShaderConverterTool */,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
/* End PBXProject section */
|
/* End PBXProject section */
|
||||||
@ -365,6 +385,20 @@
|
|||||||
shellPath = /bin/sh;
|
shellPath = /bin/sh;
|
||||||
shellScript = "\"${SRCROOT}/Scripts/package_macos.sh\"\n";
|
shellScript = "\"${SRCROOT}/Scripts/package_macos.sh\"\n";
|
||||||
};
|
};
|
||||||
|
A9AD70122440ED3B00B9E254 /* Package MoltenVK */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputPaths = (
|
||||||
|
);
|
||||||
|
name = "Package MoltenVK";
|
||||||
|
outputPaths = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "export MVK_BUILT_PROD_PATH=\"${BUILT_PRODUCTS_DIR}\"\n\"${SRCROOT}/Scripts/package_shader_converter_tool.sh\"\n\"${SRCROOT}/Scripts/package_update_latest.sh\"\n";
|
||||||
|
};
|
||||||
/* End PBXShellScriptBuildPhase section */
|
/* End PBXShellScriptBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXTargetDependency section */
|
/* Begin PBXTargetDependency section */
|
||||||
@ -388,6 +422,11 @@
|
|||||||
name = MoltenVKShaderConverter;
|
name = MoltenVKShaderConverter;
|
||||||
targetProxy = A975D5992140586700D4834F /* PBXContainerItemProxy */;
|
targetProxy = A975D5992140586700D4834F /* PBXContainerItemProxy */;
|
||||||
};
|
};
|
||||||
|
A9AD70102440ED3B00B9E254 /* PBXTargetDependency */ = {
|
||||||
|
isa = PBXTargetDependency;
|
||||||
|
name = MoltenVKShaderConverter;
|
||||||
|
targetProxy = A9AD70112440ED3B00B9E254 /* PBXContainerItemProxy */;
|
||||||
|
};
|
||||||
A9AFC2602184EEF60084B396 /* PBXTargetDependency */ = {
|
A9AFC2602184EEF60084B396 /* PBXTargetDependency */ = {
|
||||||
isa = PBXTargetDependency;
|
isa = PBXTargetDependency;
|
||||||
target = A975D5782140585200D4834F /* MoltenVK-iOS */;
|
target = A975D5782140585200D4834F /* MoltenVK-iOS */;
|
||||||
@ -441,6 +480,20 @@
|
|||||||
};
|
};
|
||||||
name = Release;
|
name = Release;
|
||||||
};
|
};
|
||||||
|
A9AD70142440ED3B00B9E254 /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
A9AD70152440ED3B00B9E254 /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
A9FEADDD1F3517480010240E /* Debug */ = {
|
A9FEADDD1F3517480010240E /* Debug */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
@ -485,6 +538,15 @@
|
|||||||
defaultConfigurationIsVisible = 0;
|
defaultConfigurationIsVisible = 0;
|
||||||
defaultConfigurationName = Release;
|
defaultConfigurationName = Release;
|
||||||
};
|
};
|
||||||
|
A9AD70132440ED3B00B9E254 /* Build configuration list for PBXAggregateTarget "MVKShaderConverterTool" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
A9AD70142440ED3B00B9E254 /* Debug */,
|
||||||
|
A9AD70152440ED3B00B9E254 /* Release */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
A9FEADDC1F3517480010240E /* Build configuration list for PBXAggregateTarget "MoltenVK" */ = {
|
A9FEADDC1F3517480010240E /* Build configuration list for PBXAggregateTarget "MoltenVK" */ = {
|
||||||
isa = XCConfigurationList;
|
isa = XCConfigurationList;
|
||||||
buildConfigurations = (
|
buildConfigurations = (
|
||||||
|
@ -0,0 +1,67 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Scheme
|
||||||
|
LastUpgradeVersion = "1140"
|
||||||
|
version = "1.3">
|
||||||
|
<BuildAction
|
||||||
|
parallelizeBuildables = "YES"
|
||||||
|
buildImplicitDependencies = "YES">
|
||||||
|
<BuildActionEntries>
|
||||||
|
<BuildActionEntry
|
||||||
|
buildForTesting = "YES"
|
||||||
|
buildForRunning = "YES"
|
||||||
|
buildForProfiling = "YES"
|
||||||
|
buildForArchiving = "YES"
|
||||||
|
buildForAnalyzing = "YES">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "A9AD700D2440ED3B00B9E254"
|
||||||
|
BuildableName = "MVKShaderConverterTool"
|
||||||
|
BlueprintName = "MVKShaderConverterTool"
|
||||||
|
ReferencedContainer = "container:MoltenVKPackaging.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</BuildActionEntry>
|
||||||
|
</BuildActionEntries>
|
||||||
|
</BuildAction>
|
||||||
|
<TestAction
|
||||||
|
buildConfiguration = "Debug"
|
||||||
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
|
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||||
|
<Testables>
|
||||||
|
</Testables>
|
||||||
|
</TestAction>
|
||||||
|
<LaunchAction
|
||||||
|
buildConfiguration = "Debug"
|
||||||
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
|
launchStyle = "0"
|
||||||
|
useCustomWorkingDirectory = "NO"
|
||||||
|
ignoresPersistentStateOnLaunch = "NO"
|
||||||
|
debugDocumentVersioning = "YES"
|
||||||
|
debugServiceExtension = "internal"
|
||||||
|
allowLocationSimulation = "YES">
|
||||||
|
</LaunchAction>
|
||||||
|
<ProfileAction
|
||||||
|
buildConfiguration = "Release"
|
||||||
|
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||||
|
savedToolIdentifier = ""
|
||||||
|
useCustomWorkingDirectory = "NO"
|
||||||
|
debugDocumentVersioning = "YES">
|
||||||
|
<MacroExpansion>
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "A9AD700D2440ED3B00B9E254"
|
||||||
|
BuildableName = "MVKShaderConverterTool"
|
||||||
|
BlueprintName = "MVKShaderConverterTool"
|
||||||
|
ReferencedContainer = "container:MoltenVKPackaging.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</MacroExpansion>
|
||||||
|
</ProfileAction>
|
||||||
|
<AnalyzeAction
|
||||||
|
buildConfiguration = "Debug">
|
||||||
|
</AnalyzeAction>
|
||||||
|
<ArchiveAction
|
||||||
|
buildConfiguration = "Release"
|
||||||
|
revealArchiveInOrganizer = "YES">
|
||||||
|
</ArchiveAction>
|
||||||
|
</Scheme>
|
@ -17,7 +17,10 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "SPIRVSupport.h"
|
#include "SPIRVSupport.h"
|
||||||
|
#include "MVKStrings.h"
|
||||||
#include <SPIRV-Cross/spirv.hpp>
|
#include <SPIRV-Cross/spirv.hpp>
|
||||||
|
#include <ostream>
|
||||||
|
|
||||||
#import <CoreFoundation/CFByteOrder.h>
|
#import <CoreFoundation/CFByteOrder.h>
|
||||||
|
|
||||||
using namespace mvk;
|
using namespace mvk;
|
||||||
@ -31,6 +34,26 @@ void mvk::spirvToBytes(const vector<uint32_t>& spv, vector<char>& bytes) {
|
|||||||
bytes.insert(bytes.end(), cBytes, cBytes + byteCnt);
|
bytes.insert(bytes.end(), cBytes, cBytes + byteCnt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void mvk::spirvToHeaderBytes(const vector<uint32_t>& spv, vector<char>& bytes, const string& varName) {
|
||||||
|
bytes.clear();
|
||||||
|
charvectorbuf cb(&bytes);
|
||||||
|
ostream hdr(&cb);
|
||||||
|
size_t spvCnt = spv.size();
|
||||||
|
|
||||||
|
hdr << "// Automatically generated. Do not edit.\n\n";
|
||||||
|
hdr << "#include <stdint.h>\n\n";
|
||||||
|
hdr << "\tstatic const uint32_t " << cleanseVarName(varName) << '[' << spvCnt << "] = {";
|
||||||
|
|
||||||
|
// Output the SPIR-V content, 8 elements per line
|
||||||
|
if (spvCnt > 0) {
|
||||||
|
hdr << "\n\t\t" << spv.front();
|
||||||
|
for (size_t spvIdx = 1; spvIdx < spvCnt; spvIdx++) {
|
||||||
|
hdr << (spvIdx % 8 ? ", " : ",\n\t\t") << spv[spvIdx];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
hdr << "\n\t};\n";
|
||||||
|
}
|
||||||
|
|
||||||
void mvk::bytesToSPIRV(const vector<char>& bytes, vector<uint32_t>& spv) {
|
void mvk::bytesToSPIRV(const vector<char>& bytes, vector<uint32_t>& spv) {
|
||||||
size_t spvCnt = bytes.size() / sizeof(uint32_t);
|
size_t spvCnt = bytes.size() / sizeof(uint32_t);
|
||||||
uint32_t* cSPV = (uint32_t*)bytes.data();
|
uint32_t* cSPV = (uint32_t*)bytes.data();
|
||||||
|
@ -30,6 +30,12 @@ namespace mvk {
|
|||||||
/** Converts the SPIR-V code to an array of bytes (suitable for writing to a file). */
|
/** Converts the SPIR-V code to an array of bytes (suitable for writing to a file). */
|
||||||
void spirvToBytes(const std::vector<uint32_t>& spv, std::vector<char>& bytes);
|
void spirvToBytes(const std::vector<uint32_t>& spv, std::vector<char>& bytes);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts the SPIR-V code to header content (suitable for writing to a file)
|
||||||
|
* with the SPIR-V content assigned to a named uint32_t variable.
|
||||||
|
*/
|
||||||
|
void spirvToHeaderBytes(const std::vector<uint32_t>& spv, std::vector<char>& bytes, const std::string& varName);
|
||||||
|
|
||||||
/** Converts an array of bytes (as read from a file) to SPIR-V code. */
|
/** Converts an array of bytes (as read from a file) to SPIR-V code. */
|
||||||
void bytesToSPIRV(const std::vector<char>& bytes, std::vector<uint32_t>& spv);
|
void bytesToSPIRV(const std::vector<char>& bytes, std::vector<uint32_t>& spv);
|
||||||
|
|
||||||
|
@ -29,8 +29,8 @@ namespace mvk {
|
|||||||
/** Returns an absolute path from the specified path, which may be absolute or relative. */
|
/** Returns an absolute path from the specified path, which may be absolute or relative. */
|
||||||
std::string absolutePath(const std::string& path);
|
std::string absolutePath(const std::string& path);
|
||||||
|
|
||||||
/** Returns the last component of the specified path. */
|
/** Returns the file name from the path, with or without the file extension. */
|
||||||
std::string lastPathComponent(const std::string& path);
|
std::string fileName(const std::string& path, bool includeExtenison = true);
|
||||||
|
|
||||||
/** Returns the extension component (after the .) of the specified path. */
|
/** Returns the extension component (after the .) of the specified path. */
|
||||||
std::string pathExtension(const std::string& path);
|
std::string pathExtension(const std::string& path);
|
||||||
|
@ -33,9 +33,11 @@ MVK_PUBLIC_SYMBOL string mvk::absolutePath(const string& path) {
|
|||||||
return nsPath.UTF8String;
|
return nsPath.UTF8String;
|
||||||
}
|
}
|
||||||
|
|
||||||
MVK_PUBLIC_SYMBOL string mvk::lastPathComponent(const string& path) {
|
MVK_PUBLIC_SYMBOL string mvk::fileName(const string& path, bool includeExtension) {
|
||||||
NSString* nsPath = @(path.data());
|
NSString* nsPath = @(path.data());
|
||||||
return nsPath.lastPathComponent.UTF8String;
|
NSString* fName = nsPath.lastPathComponent;
|
||||||
|
if ( !includeExtension ) { fName = fName.stringByDeletingPathExtension; }
|
||||||
|
return fName.UTF8String;
|
||||||
}
|
}
|
||||||
|
|
||||||
MVK_PUBLIC_SYMBOL string mvk::pathExtension(const string& path) {
|
MVK_PUBLIC_SYMBOL string mvk::pathExtension(const string& path) {
|
||||||
|
@ -111,7 +111,7 @@ bool MoltenVKShaderConverterTool::convertGLSL(string& glslInFile,
|
|||||||
|
|
||||||
path = glslInFile;
|
path = glslInFile;
|
||||||
if (readFile(path, fileContents, errMsg)) {
|
if (readFile(path, fileContents, errMsg)) {
|
||||||
string logMsg = "Read GLSL from file: " + lastPathComponent(path);
|
string logMsg = "Read GLSL from file: " + fileName(path);
|
||||||
log(logMsg.data());
|
log(logMsg.data());
|
||||||
} else {
|
} else {
|
||||||
errMsg = "Could not read GLSL file. " + errMsg;
|
errMsg = "Could not read GLSL file. " + errMsg;
|
||||||
@ -153,11 +153,16 @@ bool MoltenVKShaderConverterTool::convertGLSL(string& glslInFile,
|
|||||||
// If no file has been supplied, create one from the GLSL file name.
|
// If no file has been supplied, create one from the GLSL file name.
|
||||||
if (_shouldWriteSPIRV) {
|
if (_shouldWriteSPIRV) {
|
||||||
path = spvOutFile;
|
path = spvOutFile;
|
||||||
if (path.empty()) { path = pathWithExtension(glslInFile, "spv", _shouldIncludeOrigPathExtn, _origPathExtnSep); }
|
if (path.empty()) { path = pathWithExtension(glslInFile, _shouldOutputAsHeaders ? "h" : "spv",
|
||||||
|
_shouldIncludeOrigPathExtn, _origPathExtnSep); }
|
||||||
|
if (_shouldOutputAsHeaders) {
|
||||||
|
spirvToHeaderBytes(spv, fileContents, fileName(path, false));
|
||||||
|
} else {
|
||||||
|
spirvToBytes(spv, fileContents);
|
||||||
|
}
|
||||||
|
|
||||||
spirvToBytes(spv, fileContents);
|
|
||||||
if (writeFile(path, fileContents, errMsg)) {
|
if (writeFile(path, fileContents, errMsg)) {
|
||||||
string logMsg = "Saved SPIR-V to file: " + lastPathComponent(path);
|
string logMsg = "Saved SPIR-V to file: " + fileName(path);
|
||||||
log(logMsg.data());
|
log(logMsg.data());
|
||||||
} else {
|
} else {
|
||||||
errMsg = "Could not write SPIR-V file. " + errMsg;
|
errMsg = "Could not write SPIR-V file. " + errMsg;
|
||||||
@ -184,7 +189,7 @@ bool MoltenVKShaderConverterTool::convertSPIRV(string& spvInFile, string& mslOut
|
|||||||
|
|
||||||
path = spvInFile;
|
path = spvInFile;
|
||||||
if (readFile(path, fileContents, errMsg)) {
|
if (readFile(path, fileContents, errMsg)) {
|
||||||
string logMsg = "Read SPIR-V from file: " + lastPathComponent(path);
|
string logMsg = "Read SPIR-V from file: " + fileName(path);
|
||||||
log(logMsg.data());
|
log(logMsg.data());
|
||||||
} else {
|
} else {
|
||||||
errMsg = "Could not read SPIR-V file. " + errMsg;
|
errMsg = "Could not read SPIR-V file. " + errMsg;
|
||||||
@ -244,7 +249,7 @@ bool MoltenVKShaderConverterTool::convertSPIRV(const vector<uint32_t>& spv,
|
|||||||
fileContents.insert(fileContents.end(), msl.begin(), msl.end());
|
fileContents.insert(fileContents.end(), msl.begin(), msl.end());
|
||||||
string writeErrMsg;
|
string writeErrMsg;
|
||||||
if (writeFile(path, fileContents, writeErrMsg)) {
|
if (writeFile(path, fileContents, writeErrMsg)) {
|
||||||
string logMsg = "Saved MSL to file: " + lastPathComponent(path);
|
string logMsg = "Saved MSL to file: " + fileName(path);
|
||||||
log(logMsg.c_str());
|
log(logMsg.c_str());
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
@ -274,10 +279,15 @@ bool MoltenVKShaderConverterTool::isSPIRVFileExtension(string& pathExtension) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Log the specified message to the console.
|
// Log the specified message to the console.
|
||||||
void MoltenVKShaderConverterTool::log(const char* logMsg) { printf("%s\n", logMsg); }
|
void MoltenVKShaderConverterTool::log(const char* logMsg) {
|
||||||
|
if ( !_quietMode ) { printf("%s\n", logMsg); }
|
||||||
|
}
|
||||||
|
|
||||||
// Display usage information about this application on the console.
|
// Display usage information about this application on the console.
|
||||||
void MoltenVKShaderConverterTool::showUsage() {
|
void MoltenVKShaderConverterTool::showUsage() {
|
||||||
|
bool qm = _quietMode;
|
||||||
|
_quietMode = false;
|
||||||
|
|
||||||
string line = "\n\e[1m" + _processName + "\e[0m converts OpenGL Shading Language (GLSL) source code to";
|
string line = "\n\e[1m" + _processName + "\e[0m converts OpenGL Shading Language (GLSL) source code to";
|
||||||
log((const char*)line.c_str());
|
log((const char*)line.c_str());
|
||||||
log("SPIR-V code, and/or to Metal Shading Language (MSL) source code, or converts");
|
log("SPIR-V code, and/or to Metal Shading Language (MSL) source code, or converts");
|
||||||
@ -294,21 +304,21 @@ void MoltenVKShaderConverterTool::showUsage() {
|
|||||||
log(" the current working directory.");
|
log(" the current working directory.");
|
||||||
log(" -r - (when using -d) Process directories recursively.");
|
log(" -r - (when using -d) Process directories recursively.");
|
||||||
log(" -gi [\"glslInFile\"] - Indicates that GLSL shader code should be input.");
|
log(" -gi [\"glslInFile\"] - Indicates that GLSL shader code should be input.");
|
||||||
log(" The optional path parameter specifies the path to a");
|
log(" The optional glslInFile parameter specifies the path to a");
|
||||||
log(" single file containing GLSL source code to be converted.");
|
log(" single file containing GLSL source code to be converted.");
|
||||||
log(" When using the -d option, the path parameter is ignored.");
|
log(" When using the -d option, the glslInFile parameter is ignored.");
|
||||||
log(" -si [\"spvInFile\"] - Indicates that SPIR-V shader code should be input.");
|
log(" -si [\"spvInFile\"] - Indicates that SPIR-V shader code should be input.");
|
||||||
log(" The optional path parameter specifies the path to a");
|
log(" The optional spvInFile parameter specifies the path to a");
|
||||||
log(" single file containing SPIR-V code to be converted.");
|
log(" single file containing SPIR-V code to be converted.");
|
||||||
log(" When using the -d option, the path parameter is ignored.");
|
log(" When using the -d option, the spvInFile parameter is ignored.");
|
||||||
log(" -so [\"spvOutFile\"] - Indicates that SPIR-V shader code should be output.");
|
log(" -so [\"spvOutFile\"] - Indicates that SPIR-V shader code should be output.");
|
||||||
log(" The optional path parameter specifies the path to a single");
|
log(" The optional spvOutFile parameter specifies the path to a single");
|
||||||
log(" file to contain the SPIR-V code. When using the -d option,");
|
log(" file to contain the SPIR-V code. When using the -d option,");
|
||||||
log(" the path parameter is ignored.");
|
log(" the spvOutFile parameter is ignored.");
|
||||||
log(" -mo [\"mslOutFile\"] - Indicates that MSL shader source code should be output.");
|
log(" -mo [\"mslOutFile\"] - Indicates that MSL shader source code should be output.");
|
||||||
log(" The optional path parameter specifies the path to a single");
|
log(" The optional mslOutFile parameter specifies the path to a single");
|
||||||
log(" file to contain the MSL code. When using the -d option,");
|
log(" file to contain the MSL code. When using the -d option,");
|
||||||
log(" the path parameter is ignored.");
|
log(" the mslOutFile parameter is ignored.");
|
||||||
log(" -mv mslVersion - MSL version to output.");
|
log(" -mv mslVersion - MSL version to output.");
|
||||||
log(" Must be in form n[.n][.n] (eg. 2, 2.1, or 2.1.0).");
|
log(" Must be in form n[.n][.n] (eg. 2, 2.1, or 2.1.0).");
|
||||||
log(" Defaults to the most recent MSL version for the platform");
|
log(" Defaults to the most recent MSL version for the platform");
|
||||||
@ -319,6 +329,11 @@ void MoltenVKShaderConverterTool::showUsage() {
|
|||||||
log(" May be omitted to auto-detect.");
|
log(" May be omitted to auto-detect.");
|
||||||
log(" -c - Combine the GLSL and converted Metal Shader source code");
|
log(" -c - Combine the GLSL and converted Metal Shader source code");
|
||||||
log(" into a single ouput file.");
|
log(" into a single ouput file.");
|
||||||
|
log(" -oh [varName] - Save the output as header (.h) files.");
|
||||||
|
log(" Affects the output of the -so option.");
|
||||||
|
log(" The optional varName parameter specifies the name of the");
|
||||||
|
log(" variable in the header file to which the output code is assigned.");
|
||||||
|
log(" When using the -d option, the varName parameter is ignored.");
|
||||||
log(" -Iv - Disable inversion of the vertex coordinate Y-axis");
|
log(" -Iv - Disable inversion of the vertex coordinate Y-axis");
|
||||||
log(" (default is to invert vertex coordinates).");
|
log(" (default is to invert vertex coordinates).");
|
||||||
log(" -xs \"xtnSep\" - Separator to use when including file extension of original");
|
log(" -xs \"xtnSep\" - Separator to use when including file extension of original");
|
||||||
@ -337,7 +352,10 @@ void MoltenVKShaderConverterTool::showUsage() {
|
|||||||
log(" May be omitted for defaults (\"spv spirv\").");
|
log(" May be omitted for defaults (\"spv spirv\").");
|
||||||
log(" -l - Log the conversion results to the console (to aid debugging).");
|
log(" -l - Log the conversion results to the console (to aid debugging).");
|
||||||
log(" -p - Log the performance of the shader conversions.");
|
log(" -p - Log the performance of the shader conversions.");
|
||||||
|
log(" -q - Quiet mode. Stops logging of informational messages.");
|
||||||
log("");
|
log("");
|
||||||
|
|
||||||
|
_quietMode = qm;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MoltenVKShaderConverterTool::reportPerformance() {
|
void MoltenVKShaderConverterTool::reportPerformance() {
|
||||||
@ -383,9 +401,11 @@ MoltenVKShaderConverterTool::MoltenVKShaderConverterTool(int argc, const char* a
|
|||||||
_shouldIncludeOrigPathExtn = true;
|
_shouldIncludeOrigPathExtn = true;
|
||||||
_shouldLogConversions = false;
|
_shouldLogConversions = false;
|
||||||
_shouldReportPerformance = false;
|
_shouldReportPerformance = false;
|
||||||
|
_shouldOutputAsHeaders = false;
|
||||||
|
_quietMode = false;
|
||||||
|
|
||||||
_mslVersionMajor = 2;
|
_mslVersionMajor = 2;
|
||||||
_mslVersionMinor = 1;
|
_mslVersionMinor = 2;
|
||||||
_mslVersionPatch = 0;
|
_mslVersionPatch = 0;
|
||||||
_mslPlatform = SPIRVToMSLConversionOptions().mslOptions.platform;
|
_mslPlatform = SPIRVToMSLConversionOptions().mslOptions.platform;
|
||||||
|
|
||||||
@ -397,7 +417,7 @@ bool MoltenVKShaderConverterTool::parseArgs(int argc, const char* argv[]) {
|
|||||||
if (argc == 0) { return false; }
|
if (argc == 0) { return false; }
|
||||||
|
|
||||||
string execPath(argv[0]);
|
string execPath(argv[0]);
|
||||||
_processName = lastPathComponent(execPath);
|
_processName = fileName(execPath, false);
|
||||||
|
|
||||||
for (int argIdx = 1; argIdx < argc; argIdx++) {
|
for (int argIdx = 1; argIdx < argc; argIdx++) {
|
||||||
string arg = argv[argIdx];
|
string arg = argv[argIdx];
|
||||||
@ -501,6 +521,12 @@ bool MoltenVKShaderConverterTool::parseArgs(int argc, const char* argv[]) {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(equal(arg, "-oh", true)) {
|
||||||
|
_shouldOutputAsHeaders = true;
|
||||||
|
argIdx = optionalParam(_hdrOutVarName, argIdx, argc, argv);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if(equal(arg, "-Iv", true)) {
|
if(equal(arg, "-Iv", true)) {
|
||||||
_shouldFlipVertexY = false;
|
_shouldFlipVertexY = false;
|
||||||
continue;
|
continue;
|
||||||
@ -564,6 +590,11 @@ bool MoltenVKShaderConverterTool::parseArgs(int argc, const char* argv[]) {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(equal(arg, "-q", true)) {
|
||||||
|
_quietMode = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -95,6 +95,7 @@ namespace mvk {
|
|||||||
std::string _spvInFilePath;
|
std::string _spvInFilePath;
|
||||||
std::string _spvOutFilePath;
|
std::string _spvOutFilePath;
|
||||||
std::string _mslOutFilePath;
|
std::string _mslOutFilePath;
|
||||||
|
std::string _hdrOutVarName;
|
||||||
std::string _origPathExtnSep;
|
std::string _origPathExtnSep;
|
||||||
std::vector<std::string> _glslVtxFileExtns;
|
std::vector<std::string> _glslVtxFileExtns;
|
||||||
std::vector<std::string> _glslFragFileExtns;
|
std::vector<std::string> _glslFragFileExtns;
|
||||||
@ -118,6 +119,8 @@ namespace mvk {
|
|||||||
bool _shouldIncludeOrigPathExtn;
|
bool _shouldIncludeOrigPathExtn;
|
||||||
bool _shouldLogConversions;
|
bool _shouldLogConversions;
|
||||||
bool _shouldReportPerformance;
|
bool _shouldReportPerformance;
|
||||||
|
bool _shouldOutputAsHeaders;
|
||||||
|
bool _quietMode;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -289,5 +289,28 @@ xcodebuild \
|
|||||||
${XC_BUILD_VERBOSITY} \
|
${XC_BUILD_VERBOSITY} \
|
||||||
build
|
build
|
||||||
|
|
||||||
|
|
||||||
|
# -------------- Convert sample shader files -----------------
|
||||||
|
echo
|
||||||
|
echo ========== Building MoltenVKShaderConverter tool ==========
|
||||||
|
echo
|
||||||
|
|
||||||
|
XC_PROJ="MoltenVKPackaging.xcodeproj"
|
||||||
|
XC_SCHEME="MVKShaderConverterTool Package"
|
||||||
|
|
||||||
|
xcodebuild \
|
||||||
|
-project "${XC_PROJ}" \
|
||||||
|
-scheme "${XC_SCHEME}" \
|
||||||
|
${XC_BUILD_VERBOSITY} \
|
||||||
|
build
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo ========== Converting API-Samples shader files ==========
|
||||||
|
echo
|
||||||
|
|
||||||
|
"Package/Latest/MoltenVKShaderConverter/Tools/MoltenVKShaderConverter" \
|
||||||
|
-r -gi -so -oh -xs . -q \
|
||||||
|
-d "Demos/LunarG-VulkanSamples/VulkanSamples/API-Samples"
|
||||||
|
|
||||||
echo ========== Done! ==========
|
echo ========== Done! ==========
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user