u32 TextureSource::getTextureId(const std::string &name) { //infostream<<"getTextureId(): \""<<name<<"\""<<std::endl; { /* See if texture already exists */ JMutexAutoLock lock(m_textureinfo_cache_mutex); std::map<std::string, u32>::iterator n; n = m_name_to_id.find(name); if(n != m_name_to_id.end()) { return n->second; } } /* Get texture */ if(get_current_thread_id() == m_main_thread) { return getTextureIdDirect(name); } else { infostream<<"getTextureId(): Queued: name=\""<<name<<"\""<<std::endl; // We're gonna ask the result to be put into here static ResultQueue<std::string, u32, u8, u8> result_queue; // Throw a request in m_get_texture_queue.add(name, 0, 0, &result_queue); /*infostream<<"Waiting for texture from main thread, name=\"" <<name<<"\""<<std::endl;*/ try { while(true) { // Wait result for a second GetResult<std::string, u32, u8, u8> result = result_queue.pop_front(1000); if (result.key == name) { return result.item; } } } catch(ItemNotFoundException &e) { errorstream<<"Waiting for texture " << name << " timed out."<<std::endl; return 0; } } infostream<<"getTextureId(): Failed"<<std::endl; return 0; }
u32 TextureSource::getTextureId(const std::string &name) { //infostream<<"getTextureId(): \""<<name<<"\""<<std::endl; { /* See if texture already exists */ JMutexAutoLock lock(m_atlaspointer_cache_mutex); core::map<std::string, u32>::Node *n; n = m_name_to_id.find(name); if(n != NULL) { return n->getValue(); } } /* Get texture */ if(get_current_thread_id() == m_main_thread) { return getTextureIdDirect(name); } else { infostream<<"getTextureId(): Queued: name=\""<<name<<"\""<<std::endl; // We're gonna ask the result to be put into here ResultQueue<std::string, u32, u8, u8> result_queue; // Throw a request in m_get_texture_queue.add(name, 0, 0, &result_queue); infostream<<"Waiting for texture from main thread, name=\"" <<name<<"\""<<std::endl; try { // Wait result for a second GetResult<std::string, u32, u8, u8> result = result_queue.pop_front(1000); // Check that at least something worked OK assert(result.key == name); return result.item; } catch(ItemNotFoundException &e) { infostream<<"Waiting for texture timed out."<<std::endl; return 0; } } infostream<<"getTextureId(): Failed"<<std::endl; return 0; }
u32 ShaderSource::getShaderId(const std::string &name) { //infostream<<"getShaderId(): \""<<name<<"\""<<std::endl; { /* See if shader already exists */ JMutexAutoLock lock(m_shaderinfo_cache_mutex); std::map<std::string, u32>::iterator n; n = m_name_to_id.find(name); if(n != m_name_to_id.end()) return n->second; } /* Get shader */ if(get_current_thread_id() == m_main_thread){ return getShaderIdDirect(name); } else { /*errorstream<<"getShaderId(): Queued: name=\""<<name<<"\""<<std::endl;*/ // We're gonna ask the result to be put into here static ResultQueue<std::string, u32, u8, u8> result_queue; // Throw a request in m_get_shader_queue.add(name, 0, 0, &result_queue); /* infostream<<"Waiting for shader from main thread, name=\"" <<name<<"\""<<std::endl;*/ while(true) { GetResult<std::string, u32, u8, u8> result = result_queue.pop_frontNoEx(); if (result.key == name) { return result.item; } else { errorstream << "Got shader with invalid name: " << result.key << std::endl; } } } infostream<<"getShaderId(): Failed"<<std::endl; return 0; }
u32 ShaderSource::getShader(const std::string &name, const u8 material_type, const u8 drawtype) { /* Get shader */ if (thr_is_current_thread(m_main_thread)) { return getShaderIdDirect(name, material_type, drawtype); } else { /*errorstream<<"getShader(): Queued: name=\""<<name<<"\""<<std::endl;*/ // We're gonna ask the result to be put into here static ResultQueue<std::string, u32, u8, u8> result_queue; // Throw a request in m_get_shader_queue.add(name, 0, 0, &result_queue); /* infostream<<"Waiting for shader from main thread, name=\"" <<name<<"\""<<std::endl;*/ while(true) { GetResult<std::string, u32, u8, u8> result = result_queue.pop_frontNoEx(); if (result.key == name) { return result.item; } else { errorstream << "Got shader with invalid name: " << result.key << std::endl; } } } infostream<<"getShader(): Failed"<<std::endl; return 0; }