Use spvc API instead of directly accessing compiler on GLSL path
BUG=dawn:291
Change-Id: I3e76749bcff8d7635d9dc02de0a9a66b686cd9d8
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/14622
Commit-Queue: Ryan Harrison <rharrison@chromium.org>
Reviewed-by: Austin Eng <enga@chromium.org>
diff --git a/src/dawn_native/opengl/ShaderModuleGL.cpp b/src/dawn_native/opengl/ShaderModuleGL.cpp
index e113842..da173b5 100644
--- a/src/dawn_native/opengl/ShaderModuleGL.cpp
+++ b/src/dawn_native/opengl/ShaderModuleGL.cpp
@@ -93,9 +93,9 @@
#endif
shaderc_spvc_status status =
mSpvcContext.InitializeForGlsl(descriptor->code, descriptor->codeSize, options);
- if (status != shaderc_spvc_status_success)
+ if (status != shaderc_spvc_status_success) {
return DAWN_VALIDATION_ERROR("Unable to initialize instance of spvc");
-
+ }
compiler = reinterpret_cast<spirv_cross::CompilerGLSL*>(mSpvcContext.GetCompiler());
} else {
// If these options are changed, the values in DawnSPIRVCrossGLSLFastFuzzer.cpp need to
@@ -129,21 +129,45 @@
// Extract bindings names so that it can be used to get its location in program.
// Now translate the separate sampler / textures into combined ones and store their info.
// We need to do this before removing the set and binding decorations.
- compiler->build_combined_image_samplers();
+ if (GetDevice()->IsToggleEnabled(Toggle::UseSpvc)) {
+ mSpvcContext.BuildCombinedImageSamplers();
+ } else {
+ compiler->build_combined_image_samplers();
+ }
- for (const auto& combined : compiler->get_combined_image_samplers()) {
- mCombinedInfo.emplace_back();
+ if (GetDevice()->IsToggleEnabled(Toggle::UseSpvc)) {
+ std::vector<shaderc_spvc_combined_image_sampler> samplers;
+ mSpvcContext.GetCombinedImageSamplers(&samplers);
+ for (auto sampler : samplers) {
+ mCombinedInfo.emplace_back();
+ auto& info = mCombinedInfo.back();
- auto& info = mCombinedInfo.back();
- info.samplerLocation.group =
- compiler->get_decoration(combined.sampler_id, spv::DecorationDescriptorSet);
- info.samplerLocation.binding =
- compiler->get_decoration(combined.sampler_id, spv::DecorationBinding);
- info.textureLocation.group =
- compiler->get_decoration(combined.image_id, spv::DecorationDescriptorSet);
- info.textureLocation.binding =
- compiler->get_decoration(combined.image_id, spv::DecorationBinding);
- compiler->set_name(combined.combined_id, info.GetName());
+ mSpvcContext.GetDecoration(sampler.sampler_id,
+ shaderc_spvc_decoration_descriptorset,
+ &info.samplerLocation.group);
+ mSpvcContext.GetDecoration(sampler.sampler_id, shaderc_spvc_decoration_binding,
+ &info.samplerLocation.binding);
+ mSpvcContext.GetDecoration(sampler.image_id, shaderc_spvc_decoration_descriptorset,
+ &info.textureLocation.group);
+ mSpvcContext.GetDecoration(sampler.image_id, shaderc_spvc_decoration_binding,
+ &info.textureLocation.binding);
+ mSpvcContext.SetName(sampler.combined_id, info.GetName());
+ }
+ } else {
+ for (const auto& combined : compiler->get_combined_image_samplers()) {
+ mCombinedInfo.emplace_back();
+
+ auto& info = mCombinedInfo.back();
+ info.samplerLocation.group =
+ compiler->get_decoration(combined.sampler_id, spv::DecorationDescriptorSet);
+ info.samplerLocation.binding =
+ compiler->get_decoration(combined.sampler_id, spv::DecorationBinding);
+ info.textureLocation.group =
+ compiler->get_decoration(combined.image_id, spv::DecorationDescriptorSet);
+ info.textureLocation.binding =
+ compiler->get_decoration(combined.image_id, spv::DecorationBinding);
+ compiler->set_name(combined.combined_id, info.GetName());
+ }
}
// Change binding names to be "dawn_binding_<group>_<binding>".
@@ -153,9 +177,16 @@
for (uint32_t binding = 0; binding < kMaxBindingsPerGroup; ++binding) {
const auto& info = bindingInfo[group][binding];
if (info.used) {
- compiler->set_name(info.base_type_id, GetBindingName(group, binding));
- compiler->unset_decoration(info.id, spv::DecorationBinding);
- compiler->unset_decoration(info.id, spv::DecorationDescriptorSet);
+ if (GetDevice()->IsToggleEnabled(Toggle::UseSpvc)) {
+ mSpvcContext.SetName(info.base_type_id, GetBindingName(group, binding));
+ mSpvcContext.UnsetDecoration(info.id, shaderc_spvc_decoration_binding);
+ mSpvcContext.UnsetDecoration(info.id,
+ shaderc_spvc_decoration_descriptorset);
+ } else {
+ compiler->set_name(info.base_type_id, GetBindingName(group, binding));
+ compiler->unset_decoration(info.id, spv::DecorationBinding);
+ compiler->unset_decoration(info.id, spv::DecorationDescriptorSet);
+ }
}
}
}
diff --git a/src/tests/DawnTest.cpp b/src/tests/DawnTest.cpp
index 4d9a09e..17d839f 100644
--- a/src/tests/DawnTest.cpp
+++ b/src/tests/DawnTest.cpp
@@ -183,6 +183,7 @@
" -c, --begin-capture-on-startup: Begin debug capture on startup "
"(defaults to no capture)\n"
" --skip-validation: Skip Dawn validation\n"
+ " --use-spvc: Use spvc for accessing spirv-cross\n"
" --adapter-vendor-id: Select adapter by vendor id to run end2end tests"
"on multi-GPU systems \n";
continue;