Validate fragment output location doesn't exceed kMaxColorAttachments
This patch adds the validation on the fragment shader output location to ensure it will never exceed kMaxColorAttachments. BUG=dawn:202 TEST=dawn_unittests Change-Id: I4ac4463fd3dfb3c2e9ffecb370f9d9d59393c26d Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/11580 Commit-Queue: Jiawei Shao <jiawei.shao@intel.com> Reviewed-by: Austin Eng <enga@chromium.org>
This commit is contained in:
parent
c3b613296d
commit
05be0ff348
|
@ -190,6 +190,18 @@ namespace dawn_native {
|
|||
return;
|
||||
}
|
||||
}
|
||||
|
||||
for (const auto& fragmentOutput : resources.stage_outputs) {
|
||||
ASSERT(
|
||||
compiler.get_decoration_bitset(fragmentOutput.id).get(spv::DecorationLocation));
|
||||
uint32_t location =
|
||||
compiler.get_decoration(fragmentOutput.id, spv::DecorationLocation);
|
||||
if (location >= kMaxColorAttachments) {
|
||||
device->HandleError(dawn::ErrorType::Validation,
|
||||
"Fragment output location over limits in the SPIRV");
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -12,10 +12,14 @@
|
|||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
#include "common/Constants.h"
|
||||
|
||||
#include "tests/unittests/validation/ValidationTest.h"
|
||||
|
||||
#include "utils/DawnHelpers.h"
|
||||
|
||||
#include <sstream>
|
||||
|
||||
class ShaderModuleValidationTest : public ValidationTest {
|
||||
};
|
||||
|
||||
|
@ -89,3 +93,18 @@ TEST_F(ShaderModuleValidationTest, DISABLED_OpUndef) {
|
|||
std::string error = GetLastDeviceErrorMessage();
|
||||
ASSERT_NE(error.find("OpUndef"), std::string::npos);
|
||||
}
|
||||
|
||||
// Tests that if the output location exceeds kMaxColorAttachments the fragment shader will fail to
|
||||
// be compiled.
|
||||
TEST_F(ShaderModuleValidationTest, FragmentOutputLocationExceedsMaxColorAttachments) {
|
||||
std::ostringstream stream;
|
||||
stream << R"(#version 450
|
||||
layout(location = )"
|
||||
<< kMaxColorAttachments << R"() out vec4 fragColor;
|
||||
void main() {
|
||||
fragColor = vec4(0.0, 1.0, 0.0, 1.0);
|
||||
})";
|
||||
|
||||
ASSERT_DEVICE_ERROR(utils::CreateShaderModule(device, utils::SingleShaderStage::Fragment,
|
||||
stream.str().c_str()));
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue