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