00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "test.h"
00010
00018 Test::Test(int _duration, int _type, TScene *ps)
00019 {
00020 s = ps;
00021
00022
00023 avg_fps = 0.0;
00024 fps = 100.0;
00025 type = _type;
00026 duration = _duration;
00027 total_frames = 0;
00028 anim = 0.1f;
00029 stopbit = false;
00030 curr_setup = 1;
00031 splitbit = true;
00032 start_time = 2000000000;
00033
00034 test_score = 0;
00035
00036
00037 s->AddMaterial("mat_load_polygon",white,white,white,64.0,0.0,0.0,NONE);
00038 s->AddTexture("mat_load_polygon","data/load.tga",BASE);
00039 s->CustomShader("mat_load_polygon","data/shaders/quad.vert",NULL,"data/shaders/load_quad.frag");
00040
00041 s->AddMaterial("mat_background_quad",white,white,white,64.0,0.0,0.0,NONE);
00042 s->AddTexture("mat_background_quad","data/background.tga",BASE);
00043 s->CustomShader("mat_background_quad","data/shaders/quad.vert",NULL,"data/shaders/load_quad.frag");
00044
00045
00046 string screen_testname;
00047 switch(type)
00048 {
00049 case TEXEL_FILLRATE_SINGLE:
00050 screen_testname = "Texel Fillrate(Single texturing)";
00051 break;
00052 case TEXEL_FILLRATE_MULTI:
00053 screen_testname = "Texel Fillrate(Multi texturing)";
00054 break;
00055 case TEXEL_FILLRATE_FLOAT16:
00056 screen_testname = "Texel Fillrate(16-bit floating point textures)";
00057 break;
00058 case TEXEL_FILLRATE_FLOAT32:
00059 screen_testname = "Texel Fillrate(32-bit floating point textures)";
00060 break;
00061 case FRAG_LIGHTS:
00062 screen_testname = "Per-pixel point lights";
00063 break;
00064 case FRAG_NOISE:
00065 screen_testname = "Perlin noise";
00066 break;
00067 case FRAG_PROCEDURAL:
00068 screen_testname = "Procedural shaders";
00069 break;
00070 case FRAG_PARALLAX:
00071 screen_testname = "Parallax mapping";
00072 break;
00073 case FRAG_REFRACT:
00074 screen_testname = "Static reflections&refractions";
00075 break;
00076 case GEOM_TESSELATE:
00077 screen_testname = "Tesselation with depth map";
00078 break;
00079 case GEOM_CUBEMAP:
00080 screen_testname = "Single-pass dynamic cubemapping";
00081 break;
00082 case GEOM_PARTICLES:
00083 screen_testname = "GPU particles";
00084 break;
00085 case GEOM_INSTANCING:
00086 screen_testname = "Geometry shader instancing";
00087 break;
00088 case VERT_LIGHTS:
00089 screen_testname = "High polygon count, per-vertex point lights";
00090 break;
00091 case VERT_WAVES:
00092 screen_testname = "GPU generated waves";
00093 break;
00094 case VERT_DISPLACE:
00095 screen_testname = "Vertex displacement mapping";
00096 break;
00097 case COMPLEX_HDR:
00098 screen_testname = "HDR lighting";
00099 break;
00100 case COMPLEX_SSAO:
00101 screen_testname = "Screen space ambient occlusion";
00102 break;
00103 case COMPLEX_SHADOW:
00104 screen_testname = "Dynamic soft shadows";
00105 break;
00106 case COMPLEX_SSAMPLING:
00107 screen_testname = "Render with supersampling";
00108 break;
00109 case COMPUTE_NBODY:
00110 screen_testname = "N-Body simulation";
00111 break;
00112 default: break;
00113 }
00114 s->TestName(screen_testname);
00115
00116 cout<<"\n---------------------------------------------\n"
00117 "Initializing test "<<screen_testname<<":\n";
00118 }
00119
00120
00125 void Test::Run()
00126 {
00127 draw_scene = true;
00128
00129 if(SDL_GetTicks() < start_time)
00130 {
00131 s->LoadScreen(false);
00132 draw_scene = false;
00133 }
00134
00135 if(draw_scene)
00136 {
00137
00138 if(SDL_GetTicks() - split_time >= duration/splits)
00139 {
00140 splitbit = true;
00141 SaveResults();
00142 total_frames = 0;
00143 split_time = SDL_GetTicks();
00144 curr_setup++;
00145
00146
00147 if(curr_setup > splits)
00148 {
00149 stopbit = true;
00150 draw_scene = false;
00151 cout<<"Test finished.\n";
00152 }
00153 }
00154
00155 if(draw_scene)
00156 total_frames++;
00157 }
00158 }
00159
00160
00165 void Test::SaveResults()
00166 {
00167
00168 avg_fps = (float)total_frames/(duration/1000.0f/splits);
00169 cout<<"Split FPS: "<<avg_fps<<endl;
00170 }
00171
00176 void SystemInfo()
00177 {
00178 string os,cpuinfo,cpufreq,meminfo;
00179 char vram[4];
00180
00182 #ifdef _WIN_
00183 os = "Windows";
00185
00186
00187 HKEY hkey;
00188 LONG ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
00189 "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0",0,KEY_READ,&hkey);
00190
00191 DWORD size = 0;
00192 ret = RegQueryValueEx(hkey,"ProcessorNameString",0,NULL,0,&size);
00193
00194 char *cpustr = new TCHAR[size];
00195 ret = RegQueryValueEx(hkey,"ProcessorNameString",0,NULL,(LPBYTE)cpustr,&size);
00196 cpuinfo = cpustr;
00197
00198
00199 DWORD freq;
00200 ret = RegQueryValueEx(hkey,"~MHz",0,NULL,(LPBYTE)&freq,&size);
00201 string fr;
00202 fr = num2str(freq);
00203 cpufreq = fr;
00204 RegCloseKey(hkey);
00205
00206
00207 MEMORYSTATUS mem;
00208 mem.dwLength = sizeof(mem);
00209 GlobalMemoryStatus(&mem);
00210 string memsize;
00211 memsize = num2str(mem.dwTotalPhys/1048576) + " MB";
00212 meminfo = memsize;
00213
00214
00215
00216 RegOpenKeyEx(HKEY_LOCAL_MACHINE,"HARDWARE\\DEVICEMAP\\VIDEO",0,KEY_READ,&hkey);
00217 RegQueryValueEx(hkey,"\\Device\\Video0",0,NULL,0,&size);
00218
00219 char *gfxlocR = new TCHAR[size];
00220 RegQueryValueEx(hkey,"\\Device\\Video0",0,NULL,(LPBYTE)gfxlocR,&size);
00221
00222 string gfxlocA = gfxlocR;
00223 gfxlocA.erase(0,18);
00224
00225
00226 RegOpenKeyEx(HKEY_LOCAL_MACHINE, gfxlocA.c_str(),0,KEY_READ,&hkey);
00227 RegQueryValueEx(hkey,"HardwareInformation.MemorySize",0,NULL,(LPBYTE)vram,&size);
00228
00229 #else
00230 os = "Linux";
00232 string tmp;
00233
00234 ifstream fin("/proc/cpuinfo");
00235 while(getline(fin,tmp))
00236 {
00237 if(tmp.find("model name") != string::npos)
00238 {
00239 tmp.erase(0,tmp.find(':')+2);
00240 cpuinfo = tmp;
00241 }
00242 else if(tmp.find("cpu MHz") != string::npos)
00243 {
00244 tmp.erase(0,tmp.find(':')+2);
00245 cpufreq = tmp;
00246 }
00247 }
00248 fin.close();
00249
00250
00251 fin.open("/proc/meminfo");
00252 int memsize;
00253 char memchar[16];
00254 while(getline(fin,tmp))
00255 {
00256 if(tmp.find("MemTotal") != string::npos)
00257 {
00258 tmp.erase(0,tmp.find(':') + 8);
00259 sscanf(tmp.c_str(),"%d",&memsize);
00260 memsize /= 1024;
00261 sprintf(memchar,"%d MB",memsize);
00262 meminfo = memchar;
00263 break;
00264 }
00265 }
00266 fin.close();
00267
00268 vram[3] = 0;
00269 #endif
00270
00272 int props[17];
00273 glGetIntegerv(GL_MAX_TEXTURE_SIZE,&props[0]);
00274 glGetIntegerv(GL_MAX_3D_TEXTURE_SIZE,&props[1]);
00275 glGetIntegerv(GL_MAX_ARRAY_TEXTURE_LAYERS,&props[2]);
00276 if(props[2] > 16536)
00277 props[2] = 0;
00278 glGetIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE,&props[3]);
00279 glGetIntegerv(GL_MAX_RENDERBUFFER_SIZE,&props[4]);
00280 glGetIntegerv(GL_MAX_DRAW_BUFFERS,&props[5]);
00281 glGetIntegerv(GL_MAX_SAMPLES,&props[6]);
00282 glGetIntegerv(GL_NUM_EXTENSIONS,&props[7]);
00283 glGetIntegerv(GL_MAX_ELEMENTS_INDICES,&props[8]);
00284 glGetIntegerv(GL_MAX_ELEMENTS_VERTICES,&props[9]);
00285
00286 glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS,&props[10]);
00287 glGetIntegerv(GL_MAX_VARYING_COMPONENTS,&props[11]);
00288 glGetIntegerv(GL_MAX_VERTEX_ATTRIBS,&props[12]);
00289 glGetIntegerv(GL_MAX_VERTEX_UNIFORM_COMPONENTS,&props[13]);
00290 if(GLEW_ARB_geometry_shader4 || GLEW_EXT_geometry_shader4 || GLEW_EXT_gpu_shader4)
00291 {
00292 glGetIntegerv(GL_MAX_GEOMETRY_OUTPUT_VERTICES,&props[14]);
00293 glGetIntegerv(GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS,&props[15]);
00294 }
00295 else
00296 {
00297 props[14] = 0;
00298 props[15] = 0;
00299 }
00300 glGetIntegerv(GL_MAX_FRAGMENT_UNIFORM_COMPONENTS,&props[16]);
00301
00302
00303 string supports[5];
00304 for(unsigned i=0; i<5; i++)
00305 supports[i] = "NO";
00306
00307 if(GLEW_ARB_draw_buffers)
00308 supports[0] = "YES";
00309 if(GLEW_ARB_draw_instanced || GLEW_EXT_draw_instanced)
00310 supports[1] = "YES";
00311 if(GLEW_ARB_geometry_shader4 || GLEW_EXT_geometry_shader4 || GLEW_EXT_gpu_shader4)
00312 supports[2] = "YES";
00313 if(GLEW_ARB_texture_float)
00314 supports[3] = "YES";
00315 if(GLEW_EXT_framebuffer_multisample)
00316 supports[4] = "YES";
00317
00318
00319 string vram_str;
00320 if(vram[3] < 32)
00321 vram_str = "N/A";
00322 else
00323 vram_str = num2str(vram[3]*16);
00324
00326 results<< "<sysinfo>\n"
00327 "<system>\n"
00328 "<os>"<<os<<"</os>\n"
00329 "<cpu>"<<cpuinfo<<"</cpu>\n"
00330 "<cpufreq>"<<cpufreq<<"</cpufreq>\n"
00331 "<memory>"<<meminfo<<"</memory>\n"
00332 "</system>\n"
00333
00334 "<gfx>\n"
00335 "<name>"<<glGetString(GL_RENDERER)<<"</name>\n"
00336 "<vendor>"<<glGetString(GL_VENDOR)<<"</vendor>\n"
00337 "<vram>"<<vram_str<<"</vram>\n"
00338 "<glversion>"<<glGetString(GL_VERSION)<<"</glversion>\n"
00339 "<glslversion>"<<glGetString((GL_SHADING_LANGUAGE_VERSION))<<"</glslversion>\n"
00340 "<extensions>"<<props[7]<<"</extensions>\n"<<
00341
00342 "<hasMRT>"<<supports[0]<<"</hasMRT>"
00343 "<hasGI>"<<supports[1]<<"</hasGI>"
00344 "<hasGS>"<<supports[2]<<"</hasGS>"
00345 "<hasFloat>"<<supports[3]<<"</hasFloat>"
00346 "<hasFBOMulti>"<<supports[4]<<"</hasFBOMulti>"
00347
00348 "<texsize>"<<props[0]<<"</texsize>\n"
00349 "<texsize3D>"<<props[1]<<"</texsize3D>\n"
00350 "<tex_layers>"<<props[2]<<"</tex_layers>\n"
00351 "<cubetexsize>"<<props[3]<<"</cubetexsize>\n"
00352 "<renderbufsize>"<<props[4]<<"</renderbufsize>\n"
00353 "<drawbuffs>"<<props[5]<<"</drawbuffs>\n"
00354 "<msamples>"<<props[6]<<"</msamples>\n"
00355 "<indices>"<<props[8]<<"</indices>\n"
00356 "<vertices>"<<props[9]<<"</vertices>\n"
00357
00358 "<comb_texunits>"<<props[10]<<"</comb_texunits>\n"
00359 "<varyings>"<<props[11]<<"</varyings>\n"
00360 "<vertattribs>"<<props[12]<<"</vertattribs>\n"
00361 "<vertunifs>"<<props[13]<<"</vertunifs>\n"
00362 "<gsout_vertices>"<<props[14]<<"</gsout_vertices>\n"
00363 "<gsout_components>"<<props[15]<<"</gsout_components>\n"
00364 "<fragunifs>"<<props[16]<<"</fragunifs>\n"
00365 "</gfx>\n";
00366
00367 #ifdef USE_CL
00368
00369 cl_platform_id platform;
00370 cl_device_id device_id;
00371
00372 const int BUFF = 1024;
00373 cl_char vendor_name[BUFF] = {0};
00374 cl_char device_name[BUFF] = {0};
00375 cl_device_local_mem_type local_mem_type;
00376 cl_ulong global_mem_size;
00377 cl_uint clock_frequency, max_compute_units;
00378 size_t max_work_group_size, max_work_item_sizes[3];
00379
00380 if(clGetPlatformIDs(1, &platform, NULL) == CL_SUCCESS)
00381 {
00382 results<<"<opencl>\n<isCL>YES</isCL>";
00383
00384 clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 1, &device_id, NULL);
00385
00386 clGetDeviceInfo(device_id, CL_DEVICE_VENDOR, sizeof(vendor_name), vendor_name, NULL);
00387 clGetDeviceInfo(device_id, CL_DEVICE_NAME, sizeof(device_name), device_name, NULL);
00388 clGetDeviceInfo(device_id, CL_DEVICE_LOCAL_MEM_TYPE, sizeof(local_mem_type), &local_mem_type, NULL);
00389 clGetDeviceInfo(device_id, CL_DEVICE_GLOBAL_MEM_SIZE, sizeof(global_mem_size), &global_mem_size, NULL);
00390 clGetDeviceInfo(device_id, CL_DEVICE_MAX_CLOCK_FREQUENCY, sizeof(clock_frequency), &clock_frequency, NULL);
00391 clGetDeviceInfo(device_id, CL_DEVICE_MAX_WORK_GROUP_SIZE, sizeof(max_work_group_size), &max_work_group_size, NULL);
00392 clGetDeviceInfo(device_id, CL_DEVICE_MAX_WORK_ITEM_SIZES, sizeof(max_work_item_sizes), max_work_item_sizes, NULL);
00393 clGetDeviceInfo(device_id, CL_DEVICE_MAX_COMPUTE_UNITS, sizeof(max_compute_units), &max_compute_units, NULL);
00394
00395 string isLocal = "NO";
00396 if((int)local_mem_type == 1)
00397 isLocal = "YES";
00398
00399 results<<
00400 "<vendor>"<<vendor_name<<"</vendor>\n"
00401 "<device>"<<device_name<<"</device>\n"
00402 "<units>"<<max_compute_units<<"</units>\n"
00403 "<clock>"<<clock_frequency<<" MHz</clock>\n"
00404 "<isLocal>"<<isLocal<<"</isLocal>\n"
00405 "<globMem>"<<(int)global_mem_size/(1024*1024)<<" MB</globMem>\n"
00406 "<workitems>"<<(int)max_work_item_sizes[0]<<"x"<<(int)max_work_item_sizes[1]<<"x"<<(int)max_work_item_sizes[2]<<"</workitems>\n"
00407 "<workgroup>"<<(int)max_work_group_size<<"</workgroup>";
00408 }
00409 else
00410 results<<"<opencl>\n<isCL>NO</isCL>";
00411
00412 results<<"</opencl>\n</sysinfo>";
00413 #else
00414 results<<"<opencl>\n<isCL>NO</isCL>\n</opencl>\n</sysinfo>\n";
00415 #endif
00416 }