4 * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 #include "bcsignals.h"
25 #include "edlsession.h"
26 #include "formattools.h"
29 #include "performanceprefs.h"
30 #include "preferences.h"
35 #define MASTER_NODE_FRAMERATE_TEXT "Master node framerate: %0.3f"
37 N_(MASTER_NODE_FRAMERATE_TEXT)
40 PerformancePrefs::PerformancePrefs(MWindow *mwindow, PreferencesWindow *pwindow)
41 : PreferencesDialog(mwindow, pwindow)
46 PerformancePrefs::~PerformancePrefs()
49 nodes[0].remove_all_objects();
50 nodes[1].remove_all_objects();
51 nodes[2].remove_all_objects();
52 nodes[3].remove_all_objects();
55 void PerformancePrefs::create_objects()
62 char string[BCTEXTLEN];
63 BC_Resources *resources = BC_WindowBase::get_resources();
70 xmargin1 = x = mwindow->theme->preferencesoptions_x;
71 y = mwindow->theme->preferencesoptions_y;
73 // add_subwindow(new BC_Title(x,
77 // resources->text_default));
79 // y += get_text_height(LARGEFONT) + 5;
83 win = add_subwindow(new BC_Title(x, y + 5, _("Cache size (MB):"), MEDIUMFONT, resources->text_default));
87 win = add_subwindow(new BC_Title(x, y + 5, _("Seconds to preroll renders:")));
88 if((curw = win->get_w()) > maxw)
92 cache_size = new CICacheSize(maxw, y0, pwindow, this);
93 cache_size->create_objects();
95 add_subwindow(new BC_Title(x, y + 5, _("Seconds to preroll renders:")));
96 PrefsRenderPreroll *preroll = new PrefsRenderPreroll(pwindow, this, maxw, y1);
97 preroll->create_objects();
100 int x1 = x + xmargin4;
101 BC_Title *smp_title = new BC_Title(x1, y + 5, _("Project SMP cpus:"));
102 add_subwindow(smp_title);
103 int x2 = x1 + smp_title->get_w() + 5;
104 PrefsProjectSMP *proj_smp = new PrefsProjectSMP(pwindow, this, x2, y);
105 proj_smp->create_objects();
107 PrefsForceUniprocessor *force_1cpu = new PrefsForceUniprocessor(pwindow, x, y);
108 add_subwindow(force_1cpu);
111 // Background rendering
112 add_subwindow(new BC_Bar(5, y, get_w() - 10));
116 add_subwindow(new BC_Title(x, y, _("Background Rendering (Video only)"), LARGEFONT, resources->text_default));
119 win = add_subwindow(new PrefsUseBRender(pwindow, x, y));
121 y += win->get_h() + 10;
122 win = add_subwindow(new BC_Title(x, y, _("Frames per background rendering job:")));
123 y += win->get_h() + 5;
124 PrefsBRenderFragment *brender_fragment = new PrefsBRenderFragment(pwindow,
128 brender_fragment->create_objects();
129 y += brender_fragment->get_h() + 5;
130 win = add_subwindow(new BC_Title(x, y, _("Frames to preroll background:")));
131 y += win->get_h() + 5;
132 PrefsBRenderPreroll *bpreroll = new PrefsBRenderPreroll(pwindow,
136 bpreroll->create_objects();
137 y += bpreroll->get_h() + 20;
141 add_subwindow(new BC_Title(x, y1, _("Output for background rendering:")));
144 new FormatTools(mwindow,
146 pwindow->thread->preferences->brender_asset);
147 brender_tools->create_objects(x,
149 0, // Include tools for audio
150 1, // Include tools for video
151 0, // Include checkbox for audio
152 0, // Include checkbox for video
155 0, // Select compressors to be offered
156 0, // Prompt for recording options
157 0, // prompt for use labels
158 1); // Supply file formats for background rendering
163 add_subwindow(new BC_Bar(5, y, get_w() - 10));
165 add_subwindow(new BC_Title(x, y, _("Render Farm"), LARGEFONT, resources->text_default));
167 BC_Title *node_title = new BC_Title(x1, y, _("Nodes:"));
168 add_subwindow(node_title);
169 x1 += node_title->get_w() + 25;
170 sprintf(string, _(MASTER_NODE_FRAMERATE_TEXT),
171 pwindow->thread->preferences->local_rate);
172 add_subwindow(master_rate = new BC_Title(x1, y, string));
174 add_subwindow(node_list = new PrefsRenderFarmNodes(pwindow,
179 add_subwindow(new PrefsRenderFarm(pwindow, x, y));
181 add_subwindow(new BC_Title(x, y, _("Hostname:")));
182 add_subwindow(new BC_Title(x + xmargin3, y, _("Port:")));
185 add_subwindow(edit_node = new PrefsRenderFarmEditNode(pwindow,
189 edit_port = new PrefsRenderFarmPort(pwindow,
193 edit_port->create_objects();
198 add_subwindow(new PrefsRenderFarmReplaceNode(pwindow,
202 add_subwindow(new PrefsRenderFarmNewNode(pwindow,
207 add_subwindow(new PrefsRenderFarmDelNode(pwindow,
211 add_subwindow(new PrefsRenderFarmSortNodes(pwindow,
216 add_subwindow(new PrefsRenderFarmReset(pwindow,
221 add_subwindow(new BC_Title(x,
223 _("Total jobs to create:")));
224 add_subwindow(new BC_Title(x,
226 _("(overridden if new file at each label is checked)")));
227 PrefsRenderFarmJobs *jobs = new PrefsRenderFarmJobs(pwindow,
231 jobs->create_objects();
233 // add_subwindow(new PrefsRenderFarmVFS(pwindow,
237 // add_subwindow(new BC_Title(x,
239 // _("Filesystem prefix on remote nodes:")));
240 // add_subwindow(new PrefsRenderFarmMountpoint(pwindow,
247 void PerformancePrefs::generate_node_list()
249 int selected_row = node_list ? node_list->get_selection_number(0, 0) : -1;
251 for(int i = 0; i < TOTAL_COLUMNS; i++)
252 nodes[i].remove_all_objects();
255 i < pwindow->thread->preferences->renderfarm_nodes.size();
258 BC_ListBoxItem *item;
259 nodes[ENABLED_COLUMN].append(item = new BC_ListBoxItem(
260 (char*)(pwindow->thread->preferences->renderfarm_enabled.get(i) ? "X" : " ")));
261 if(i == selected_row) item->set_selected(1);
263 nodes[HOSTNAME_COLUMN].append(item = new BC_ListBoxItem(
264 pwindow->thread->preferences->renderfarm_nodes.get(i)));
265 if(i == selected_row) item->set_selected(1);
267 char string[BCTEXTLEN];
268 sprintf(string, "%d", pwindow->thread->preferences->renderfarm_ports.get(i));
269 nodes[PORT_COLUMN].append(item = new BC_ListBoxItem(string));
270 if(i == selected_row) item->set_selected(1);
272 sprintf(string, "%0.3f", pwindow->thread->preferences->renderfarm_rate.get(i));
273 nodes[RATE_COLUMN].append(item = new BC_ListBoxItem(string));
274 if(i == selected_row) item->set_selected(1);
278 static const char *default_titles[] =
286 static int default_widths[] =
295 void PerformancePrefs::update_node_list()
297 node_list->update_list();
300 void PrefsRenderFarmNodes::update_list()
302 update(subwindow->nodes, titles, widths, PerformancePrefs::TOTAL_COLUMNS,
303 get_xposition(), get_yposition(), get_selection_number(0, 0));
307 void PerformancePrefs::update_rates()
309 //printf("PerformancePrefs::update_rates %d\n", __LINE__);
310 char string[BCTEXTLEN];
312 i < mwindow->preferences->renderfarm_rate.size();
315 if(i < nodes[RATE_COLUMN].size())
317 sprintf(string, "%0.3f", mwindow->preferences->renderfarm_rate.get(i));
318 nodes[RATE_COLUMN].get(i)->set_text(string);
322 sprintf(string, _(MASTER_NODE_FRAMERATE_TEXT),
323 mwindow->preferences->local_rate);
324 master_rate->update(string);
330 PrefsUseBRender::PrefsUseBRender(PreferencesWindow *pwindow,
335 pwindow->thread->preferences->use_brender,
336 _("Use background rendering"))
338 this->pwindow = pwindow;
341 int PrefsUseBRender::handle_event()
343 pwindow->thread->redraw_overlays = 1;
344 pwindow->thread->redraw_times = 1;
345 pwindow->thread->preferences->use_brender = get_value();
354 PrefsBRenderFragment::PrefsBRenderFragment(PreferencesWindow *pwindow,
355 PerformancePrefs *subwindow,
358 : BC_TumbleTextBox(subwindow,
359 (int64_t)pwindow->thread->preferences->brender_fragment,
366 this->pwindow = pwindow;
368 int PrefsBRenderFragment::handle_event()
370 pwindow->thread->preferences->brender_fragment = atol(get_text());
384 CICacheSize::CICacheSize(int x,
386 PreferencesWindow *pwindow,
387 PerformancePrefs *subwindow)
388 : BC_TumbleTextBox(subwindow,
389 (int64_t)pwindow->thread->preferences->cache_size / 0x100000,
390 (int64_t)MIN_CACHE_SIZE / 0x100000,
391 (int64_t)MAX_CACHE_SIZE / 0x100000,
396 this->pwindow = pwindow;
400 int CICacheSize::handle_event()
403 result = (int64_t)atol(get_text()) * 0x100000;
404 CLAMP(result, MIN_CACHE_SIZE, MAX_CACHE_SIZE);
405 pwindow->thread->preferences->cache_size = result;
410 PrefsRenderPreroll::PrefsRenderPreroll(PreferencesWindow *pwindow,
411 PerformancePrefs *subwindow,
414 : BC_TumbleTextBox(subwindow,
415 (float)pwindow->thread->preferences->render_preroll,
422 this->pwindow = pwindow;
425 PrefsRenderPreroll::~PrefsRenderPreroll()
428 int PrefsRenderPreroll::handle_event()
430 pwindow->thread->preferences->render_preroll = atof(get_text());
435 PrefsBRenderPreroll::PrefsBRenderPreroll(PreferencesWindow *pwindow,
436 PerformancePrefs *subwindow,
439 : BC_TumbleTextBox(subwindow,
440 (int64_t)pwindow->thread->preferences->brender_preroll,
447 this->pwindow = pwindow;
449 int PrefsBRenderPreroll::handle_event()
451 pwindow->thread->preferences->brender_preroll = atol(get_text());
465 PrefsRenderFarm::PrefsRenderFarm(PreferencesWindow *pwindow, int x, int y)
468 pwindow->thread->preferences->use_renderfarm,
469 _("Use render farm"))
471 this->pwindow = pwindow;
473 PrefsRenderFarm::~PrefsRenderFarm()
476 int PrefsRenderFarm::handle_event()
478 pwindow->thread->preferences->use_renderfarm = get_value();
485 PrefsForceUniprocessor::PrefsForceUniprocessor(PreferencesWindow *pwindow, int x, int y)
488 pwindow->thread->preferences->force_uniprocessor,
489 _("Force single processor use"))
491 this->pwindow = pwindow;
493 PrefsForceUniprocessor::~PrefsForceUniprocessor()
496 int PrefsForceUniprocessor::handle_event()
498 pwindow->thread->preferences->force_uniprocessor = get_value();
504 PrefsRenderFarmConsolidate::PrefsRenderFarmConsolidate(PreferencesWindow *pwindow, int x, int y)
507 pwindow->thread->preferences->renderfarm_consolidate,
508 _("Consolidate output files on completion"))
510 this->pwindow = pwindow;
512 PrefsRenderFarmConsolidate::~PrefsRenderFarmConsolidate()
515 int PrefsRenderFarmConsolidate::handle_event()
517 pwindow->thread->preferences->renderfarm_consolidate = get_value();
522 PrefsRenderFarmPort::PrefsRenderFarmPort(PreferencesWindow *pwindow,
523 PerformancePrefs *subwindow,
526 : BC_TumbleTextBox(subwindow,
527 (int64_t)pwindow->thread->preferences->renderfarm_port,
534 this->pwindow = pwindow;
537 PrefsRenderFarmPort::~PrefsRenderFarmPort()
541 int PrefsRenderFarmPort::handle_event()
543 pwindow->thread->preferences->renderfarm_port = atol(get_text());
549 PrefsRenderFarmNodes::PrefsRenderFarmNodes(PreferencesWindow *pwindow,
550 PerformancePrefs *subwindow, int x, int y)
551 : BC_ListBox(x, y, 340, 230, LISTBOX_TEXT, 0,0,0,1, 0,0, LISTBOX_MULTIPLE)
553 for( int i=0; i<PerformancePrefs::TOTAL_COLUMNS; ++i ) {
554 titles[i] = _(default_titles[i]);
555 widths[i] = default_widths[i];
557 update(subwindow->nodes, titles, widths, PerformancePrefs::TOTAL_COLUMNS,
559 this->subwindow = subwindow;
560 this->pwindow = pwindow;
562 PrefsRenderFarmNodes::~PrefsRenderFarmNodes()
566 int PrefsRenderFarmNodes::column_resize_event()
568 for( int i=0; i<PerformancePrefs::TOTAL_COLUMNS; ++i )
569 widths[i] = get_column_width(i);
573 int PrefsRenderFarmNodes::handle_event()
576 if(get_selection_number(0, 0) >= 0)
578 subwindow->hot_node = get_selection_number(1, 0);
579 subwindow->edit_node->update(get_selection(1, 0)->get_text());
580 const char *text = get_selection(2, 0)->get_text();
581 subwindow->edit_port->update(text);
582 pwindow->thread->preferences->renderfarm_port = atol(text);
583 if(get_cursor_x() < widths[0])
585 pwindow->thread->preferences->renderfarm_enabled.values[subwindow->hot_node] =
586 !pwindow->thread->preferences->renderfarm_enabled.values[subwindow->hot_node];
587 subwindow->generate_node_list();
588 subwindow->update_node_list();
593 subwindow->hot_node = -1;
594 subwindow->edit_node->update("");
599 int PrefsRenderFarmNodes::selection_changed()
611 PrefsRenderFarmEditNode::PrefsRenderFarmEditNode(PreferencesWindow *pwindow, PerformancePrefs *subwindow, int x, int y)
612 : BC_TextBox(x, y, 240, 1, "")
614 this->pwindow = pwindow;
615 this->subwindow = subwindow;
618 PrefsRenderFarmEditNode::~PrefsRenderFarmEditNode()
622 int PrefsRenderFarmEditNode::handle_event()
632 PrefsRenderFarmNewNode::PrefsRenderFarmNewNode(PreferencesWindow *pwindow, PerformancePrefs *subwindow, int x, int y)
633 : BC_GenericButton(x, y, _("Add Nodes"))
635 this->pwindow = pwindow;
636 this->subwindow = subwindow;
638 PrefsRenderFarmNewNode::~PrefsRenderFarmNewNode()
641 int PrefsRenderFarmNewNode::handle_event()
643 const char *name = subwindow->edit_node->get_text();
644 char *cp = (char*)subwindow->edit_port->get_text();
645 int64_t start_port = strtol(cp, &cp, 0), end_port = start_port;
646 while( isspace(*cp) ) ++cp;
648 end_port = strtol(cp, &cp, 0);
649 for( int port=start_port; port<=end_port; ++port ) {
650 pwindow->thread->preferences->add_node(name, port, 1, 0.0);
652 pwindow->thread->preferences->renderfarm_port = end_port;
653 subwindow->edit_port->update(end_port);
654 pwindow->thread->preferences->reset_rates();
655 subwindow->generate_node_list();
656 subwindow->update_node_list();
657 subwindow->hot_node = -1;
667 PrefsRenderFarmReplaceNode::PrefsRenderFarmReplaceNode(PreferencesWindow *pwindow, PerformancePrefs *subwindow, int x, int y)
668 : BC_GenericButton(x, y, _("Apply Changes"))
670 this->pwindow = pwindow;
671 this->subwindow = subwindow;
673 PrefsRenderFarmReplaceNode::~PrefsRenderFarmReplaceNode()
676 int PrefsRenderFarmReplaceNode::handle_event()
678 if(subwindow->hot_node >= 0)
680 pwindow->thread->preferences->edit_node(subwindow->hot_node,
681 subwindow->edit_node->get_text(),
682 pwindow->thread->preferences->renderfarm_port,
683 pwindow->thread->preferences->renderfarm_enabled.values[subwindow->hot_node]);
684 subwindow->generate_node_list();
685 subwindow->update_node_list();
694 PrefsRenderFarmDelNode::PrefsRenderFarmDelNode(PreferencesWindow *pwindow, PerformancePrefs *subwindow, int x, int y)
695 : BC_GenericButton(x, y, _("Delete Nodes"))
697 this->pwindow = pwindow;
698 this->subwindow = subwindow;
700 PrefsRenderFarmDelNode::~PrefsRenderFarmDelNode()
703 int PrefsRenderFarmDelNode::handle_event()
705 ArrayList<BC_ListBoxItem *> &item_list = subwindow->nodes[0];
706 for( int i=item_list.size(); --i>=0; ) {
707 if( !item_list[i]->get_selected() ) continue;
708 pwindow->thread->preferences->delete_node(i);
710 subwindow->generate_node_list();
711 subwindow->update_node_list();
712 subwindow->hot_node = -1;
720 PrefsRenderFarmSortNodes::PrefsRenderFarmSortNodes(PreferencesWindow *pwindow,
721 PerformancePrefs *subwindow,
724 : BC_GenericButton(x, y, _("Sort nodes"))
726 this->pwindow = pwindow;
727 this->subwindow = subwindow;
730 PrefsRenderFarmSortNodes::~PrefsRenderFarmSortNodes()
734 int PrefsRenderFarmSortNodes::handle_event()
736 pwindow->thread->preferences->sort_nodes();
737 subwindow->generate_node_list();
738 subwindow->update_node_list();
739 subwindow->hot_node = -1;
747 PrefsRenderFarmReset::PrefsRenderFarmReset(PreferencesWindow *pwindow,
748 PerformancePrefs *subwindow,
751 : BC_GenericButton(x, y, _("Reset rates"))
753 this->pwindow = pwindow;
754 this->subwindow = subwindow;
757 int PrefsRenderFarmReset::handle_event()
759 pwindow->thread->preferences->reset_rates();
760 subwindow->generate_node_list();
761 subwindow->update_node_list();
763 char string[BCTEXTLEN];
765 MASTER_NODE_FRAMERATE_TEXT,
766 pwindow->thread->preferences->local_rate);
767 subwindow->master_rate->update(string);
768 subwindow->hot_node = -1;
776 PrefsProjectSMP::PrefsProjectSMP(PreferencesWindow *pwindow,
777 PerformancePrefs *subwindow, int x, int y)
778 : BC_TumbleTextBox(subwindow,
779 (int64_t)pwindow->thread->preferences->project_smp,
780 (int64_t)1, (int64_t)100, x, y, 100)
782 this->pwindow = pwindow;
784 PrefsProjectSMP::~PrefsProjectSMP()
787 int PrefsProjectSMP::handle_event()
789 pwindow->thread->preferences->project_smp = atol(get_text());
797 PrefsRenderFarmJobs::PrefsRenderFarmJobs(PreferencesWindow *pwindow,
798 PerformancePrefs *subwindow,
801 : BC_TumbleTextBox(subwindow,
802 (int64_t)pwindow->thread->preferences->renderfarm_job_count,
809 this->pwindow = pwindow;
811 PrefsRenderFarmJobs::~PrefsRenderFarmJobs()
814 int PrefsRenderFarmJobs::handle_event()
816 pwindow->thread->preferences->renderfarm_job_count = atol(get_text());
822 PrefsRenderFarmMountpoint::PrefsRenderFarmMountpoint(PreferencesWindow *pwindow,
823 PerformancePrefs *subwindow,
830 pwindow->thread->preferences->renderfarm_mountpoint)
832 this->pwindow = pwindow;
833 this->subwindow = subwindow;
835 PrefsRenderFarmMountpoint::~PrefsRenderFarmMountpoint()
838 int PrefsRenderFarmMountpoint::handle_event()
840 strcpy(pwindow->thread->preferences->renderfarm_mountpoint, get_text());
847 PrefsRenderFarmVFS::PrefsRenderFarmVFS(PreferencesWindow *pwindow,
848 PerformancePrefs *subwindow, int x, int y)
849 : BC_CheckBox(x, y, pwindow->thread->preferences->renderfarm_vfs,
850 _("Use virtual filesystem"))
852 this->pwindow = pwindow;
853 this->subwindow = subwindow;
856 int PrefsRenderFarmVFS::handle_event()
858 pwindow->thread->preferences->renderfarm_vfs = get_value();