void ValidationState_t::RegisterInstruction( const spv_parsed_instruction_t& inst) { if (in_function_body()) { ordered_instructions_.emplace_back(&inst, ¤t_function(), current_function().current_block()); } else { ordered_instructions_.emplace_back(&inst, nullptr, nullptr); } uint32_t id = ordered_instructions_.back().id(); if (id) { all_definitions_.insert(make_pair(id, &ordered_instructions_.back())); } // If the instruction is using an OpTypeSampledImage as an operand, it should // be recorded. The validator will ensure that all usages of an // OpTypeSampledImage and its definition are in the same basic block. for (uint16_t i = 0; i < inst.num_operands; ++i) { const spv_parsed_operand_t& operand = inst.operands[i]; if (SPV_OPERAND_TYPE_ID == operand.type) { const uint32_t operand_word = inst.words[operand.offset]; Instruction* operand_inst = FindDef(operand_word); if (operand_inst && SpvOpSampledImage == operand_inst->opcode()) { RegisterSampledImageConsumer(operand_word, inst.result_id); } } } }
void OSLCompilerImpl::pop_nesting (bool isloop) { --m_total_nesting; if (isloop) --m_loop_nesting; if (current_function()) current_function()->pop_nesting (isloop); }
void OSLCompilerImpl::push_nesting (bool isloop) { ++m_total_nesting; if (isloop) ++m_loop_nesting; if (current_function()) current_function()->push_nesting (isloop); }
spv_result_t ValidationState_t::RegisterFunctionEnd() { assert(in_function_body() == true && "RegisterFunctionEnd can only be called when parsing the binary " "inside of another function"); assert(in_block() == false && "RegisterFunctionParameter can only be called when parsing the binary " "ouside of a block"); current_function().RegisterFunctionEnd(); in_function_ = false; return SPV_SUCCESS; }