diff options
| author | Chris Forbes <chrisforbes@google.com> | 2017-06-09 14:42:56 -0700 |
|---|---|---|
| committer | Chris Forbes <chrisf@ijw.co.nz> | 2017-06-09 16:04:13 -0700 |
| commit | 6ecd90384d9db6ac6666a2ef4f594c735b55ae4f (patch) | |
| tree | 05ee3af7770fd4586f289047e8fccd1203ac7da3 /layers/shader_validation.cpp | |
| parent | 8db50bae91f29984384459de4d7ce8465eaab1eb (diff) | |
| download | usermoji-6ecd90384d9db6ac6666a2ef4f594c735b55ae4f.tar.xz | |
layers: Move validation of CreateShaderModule
Now we have no spirv details left in core_validation.cpp
Diffstat (limited to 'layers/shader_validation.cpp')
| -rw-r--r-- | layers/shader_validation.cpp | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/layers/shader_validation.cpp b/layers/shader_validation.cpp index fc44d41b..b95c55e1 100644 --- a/layers/shader_validation.cpp +++ b/layers/shader_validation.cpp @@ -34,6 +34,7 @@ #include "core_validation.h" #include "core_validation_types.h" #include "shader_validation.h" +#include "spirv-tools/libspirv.h" enum FORMAT_TYPE { FORMAT_TYPE_FLOAT = 1, // UNORM, SNORM, FLOAT, USCALED, SSCALED, SRGB -- anything we consider float in the shader @@ -1509,3 +1510,43 @@ bool validate_compute_pipeline(layer_data *dev_data, PIPELINE_STATE *pPipeline) return validate_pipeline_shader_stage(dev_data, &pCreateInfo->stage, pPipeline, &module, &entrypoint); } + +bool PreCallValidateCreateShaderModule(layer_data *dev_data, VkShaderModuleCreateInfo const *pCreateInfo, bool *spirv_valid) { + bool skip = false; + spv_result_t spv_valid = SPV_SUCCESS; + auto report_data = GetReportData(dev_data); + + if (GetDisables(dev_data)->shader_validation) { + return false; + } + + auto have_glsl_shader = GetEnabledExtensions(dev_data)->vk_nv_glsl_shader; + + if (!have_glsl_shader && (pCreateInfo->codeSize % 4)) { + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + __LINE__, VALIDATION_ERROR_12a00ac0, "SC", + "SPIR-V module not valid: Codesize must be a multiple of 4 but is " PRINTF_SIZE_T_SPECIFIER ". %s", + pCreateInfo->codeSize, validation_error_map[VALIDATION_ERROR_12a00ac0]); + } else { + // Use SPIRV-Tools validator to try and catch any issues with the module itself + spv_context ctx = spvContextCreate(SPV_ENV_VULKAN_1_0); + spv_const_binary_t binary{ pCreateInfo->pCode, pCreateInfo->codeSize / sizeof(uint32_t) }; + spv_diagnostic diag = nullptr; + + spv_valid = spvValidate(ctx, &binary, &diag); + if (spv_valid != SPV_SUCCESS) { + if (!have_glsl_shader || (pCreateInfo->pCode[0] == spv::MagicNumber)) { + skip |= log_msg(report_data, + spv_valid == SPV_WARNING ? VK_DEBUG_REPORT_WARNING_BIT_EXT : VK_DEBUG_REPORT_ERROR_BIT_EXT, + VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, SHADER_CHECKER_INCONSISTENT_SPIRV, "SC", + "SPIR-V module not valid: %s", diag && diag->error ? diag->error : "(no error text)"); + } + } + + spvDiagnosticDestroy(diag); + spvContextDestroy(ctx); + } + + *spirv_valid = (spv_valid == SPV_SUCCESS); + return skip; +} |
