OpenGL: Don't bind non-existent shader resources.

In OpenGL we have to query a resource's location or index before we can
bind it. The driver can tell us that the resource doesn't exist using
special values (-1 for locations, GL_INVALID_INDEX for indices). This
happens when Dawn compiles a pipeline that has bind group bindings that
none of the shader modules uses.

This was found while enable OpenGL debug output.

BUG=dawn:190

Change-Id: I58b3a1a65f87b4408985c1258f1a95379e6b540e
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/9203
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Austin Eng <enga@chromium.org>
Reviewed-by: Kai Ninomiya <kainino@chromium.org>
This commit is contained in:
Corentin Wallez 2019-07-22 09:24:51 +00:00 committed by Commit Bot service account
parent 69f1db7248
commit 9dffe11696
1 changed files with 12 additions and 2 deletions

View File

@ -120,13 +120,18 @@ namespace dawn_native { namespace opengl {
switch (groupInfo.types[binding]) { switch (groupInfo.types[binding]) {
case dawn::BindingType::UniformBuffer: { case dawn::BindingType::UniformBuffer: {
GLint location = gl.GetUniformBlockIndex(mProgram, name.c_str()); GLint location = gl.GetUniformBlockIndex(mProgram, name.c_str());
if (location != -1) {
gl.UniformBlockBinding(mProgram, location, indices[group][binding]); gl.UniformBlockBinding(mProgram, location, indices[group][binding]);
}
} break; } break;
case dawn::BindingType::StorageBuffer: { case dawn::BindingType::StorageBuffer: {
GLuint location = gl.GetProgramResourceIndex( GLuint location = gl.GetProgramResourceIndex(
mProgram, GL_SHADER_STORAGE_BLOCK, name.c_str()); mProgram, GL_SHADER_STORAGE_BLOCK, name.c_str());
gl.ShaderStorageBlockBinding(mProgram, location, indices[group][binding]); if (location != GL_INVALID_INDEX) {
gl.ShaderStorageBlockBinding(mProgram, location,
indices[group][binding]);
}
} break; } break;
case dawn::BindingType::Sampler: case dawn::BindingType::Sampler:
@ -161,6 +166,11 @@ namespace dawn_native { namespace opengl {
for (const auto& combined : combinedSamplersSet) { for (const auto& combined : combinedSamplersSet) {
std::string name = combined.GetName(); std::string name = combined.GetName();
GLint location = gl.GetUniformLocation(mProgram, name.c_str()); GLint location = gl.GetUniformLocation(mProgram, name.c_str());
if (location == -1) {
continue;
}
gl.Uniform1i(location, textureUnit); gl.Uniform1i(location, textureUnit);
GLuint samplerIndex = GLuint samplerIndex =