From d2ccbedbb5b5752da5b083e446b67310be9748ce Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Mon, 1 Feb 2016 12:00:21 +1300 Subject: layers: Look up entrypoint for each shader stage Not doing anything useful with this yet beyond insisting that it is present, but that will come in later patches. V4: Add new enum to md Signed-off-by: Chris Forbes --- layers/draw_state.cpp | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) (limited to 'layers/draw_state.cpp') diff --git a/layers/draw_state.cpp b/layers/draw_state.cpp index e7801bfd..81b9bb68 100644 --- a/layers/draw_state.cpp +++ b/layers/draw_state.cpp @@ -152,6 +152,8 @@ struct spirv_inst_iter { uint32_t const & word(unsigned n) { return it[n]; } uint32_t offset() { return (uint32_t)(it - zero); } + spirv_inst_iter() {} + spirv_inst_iter(std::vector::const_iterator zero, std::vector::const_iterator it) : zero(zero), it(it) {} @@ -399,6 +401,25 @@ build_def_index(shader_module *module) } } + +static spirv_inst_iter +find_entrypoint(shader_module *src, char const *name, VkShaderStageFlagBits stageBits) +{ + for (auto insn : *src) { + if (insn.opcode() == spv::OpEntryPoint) { + auto entrypointName = (char const *) &insn.word(3); + auto entrypointStageBits = 1u << insn.word(1); + + if (!strcmp(entrypointName, name) && (entrypointStageBits & stageBits)) { + return insn; + } + } + } + + return src->end(); +} + + bool shader_is_spirv(VkShaderModuleCreateInfo const *pCreateInfo) { @@ -1391,6 +1412,8 @@ validate_pipeline_shaders(layer_data *my_data, VkDevice dev, PIPELINE_NODE* pPip shader_module *shaders[5]; memset(shaders, 0, sizeof(shaders)); + spirv_inst_iter entrypoints[5]; + memset(entrypoints, 0, sizeof(entrypoints)); RENDER_PASS_NODE const *rp = 0; VkPipelineVertexInputStateCreateInfo const *vi = 0; VkBool32 pass = VK_TRUE; @@ -1409,8 +1432,18 @@ validate_pipeline_shaders(layer_data *my_data, VkDevice dev, PIPELINE_NODE* pPip else { pass = validate_specialization_offsets(my_data, pStage) && pass; + auto stage_id = get_shader_stage_id(pStage->stage); shader_module *module = my_data->shaderModuleMap[pStage->module]; - shaders[get_shader_stage_id(pStage->stage)] = module; + shaders[stage_id] = module; + + /* find the entrypoint */ + entrypoints[stage_id] = find_entrypoint(module, pStage->pName, pStage->stage); + if (entrypoints[stage_id] == module->end()) { + if (log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, /*dev*/0, __LINE__, SHADER_CHECKER_MISSING_ENTRYPOINT, "SC", + "No entrypoint found named `%s` for stages %u", pStage->pName, pStage->stage)) { + pass = VK_FALSE; + } + } /* validate descriptor set layout against what the spirv module actually uses */ std::map, interface_var> descriptor_uses; -- cgit v1.2.3