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:
Bill Hollings 2020-04-11 16:19:03 -04:00
parent 7d779a1636
commit eb99488f04
13 changed files with 298 additions and 51 deletions

View File

@ -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

View File

@ -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>

View File

@ -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

View File

@ -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

View File

@ -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 = (

View File

@ -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>

View File

@ -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();

View File

@ -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);

View File

@ -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);

View File

@ -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) {

View File

@ -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;

View File

@ -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;
}; };

View File

@ -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! ==========