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