1*d86ed7fbStbbdev /*
2*d86ed7fbStbbdev     Copyright (c) 2005-2020 Intel Corporation
3*d86ed7fbStbbdev 
4*d86ed7fbStbbdev     Licensed under the Apache License, Version 2.0 (the "License");
5*d86ed7fbStbbdev     you may not use this file except in compliance with the License.
6*d86ed7fbStbbdev     You may obtain a copy of the License at
7*d86ed7fbStbbdev 
8*d86ed7fbStbbdev         http://www.apache.org/licenses/LICENSE-2.0
9*d86ed7fbStbbdev 
10*d86ed7fbStbbdev     Unless required by applicable law or agreed to in writing, software
11*d86ed7fbStbbdev     distributed under the License is distributed on an "AS IS" BASIS,
12*d86ed7fbStbbdev     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*d86ed7fbStbbdev     See the License for the specific language governing permissions and
14*d86ed7fbStbbdev     limitations under the License.
15*d86ed7fbStbbdev */
16*d86ed7fbStbbdev 
17*d86ed7fbStbbdev // Support for GUI display for Polygon overlay demo
18*d86ed7fbStbbdev 
19*d86ed7fbStbbdev #ifndef NOMINMAX
20*d86ed7fbStbbdev #define NOMINMAX
21*d86ed7fbStbbdev #endif // NOMINMAX
22*d86ed7fbStbbdev 
23*d86ed7fbStbbdev #define VIDEO_WINMAIN_ARGS
24*d86ed7fbStbbdev #include <iostream>
25*d86ed7fbStbbdev 
26*d86ed7fbStbbdev #include "oneapi/tbb/tick_count.h"
27*d86ed7fbStbbdev 
28*d86ed7fbStbbdev #include "common/utility/get_default_num_threads.hpp"
29*d86ed7fbStbbdev 
30*d86ed7fbStbbdev #include "polyover.hpp"
31*d86ed7fbStbbdev #include "polymain.hpp"
32*d86ed7fbStbbdev #include "pover_video.hpp"
33*d86ed7fbStbbdev #ifndef _WIN32
34*d86ed7fbStbbdev #include <sys/time.h>
35*d86ed7fbStbbdev #include <unistd.h>
36*d86ed7fbStbbdev 
37*d86ed7fbStbbdev void rt_sleep(int msec) {
38*d86ed7fbStbbdev     usleep(msec * 1000);
39*d86ed7fbStbbdev }
40*d86ed7fbStbbdev 
41*d86ed7fbStbbdev #else //_WIN32
42*d86ed7fbStbbdev 
43*d86ed7fbStbbdev #undef OLDUNIXTIME
44*d86ed7fbStbbdev #undef STDTIME
45*d86ed7fbStbbdev 
46*d86ed7fbStbbdev #include <windows.h>
47*d86ed7fbStbbdev 
48*d86ed7fbStbbdev void rt_sleep(int msec) {
49*d86ed7fbStbbdev     Sleep(msec);
50*d86ed7fbStbbdev }
51*d86ed7fbStbbdev 
52*d86ed7fbStbbdev #endif /*  _WIN32  */
53*d86ed7fbStbbdev 
54*d86ed7fbStbbdev bool g_next_frame() {
55*d86ed7fbStbbdev     if (++n_next_frame_calls >= frame_skips) { // the data race here is benign
56*d86ed7fbStbbdev         n_next_frame_calls = 0;
57*d86ed7fbStbbdev         return gVideo->next_frame();
58*d86ed7fbStbbdev     }
59*d86ed7fbStbbdev     return gVideo->running;
60*d86ed7fbStbbdev }
61*d86ed7fbStbbdev 
62*d86ed7fbStbbdev bool g_last_frame() {
63*d86ed7fbStbbdev     if (n_next_frame_calls)
64*d86ed7fbStbbdev         return gVideo->next_frame();
65*d86ed7fbStbbdev     return gVideo->running;
66*d86ed7fbStbbdev }
67*d86ed7fbStbbdev 
68*d86ed7fbStbbdev bool initializeVideo(int argc, char *argv[]) {
69*d86ed7fbStbbdev     //pover_video *l_video = new pover_video();
70*d86ed7fbStbbdev     //gVideo = l_video;
71*d86ed7fbStbbdev     gVideo->init_console(); // don't check return code.
72*d86ed7fbStbbdev     gVideo->title = g_windowTitle;
73*d86ed7fbStbbdev     g_useGraphics = gVideo->init_window(g_xwinsize, g_ywinsize);
74*d86ed7fbStbbdev     return true;
75*d86ed7fbStbbdev }
76*d86ed7fbStbbdev 
77*d86ed7fbStbbdev void pover_video::on_process() {
78*d86ed7fbStbbdev     oneapi::tbb::tick_count t0, t1;
79*d86ed7fbStbbdev     double naiveParallelTime, domainSplitParallelTime;
80*d86ed7fbStbbdev     // create map1  These could be done in parallel, if the pseudorandom number generator were re-seeded.
81*d86ed7fbStbbdev     GenerateMap(
82*d86ed7fbStbbdev         &gPolymap1, gMapXSize, gMapYSize, gNPolygons, /*red*/ 255, /*green*/ 0, /*blue*/ 127);
83*d86ed7fbStbbdev     // create map2
84*d86ed7fbStbbdev     GenerateMap(
85*d86ed7fbStbbdev         &gPolymap2, gMapXSize, gMapYSize, gNPolygons, /*red*/ 0, /*green*/ 255, /*blue*/ 127);
86*d86ed7fbStbbdev     //
87*d86ed7fbStbbdev     // Draw source maps
88*d86ed7fbStbbdev     gDrawXOffset = map1XLoc;
89*d86ed7fbStbbdev     gDrawYOffset = map1YLoc;
90*d86ed7fbStbbdev     for (int i = 0; i < int(gPolymap1->size()); i++) {
91*d86ed7fbStbbdev         (*gPolymap1)[i].drawPoly();
92*d86ed7fbStbbdev     }
93*d86ed7fbStbbdev     gDrawXOffset = map2XLoc;
94*d86ed7fbStbbdev     gDrawYOffset = map2YLoc;
95*d86ed7fbStbbdev     for (int i = 0; i < int(gPolymap2->size()); i++) {
96*d86ed7fbStbbdev         (*gPolymap2)[i].drawPoly();
97*d86ed7fbStbbdev     }
98*d86ed7fbStbbdev     gDoDraw = true;
99*d86ed7fbStbbdev 
100*d86ed7fbStbbdev     // run serial map generation
101*d86ed7fbStbbdev     gDrawXOffset = maprXLoc;
102*d86ed7fbStbbdev     gDrawYOffset = maprYLoc;
103*d86ed7fbStbbdev     {
104*d86ed7fbStbbdev         RPolygon *xp =
105*d86ed7fbStbbdev             new RPolygon(0, 0, gMapXSize - 1, gMapYSize - 1, 0, 0, 0); // Clear the output space
106*d86ed7fbStbbdev         delete xp;
107*d86ed7fbStbbdev         t0 = oneapi::tbb::tick_count::now();
108*d86ed7fbStbbdev         SerialOverlayMaps(&gResultMap, gPolymap1, gPolymap2);
109*d86ed7fbStbbdev         t1 = oneapi::tbb::tick_count::now();
110*d86ed7fbStbbdev         std::cout << "Serial overlay took " << (t1 - t0).seconds() * 1000 << " msec"
111*d86ed7fbStbbdev                   << "\n";
112*d86ed7fbStbbdev         gSerialTime = (t1 - t0).seconds() * 1000;
113*d86ed7fbStbbdev #if _DEBUG
114*d86ed7fbStbbdev         CheckPolygonMap(gResultMap);
115*d86ed7fbStbbdev         // keep the map for comparison purposes.
116*d86ed7fbStbbdev #else
117*d86ed7fbStbbdev         delete gResultMap;
118*d86ed7fbStbbdev #endif
119*d86ed7fbStbbdev         if (gCsvFile.is_open()) {
120*d86ed7fbStbbdev             gCsvFile << "Serial Time," << gSerialTime << "\n";
121*d86ed7fbStbbdev             gCsvFile << "Threads,";
122*d86ed7fbStbbdev             if (gThreadsLow == THREADS_UNSET || gThreadsLow == utility::get_default_num_threads()) {
123*d86ed7fbStbbdev                 gCsvFile << "Threads,Automatic";
124*d86ed7fbStbbdev             }
125*d86ed7fbStbbdev             else {
126*d86ed7fbStbbdev                 for (int i = gThreadsLow; i <= gThreadsHigh; i++) {
127*d86ed7fbStbbdev                     gCsvFile << i;
128*d86ed7fbStbbdev                     if (i < gThreadsHigh)
129*d86ed7fbStbbdev                         gCsvFile << ",";
130*d86ed7fbStbbdev                 }
131*d86ed7fbStbbdev             }
132*d86ed7fbStbbdev             gCsvFile << "\n";
133*d86ed7fbStbbdev         }
134*d86ed7fbStbbdev         if (gIsGraphicalVersion)
135*d86ed7fbStbbdev             rt_sleep(2000);
136*d86ed7fbStbbdev     }
137*d86ed7fbStbbdev     // run naive parallel map generation
138*d86ed7fbStbbdev     {
139*d86ed7fbStbbdev         Polygon_map_t *resultMap;
140*d86ed7fbStbbdev         if (gCsvFile.is_open()) {
141*d86ed7fbStbbdev             gCsvFile << "Naive Time";
142*d86ed7fbStbbdev         }
143*d86ed7fbStbbdev         NaiveParallelOverlay(resultMap, *gPolymap1, *gPolymap2);
144*d86ed7fbStbbdev         delete resultMap;
145*d86ed7fbStbbdev         if (gIsGraphicalVersion)
146*d86ed7fbStbbdev             rt_sleep(2000);
147*d86ed7fbStbbdev     }
148*d86ed7fbStbbdev     // run split map generation
149*d86ed7fbStbbdev     {
150*d86ed7fbStbbdev         Polygon_map_t *resultMap;
151*d86ed7fbStbbdev         if (gCsvFile.is_open()) {
152*d86ed7fbStbbdev             gCsvFile << "Split Time";
153*d86ed7fbStbbdev         }
154*d86ed7fbStbbdev         SplitParallelOverlay(&resultMap, gPolymap1, gPolymap2);
155*d86ed7fbStbbdev         delete resultMap;
156*d86ed7fbStbbdev         if (gIsGraphicalVersion)
157*d86ed7fbStbbdev             rt_sleep(2000);
158*d86ed7fbStbbdev     }
159*d86ed7fbStbbdev     // split, accumulating into concurrent vector
160*d86ed7fbStbbdev     {
161*d86ed7fbStbbdev         concurrent_Polygon_map_t *cresultMap;
162*d86ed7fbStbbdev         if (gCsvFile.is_open()) {
163*d86ed7fbStbbdev             gCsvFile << "Split CV time";
164*d86ed7fbStbbdev         }
165*d86ed7fbStbbdev         SplitParallelOverlayCV(&cresultMap, gPolymap1, gPolymap2);
166*d86ed7fbStbbdev         delete cresultMap;
167*d86ed7fbStbbdev         if (gIsGraphicalVersion)
168*d86ed7fbStbbdev             rt_sleep(2000);
169*d86ed7fbStbbdev     }
170*d86ed7fbStbbdev     // split, accumulating into ETS
171*d86ed7fbStbbdev     {
172*d86ed7fbStbbdev         ETS_Polygon_map_t *cresultMap;
173*d86ed7fbStbbdev         if (gCsvFile.is_open()) {
174*d86ed7fbStbbdev             gCsvFile << "Split ETS time";
175*d86ed7fbStbbdev         }
176*d86ed7fbStbbdev         SplitParallelOverlayETS(&cresultMap, gPolymap1, gPolymap2);
177*d86ed7fbStbbdev         delete cresultMap;
178*d86ed7fbStbbdev         if (gIsGraphicalVersion)
179*d86ed7fbStbbdev             rt_sleep(2000);
180*d86ed7fbStbbdev     }
181*d86ed7fbStbbdev     if (gIsGraphicalVersion)
182*d86ed7fbStbbdev         rt_sleep(8000);
183*d86ed7fbStbbdev     delete gPolymap1;
184*d86ed7fbStbbdev     delete gPolymap2;
185*d86ed7fbStbbdev #if _DEBUG
186*d86ed7fbStbbdev     delete gResultMap;
187*d86ed7fbStbbdev #endif
188*d86ed7fbStbbdev }
189