gem5/splash2/codes/apps/radiosity/modelman.C
Sanchayan Maity 0f4b39775c Fix splash2 benchmark
During the last commit of splash2 benchmark it seems before committing
when we ran "make clean", it effectively undid what the patch at below
link did
http://www.capsl.udel.edu/splash/Download.html

Fix this since without this it is not possible to build the arcane
splash2 benchmark.
2017-04-26 21:33:02 +05:30

296 lines
10 KiB
C

/*************************************************************************/
/* */
/* 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. */
/* */
/*************************************************************************/
/************************************************************************
*
* Model definition & management.
*
* This module has the following functions:
* (1) Create modeling tasks.
* (2) Process modeling tasks.
*
*************************************************************************/
#include <stdio.h>
EXTERN_ENV;
include(radiosity.h)
static void init_test_model_tasks(long process_id);
static void init_room_model_tasks(ModelDataBase *model, long process_id);
static void process_triangle(Model_Triangle *model, long process_id);
static void process_rectangle(Model_Rectangle *model, long process_id);
/***************************************************************************
*
* Test Model definitions.
*
****************************************************************************/
#define WHITE { 0.9, 0.9, 0.9 }
#define GREEN { 0.1, 0.9, 0.1 }
#define PASSIVE { 0.0, 0.0, 0.0 }
#define WHITE_LIGHT { 200.0, 200.0, 200.0 }
Model_Triangle tri1 = { WHITE,
PASSIVE,
{ 0.0, 0.0, 0.0 },
{ 100.0, 0.0, 0.0 },
{ 0.0, 100.0, 0.0 } } ;
Model_Triangle tri2 = { WHITE,
PASSIVE,
{ 0.0, 0.0, 100.0 },
{ 100.0, 100.0, 0.0 },
{ 0.0, 0.0, -100.0 } } ;
Model_Rectangle Floor = { WHITE,
PASSIVE,
{ 600.0, -600.0, 700.0 },
{ 600.0, -600.0, -700.0 },
{ -800.0, -600.0, 700.0 } } ;
Model_Rectangle Ceiling = { WHITE,
PASSIVE,
{ 600.0, 600.0, 700.0 },
{ -800.0, 600.0, 700.0 },
{ 600.0, 600.0, -700.0 } } ;
Model_Rectangle wall1 = { WHITE,
PASSIVE,
{ -800.0, -600.0, 700.0 },
{ -800.0, -600.0, -700.0 },
{ -800.0, 600.0, 700.0 } } ;
Model_Rectangle wall2 = { WHITE,
PASSIVE,
{ 600.0, -600.0, -700.0 },
{ 600.0, 600.0, -700.0 },
{ -800.0, -600.0, -700.0 } } ;
Model_Rectangle deskTop = { GREEN,
PASSIVE,
{ -795.0, -320.0, 300.0 },
{ -400.0, -320.0, 300.0 },
{ -795.0, -320.0, -300.0 } } ;
Model_Rectangle deskBtm = { GREEN,
PASSIVE,
{ -795.0, -340.0, 300.0 },
{ -795.0, -340.0, -300.0 },
{ -400.0, -340.0, 300.0 } } ;
Model_Rectangle light1 = { WHITE,
WHITE_LIGHT,
{ -795.0, -50.0, 50.0 },
{ -795.0, -50.0, -50.0 },
{ -795.0, 50.0, 50.0 } } ;
/***************************************************************************
****************************************************************************
*
* Methods of Model object
*
****************************************************************************
****************************************************************************/
/***************************************************************************
*
* init_modeling_tasks()
*
* Initialize modeling task.
*
****************************************************************************/
long model_selector = MODEL_TEST_DATA ;
void init_modeling_tasks(long process_id)
{
extern ModelDataBase room_model[] ;
extern ModelDataBase largeroom_model[] ;
if( ! check_task_counter() )
return ;
switch( model_selector )
{
case MODEL_TEST_DATA:
default:
init_test_model_tasks(process_id) ;
break ;
case MODEL_ROOM_DATA:
init_room_model_tasks( room_model, process_id ) ;
break ;
case MODEL_LARGEROOM_DATA:
init_room_model_tasks( largeroom_model, process_id ) ;
break ;
}
}
static void init_test_model_tasks(long process_id)
{
create_modeling_task( (Model*)&Floor, MODEL_RECTANGLE, process_id ) ;
create_modeling_task( (Model*)&Ceiling, MODEL_RECTANGLE, process_id ) ;
create_modeling_task( (Model*)&wall1, MODEL_RECTANGLE, process_id ) ;
create_modeling_task( (Model*)&wall2, MODEL_RECTANGLE, process_id ) ;
create_modeling_task( (Model*)&deskTop, MODEL_RECTANGLE, process_id ) ;
create_modeling_task( (Model*)&deskBtm, MODEL_RECTANGLE, process_id ) ;
create_modeling_task( (Model*)&light1, MODEL_RECTANGLE, process_id ) ;
}
static void init_room_model_tasks(ModelDataBase *model, long process_id)
{
ModelDataBase *pm ;
for( pm = model ; pm->type != MODEL_NULL ; pm++ )
create_modeling_task( &pm->model, pm->type, process_id ) ;
}
/***************************************************************************
*
* process_model()
*
****************************************************************************/
void process_model(Model *model, long type, long process_id)
{
switch( type )
{
case MODEL_TRIANGLE:
process_triangle( (Model_Triangle *)model, process_id ) ;
break ;
case MODEL_RECTANGLE:
process_rectangle( (Model_Rectangle *)model, process_id ) ;
break ;
default:
fprintf( stderr, "Panic:process_model:Illegal type %ld\n", type ) ;
}
}
/***************************************************************************
*
* process_triangle()
*
****************************************************************************/
static void process_triangle(Model_Triangle *model, long process_id)
{
Patch *p ;
float length ;
/* Create a patch */
p = get_patch(process_id) ;
/* (1) Set the Vertecies */
p->p1 = model->p1 ;
p->p2 = model->p2 ;
p->p3 = model->p3 ;
/* (2) Create the Edges */
p->ev1 = create_elemvertex( &p->p1, process_id ) ;
p->ev2 = create_elemvertex( &p->p2, process_id ) ;
p->ev3 = create_elemvertex( &p->p3, process_id ) ;
p->e12 = create_edge( p->ev1, p->ev2, process_id ) ;
p->e23 = create_edge( p->ev2, p->ev3, process_id ) ;
p->e31 = create_edge( p->ev3, p->ev1, process_id ) ;
/* (3) Other patch properties */
length = comp_plane_equ( &p->plane_equ,
&model->p1, &model->p2, &model->p3, process_id ) ;
p->area = length * (float)0.5 ;
p->color = model->color ;
p->emittance = model->emittance ;
/* Create a BSP insertion task */
create_bsp_task( p, global->bsp_root, process_id ) ;
}
/***************************************************************************
*
* process_rectangle()
*
****************************************************************************/
static void process_rectangle(Model_Rectangle *model, long process_id)
{
Patch *p, *q ;
float length ;
/* Create a patch (P1-P2-P3) */
p = get_patch(process_id) ;
/* (1) Set the Vertecies */
p->p1 = model->p1 ;
p->p2 = model->p2 ;
p->p3 = model->p3 ;
/* (2) Create the Edges */
p->ev1 = create_elemvertex( &p->p1, process_id ) ;
p->ev2 = create_elemvertex( &p->p2, process_id ) ;
p->ev3 = create_elemvertex( &p->p3, process_id ) ;
p->e12 = create_edge( p->ev1, p->ev2, process_id ) ;
p->e23 = create_edge( p->ev2, p->ev3, process_id ) ;
p->e31 = create_edge( p->ev3, p->ev1, process_id ) ;
/* (3) Other patch properties */
length = comp_plane_equ( &p->plane_equ,
&model->p1, &model->p2, &model->p3, process_id ) ;
p->area = length * (float)0.5 ;
p->color = model->color ;
p->emittance= model->emittance ;
/* Create a patch (P(2+3-1)-P3-P2) */
q = get_patch(process_id) ;
/* (1) Set the Vertices */
q->p1.x = model->p2.x + model->p3.x - model->p1.x ;
q->p1.y = model->p2.y + model->p3.y - model->p1.y ;
q->p1.z = model->p2.z + model->p3.z - model->p1.z ;
q->p2 = model->p3 ;
q->p3 = model->p2 ;
/* (2) Create the Edges */
q->ev1 = create_elemvertex( &q->p1, process_id ) ;
q->ev2 = p->ev3 ;
q->ev3 = p->ev2 ;
q->e12 = create_edge( q->ev1, q->ev2, process_id ) ;
q->e23 = p->e23 ;
q->e31 = create_edge( q->ev3, q->ev1, process_id ) ;
/* (3) Other patch properties */
q->plane_equ= p->plane_equ ;
q->area = p->area ;
q->color = p->color ;
q->emittance= p->emittance ;
/* Create BSP insertion tasks */
create_bsp_task( p, global->bsp_root, process_id ) ;
create_bsp_task( q, global->bsp_root, process_id ) ;
}