void daemon_compute_append_queue(struct razer_daemon *daemon,list *queue)
{
	while(!list_IsEmpty(queue))
	{
		struct razer_fx_render_node *render_node = (struct razer_fx_render_node*)list_Dequeue(queue);
		list_Push(daemon->render_nodes,render_node);
		if(render_node->input_frame_linked_uid!=-1 && render_node->input_frame_linked_uid != 0)
			list_Queue(queue,daemon_get_render_node(daemon,render_node->input_frame_linked_uid));
		if(render_node->second_input_frame_linked_uid!=-1 && render_node->second_input_frame_linked_uid != 0)
			list_Queue(queue,daemon_get_render_node(daemon,render_node->second_input_frame_linked_uid));
	}
}
void daemon_disconnect_frame_buffer(struct razer_daemon *daemon)
{
	if(daemon->frame_buffer_linked_uid != 0) //unlink old render node first
	{
		struct razer_fx_render_node *old_rn = daemon_get_render_node(daemon,daemon->frame_buffer_linked_uid);
		old_rn->output_frame = razer_create_rgb_frame();
		old_rn->output_frame_linked_uid = -1;
	}
	//if(render_node->output_frame_linked_uid == -1)
	//	razer_free_rgb_frame(render_node->output_frame);
	//daemon->frame_buffer = razer_create_rgb_frame();
	daemon->frame_buffer_linked_uid = -1;
	daemon->is_render_nodes_dirty = 1;
}
void daemon_compute_render_nodes(struct razer_daemon *daemon)
{
	//struct razer_queue *queue = daemon_create_queue();
	list *queue = list_Create(0,0);
	list_Clear(daemon->render_nodes);
	struct razer_fx_render_node *rn = daemon_get_render_node(daemon,daemon->frame_buffer_linked_uid);
	if(rn)
	{
		list_Queue(queue,rn);
		daemon_compute_append_queue(daemon,queue);
	}
	//daemon_free_queue(&queue);
	list_Close(queue);
	daemon->is_render_nodes_dirty = 0;
}
void daemon_connect_frame_buffer(struct razer_daemon *daemon,struct razer_fx_render_node *render_node)
{
	if(daemon->frame_buffer_linked_uid != 0) //unlink old render node first
	{
		struct razer_fx_render_node *old_rn = daemon_get_render_node(daemon,daemon->frame_buffer_linked_uid);
		old_rn->output_frame = razer_create_rgb_frame();
		old_rn->output_frame_linked_uid = -1;
	}
	if(render_node->output_frame_linked_uid == -1)
		razer_free_rgb_frame(render_node->output_frame);
	render_node->output_frame = daemon->frame_buffer;
	daemon->frame_buffer_linked_uid = render_node->id;
	daemon->fps = render_node->effect->fps;
	daemon->is_render_nodes_dirty = 1;
}
struct razer_fx_render_node *daemon_create_render_node(struct razer_daemon *daemon,struct razer_effect *effect,int input_render_node_uid,int second_input_render_node_uid,int output_render_node_uid,char *name,char *description)
{
	struct razer_fx_render_node *render_node = (struct razer_fx_render_node*)malloc(sizeof(struct razer_fx_render_node));
	render_node->daemon = daemon;
	//render_node->effect = effect;
	if(effect)
		render_node->effect = daemon_create_effect_instance(daemon,effect);
	else
		render_node->effect = NULL;
	render_node->opacity = 1.0f;
	if(input_render_node_uid == -1)
	{
		struct razer_rgb_frame *iframe = razer_create_rgb_frame();
		render_node->input_frame = iframe;
		render_node->input_frame_linked_uid = -1;
	}
	else if(input_render_node_uid == 0) //set input to daemon output buffer
	{
		render_node->input_frame = daemon->frame_buffer;
		render_node->input_frame_linked_uid = 0;
	}
	else
	{
		struct razer_fx_render_node *rn = daemon_get_render_node(daemon,input_render_node_uid);
		render_node->input_frame = rn->output_frame;
		render_node->input_frame_linked_uid = input_render_node_uid;
	}

	if(second_input_render_node_uid == -1)
	{
		struct razer_rgb_frame *siframe = razer_create_rgb_frame();
		render_node->second_input_frame = siframe;
		render_node->second_input_frame_linked_uid = -1;
	}
	else if(second_input_render_node_uid == 0) //set input to daemon output buffer
	{
		render_node->second_input_frame = daemon->frame_buffer;
		render_node->second_input_frame_linked_uid = 0;
	}
	else
	{
		struct razer_fx_render_node *srn = daemon_get_render_node(daemon,second_input_render_node_uid);
		render_node->second_input_frame = srn->output_frame;
		render_node->second_input_frame_linked_uid = second_input_render_node_uid;
	}

	if(output_render_node_uid == -1)
	{
		struct razer_rgb_frame *oframe = razer_create_rgb_frame();
		render_node->output_frame = oframe;
		render_node->output_frame_linked_uid = -1;
	}
	else if(output_render_node_uid == 0) //set input to daemon output buffer
	{
		render_node->output_frame = daemon->frame_buffer;
		render_node->output_frame_linked_uid = 0;
	}
	/*else //not used
	{
		struct razer_fx_render_node *orn = daemon_get_render_node(daemon,output_render_node_uid);
		render_node->output_frame = orn->output_frame;
		render_node->output_frame_linked_uid = output_render_node_uid;
	}*/

	render_node->description = str_Copy(description);
	render_node->name = str_Copy(name);
	//render_node->fps = daemon->fps;
	render_node->compose_mode = RAZER_COMPOSE_MODE_MIX;
	render_node->next = NULL;
	render_node->parent = NULL;
	//render_node->parameters = NULL;
	//render_node->parameters_num = 0;
	render_node->subs = list_Create(0,0);
	render_node->start_ticks = 0;
	render_node->running = 0;//set to 1 with first update
	render_node->limit_render_time_ms = 0;
	render_node->move_frame_buffer_linkage_to_next = 1;
	//render_node->continue_chain=1;
	render_node->loop_count = -1;
	return(render_node);
}