| /*************************************************************************/ |
| /* */ |
| /* Copyright (c) 1994 Stanford University */ |
| /* */ |
| /* All rights reserved. */ |
| /* */ |
| /* Permission is given to use, copy, and modify this software for any */ |
| /* non-commercial purpose as long as this copyright notice is not */ |
| /* removed. All other uses, including redistribution in whole or in */ |
| /* part, are forbidden without prior written permission. */ |
| /* */ |
| /* This software is provided with absolutely no warranty and no */ |
| /* support. */ |
| /* */ |
| /*************************************************************************/ |
| |
| |
| /* This file contains many constant definitions that control the execution |
| of the program, as well as lobal data structure declarations */ |
| |
| #ifndef _RADIOSITY_H |
| #define _RADIOSITY_H |
| |
| #include <math.h> |
| include(parallel.h) |
| include(patch.h) |
| include(model.h) |
| include(task.h) |
| #include "glib.h" |
| #include "pslib.h" |
| |
| |
| /**************************************** |
| * |
| * Configuration Parameters |
| * |
| *****************************************/ |
| |
| /************************************************************************* |
| * |
| * Task scheduling & Load balancing (1) |
| * --- Assignment of the patches to the processors |
| * |
| * This macro specifies how patches are assigned to the task queues (ie, |
| * processors). |
| * - PATCH_ASSIGNMENT_STATIC assigns the same set of patches to the same |
| * queue repeatedly over iterations. |
| * - PATCH_ASSIGNMENT_COSTBASED assigns patches to queues based on the |
| * work associated with those patches in previous iterations, in order |
| * to try to balance the initial workload assignment among processors |
| * and hence reduce task stealing. |
| * |
| **************************************************************************/ |
| |
| #define PATCH_ASSIGNMENT_STATIC (1) |
| #define PATCH_ASSIGNMENT_COSTBASED (3) |
| |
| #if !defined(PATCH_ASSIGNMENT) |
| #define PATCH_ASSIGNMENT PATCH_ASSIGNMENT_STATIC |
| #endif |
| |
| |
| /**************************************** |
| * |
| * Constants |
| * |
| *****************************************/ |
| |
| |
| #define F_ZERO (1.0e-6) |
| |
| #if defined(SIMULATOR) |
| #define MAX_PROCESSORS (128) /* Maximum number of processors |
| (i.e., processes) created */ |
| #define MAX_TASKQUEUES (128) /* Maximum number of task queues */ |
| #define MAX_TASKS (32768) /* # of available task descriptors */ |
| #define MAX_PATCHES (1024) /* # of available patch objects */ |
| #define MAX_ELEMENTS (80000) /* # of available element objects */ |
| #define MAX_INTERACTIONS (640000) /* # of available interaction objs */ |
| #define MAX_ELEMVERTICES (65536) /* # of available ElemVertex objs */ |
| #define MAX_EDGES (65536) /* # of available Edge objs */ |
| #endif |
| |
| #if defined(DASH) |
| #define MAX_PROCESSORS (64) /* Maximum number of processors |
| (i.e., processes) created */ |
| #define MAX_TASKQUEUES (64) /* Maximum number of task queues */ |
| #define MAX_TASKS (32768) /* # of available task descriptors */ |
| #define MAX_PATCHES (1024) /* # of available patch objects */ |
| #define MAX_ELEMENTS (80000) /* # of available element objects */ |
| #define MAX_INTERACTIONS (640000) /* # of available interaction objs */ |
| #define MAX_ELEMVERTICES (65536) /* # of available ElemVertex objs */ |
| #define MAX_EDGES (65536) /* # of available Edge objs */ |
| #endif |
| |
| #if defined(SGI_GL) |
| #define MAX_PROCESSORS (8) /* Maximum number of processors |
| (i.e., processes) created */ |
| #define MAX_TASKQUEUES (8) /* Maximum number of task queues */ |
| #define MAX_TASKS (8192) /* # of available task descriptors */ |
| #define MAX_PATCHES (1024) /* # of available patch objects */ |
| #define MAX_ELEMENTS (40000) /* # of available element objects */ |
| #define MAX_INTERACTIONS (320000) /* # of available interaction objs */ |
| #define MAX_ELEMVERTICES (16384) /* # of available ElemVertex objs */ |
| #define MAX_EDGES (65536) /* # of available Edge objs */ |
| #endif |
| |
| #if defined(SUN4) |
| #define MAX_PROCESSORS (1) /* Maximum number of processors |
| (i.e., processes) created */ |
| #define MAX_TASKQUEUES (1) /* Maximum number of task queues */ |
| #define MAX_TASKS (1024) /* # of available task descriptors */ |
| #define MAX_PATCHES (1024) /* # of available patch objects */ |
| #define MAX_ELEMENTS (20000) /* # of available element objects */ |
| #define MAX_INTERACTIONS (160000) /* # of available interaction objs */ |
| #define MAX_ELEMVERTICES (16384) /* # of available ElemVertex objs */ |
| #define MAX_EDGES (32768) /* # of available Edge objs */ |
| #endif |
| |
| #if (!defined(SIMULATOR) && !defined(DASH) && !defined(SGI_GL) && !defined(SUN4)) |
| #define MAX_PROCESSORS (128) /* Maximum number of processors |
| (i.e., processes) created */ |
| #define MAX_TASKQUEUES (128) /* Maximum number of task queues */ |
| #define MAX_TASKS (32768) /* # of available task descriptors */ |
| #define MAX_PATCHES (1024) /* # of available patch objects */ |
| #define MAX_ELEMENTS (80000) /* # of available element objects */ |
| #define MAX_INTERACTIONS (640000) /* # of available interaction objs */ |
| #define MAX_ELEMVERTICES (65536) /* # of available ElemVertex objs */ |
| #define MAX_EDGES (65536) /* # of available Edge objs */ |
| #endif |
| |
| #define MAX_SHARED_LOCK (3900) /* Maximum locks allocated. Objects |
| share these locks */ |
| |
| #if defined(SGI_GL) || defined(DASH) || defined(SIMULATOR) |
| #define CLOCK_MAX_VAL (2048*1000000) /* ANL macro clock max value */ |
| #elif defined(SUN4) |
| #define CLOCK_MAX_VAL (65536*1000000) /* ANL macro clock max value */ |
| #else |
| #define CLOCK_MAX_VAL (2048*1000000) /* ANL macro clock max value */ |
| #endif |
| |
| |
| |
| /**************************************** |
| * |
| * System defaults |
| * |
| *****************************************/ |
| |
| #define DEFAULT_N_PROCESSORS (1) |
| #define DEFAULT_N_TASKQUEUES (1) |
| #define DEFAULT_N_TASKS_PER_QUEUE (200) |
| /* Create new tasks if number of tasks currently |
| in the queue is less than this number */ |
| #define DEFAULT_N_INTER_PARALLEL_BF_REFINEMENT (5) |
| /* If the number of interactions is greater than |
| or equal to this value, BF-refinement is |
| performed in parallel */ |
| #define DEFAULT_N_VISIBILITY_PER_TASK (4) |
| /* Number of visibility computations per |
| visibility task */ |
| #define DEFAULT_AREA_EPSILON (2000.0) |
| /* If element is smaller than this value, |
| no further subdivision takes place */ |
| #define DEFAULT_ENERGY_EPSILON (0.005) |
| /* Terminate radiosity iteration if the |
| difference of total energy is less than this |
| value. */ |
| #define DEFAULT_BFEPSILON (0.015) |
| /* BF refinement threshold level. If the estimated |
| error of BF (due to FF error and error due to |
| constant approximation within an element) is |
| larger than this value, then subdivide */ |
| |
| #define DFLT_VIEW_ROT_X (10.0) |
| #define DFLT_VIEW_ROT_Y (0.0) |
| #define DFLT_VIEW_DIST (8000.0) |
| #define DFLT_VIEW_ZOOM (1.0) |
| |
| |
| /**************************************** |
| * |
| * Display mode |
| * |
| *****************************************/ |
| |
| #define DISPLAY_FILLED (0) |
| #define DISPLAY_SHADED (1) |
| #define DISPLAY_EDGEONLY (2) |
| |
| #define DISPLAY_ALL_INTERACTIONS (0) |
| #define DISPLAY_HALF_INTERACTIONS (1) |
| |
| |
| |
| /**************************************** |
| * |
| * Statistical Measure |
| * |
| *****************************************/ |
| |
| #define MAX_ITERATION_INFO (16) |
| |
| struct _element ; |
| |
| typedef struct |
| { |
| int visibility_comp ; |
| int ray_intersect_test ; |
| int tasks_from_myq ; |
| int tasks_from_otherq ; |
| int process_tasks_wait ; |
| struct _element *last_pr_task ; |
| } PerIterationInfo ; |
| |
| |
| typedef struct |
| { |
| char pad1[PAGE_SIZE]; /* padding to avoid false-sharing |
| and allow page-placement */ |
| int total_modeling_tasks ; |
| int total_def_patch_tasks ; |
| int total_ff_ref_tasks ; |
| int total_ray_tasks ; |
| int total_radavg_tasks ; |
| int total_direct_radavg_tasks ; |
| int total_interaction_comp ; |
| int total_visibility_comp ; |
| int partially_visible ; |
| int total_ray_intersect_test ; |
| int total_patch_cache_check ; |
| int total_patch_cache_hit ; |
| int patch_cache_hit[PATCH_CACHE_SIZE] ; |
| PerIterationInfo per_iteration[ MAX_ITERATION_INFO ] ; |
| char pad2[PAGE_SIZE]; /* padding to avoid false-sharing |
| and allow page-placement */ |
| } StatisticalInfo ; |
| |
| extern void init_stat_info() ; |
| |
| /**************************************** |
| * |
| * Shared data structure definition. |
| * |
| *****************************************/ |
| |
| typedef struct |
| { |
| long int rad_start, rad_time, refine_time, wait_time, vertex_time; |
| } Timing; |
| |
| typedef struct |
| { |
| |
| /* Task queue */ |
| /* ***** */ int index; |
| /* ***** */ LOCKDEC(index_lock) |
| Task_Queue task_queue[ MAX_TASKQUEUES ] ; |
| Task task_buf[ MAX_TASKS ] ; |
| |
| /* BSP tree root */ |
| LOCKDEC(bsp_tree_lock) |
| Patch *bsp_root ; |
| |
| /* Average radiosity value */ |
| LOCKDEC(avg_radiosity_lock) |
| int converged ; |
| Rgb prev_total_energy ; |
| Rgb total_energy ; |
| float total_patch_area ; |
| int iteration_count ; |
| |
| /* Computation cost estimate */ |
| LOCKDEC(cost_sum_lock) |
| int cost_sum ; |
| int cost_estimate_sum ; |
| Patch_Cost patch_cost[ MAX_PATCHES ] ; |
| |
| /* Barrier */ |
| BARDEC(barrier) |
| |
| /* Private varrier */ |
| int pbar_count ; |
| LOCKDEC(pbar_lock) |
| |
| /* Task initializer counter */ |
| int task_counter ; |
| LOCKDEC(task_counter_lock) |
| |
| /* Resource buffers */ |
| LOCKDEC(free_patch_lock) |
| Patch *free_patch ; |
| int n_total_patches ; |
| int n_free_patches ; |
| Patch patch_buf[ MAX_PATCHES ] ; |
| |
| LOCKDEC(free_element_lock) |
| Element *free_element ; |
| int n_free_elements ; |
| Element element_buf[ MAX_ELEMENTS ] ; |
| |
| LOCKDEC(free_interaction_lock) |
| Interaction *free_interaction ; |
| int n_free_interactions ; |
| Interaction interaction_buf[ MAX_INTERACTIONS ] ; |
| |
| LOCKDEC(free_elemvertex_lock) |
| int free_elemvertex ; |
| ElemVertex elemvertex_buf[ MAX_ELEMVERTICES ] ; |
| |
| LOCKDEC(free_edge_lock) |
| int free_edge ; |
| Edge edge_buf[ MAX_EDGES ] ; |
| |
| Shared_Lock sh_lock[ MAX_SHARED_LOCK ] ; |
| |
| StatisticalInfo stat_info[ MAX_PROCESSORS ] ; |
| |
| } Global ; |
| |
| |
| /**************************************** |
| * |
| * Global variables |
| * |
| *****************************************/ |
| |
| extern Timing **timing ; |
| extern Global *global ; |
| extern int n_processors ; |
| extern int n_taskqueues ; |
| extern int n_tasks_per_queue ; |
| |
| extern int N_inter_parallel_bf_refine ; |
| extern int N_visibility_per_task ; |
| extern float Area_epsilon ; |
| extern float Energy_epsilon ; |
| extern float BFepsilon ; |
| |
| extern int batch_mode, verbose_mode ; |
| extern int taskqueue_id[] ; |
| |
| extern long time_rad_start, time_rad_end, time_process_start[] ; |
| |
| |
| /**************************************** |
| * |
| * Global function names & types |
| * |
| *****************************************/ |
| |
| extern void init_global() ; |
| extern void init_visibility_module() ; |
| |
| extern void radiosity_averaging() ; |
| extern void setup_view() ; |
| extern void display_scene() ; |
| extern void display_patch(), display_patches_in_bsp_tree() ; |
| extern void display_element(), display_elements_in_patch() ; |
| extern void display_elements_in_bsp_tree() ; |
| extern void display_interactions_in_element() ; |
| extern void display_interactions_in_patch() ; |
| extern void display_interactions_in_bsp_tree() ; |
| |
| extern void ps_display_scene() ; |
| extern void ps_display_patch(), ps_display_patches_in_bsp_tree() ; |
| extern void ps_display_element(), ps_display_elements_in_patch() ; |
| extern void ps_display_elements_in_bsp_tree() ; |
| extern void ps_display_interactions_in_element() ; |
| extern void ps_display_interactions_in_patch() ; |
| extern void ps_display_interactions_in_bsp_tree() ; |
| |
| extern void print_statistics() ; |
| extern void print_running_time(), print_fork_time() ; |
| extern void print_usage() ; |
| |
| extern void clear_radiosity(), clear_patch_radiosity() ; |
| |
| extern void exit() ; |
| |
| |
| #endif |