Initial support for compute
* minimal backend support for compute - added api to dispatch a compute shader - added api to create and bind a ssbo - added api to read back a buffer Only implemented in the gl backend * Add a backend compute test suite * basic support for compute shaders in matc this is still very much work-in-progress. We're not supporting images nor ssbo for now. * rename UniformInterfaceBlock to BufferInterfaceBlock * augment BufferInterfaceBlock to support ssbo features - add support for std430 - add support for ssbo - add support for variable-size array - add support for memory qualifiers * reformat MaterialBuilder * material format: move subpasses outside of parameters subpasses now are their own json property instead of being a "parameter". * refactor parameter() methods to match Buffer/SamplerInterfaceBlock We're just shuffling the arguments. * add support for buffers in .mat files * filamat now generates buffer blocks (ssbo) * take feature level into consideration when optimizing shaders * don't store the 'uniform binding' chunk for level 2 materials this includes some refactoring/cleanups of MaterialParser * matinfo: fixes for compute - separate subpasses from parameters - don't attempt to print material properties
This commit is contained in:
@@ -77,6 +77,7 @@ static BindingIndexMap getBindingIndexMap(const GLSLPostProcessor::Config& confi
|
||||
}
|
||||
}
|
||||
case MaterialDomain::POST_PROCESS:
|
||||
case MaterialDomain::COMPUTE:
|
||||
break;
|
||||
}
|
||||
generateBindingIndexMap(config, config.materialInfo->sib, map);
|
||||
@@ -98,15 +99,6 @@ GLSLPostProcessor::GLSLPostProcessor(MaterialBuilder::Optimization optimization,
|
||||
|
||||
GLSLPostProcessor::~GLSLPostProcessor() = default;
|
||||
|
||||
static uint32_t glslVersionFromShaderModel(ShaderModel model) {
|
||||
switch (model) {
|
||||
case ShaderModel::MOBILE:
|
||||
return 300;
|
||||
case ShaderModel::DESKTOP:
|
||||
return 410;
|
||||
}
|
||||
}
|
||||
|
||||
static bool filterSpvOptimizerMessage(spv_message_level_t level) {
|
||||
#ifdef NDEBUG
|
||||
// In release builds, only log errors.
|
||||
@@ -238,6 +230,9 @@ bool GLSLPostProcessor::process(const std::string& inputShader, Config const& co
|
||||
case ShaderStage::FRAGMENT:
|
||||
internalConfig.shLang = EShLangFragment;
|
||||
break;
|
||||
case ShaderStage::COMPUTE:
|
||||
internalConfig.shLang = EShLangCompute;
|
||||
break;
|
||||
}
|
||||
|
||||
TProgram program;
|
||||
@@ -249,7 +244,7 @@ bool GLSLPostProcessor::process(const std::string& inputShader, Config const& co
|
||||
const char* shaderCString = inputShader.c_str();
|
||||
tShader.setStrings(&shaderCString, 1);
|
||||
|
||||
internalConfig.langVersion = GLSLTools::glslangVersionFromShaderModel(config.shaderModel);
|
||||
internalConfig.langVersion = GLSLTools::getGlslDefaultVersion(config.shaderModel);
|
||||
GLSLTools::prepareShaderParser(config.targetApi, config.targetLanguage, tShader,
|
||||
internalConfig.shLang, internalConfig.langVersion);
|
||||
|
||||
@@ -333,7 +328,7 @@ void GLSLPostProcessor::preprocessOptimization(glslang::TShader& tShader,
|
||||
std::string glsl;
|
||||
TShader::ForbidIncluder forbidIncluder;
|
||||
|
||||
const int version = GLSLTools::glslangVersionFromShaderModel(config.shaderModel);
|
||||
const int version = GLSLTools::getGlslDefaultVersion(config.shaderModel);
|
||||
EShMessages msg = GLSLTools::glslangFlagsFromTargetApi(config.targetApi, config.targetLanguage);
|
||||
bool ok = tShader.preprocess(&DefaultTBuiltInResource, version, ENoProfile, false, false,
|
||||
msg, &glsl, forbidIncluder);
|
||||
@@ -403,15 +398,17 @@ void GLSLPostProcessor::fullOptimization(const TShader& tShader,
|
||||
// Transpile back to GLSL
|
||||
if (internalConfig.glslOutput) {
|
||||
CompilerGLSL::Options glslOptions;
|
||||
glslOptions.es = config.shaderModel == ShaderModel::MOBILE;
|
||||
glslOptions.version = glslVersionFromShaderModel(config.shaderModel);
|
||||
auto version = GLSLTools::getShadingLanguageVersion(
|
||||
config.shaderModel, config.featureLevel);
|
||||
glslOptions.es = version.second;
|
||||
glslOptions.version = version.first;
|
||||
glslOptions.enable_420pack_extension = glslOptions.version >= 420;
|
||||
glslOptions.fragment.default_float_precision = glslOptions.es ?
|
||||
CompilerGLSL::Options::Precision::Mediump : CompilerGLSL::Options::Precision::Highp;
|
||||
glslOptions.fragment.default_int_precision = glslOptions.es ?
|
||||
CompilerGLSL::Options::Precision::Mediump : CompilerGLSL::Options::Precision::Highp;
|
||||
|
||||
CompilerGLSL glslCompiler(move(spirv));
|
||||
CompilerGLSL glslCompiler(std::move(spirv));
|
||||
glslCompiler.set_common_options(glslOptions);
|
||||
|
||||
if (!glslOptions.es) {
|
||||
|
||||
Reference in New Issue
Block a user