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; // We already have the symbols on [0,lastparam). Now copy the rest. off_t symmem = vectorbytes(m_instsymbols); ASSERT (m_master->m_lastparam < 0 || m_instsymbols.size() == (size_t)m_master->m_lastparam); ASSERT (m_instsymbols.size() <= m_master->m_symbols.size()); m_instsymbols.reserve (m_master->m_symbols.size()); for (size_t i = m_instsymbols.size(), e = m_master->m_symbols.size(); i < e; ++i) m_instsymbols.push_back (m_master->m_symbols[i]); ASSERT (m_instsymbols.size() == m_master->m_symbols.size()); // adjust stats off_t opmem = vectorbytes(m_instops); off_t argmem = vectorbytes(m_instargs); symmem = vectorbytes(m_instsymbols) - symmem; // just the new mem { spin_lock lock (shadingsys().m_stat_mutex); shadingsys().m_stat_mem_inst_ops += opmem; shadingsys().m_stat_mem_inst_args += argmem; shadingsys().m_stat_mem_inst_syms += symmem; shadingsys().m_stat_mem_inst += opmem+argmem+symmem; shadingsys().m_stat_memory += opmem+argmem+symmem; } }
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->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::add_connection (int srclayer, const ConnectedParam &srccon, const ConnectedParam &dstcon) { off_t oldmem = vectorbytes(m_connections); m_connections.push_back (Connection (srclayer, srccon, dstcon)); // adjust stats off_t mem = vectorbytes(m_connections) - oldmem; { spin_lock lock (shadingsys().m_stat_mutex); shadingsys().m_stat_mem_inst_connections += mem; shadingsys().m_stat_mem_inst += mem; shadingsys().m_stat_memory += mem; } }
void ShaderInstance::add_connection (int srclayer, const ConnectedParam &srccon, const ConnectedParam &dstcon) { // specialize symbol in case of dstcon is an unsized array if (dstcon.type.is_unsized_array()) { SymOverrideInfo *so = &m_instoverrides[dstcon.param]; so->arraylen(srccon.type.arraylength()); const TypeDesc& type = srccon.type.simpletype(); // Skip structs for now, they're just placeholders /*if (t.is_structure()) { } else*/ if (type.basetype == TypeDesc::FLOAT) { so->dataoffset((int) m_fparams.size()); expand (m_fparams,type.size()); } else if (type.basetype == TypeDesc::INT) { so->dataoffset((int) m_iparams.size()); expand (m_iparams, type.size()); } else if (type.basetype == TypeDesc::STRING) { so->dataoffset((int) m_sparams.size()); expand (m_sparams, type.size()); }/* else if (t.is_closure()) { // Closures are pointers, so we allocate a string default taking // adventage of their default being NULL as well. so->dataoffset((int) m_sparams.size()); expand (m_sparams, type.size()); }*/ else { ASSERT (0 && "unexpected type"); } } off_t oldmem = vectorbytes(m_connections); m_connections.push_back (Connection (srclayer, srccon, dstcon)); // adjust stats off_t mem = vectorbytes(m_connections) - oldmem; { spin_lock lock (shadingsys().m_stat_mutex); shadingsys().m_stat_mem_inst_connections += mem; shadingsys().m_stat_mem_inst += mem; shadingsys().m_stat_memory += mem; } }
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; } }
ShaderMaster::~ShaderMaster () { // Adjust statistics size_t opmem = vectorbytes (m_ops); size_t argmem = vectorbytes (m_args); size_t symmem = vectorbytes (m_symbols); size_t defaultmem = vectorbytes (m_idefaults) + vectorbytes (m_fdefaults) + vectorbytes (m_sdefaults); size_t constmem = vectorbytes (m_iconsts) + vectorbytes (m_fconsts) + vectorbytes (m_sconsts); size_t totalmem = (opmem + argmem + symmem + defaultmem + constmem + sizeof(ShaderMaster)); { ShadingSystemImpl &ss (shadingsys()); OIIO::spin_lock lock (ss.m_stat_mutex); ss.m_stat_mem_master_ops -= opmem; ss.m_stat_mem_master_args -= argmem; ss.m_stat_mem_master_syms -= symmem; ss.m_stat_mem_master_defaults -= defaultmem; ss.m_stat_mem_master_consts -= constmem; ss.m_stat_mem_master -= totalmem; ss.m_stat_memory -= totalmem; } }
else if (s.typespec().simpletype().basetype == TypeDesc::STRING) s.data (&(m_sconsts[s.dataoffset()])); } } ++i; } // Re-track variable lifetimes SymbolPtrVec oparg_ptrs; oparg_ptrs.reserve (m_args.size()); BOOST_FOREACH (int a, m_args) oparg_ptrs.push_back (symbol (a)); OSLCompilerImpl::track_variable_lifetimes (m_ops, oparg_ptrs, allsymptrs); // Adjust statistics size_t opmem = vectorbytes (m_ops); size_t argmem = vectorbytes (m_args); size_t symmem = vectorbytes (m_symbols); size_t defaultmem = vectorbytes (m_idefaults) + vectorbytes (m_fdefaults) + vectorbytes (m_sdefaults); size_t constmem = vectorbytes (m_iconsts) + vectorbytes (m_fconsts) + vectorbytes (m_sconsts); size_t totalmem = (opmem + argmem + symmem + defaultmem + constmem + sizeof(ShaderMaster)); { ShadingSystemImpl &ss (shadingsys()); OIIO::spin_lock lock (ss.m_stat_mutex); ss.m_stat_mem_master_ops += opmem; ss.m_stat_mem_master_args += argmem; ss.m_stat_mem_master_syms += symmem; ss.m_stat_mem_master_defaults += defaultmem;