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"
34 #define MASTER_NODE_FRAMERATE_TEXT "Master node framerate: %0.3f"
36 N_(MASTER_NODE_FRAMERATE_TEXT)
39 PerformancePrefs::PerformancePrefs(MWindow *mwindow, PreferencesWindow *pwindow)
40 : PreferencesDialog(mwindow, pwindow)
45 PerformancePrefs::~PerformancePrefs()
48 nodes[0].remove_all_objects();
49 nodes[1].remove_all_objects();
50 nodes[2].remove_all_objects();
51 nodes[3].remove_all_objects();
54 void PerformancePrefs::create_objects()
61 char string[BCTEXTLEN];
62 BC_Resources *resources = BC_WindowBase::get_resources();
69 xmargin1 = x = mwindow->theme->preferencesoptions_x;
70 y = mwindow->theme->preferencesoptions_y;
72 // add_subwindow(new BC_Title(x,
76 // resources->text_default));
78 // y += get_text_height(LARGEFONT) + 5;
82 win = add_subwindow(new BC_Title(x, y + 5, _("Cache size (MB):"), MEDIUMFONT, resources->text_default));
86 win = add_subwindow(new BC_Title(x, y + 5, _("Seconds to preroll renders:")));
87 if((curw = win->get_w()) > maxw)
91 cache_size = new CICacheSize(maxw, y0, pwindow, this);
92 cache_size->create_objects();
94 add_subwindow(new BC_Title(x, y + 5, _("Seconds to preroll renders:")));
95 PrefsRenderPreroll *preroll = new PrefsRenderPreroll(pwindow, this, maxw, y1);
96 preroll->create_objects();
99 int x1 = x + xmargin4;
100 BC_Title *smp_title = new BC_Title(x1, y + 5, _("Project SMP cpus:"));
101 add_subwindow(smp_title);
102 int x2 = x1 + smp_title->get_w() + 5;
103 PrefsProjectSMP *proj_smp = new PrefsProjectSMP(pwindow, this, x2, y);
104 proj_smp->create_objects();
106 PrefsForceUniprocessor *force_1cpu = new PrefsForceUniprocessor(pwindow, x, y);
107 add_subwindow(force_1cpu);
110 // Background rendering
111 add_subwindow(new BC_Bar(5, y, get_w() - 10));
115 add_subwindow(new BC_Title(x, y, _("Background Rendering (Video only)"), LARGEFONT, resources->text_default));
118 win = add_subwindow(new PrefsUseBRender(pwindow, x, y));
120 y += win->get_h() + 10;
121 win = add_subwindow(new BC_Title(x, y, _("Frames per background rendering job:")));
122 y += win->get_h() + 5;
123 PrefsBRenderFragment *brender_fragment = new PrefsBRenderFragment(pwindow,
127 brender_fragment->create_objects();
128 y += brender_fragment->get_h() + 5;
129 win = add_subwindow(new BC_Title(x, y, _("Frames to preroll background:")));
130 y += win->get_h() + 5;
131 PrefsBRenderPreroll *bpreroll = new PrefsBRenderPreroll(pwindow,
135 bpreroll->create_objects();
136 y += bpreroll->get_h() + 20;
140 add_subwindow(new BC_Title(x, y1, _("Output for background rendering:")));
143 new FormatTools(mwindow,
145 pwindow->thread->preferences->brender_asset);
146 brender_tools->create_objects(x,
148 0, // Include tools for audio
149 1, // Include tools for video
150 0, // Include checkbox for audio
151 0, // Include checkbox for video
154 0, // Select compressors to be offered
155 0, // Prompt for recording options
156 0, // If nonzero, prompt for insertion strategy
157 1); // Supply file formats for background rendering
162 add_subwindow(new BC_Bar(5, y, get_w() - 10));
164 add_subwindow(new BC_Title(x, y, _("Render Farm"), LARGEFONT, resources->text_default));
166 BC_Title *node_title = new BC_Title(x1, y, _("Nodes:"));
167 add_subwindow(node_title);
168 x1 += node_title->get_w() + 25;
169 sprintf(string, _(MASTER_NODE_FRAMERATE_TEXT),
170 pwindow->thread->preferences->local_rate);
171 add_subwindow(master_rate = new BC_Title(x1, y, string));
173 add_subwindow(node_list = new PrefsRenderFarmNodes(pwindow,
178 add_subwindow(new PrefsRenderFarm(pwindow, x, y));
180 add_subwindow(new BC_Title(x, y, _("Hostname:")));
181 add_subwindow(new BC_Title(x + xmargin3, y, _("Port:")));
184 add_subwindow(edit_node = new PrefsRenderFarmEditNode(pwindow,
188 edit_port = new PrefsRenderFarmPort(pwindow,
192 edit_port->create_objects();
197 add_subwindow(new PrefsRenderFarmReplaceNode(pwindow,
201 add_subwindow(new PrefsRenderFarmNewNode(pwindow,
206 add_subwindow(new PrefsRenderFarmDelNode(pwindow,
210 add_subwindow(new PrefsRenderFarmSortNodes(pwindow,
215 add_subwindow(new PrefsRenderFarmReset(pwindow,
220 add_subwindow(new BC_Title(x,
222 _("Total jobs to create:")));
223 add_subwindow(new BC_Title(x,
225 _("(overridden if new file at each label is checked)")));
226 PrefsRenderFarmJobs *jobs = new PrefsRenderFarmJobs(pwindow,
230 jobs->create_objects();
232 // add_subwindow(new PrefsRenderFarmVFS(pwindow,
236 // add_subwindow(new BC_Title(x,
238 // _("Filesystem prefix on remote nodes:")));
239 // add_subwindow(new PrefsRenderFarmMountpoint(pwindow,
246 void PerformancePrefs::generate_node_list()
248 int selected_row = node_list ? node_list->get_selection_number(0, 0) : -1;
250 for(int i = 0; i < TOTAL_COLUMNS; i++)
251 nodes[i].remove_all_objects();
254 i < pwindow->thread->preferences->renderfarm_nodes.size();
257 BC_ListBoxItem *item;
258 nodes[ENABLED_COLUMN].append(item = new BC_ListBoxItem(
259 (char*)(pwindow->thread->preferences->renderfarm_enabled.get(i) ? "X" : " ")));
260 if(i == selected_row) item->set_selected(1);
262 nodes[HOSTNAME_COLUMN].append(item = new BC_ListBoxItem(
263 pwindow->thread->preferences->renderfarm_nodes.get(i)));
264 if(i == selected_row) item->set_selected(1);
266 char string[BCTEXTLEN];
267 sprintf(string, "%d", pwindow->thread->preferences->renderfarm_ports.get(i));
268 nodes[PORT_COLUMN].append(item = new BC_ListBoxItem(string));
269 if(i == selected_row) item->set_selected(1);
271 sprintf(string, "%0.3f", pwindow->thread->preferences->renderfarm_rate.get(i));
272 nodes[RATE_COLUMN].append(item = new BC_ListBoxItem(string));
273 if(i == selected_row) item->set_selected(1);
277 static const char *default_titles[] =
285 static int default_widths[] =
294 void PerformancePrefs::update_node_list()
296 node_list->update_list();
299 void PrefsRenderFarmNodes::update_list()
301 update(subwindow->nodes, titles, widths, PerformancePrefs::TOTAL_COLUMNS,
302 get_xposition(), get_yposition(), get_selection_number(0, 0));
306 void PerformancePrefs::update_rates()
308 //printf("PerformancePrefs::update_rates %d\n", __LINE__);
309 char string[BCTEXTLEN];
311 i < mwindow->preferences->renderfarm_rate.size();
314 if(i < nodes[RATE_COLUMN].size())
316 sprintf(string, "%0.3f", mwindow->preferences->renderfarm_rate.get(i));
317 nodes[RATE_COLUMN].get(i)->set_text(string);
321 sprintf(string, _(MASTER_NODE_FRAMERATE_TEXT),
322 mwindow->preferences->local_rate);
323 master_rate->update(string);
329 PrefsUseBRender::PrefsUseBRender(PreferencesWindow *pwindow,
334 pwindow->thread->preferences->use_brender,
335 _("Use background rendering"))
337 this->pwindow = pwindow;
340 int PrefsUseBRender::handle_event()
342 pwindow->thread->redraw_overlays = 1;
343 pwindow->thread->redraw_times = 1;
344 pwindow->thread->preferences->use_brender = get_value();
353 PrefsBRenderFragment::PrefsBRenderFragment(PreferencesWindow *pwindow,
354 PerformancePrefs *subwindow,
357 : BC_TumbleTextBox(subwindow,
358 (int64_t)pwindow->thread->preferences->brender_fragment,
365 this->pwindow = pwindow;
367 int PrefsBRenderFragment::handle_event()
369 pwindow->thread->preferences->brender_fragment = atol(get_text());
383 CICacheSize::CICacheSize(int x,
385 PreferencesWindow *pwindow,
386 PerformancePrefs *subwindow)
387 : BC_TumbleTextBox(subwindow,
388 (int64_t)pwindow->thread->preferences->cache_size / 0x100000,
389 (int64_t)MIN_CACHE_SIZE / 0x100000,
390 (int64_t)MAX_CACHE_SIZE / 0x100000,
395 this->pwindow = pwindow;
399 int CICacheSize::handle_event()
402 result = (int64_t)atol(get_text()) * 0x100000;
403 CLAMP(result, MIN_CACHE_SIZE, MAX_CACHE_SIZE);
404 pwindow->thread->preferences->cache_size = result;
409 PrefsRenderPreroll::PrefsRenderPreroll(PreferencesWindow *pwindow,
410 PerformancePrefs *subwindow,
413 : BC_TumbleTextBox(subwindow,
414 (float)pwindow->thread->preferences->render_preroll,
421 this->pwindow = pwindow;
424 PrefsRenderPreroll::~PrefsRenderPreroll()
427 int PrefsRenderPreroll::handle_event()
429 pwindow->thread->preferences->render_preroll = atof(get_text());
434 PrefsBRenderPreroll::PrefsBRenderPreroll(PreferencesWindow *pwindow,
435 PerformancePrefs *subwindow,
438 : BC_TumbleTextBox(subwindow,
439 (int64_t)pwindow->thread->preferences->brender_preroll,
446 this->pwindow = pwindow;
448 int PrefsBRenderPreroll::handle_event()
450 pwindow->thread->preferences->brender_preroll = atol(get_text());
464 PrefsRenderFarm::PrefsRenderFarm(PreferencesWindow *pwindow, int x, int y)
467 pwindow->thread->preferences->use_renderfarm,
468 _("Use render farm"))
470 this->pwindow = pwindow;
472 PrefsRenderFarm::~PrefsRenderFarm()
475 int PrefsRenderFarm::handle_event()
477 pwindow->thread->preferences->use_renderfarm = get_value();
484 PrefsForceUniprocessor::PrefsForceUniprocessor(PreferencesWindow *pwindow, int x, int y)
487 pwindow->thread->preferences->force_uniprocessor,
488 _("Force single processor use"))
490 this->pwindow = pwindow;
492 PrefsForceUniprocessor::~PrefsForceUniprocessor()
495 int PrefsForceUniprocessor::handle_event()
497 pwindow->thread->preferences->force_uniprocessor = get_value();
503 PrefsRenderFarmConsolidate::PrefsRenderFarmConsolidate(PreferencesWindow *pwindow, int x, int y)
506 pwindow->thread->preferences->renderfarm_consolidate,
507 _("Consolidate output files on completion"))
509 this->pwindow = pwindow;
511 PrefsRenderFarmConsolidate::~PrefsRenderFarmConsolidate()
514 int PrefsRenderFarmConsolidate::handle_event()
516 pwindow->thread->preferences->renderfarm_consolidate = get_value();
521 PrefsRenderFarmPort::PrefsRenderFarmPort(PreferencesWindow *pwindow,
522 PerformancePrefs *subwindow,
525 : BC_TumbleTextBox(subwindow,
526 (int64_t)pwindow->thread->preferences->renderfarm_port,
533 this->pwindow = pwindow;
536 PrefsRenderFarmPort::~PrefsRenderFarmPort()
540 int PrefsRenderFarmPort::handle_event()
542 pwindow->thread->preferences->renderfarm_port = atol(get_text());
548 PrefsRenderFarmNodes::PrefsRenderFarmNodes(PreferencesWindow *pwindow,
549 PerformancePrefs *subwindow, int x, int y)
550 : BC_ListBox(x, y, 340, 230,
551 LISTBOX_TEXT, // Display text list or icons
555 PerformancePrefs::TOTAL_COLUMNS)
557 for( int i=0; i<PerformancePrefs::TOTAL_COLUMNS; ++i ) {
558 titles[i] = _(default_titles[i]);
559 widths[i] = default_widths[i];
561 this->subwindow = subwindow;
562 this->pwindow = pwindow;
564 PrefsRenderFarmNodes::~PrefsRenderFarmNodes()
568 int PrefsRenderFarmNodes::column_resize_event()
570 for( int i=0; i<PerformancePrefs::TOTAL_COLUMNS; ++i )
571 widths[i] = get_column_width(i);
575 int PrefsRenderFarmNodes::handle_event()
578 if(get_selection_number(0, 0) >= 0)
580 subwindow->hot_node = get_selection_number(1, 0);
581 subwindow->edit_node->update(get_selection(1, 0)->get_text());
582 subwindow->edit_port->update(get_selection(2, 0)->get_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 Node"))
635 this->pwindow = pwindow;
636 this->subwindow = subwindow;
638 PrefsRenderFarmNewNode::~PrefsRenderFarmNewNode()
641 int PrefsRenderFarmNewNode::handle_event()
643 pwindow->thread->preferences->add_node(subwindow->edit_node->get_text(),
644 pwindow->thread->preferences->renderfarm_port,
647 pwindow->thread->preferences->reset_rates();
648 subwindow->generate_node_list();
649 subwindow->update_node_list();
650 subwindow->hot_node = -1;
660 PrefsRenderFarmReplaceNode::PrefsRenderFarmReplaceNode(PreferencesWindow *pwindow, PerformancePrefs *subwindow, int x, int y)
661 : BC_GenericButton(x, y, _("Apply Changes"))
663 this->pwindow = pwindow;
664 this->subwindow = subwindow;
666 PrefsRenderFarmReplaceNode::~PrefsRenderFarmReplaceNode()
669 int PrefsRenderFarmReplaceNode::handle_event()
671 if(subwindow->hot_node >= 0)
673 pwindow->thread->preferences->edit_node(subwindow->hot_node,
674 subwindow->edit_node->get_text(),
675 pwindow->thread->preferences->renderfarm_port,
676 pwindow->thread->preferences->renderfarm_enabled.values[subwindow->hot_node]);
677 subwindow->generate_node_list();
678 subwindow->update_node_list();
687 PrefsRenderFarmDelNode::PrefsRenderFarmDelNode(PreferencesWindow *pwindow, PerformancePrefs *subwindow, int x, int y)
688 : BC_GenericButton(x, y, _("Delete Node"))
690 this->pwindow = pwindow;
691 this->subwindow = subwindow;
693 PrefsRenderFarmDelNode::~PrefsRenderFarmDelNode()
696 int PrefsRenderFarmDelNode::handle_event()
698 if( subwindow->hot_node >= 0 ) {
699 pwindow->thread->preferences->delete_node(subwindow->hot_node);
701 subwindow->generate_node_list();
702 subwindow->update_node_list();
703 subwindow->hot_node = -1;
712 PrefsRenderFarmSortNodes::PrefsRenderFarmSortNodes(PreferencesWindow *pwindow,
713 PerformancePrefs *subwindow,
716 : BC_GenericButton(x, y, _("Sort nodes"))
718 this->pwindow = pwindow;
719 this->subwindow = subwindow;
722 PrefsRenderFarmSortNodes::~PrefsRenderFarmSortNodes()
726 int PrefsRenderFarmSortNodes::handle_event()
728 pwindow->thread->preferences->sort_nodes();
729 subwindow->generate_node_list();
730 subwindow->update_node_list();
731 subwindow->hot_node = -1;
739 PrefsRenderFarmReset::PrefsRenderFarmReset(PreferencesWindow *pwindow,
740 PerformancePrefs *subwindow,
743 : BC_GenericButton(x, y, _("Reset rates"))
745 this->pwindow = pwindow;
746 this->subwindow = subwindow;
749 int PrefsRenderFarmReset::handle_event()
751 pwindow->thread->preferences->reset_rates();
752 subwindow->generate_node_list();
753 subwindow->update_node_list();
755 char string[BCTEXTLEN];
757 MASTER_NODE_FRAMERATE_TEXT,
758 pwindow->thread->preferences->local_rate);
759 subwindow->master_rate->update(string);
760 subwindow->hot_node = -1;
768 PrefsProjectSMP::PrefsProjectSMP(PreferencesWindow *pwindow,
769 PerformancePrefs *subwindow, int x, int y)
770 : BC_TumbleTextBox(subwindow,
771 (int64_t)pwindow->thread->preferences->project_smp,
772 (int64_t)1, (int64_t)100, x, y, 100)
774 this->pwindow = pwindow;
776 PrefsProjectSMP::~PrefsProjectSMP()
779 int PrefsProjectSMP::handle_event()
781 pwindow->thread->preferences->project_smp = atol(get_text());
789 PrefsRenderFarmJobs::PrefsRenderFarmJobs(PreferencesWindow *pwindow,
790 PerformancePrefs *subwindow,
793 : BC_TumbleTextBox(subwindow,
794 (int64_t)pwindow->thread->preferences->renderfarm_job_count,
801 this->pwindow = pwindow;
803 PrefsRenderFarmJobs::~PrefsRenderFarmJobs()
806 int PrefsRenderFarmJobs::handle_event()
808 pwindow->thread->preferences->renderfarm_job_count = atol(get_text());
814 PrefsRenderFarmMountpoint::PrefsRenderFarmMountpoint(PreferencesWindow *pwindow,
815 PerformancePrefs *subwindow,
822 pwindow->thread->preferences->renderfarm_mountpoint)
824 this->pwindow = pwindow;
825 this->subwindow = subwindow;
827 PrefsRenderFarmMountpoint::~PrefsRenderFarmMountpoint()
830 int PrefsRenderFarmMountpoint::handle_event()
832 strcpy(pwindow->thread->preferences->renderfarm_mountpoint, get_text());
839 PrefsRenderFarmVFS::PrefsRenderFarmVFS(PreferencesWindow *pwindow,
840 PerformancePrefs *subwindow, int x, int y)
841 : BC_CheckBox(x, y, pwindow->thread->preferences->renderfarm_vfs,
842 _("Use virtual filesystem"))
844 this->pwindow = pwindow;
845 this->subwindow = subwindow;
848 int PrefsRenderFarmVFS::handle_event()
850 pwindow->thread->preferences->renderfarm_vfs = get_value();