void ShaderInstance::copy_code_from_master (ShaderGroup &group) { ASSERT (m_instops.empty() && m_instargs.empty()); // reserve with enough room for a few insertions m_instops.reserve (master()->m_ops.size()+10); m_instargs.reserve (master()->m_args.size()+10); m_instops = master()->m_ops; m_instargs = master()->m_args; // Copy the symbols from the master ASSERT (m_instsymbols.size() == 0 && "should not have copied m_instsymbols yet"); m_instsymbols = m_master->m_symbols; // Copy the instance override data // Also set the renderer_output flags where needed. ASSERT (m_instoverrides.size() == (size_t)std::max(0,lastparam())); ASSERT (m_instsymbols.size() >= (size_t)std::max(0,lastparam())); if (m_instoverrides.size()) { for (size_t i = 0, e = lastparam(); i < e; ++i) { Symbol *si = &m_instsymbols[i]; if (m_instoverrides[i].valuesource() == Symbol::DefaultVal) { // Fix the length of any default-value variable length array // parameters. if (si->typespec().is_unsized_array()) si->arraylen (si->initializers()); } else { if (m_instoverrides[i].arraylen()) si->arraylen (m_instoverrides[i].arraylen()); si->valuesource (m_instoverrides[i].valuesource()); si->connected_down (m_instoverrides[i].connected_down()); si->lockgeom (m_instoverrides[i].lockgeom()); si->dataoffset (m_instoverrides[i].dataoffset()); si->data (param_storage(i)); } if (shadingsys().is_renderer_output (layername(), si->name(), &group)) { si->renderer_output (true); renderer_outputs (true); } } } evaluate_writes_globals_and_userdata_params (); off_t symmem = vectorbytes(m_instsymbols) - vectorbytes(m_instoverrides); SymOverrideInfoVec().swap (m_instoverrides); // free it // adjust stats { spin_lock lock (shadingsys().m_stat_mutex); shadingsys().m_stat_mem_inst_syms += symmem; shadingsys().m_stat_mem_inst += symmem; shadingsys().m_stat_memory += symmem; } }
void ShaderInstance::copy_code_from_master () { ASSERT (m_instops.empty() && m_instargs.empty()); // reserve with enough room for a few insertions m_instops.reserve (master()->m_ops.size()+10); m_instargs.reserve (master()->m_args.size()+10); m_instops = master()->m_ops; m_instargs = master()->m_args; // Copy the symbols from the master ASSERT (m_instsymbols.size() == 0 && "should not have copied m_instsymbols yet"); m_instsymbols = m_master->m_symbols; // Copy the instance override data ASSERT (m_instoverrides.size() == (size_t)std::max(0,lastparam())); ASSERT (m_instsymbols.size() >= (size_t)std::max(0,lastparam())); if (m_instoverrides.size()) { for (size_t i = 0, e = lastparam(); i < e; ++i) { if (m_instoverrides[i].valuesource() != Symbol::DefaultVal) { Symbol *si = &m_instsymbols[i]; si->data (param_storage(i)); si->valuesource (m_instoverrides[i].valuesource()); si->connected_down (m_instoverrides[i].connected_down()); si->lockgeom (m_instoverrides[i].lockgeom()); } } } off_t symmem = vectorbytes(m_instsymbols) - vectorbytes(m_instoverrides); SymOverrideInfoVec().swap (m_instoverrides); // free it // adjust stats { spin_lock lock (shadingsys().m_stat_mutex); shadingsys().m_stat_mem_inst_syms += symmem; shadingsys().m_stat_mem_inst += symmem; shadingsys().m_stat_memory += symmem; } }