Ejemplo n.º 1
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 {
		infostream<<"getShaderId(): 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_shader_queue.add(name, 0, 0, &result_queue);

		infostream<<"Waiting for shader 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 shader timed out."<<std::endl;
			return 0;
		}
	}

	infostream<<"getShaderId(): Failed"<<std::endl;

	return 0;
}
Ejemplo n.º 2
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;
}
Ejemplo n.º 3
0
void ShaderSource::processQueue()
{
	/*
		Fetch shaders
	*/
	//NOTE this is only thread safe for ONE consumer thread!
	if(!m_get_shader_queue.empty()){
		GetRequest<std::string, u32, u8, u8>
				request = m_get_shader_queue.pop();

		/**errorstream<<"ShaderSource::processQueue(): "
				<<"got shader request with "
				<<"name=\""<<request.key<<"\""
				<<std::endl;**/

		m_get_shader_queue.pushResult(request,getShaderIdDirect(request.key));
	}
}
Ejemplo n.º 4
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;
}
Ejemplo n.º 5
0
void ShaderSource::processQueue()
{
	/*
		Fetch shaders
	*/
	if(!m_get_shader_queue.empty()){
		GetRequest<std::string, u32, u8, u8>
				request = m_get_shader_queue.pop();

		/*infostream<<"ShaderSource::processQueue(): "
				<<"got shader request with "
				<<"name=\""<<request.key<<"\""
				<<std::endl;*/

		GetResult<std::string, u32, u8, u8>
				result;
		result.key = request.key;
		result.callers = request.callers;
		result.item = getShaderIdDirect(request.key);

		request.dest->push_back(result);
	}
}