1 //============================================================================
2 //  Copyright (c) Kitware, Inc.
3 //  All rights reserved.
4 //  See LICENSE.txt for details.
5 //  This software is distributed WITHOUT ANY WARRANTY; without even
6 //  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
7 //  PURPOSE.  See the above copyright notice for more information.
8 //
9 //  Copyright 2017 National Technology & Engineering Solutions of Sandia, LLC (NTESS).
10 //  Copyright 2017 UT-Battelle, LLC.
11 //  Copyright 2017 Los Alamos National Security.
12 //
13 //  Under the terms of Contract DE-NA0003525 with NTESS,
14 //  the U.S. Government retains certain rights in this software.
15 //
16 //  Under the terms of Contract DE-AC52-06NA25396 with Los Alamos National
17 //  Laboratory (LANL), the U.S. Government retains certain rights in
18 //  this software.
19 //============================================================================
20 
21 #include "Benchmarker.h"
22 
23 #include <vtkm/TypeTraits.h>
24 
25 #include <vtkm/cont/ArrayHandle.h>
26 #include <vtkm/cont/DeviceAdapterAlgorithm.h>
27 #include <vtkm/cont/Timer.h>
28 #include <vtkm/cont/testing/MakeTestDataSet.h>
29 
30 #include <vtkm/rendering/Camera.h>
31 #include <vtkm/rendering/raytracing/Ray.h>
32 #include <vtkm/rendering/raytracing/RayTracer.h>
33 #include <vtkm/rendering/raytracing/SphereIntersector.h>
34 #include <vtkm/rendering/raytracing/TriangleExtractor.h>
35 
36 #include <vtkm/exec/FunctorBase.h>
37 
38 #include <sstream>
39 #include <string>
40 #include <vector>
41 
42 using namespace vtkm::benchmarking;
43 namespace vtkm
44 {
45 namespace benchmarking
46 {
47 
48 template <typename Precision>
49 struct BenchRayTracing
50 {
51   vtkm::rendering::raytracing::RayTracer Tracer;
52   vtkm::rendering::raytracing::Camera RayCamera;
53   vtkm::cont::ArrayHandle<vtkm::Vec<vtkm::Id, 4>> Indices;
54   vtkm::rendering::raytracing::Ray<Precision> Rays;
55   vtkm::Id NumberOfTriangles;
56   vtkm::cont::CoordinateSystem Coords;
57   vtkm::cont::DataSet Data;
58 
BenchRayTracingvtkm::benchmarking::BenchRayTracing59   VTKM_CONT BenchRayTracing()
60   {
61     vtkm::cont::testing::MakeTestDataSet maker;
62     Data = maker.Make3DUniformDataSet2();
63     Coords = Data.GetCoordinateSystem();
64 
65     vtkm::rendering::Camera camera;
66     vtkm::Bounds bounds = Data.GetCoordinateSystem().GetBounds();
67     camera.ResetToBounds(bounds);
68 
69     vtkm::cont::DynamicCellSet cellset = Data.GetCellSet();
70 
71     vtkm::rendering::raytracing::TriangleExtractor triExtractor;
72     triExtractor.ExtractCells(cellset);
73     vtkm::rendering::raytracing::TriangleIntersector* triIntersector =
74       new vtkm::rendering::raytracing::TriangleIntersector();
75     triIntersector->SetData(Coords, triExtractor.GetTriangles());
76     Tracer.AddShapeIntersector(triIntersector);
77 
78     vtkm::rendering::CanvasRayTracer canvas(1920, 1080);
79     RayCamera.SetParameters(camera, canvas);
80     RayCamera.CreateRays(Rays, Coords.GetBounds());
81 
82     Rays.Buffers.at(0).InitConst(0.f);
83 
84     vtkm::cont::Field field = Data.GetField("pointvar");
85     vtkm::Range range = field.GetRange().GetPortalConstControl().Get(0);
86 
87     Tracer.SetField(field, range);
88 
89     vtkm::cont::ArrayHandle<vtkm::Vec<vtkm::UInt8, 4>> temp;
90     vtkm::cont::ColorTable table("cool to warm");
91     table.Sample(100, temp);
92 
93     vtkm::cont::ArrayHandle<vtkm::Vec<vtkm::Float32, 4>> colors;
94     colors.Allocate(100);
95     auto portal = colors.GetPortalControl();
96     auto colorPortal = temp.GetPortalConstControl();
97     constexpr vtkm::Float32 conversionToFloatSpace = (1.0f / 255.0f);
98     for (vtkm::Id i = 0; i < 100; ++i)
99     {
100       auto color = colorPortal.Get(i);
101       vtkm::Vec<vtkm::Float32, 4> t(color[0] * conversionToFloatSpace,
102                                     color[1] * conversionToFloatSpace,
103                                     color[2] * conversionToFloatSpace,
104                                     color[3] * conversionToFloatSpace);
105       portal.Set(i, t);
106     }
107 
108     Tracer.SetColorMap(colors);
109     Tracer.Render(Rays);
110   }
111 
112   VTKM_CONT
operator ()vtkm::benchmarking::BenchRayTracing113   vtkm::Float64 operator()()
114   {
115     vtkm::cont::Timer<VTKM_DEFAULT_DEVICE_ADAPTER_TAG> timer;
116 
117     RayCamera.CreateRays(Rays, Coords.GetBounds());
118     Tracer.Render(Rays);
119 
120     return timer.GetElapsedTime();
121   }
122 
123   VTKM_CONT
Descriptionvtkm::benchmarking::BenchRayTracing124   std::string Description() const { return "A ray tracing benchmark"; }
125 };
126 
127 VTKM_MAKE_BENCHMARK(RayTracing, BenchRayTracing);
128 }
129 } // end namespace vtkm::benchmarking
130 
main(int,char * [])131 int main(int, char* [])
132 {
133   VTKM_RUN_BENCHMARK(RayTracing, vtkm::ListTagBase<vtkm::Float32>());
134   return 0;
135 }
136