diff --git a/CMake/VTKmMacros.cmake b/CMake/VTKmMacros.cmake index 524595643..66931930c 100755 --- a/CMake/VTKmMacros.cmake +++ b/CMake/VTKmMacros.cmake @@ -645,7 +645,12 @@ function(vtkm_benchmarks device_adapter) PROPERTIES HEADER_FILE_ONLY TRUE) target_include_directories(${benchmark_prog} PRIVATE ${VTKm_BACKEND_INCLUDE_DIRS}) - target_link_libraries(${benchmark_prog} PRIVATE vtkm_cont ${VTKm_BACKEND_LIBRARIES}) + + if(VTKm_ENABLE_RENDERING) + set(VTKM_RENDERING_LIBS vtkm_rendering) + endif() + + target_link_libraries(${benchmark_prog} PRIVATE vtkm_cont ${VTKM_RENDERING_LIBS} ${VTKm_BACKEND_LIBRARIES}) vtkm_setup_msvc_properties(${benchmark_prog}) diff --git a/vtkm/benchmarking/BenchmarkRayTracing.cxx b/vtkm/benchmarking/BenchmarkRayTracing.cxx index 7a5911e98..c32eb137f 100644 --- a/vtkm/benchmarking/BenchmarkRayTracing.cxx +++ b/vtkm/benchmarking/BenchmarkRayTracing.cxx @@ -28,6 +28,8 @@ #include #include +#include +#include #include #include @@ -47,41 +49,65 @@ struct BenchRayTracing { vtkm::rendering::raytracing::RayTracer Tracer; vtkm::rendering::raytracing::Camera RayCamera; - // Setup anything that doesn't need to change per run in the constructor + vtkm::cont::ArrayHandle> Indices; + vtkm::rendering::raytracing::Ray Rays; + vtkm::Id NumberOfTriangles; + vtkm::cont::CoordinateSystem Coords; + vtkm::cont::DataSet Data; + VTKM_CONT BenchRayTracing() { vtkm::cont::testing::MakeTestDataSet maker; - vtkm::cont::DataSet data = maker.Make3DUniformDataSet2(); + Data = maker.Make3DUniformDataSet2(); + Coords = Data.GetCoordinateSystem(); vtkm::rendering::Camera camera; - vtkm::Bounds bounds = data.GetCoordinateSystem().GetBounds(); + vtkm::Bounds bounds = Data.GetCoordinateSystem().GetBounds(); camera.ResetToBounds(bounds); + + vtkm::cont::DynamicCellSet cellset = Data.GetCellSet(); + vtkm::rendering::internal::RunTriangulator(cellset, Indices, NumberOfTriangles); + + vtkm::rendering::CanvasRayTracer canvas(1920, 1080); + RayCamera.SetParameters(camera, canvas); + RayCamera.CreateRays(Rays, Coords); + + Rays.Buffers.at(0).InitConst(0.f); + + vtkm::cont::Field field = Data.GetField("pointvar"); + vtkm::Range range = field.GetRange().GetPortalConstControl().Get(0); + + Tracer.SetData(Coords.GetData(), Indices, field, NumberOfTriangles, range, bounds); + + vtkm::cont::ArrayHandle> colors; + vtkm::rendering::ColorTable("cool2warm").Sample(100, colors); + + Tracer.SetColorMap(colors); + Tracer.Render(Rays); } - // The overloaded call operator will run the operations being timed and - // return the execution time VTKM_CONT - vtkm::Float64 operator()() { return 0.05; } + vtkm::Float64 operator()() + { + vtkm::cont::Timer timer; + + RayCamera.CreateRays(Rays, Coords); + Tracer.Render(Rays); + + return timer.GetElapsedTime(); + } - // The benchmark must also provide a method describing itself, this is - // used when printing out run time statistics VTKM_CONT std::string Description() const { return "A ray tracing benchmark"; } }; -// Now use the VTKM_MAKE_BENCHMARK macro to generate a maker functor for -// your benchmark. This lets us generate the benchmark functor for each type -// we want to test VTKM_MAKE_BENCHMARK(RayTracing, BenchRayTracing); } } // end namespace vtkm::benchmarking int main(int, char* []) { - using Device = VTKM_DEFAULT_DEVICE_ADAPTER_TAG; - //using Benchmarks = vtkm::benchmarking::BenchRayTracing; using TestTypes = vtkm::ListTagBase; VTKM_RUN_BENCHMARK(RayTracing, vtkm::ListTagBase()); - //bool result = Benchmarks::Run(); - //return result ? EXIT_SUCCESS : EXIT_FAILURE; + return 0; } diff --git a/vtkm/cont/testing/MakeTestDataSet.h b/vtkm/cont/testing/MakeTestDataSet.h index 34c8b3fba..6a8bda456 100644 --- a/vtkm/cont/testing/MakeTestDataSet.h +++ b/vtkm/cont/testing/MakeTestDataSet.h @@ -248,7 +248,7 @@ inline vtkm::cont::DataSet MakeTestDataSet::Make3DUniformDataSet1() inline vtkm::cont::DataSet MakeTestDataSet::Make3DUniformDataSet2() { - const vtkm::Id base_size = 128; + const vtkm::Id base_size = 256; vtkm::cont::DataSetBuilderUniform dsb; vtkm::Id3 dimensions(base_size, base_size, base_size); vtkm::cont::DataSet dataSet = dsb.Create(dimensions); @@ -262,6 +262,7 @@ inline vtkm::cont::DataSet MakeTestDataSet::Make3DUniformDataSet2() for (vtkm::Int32 x = 0; x < base_size; ++x) { vtkm::Int32 index = z * base_size * base_size + y * base_size + x; + pointvar[index] = vtkm::Sqrt(vtkm::Float32(x * x + y * y + z * z)); } dsf.AddPointField(dataSet, "pointvar", pointvar, nVerts); diff --git a/vtkm/rendering/MapperRayTracer.cxx b/vtkm/rendering/MapperRayTracer.cxx index 84e699bb2..fa0dae248 100644 --- a/vtkm/rendering/MapperRayTracer.cxx +++ b/vtkm/rendering/MapperRayTracer.cxx @@ -107,9 +107,9 @@ void MapperRayTracer::RenderCells(const vtkm::cont::DynamicCellSet& cellset, this->Internals->Rays, camera, *this->Internals->Canvas); vtkm::Bounds dataBounds = coords.GetBounds(); - + vtkm::cont::Field& field = const_cast(scalarField); this->Internals->Tracer.SetData( - coords.GetData(), indices, scalarField, numberOfTriangles, scalarRange, dataBounds); + coords.GetData(), indices, field, numberOfTriangles, scalarRange, dataBounds); this->Internals->Tracer.SetColorMap(this->ColorMap); this->Internals->Tracer.Render(this->Internals->Rays); diff --git a/vtkm/rendering/raytracing/RayTracer.cxx b/vtkm/rendering/raytracing/RayTracer.cxx index 6b06eecfb..cbf461880 100644 --- a/vtkm/rendering/raytracing/RayTracer.cxx +++ b/vtkm/rendering/raytracing/RayTracer.cxx @@ -234,14 +234,14 @@ public: VTKM_CONT void run(Ray& rays, LinearBVH& bvh, vtkm::cont::DynamicArrayHandleCoordinateSystem& coordsHandle, - const vtkm::cont::Field* scalarField, + vtkm::cont::Field& scalarField, const vtkm::Range& scalarRange) { - bool isSupportedField = (scalarField->GetAssociation() == vtkm::cont::Field::ASSOC_POINTS || - scalarField->GetAssociation() == vtkm::cont::Field::ASSOC_CELL_SET); + bool isSupportedField = (scalarField.GetAssociation() == vtkm::cont::Field::ASSOC_POINTS || + scalarField.GetAssociation() == vtkm::cont::Field::ASSOC_CELL_SET); if (!isSupportedField) throw vtkm::cont::ErrorBadValue("Field not accociated with cell set or points"); - bool isAssocPoints = scalarField->GetAssociation() == vtkm::cont::Field::ASSOC_POINTS; + bool isAssocPoints = scalarField.GetAssociation() == vtkm::cont::Field::ASSOC_POINTS; vtkm::worklet::DispatcherMapField(CalculateNormals(bvh.LeafNodes)) .Invoke(rays.HitIdx, rays.Dir, rays.NormalX, rays.NormalY, rays.NormalZ, coordsHandle); @@ -251,14 +251,14 @@ public: vtkm::worklet::DispatcherMapField, Device>( LerpScalar( bvh.LeafNodes, vtkm::Float32(scalarRange.Min), vtkm::Float32(scalarRange.Max))) - .Invoke(rays.HitIdx, rays.U, rays.V, rays.Scalar, *scalarField); + .Invoke(rays.HitIdx, rays.U, rays.V, rays.Scalar, scalarField); } else { vtkm::worklet::DispatcherMapField, Device>( NodalScalar( bvh.LeafNodes, vtkm::Float32(scalarRange.Min), vtkm::Float32(scalarRange.Max))) - .Invoke(rays.HitIdx, rays.Scalar, *scalarField); + .Invoke(rays.HitIdx, rays.Scalar, scalarField); } } // Run @@ -398,14 +398,14 @@ Camera& RayTracer::GetCamera() void RayTracer::SetData(const vtkm::cont::DynamicArrayHandleCoordinateSystem& coordsHandle, const vtkm::cont::ArrayHandle>& indices, - const vtkm::cont::Field& scalarField, + vtkm::cont::Field& scalarField, const vtkm::Id& numberOfTriangles, const vtkm::Range& scalarRange, const vtkm::Bounds& dataBounds) { CoordsHandle = coordsHandle; Indices = indices; - ScalarField = &scalarField; + ScalarField = scalarField; NumberOfTriangles = numberOfTriangles; ScalarRange = scalarRange; DataBounds = dataBounds; diff --git a/vtkm/rendering/raytracing/RayTracer.h b/vtkm/rendering/raytracing/RayTracer.h index 7555dc394..8b1c20b74 100644 --- a/vtkm/rendering/raytracing/RayTracer.h +++ b/vtkm/rendering/raytracing/RayTracer.h @@ -34,13 +34,13 @@ namespace rendering namespace raytracing { -class RayTracer +class VTKM_RENDERING_EXPORT RayTracer { protected: LinearBVH Bvh; Camera camera; vtkm::cont::DynamicArrayHandleCoordinateSystem CoordsHandle; - const vtkm::cont::Field* ScalarField; + vtkm::cont::Field ScalarField; vtkm::cont::ArrayHandle> Indices; vtkm::cont::ArrayHandle Scalars; vtkm::Id NumberOfTriangles; @@ -63,7 +63,7 @@ public: VTKM_CONT void SetData(const vtkm::cont::DynamicArrayHandleCoordinateSystem& coordsHandle, const vtkm::cont::ArrayHandle>& indices, - const vtkm::cont::Field& scalarField, + vtkm::cont::Field& scalarField, const vtkm::Id& numberOfTriangles, const vtkm::Range& scalarRange, const vtkm::Bounds& dataBounds);