int daemon_update_render_node(struct razer_daemon *daemon,struct razer_fx_render_node *render_node) { if(!render_node || !render_node->effect) return(-1); if(!render_node->start_ticks) { render_node->start_ticks = razer_get_ticks(); render_node->running = 1; for(int i=0;i<list_GetLen(render_node->subs);i++) { struct razer_fx_render_node *sub = list_Get(render_node->subs,i); sub->start_ticks = 0; sub->running = 1; } } if(!render_node->running || daemon_has_render_node_reached_render_limit(daemon,render_node)) return(0); if(list_GetLen(render_node->subs)) { /*#ifdef USE_DEBUGGING printf("## has compute nodes ##"); #endif*/ for(int i=0;i<list_GetLen(render_node->subs);i++) { struct razer_fx_render_node *sub = list_Get(render_node->subs,i); if(!sub->effect) continue; if(sub->effect->class&=2) continue;//only execute compute effects if(!sub->start_ticks) { sub->start_ticks = razer_get_ticks(); sub->running = 1; } if(!sub->running) continue; int sub_ret = daemon_update_render_node(daemon,sub); if(!sub_ret || daemon_has_render_node_reached_render_limit(daemon,sub) || !sub->running) { if(sub->next) { list_Set(render_node->subs,i,sub->next); sub->next->parent = render_node; sub->next->start_ticks = 0; } sub->running = 0; //return(0); } } } if(!render_node->effect->update) return(-1); int ret = render_node->effect->update(render_node); return(ret); }
int daemon_input_event_render_node(struct razer_daemon *daemon,struct razer_fx_render_node *render_node,struct razer_chroma_event *event) { if(!render_node || !render_node->effect) return(-1); if(!render_node->start_ticks) { render_node->start_ticks = razer_get_ticks(); render_node->running = 1; } if(!render_node->running || daemon_has_render_node_reached_render_limit(daemon,render_node)) return(0); if(list_GetLen(render_node->subs)) { for(int i=0;i<list_GetLen(render_node->subs);i++) { struct razer_fx_render_node *sub = list_Get(render_node->subs,i); if(!sub->start_ticks) { sub->start_ticks = razer_get_ticks(); sub->running = 1; } if(!sub->running) continue; int sub_ret = daemon_input_event_render_node(daemon,sub,event); if(!sub_ret || daemon_has_render_node_reached_render_limit(daemon,sub) || !sub->running) { if(sub->next) { list_Set(render_node->subs,i,sub->next); sub->next->parent = render_node; sub->next->start_ticks = 0; } sub->running = 0; //return(0); } } } if(!render_node->effect->input_event) return(-1); int ret = render_node->effect->input_event(render_node,event); return(ret); }
struct razer_fx_render_node *daemon_get_render_node(struct razer_daemon *daemon,int uid) { for(int i = 0;i<list_GetLen(daemon->fx_render_nodes);i++) { struct razer_fx_render_node *render_node = list_Get(daemon->fx_render_nodes,i); if(render_node->id == uid) return(render_node); } return(NULL); }
int daemon_update_render_nodes(struct razer_daemon *daemon) { if(daemon->is_render_nodes_dirty) daemon_compute_render_nodes(daemon); //printf("daemon render_nodes to update:%d\n",daemon->render_nodes_num); int ret = 0; struct razer_fx_render_node *rn = NULL; for(int i = list_GetLen(daemon->render_nodes)-1;i>=0;i--) { rn = list_Get(daemon->render_nodes,i); ret = daemon_update_render_node(daemon,rn); if(!ret) { //TODO rewrite if(rn->next) { //exchange this render_node with the next one list_Set(daemon->render_nodes,i,rn->next); if(rn->move_frame_buffer_linkage_to_next) { if(rn->next->output_frame_linked_uid == -1) razer_free_rgb_frame(rn->next->output_frame); if(rn->next->input_frame_linked_uid == -1) razer_free_rgb_frame(rn->next->input_frame); if(rn->next->second_input_frame_linked_uid == -1) razer_free_rgb_frame(rn->next->second_input_frame); rn->next->input_frame = rn->input_frame; rn->next->second_input_frame = rn->second_input_frame; rn->next->input_frame_linked_uid = rn->input_frame_linked_uid; rn->next->second_input_frame_linked_uid = rn->second_input_frame_linked_uid; //if(rn->output_frame_linked_uid!= -1) } rn->next->output_frame = rn->output_frame; rn->next->output_frame_linked_uid = rn->output_frame_linked_uid; rn->next->prev = rn; rn->next->start_ticks = 0; rn->start_ticks = 0; rn->running = 0; } } } if(!rn->next && !ret) { //root render_node effect returned 0 //start next render_node in chain or default } //razer_clear_frame(daemon->render_node->input_frame); //daemon_update_render_node(daemon->render_node); razer_update_frame(daemon->chroma,daemon->frame_buffer); return(1); }
int daemon_input_event_render_nodes(struct razer_daemon *daemon,struct razer_chroma_event *event) { if(daemon->is_render_nodes_dirty) daemon_compute_render_nodes(daemon); int ret = 0; struct razer_fx_render_node *rn = NULL; for(int i = list_GetLen(daemon->render_nodes)-1;i>=0;i--) { rn = list_Get(daemon->render_nodes,i); ret = daemon_input_event_render_node(daemon,rn,event); if(!ret && rn->id != daemon->frame_buffer_linked_uid) { if(rn->next) { //exchange this render_node with the next one list_Set(daemon->render_nodes,i,rn->next); if(rn->move_frame_buffer_linkage_to_next) { if(rn->next->output_frame_linked_uid == -1) razer_free_rgb_frame(rn->next->output_frame); if(rn->next->input_frame_linked_uid == -1) razer_free_rgb_frame(rn->next->input_frame); if(rn->next->second_input_frame_linked_uid == -1) razer_free_rgb_frame(rn->next->second_input_frame); rn->next->input_frame = rn->input_frame; rn->next->second_input_frame = rn->second_input_frame; rn->next->output_frame = rn->output_frame; rn->next->input_frame_linked_uid = rn->input_frame_linked_uid; rn->next->second_input_frame_linked_uid = rn->second_input_frame_linked_uid; //if(rn->output_frame_linked_uid!= -1) rn->next->output_frame_linked_uid = rn->output_frame_linked_uid; } rn->next->prev = rn; rn->next->start_ticks = 0; rn->start_ticks = 0; rn->running = 0; } } } if(rn->next && !ret) { //printf("switching root render node from %d to %d\n",rn->id,rn->next->id); rn->start_ticks = 0; rn->running = 0; daemon_connect_frame_buffer(daemon,rn->next); //root render_node effect returned 0 //start next render_node in chain or default } return(1); }