00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "test_fill.h"
00010
00011
00012
00013 TestFill::TestFill(int _duration, int _type, TScene *s) : Test(_duration, _type, s)
00014 {
00015 splits = 1;
00016
00017
00018 resx = s->GetResX();
00019 resy = s->GetResY();
00020
00021
00022 s->MoveCameraAbs(0.0f,0.0f,-0.21f);
00023 s->RotateCameraAbs(90.0,A_X);
00024
00025 s->AddMaterial("fill_mat",white,white,white,64.0f,0.0f,0.1f,NONE);
00026
00027 glGetIntegerv(GL_MAX_TEXTURE_UNITS, &tex_units);
00028
00029 if(type >= TEXEL_FILLRATE_MULTI)
00030 surfaces = SURFACES/tex_units;
00031 else
00032 surfaces = SURFACES;
00033
00034 switch(type)
00035 {
00036 case TEXEL_FILLRATE_SINGLE:
00037 testname = "texel_fillrate_single";
00038 weight = 0.15f;
00039 s->SetLoadList(surfaces + 2);
00040
00041 try
00042 {
00043 s->AddTexture("fill_mat","data/tex/single.tga",BASE,MODULATE,1.0,1.0,1.0);
00044 }
00045 catch(int err)
00046 {
00047 stopbit = true;
00048 throw ERR;
00049 return;
00050 }
00051 break;
00052
00053 case TEXEL_FILLRATE_MULTI:
00054 testname = "texel_fillrate_multi";
00055 weight = 0.30f;
00056 s->SetLoadList(surfaces + tex_units + 1);
00057 try
00058 {
00059
00060 for(int i = 0; i < tex_units/2; i++)
00061 {
00062 s->AddTexture("fill_mat","data/tex/multi.tga",BASE,MODULATE,1.5,1.0,1.0);
00063 s->AddTexture("fill_mat","data/tex/multi.tga",BASE,ADD,1.5,1.0,1.0);
00064 }
00065 }
00066 catch(int err)
00067 {
00068 stopbit = true;
00069 throw ERR;
00070 return;
00071 }
00072 break;
00073 case TEXEL_FILLRATE_FLOAT16:
00074 testname = "texel_fillrate_float16";
00075 weight = 0.40f;
00076 s->SetLoadList(surfaces + tex_units + 1);
00077 try
00078 {
00079 for(int i = 0; i < tex_units/2; i++)
00080 {
00081 s->AddTexture("fill_mat","data/tex/multi.tga",BASE,MODULATE,1.5,1.0,1.0);
00082 s->AddTexture("fill_mat","data/tex/multi.tga",BASE,ADD,1.5,1.0,1.0);
00083 }
00084
00085 s->UseHDR(true);
00086 s->CreateRenderTarget(resx,resy,GL_RGBA16F, GL_FLOAT);
00087
00088
00089 s->SetUniform("mat_tonemap","exposure",1.0);
00090 s->SetUniform("mat_tonemap","bloomFactor",1.0);
00091 s->SetUniform("mat_tonemap","brightMax",1.0);
00092 s->SetUniform("mat_tonemap","ssao_only",false);
00093 s->SetUniform("mat_bloom_hdr","THRESHOLD",0.0);
00094 s->SetUniform("mat_blur_horiz","kernel_size",1);
00095 s->SetUniform("mat_blur_horiz","blur_radius",0.0);
00096 s->SetUniform("mat_blur_vert","kernel_size",1);
00097 s->SetUniform("mat_blur_vert","blur_radius",0.0);
00098 }
00099 catch(int err)
00100 {
00101 stopbit = true;
00102 throw ERR;
00103 return;
00104 }
00105 break;
00106 case TEXEL_FILLRATE_FLOAT32:
00107 testname = "texel_fillrate_float32";
00108 weight = 0.15f;
00109 s->SetLoadList(surfaces + tex_units + 1);
00110 try
00111 {
00112 for(int i = 0; i < tex_units/2; i++)
00113 {
00114 s->AddTexture("fill_mat","data/tex/multi.tga",BASE,MODULATE,1.5,1.0,1.0);
00115 s->AddTexture("fill_mat","data/tex/multi.tga",BASE,ADD,1.5,1.0,1.0);
00116 }
00117
00118 s->UseHDR(true);
00119 s->CreateRenderTarget(resx,resy,GL_RGBA32F, GL_FLOAT);
00120
00121
00122 s->SetUniform("mat_tonemap","exposure",1.0);
00123 s->SetUniform("mat_tonemap","bloomFactor",1.0);
00124 s->SetUniform("mat_tonemap","brightMax",1.0);
00125 s->SetUniform("mat_tonemap","ssao_only",false);
00126 s->SetUniform("mat_bloom_hdr","THRESHOLD",0.0);
00127 s->SetUniform("mat_blur_horiz","kernel_size",1);
00128 s->SetUniform("mat_blur_horiz","blur_radius",0.0);
00129 s->SetUniform("mat_blur_vert","kernel_size",1);
00130 s->SetUniform("mat_blur_vert","blur_radius",0.0);
00131 }
00132 catch(int err)
00133 {
00134 stopbit = true;
00135 throw ERR;
00136 return;
00137 }
00138 break;
00139 default:
00140 stopbit = true;
00141 throw ERR;
00142 break;
00143 };
00144
00145
00146 for(int i = 0; i < surfaces; i++)
00147 {
00148 obj_name = "surface" + num2str(i);
00149 s->AddObject(obj_name.c_str(),PLANE,1.0,1.0);
00150 s->MoveObjAbs(obj_name.c_str(),0.0f, -surfaces*0.01f + 0.01f*i,0.0f);
00151 s->SetMaterial(obj_name.c_str(),"fill_mat");
00152 }
00153
00154 if(!s->PostInit())
00155 stopbit = true;
00156
00157
00158 InitTime();
00159 }
00160
00161
00162
00163 TestFill::~TestFill()
00164 {
00165 s->Destroy();
00166 }
00167
00168
00169
00170 void TestFill::Run()
00171 {
00172 Test::Run();
00173 if(!draw_scene) return;
00174
00175 for(int i = 0; i < surfaces; i++)
00176 {
00177 obj_name = "surface" + num2str(i);
00178 s->RotateObj(obj_name.c_str(),sin(anim)*i/200.0f,A_Y);
00179 }
00180 s->Redraw();
00181 msg = num2str((fps*resx*resy)/1000000.0f * SURFACES) + " MTexels/s";
00182 s->DrawScreenText(msg.c_str(), 90.0, 1.0);
00183 }
00184
00185
00186
00187 void TestFill::Animate()
00188 {
00189 Test::Animate();
00190
00191
00192
00193
00194
00195
00196
00197 }
00198
00199
00200
00201 void TestFill::SaveResults()
00202 {
00203 Test::SaveResults();
00204
00205 fillrate = avg_fps*resx*resy/1000000.0f*SURFACES;
00206
00207
00208 switch(type)
00209 {
00210 case TEXEL_FILLRATE_SINGLE:
00211 test_score += fillrate/110;
00212 break;
00213 case TEXEL_FILLRATE_MULTI:
00214 test_score += fillrate/190;
00215 break;
00216 case TEXEL_FILLRATE_FLOAT16:
00217 test_score += fillrate/50;
00218 break;
00219 case TEXEL_FILLRATE_FLOAT32:
00220 test_score += fillrate/12.5f;
00221 break;
00222 }
00223 cout<<"SCORE: "<<test_score<<endl;
00224
00225 if(type == TEXEL_FILLRATE_SINGLE)
00226 results<<"<fillrate>\n";
00227
00228 results<< "<"<<testname<<">\n"<<
00229 "<fps>"<<avg_fps<<"</fps>\n"<<
00230 "<fill_rate>"<<fillrate<<"</fill_rate>\n"
00231 "<score>"<<test_score<<"</score>"
00232 "</"<<testname<<">\n";
00233
00234 if(type == TEXEL_FILLRATE_FLOAT32)
00235 results<<"</fillrate>\n";
00236
00237 }