Commit 5ecf2d11 authored by Robert Maynard's avatar Robert Maynard
Browse files

vtkm::rendering has more compilation units to help out 32bit compilers

Visual Studio default toolset uses 32bit executables for compiling which
means that if it uses more than 4GB of memory per instance it crashes.
By moving the ConnectivityTracer into a separate compilation unit we
can help out the compiler.

This also improved compilation times and library size:

Old:
build time (j8): 48.62 real
lib size: 6.2MB

New:
build time (j8): 41.31 real
lib size: 5.0MB
parent 548e9467
...@@ -65,25 +65,19 @@ set(sources ...@@ -65,25 +65,19 @@ set(sources
BitmapFontFactory.cxx BitmapFontFactory.cxx
BoundingBoxAnnotation.cxx BoundingBoxAnnotation.cxx
Camera.cxx Camera.cxx
Canvas.cxx
CanvasRayTracer.cxx
Color.cxx Color.cxx
ColorBarAnnotation.cxx ColorBarAnnotation.cxx
ColorLegendAnnotation.cxx ColorLegendAnnotation.cxx
ColorTable.cxx ColorTable.cxx
ConnectivityProxy.cxx
DecodePNG.cxx DecodePNG.cxx
LineRenderer.cxx LineRenderer.cxx
Mapper.cxx MapperConnectivity.cxx
MapperRayTracer.cxx MapperRayTracer.cxx
MapperVolume.cxx MapperVolume.cxx
MapperConnectivity.cxx
MapperWireframer.cxx
Scene.cxx Scene.cxx
TextAnnotation.cxx TextAnnotation.cxx
TextAnnotationBillboard.cxx TextAnnotationBillboard.cxx
TextAnnotationScreen.cxx TextAnnotationScreen.cxx
TextRenderer.cxx
View.cxx View.cxx
View1D.cxx View1D.cxx
View2D.cxx View2D.cxx
...@@ -91,13 +85,10 @@ set(sources ...@@ -91,13 +85,10 @@ set(sources
WorldAnnotator.cxx WorldAnnotator.cxx
internal/RunTriangulator.cxx internal/RunTriangulator.cxx
raytracing/BoundingVolumeHierarchy.cxx raytracing/ConnectivityBase.cxx
raytracing/Camera.cxx raytracing/ConnectivityTracerBase.cxx
raytracing/ChannelBuffer.cxx raytracing/ConnectivityTracerFactory.cxx
raytracing/Logger.cxx raytracing/Logger.cxx
raytracing/RayTracer.cxx
raytracing/RayOperations.cxx
raytracing/VolumeRendererStructured.cxx
) )
set(opengl_headers set(opengl_headers
...@@ -133,18 +124,20 @@ set(osmesa_sources ...@@ -133,18 +124,20 @@ set(osmesa_sources
# This list of sources has code that uses devices and so might need to be # This list of sources has code that uses devices and so might need to be
# compiled with a device-specific compiler (like CUDA). # compiled with a device-specific compiler (like CUDA).
set(device_sources set(device_sources
Mapper.cxx
MapperWireframer.cxx
Canvas.cxx Canvas.cxx
CanvasRayTracer.cxx CanvasRayTracer.cxx
ConnectivityProxy.cxx ConnectivityProxy.cxx
Mapper.cxx
MapperWireframer.cxx
TextRenderer.cxx TextRenderer.cxx
raytracing/BoundingVolumeHierarchy.cxx raytracing/BoundingVolumeHierarchy.cxx
raytracing/Camera.cxx raytracing/Camera.cxx
raytracing/ChannelBuffer.cxx raytracing/ChannelBuffer.cxx
raytracing/VolumeRendererStructured.cxx raytracing/ConnectivityTracer.cxx
raytracing/RayOperations.cxx raytracing/RayOperations.cxx
raytracing/RayTracer.cxx raytracing/RayTracer.cxx
raytracing/VolumeRendererStructured.cxx
) )
#----------------------------------------------------------------------------- #-----------------------------------------------------------------------------
......
...@@ -25,6 +25,8 @@ ...@@ -25,6 +25,8 @@
#include <vtkm/rendering/Mapper.h> #include <vtkm/rendering/Mapper.h>
#include <vtkm/rendering/raytracing/ConnectivityTracerFactory.h> #include <vtkm/rendering/raytracing/ConnectivityTracerFactory.h>
#include <vtkm/rendering/raytracing/Logger.h> #include <vtkm/rendering/raytracing/Logger.h>
#include <vtkm/rendering/raytracing/RayOperations.h>
namespace vtkm namespace vtkm
{ {
......
...@@ -21,14 +21,15 @@ ...@@ -21,14 +21,15 @@
set(headers set(headers
BoundingVolumeHierarchy.h BoundingVolumeHierarchy.h
Camera.h Camera.h
CellIntersector.h
CellSampler.h
CellTables.h
ChannelBuffer.h ChannelBuffer.h
ChannelBufferOperations.h ChannelBufferOperations.h
ConnectivityBase.h ConnectivityBase.h
ConnectivityTracer.h ConnectivityTracer.h
ConnectivityTracerBase.h
ConnectivityTracerFactory.h ConnectivityTracerFactory.h
CellIntersector.h
CellSampler.h
CellTables.h
Logger.h Logger.h
MeshConnectivityBuilder.h MeshConnectivityBuilder.h
MeshConnectivityStructures.h MeshConnectivityStructures.h
...@@ -38,8 +39,8 @@ set(headers ...@@ -38,8 +39,8 @@ set(headers
RayTracer.h RayTracer.h
RayTracingTypeDefs.h RayTracingTypeDefs.h
TriangleIntersector.h TriangleIntersector.h
Worklets.h
VolumeRendererStructured.h VolumeRendererStructured.h
Worklets.h
) )
set_source_files_properties(CellTables.h set_source_files_properties(CellTables.h
......
//============================================================================
// Copyright (c) Kitware, Inc.
// All rights reserved.
// See LICENSE.txt for details.
// This software is distributed WITHOUT ANY WARRANTY; without even
// the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
// PURPOSE. See the above copyright notice for more information.
//
// Copyright 2018 National Technology & Engineering Solutions of Sandia, LLC (NTESS).
// Copyright 2018 UT-Battelle, LLC.
// Copyright 2018 Los Alamos National Security.
//
// Under the terms of Contract DE-NA0003525 with NTESS,
// the U.S. Government retains certain rights in this software.
//
// Under the terms of Contract DE-AC52-06NA25396 with Los Alamos National
// Laboratory (LANL), the U.S. Government retains certain rights in
// this software.
//============================================================================
#include <vtkm/rendering/raytracing/ConnectivityBase.h>
namespace vtkm
{
namespace rendering
{
namespace raytracing
{
ConnectivityBase::ConnectivityBase()
{
}
ConnectivityBase::~ConnectivityBase()
{
}
}
}
}
...@@ -20,7 +20,8 @@ ...@@ -20,7 +20,8 @@
#ifndef vtk_m_rendering_raytracing_Connectivity_Base_h #ifndef vtk_m_rendering_raytracing_Connectivity_Base_h
#define vtk_m_rendering_raytracing_Connectivity_Base_h #define vtk_m_rendering_raytracing_Connectivity_Base_h
#include <vtkm/rendering/raytracing/Logger.h> #include <vtkm/rendering/vtkm_rendering_export.h>
#include <vtkm/rendering/raytracing/Ray.h> #include <vtkm/rendering/raytracing/Ray.h>
namespace vtkm namespace vtkm
...@@ -30,7 +31,7 @@ namespace rendering ...@@ -30,7 +31,7 @@ namespace rendering
namespace raytracing namespace raytracing
{ {
class ConnectivityBase class VTKM_RENDERING_EXPORT ConnectivityBase
{ {
public: public:
enum IntegrationMode enum IntegrationMode
...@@ -39,8 +40,8 @@ public: ...@@ -39,8 +40,8 @@ public:
Energy Energy
}; };
ConnectivityBase() {} ConnectivityBase();
virtual ~ConnectivityBase() {} virtual ~ConnectivityBase();
virtual void Trace(Ray<vtkm::Float64>& rays) = 0; virtual void Trace(Ray<vtkm::Float64>& rays) = 0;
...@@ -59,6 +60,7 @@ public: ...@@ -59,6 +60,7 @@ public:
virtual void SetColorMap( virtual void SetColorMap(
const vtkm::cont::ArrayHandle<vtkm::Vec<vtkm::Float32, 4>>& colorMap) = 0; const vtkm::cont::ArrayHandle<vtkm::Vec<vtkm::Float32, 4>>& colorMap) = 0;
}; // class ConnectivityBase }; // class ConnectivityBase
} }
} }
......
//============================================================================
// Copyright (c) Kitware, Inc.
// All rights reserved.
// See LICENSE.txt for details.
// This software is distributed WITHOUT ANY WARRANTY; without even
// the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
// PURPOSE. See the above copyright notice for more information.
//
// Copyright 2015 National Technology & Engineering Solutions of Sandia, LLC (NTESS).
// Copyright 2015 UT-Battelle, LLC.
// Copyright 2015 Los Alamos National Security.
//
// Under the terms of Contract DE-NA0003525 with NTESS,
// the U.S. Government retains certain rights in this software.
//
// Under the terms of Contract DE-AC52-06NA25396 with Los Alamos National
// Laboratory (LANL), the U.S. Government retains certain rights in
// this software.
//============================================================================
#define vtk_m_rendering_raytracing_ConnectivityTracer_cxx
#include <vtkm/rendering/raytracing/ConnectivityTracer.h>
#include <vtkm/rendering/raytracing/ConnectivityTracer.hxx>
namespace vtkm
{
namespace rendering
{
namespace raytracing
{
namespace detail
{
struct RenderFunctor
{
template <typename Device, typename Tracer, typename Rays>
bool operator()(Device device, Tracer&& tracer, Rays&& rays) const
{
tracer.RenderOnDevice(rays, device);
return true;
}
};
} //namespace detail
template <vtkm::Int32 CellType, typename ConnectivityType>
void ConnectivityTracer<CellType, ConnectivityType>::Trace(Ray<vtkm::Float32>& rays)
{
detail::RenderFunctor functor;
vtkm::cont::TryExecute(functor, *this, rays);
}
template <vtkm::Int32 CellType, typename ConnectivityType>
void ConnectivityTracer<CellType, ConnectivityType>::Trace(Ray<vtkm::Float64>& rays)
{
detail::RenderFunctor functor;
vtkm::cont::TryExecute(functor, *this, rays);
}
//explicit construct all valid forms ofConnectivityTracer
template class detail::RayTracking<float>;
template class detail::RayTracking<double>;
template class VTKM_RENDERING_TEMPLATE_EXPORT
ConnectivityTracer<CELL_SHAPE_ZOO, UnstructuredMeshConn>;
template class VTKM_RENDERING_TEMPLATE_EXPORT
ConnectivityTracer<CELL_SHAPE_HEXAHEDRON, UnstructuredMeshConnSingleType>;
template class VTKM_RENDERING_TEMPLATE_EXPORT
ConnectivityTracer<CELL_SHAPE_WEDGE, UnstructuredMeshConnSingleType>;
template class VTKM_RENDERING_TEMPLATE_EXPORT
ConnectivityTracer<CELL_SHAPE_TETRA, UnstructuredMeshConnSingleType>;
template class VTKM_RENDERING_TEMPLATE_EXPORT
ConnectivityTracer<CELL_SHAPE_STRUCTURED, StructuredMeshConn>;
}
}
} // namespace vtkm::rendering::raytracing
This diff is collapsed.
//============================================================================
// Copyright (c) Kitware, Inc.
// All rights reserved.
// See LICENSE.txt for details.
// This software is distributed WITHOUT ANY WARRANTY; without even
// the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
// PURPOSE. See the above copyright notice for more information.
//
// Copyright 2018 National Technology & Engineering Solutions of Sandia, LLC (NTESS).
// Copyright 2018 UT-Battelle, LLC.
// Copyright 2018 Los Alamos National Security.
//
// Under the terms of Contract DE-NA0003525 with NTESS,
// the U.S. Government retains certain rights in this software.
//
// Under the terms of Contract DE-AC52-06NA25396 with Los Alamos National
// Laboratory (LANL), the U.S. Government retains certain rights in
// this software.
//============================================================================
#include <vtkm/rendering/raytracing/ConnectivityTracerBase.h>
#include <vtkm/VectorAnalysis.h>
#include <vtkm/rendering/raytracing/Logger.h>
namespace vtkm
{
namespace rendering
{
namespace raytracing
{
ConnectivityTracerBase::ConnectivityTracerBase()
: ConnectivityBase()
{
}
ConnectivityTracerBase::~ConnectivityTracerBase()
{
}
void ConnectivityTracerBase::Init()
{
//
// Check to see if a sample distance was set
//
if (SampleDistance <= 0)
{
const vtkm::Float32 defaultSampleRate = 200.f;
// We need to set some default sample distance
vtkm::Vec<vtkm::Float32, 3> extent;
extent[0] = BoundingBox[1] - BoundingBox[0];
extent[1] = BoundingBox[3] - BoundingBox[2];
extent[2] = BoundingBox[5] - BoundingBox[4];
SampleDistance = vtkm::Magnitude(extent) / defaultSampleRate;
}
}
void ConnectivityTracerBase::SetColorMap(
const vtkm::cont::ArrayHandle<vtkm::Vec<vtkm::Float32, 4>>& colorMap)
{
ColorMap = colorMap;
}
void ConnectivityTracerBase::SetVolumeData(const vtkm::cont::Field& scalarField,
const vtkm::Range& scalarBounds)
{
//TODO: Need a way to tell if we have been updated
ScalarField = scalarField;
ScalarBounds = scalarBounds;
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");
FieldAssocPoints = ScalarField.GetAssociation() == vtkm::cont::Field::ASSOC_POINTS;
this->Integrator = Volume;
}
void ConnectivityTracerBase::SetEnergyData(const vtkm::cont::Field& absorption,
const vtkm::Int32 numBins,
const vtkm::cont::Field& emission)
{
bool isSupportedField = absorption.GetAssociation() == vtkm::cont::Field::ASSOC_CELL_SET;
if (!isSupportedField)
throw vtkm::cont::ErrorBadValue("Absorption Field '" + absorption.GetName() +
"' not accociated with cells");
ScalarField = absorption;
// Check for emmision
HasEmission = false;
if (emission.GetAssociation() != vtkm::cont::Field::ASSOC_ANY)
{
if (emission.GetAssociation() != vtkm::cont::Field::ASSOC_CELL_SET)
throw vtkm::cont::ErrorBadValue("Emission Field '" + emission.GetName() +
"' not accociated with cells");
HasEmission = true;
EmissionField = emission;
}
// Do some basic range checking
if (numBins < 1)
throw vtkm::cont::ErrorBadValue("Number of energy bins is less than 1");
vtkm::Id binCount = ScalarField.GetData().GetNumberOfValues();
vtkm::Id cellCount = this->GetNumberOfMeshCells();
if (cellCount != (binCount / vtkm::Id(numBins)))
{
std::stringstream message;
message << "Invalid number of absorption bins\n";
message << "Number of cells: " << cellCount << "\n";
message << "Number of field values: " << binCount << "\n";
message << "Number of bins: " << numBins << "\n";
throw vtkm::cont::ErrorBadValue(message.str());
}
if (HasEmission)
{
binCount = EmissionField.GetData().GetNumberOfValues();
if (cellCount != (binCount / vtkm::Id(numBins)))
{
std::stringstream message;
message << "Invalid number of emission bins\n";
message << "Number of cells: " << cellCount << "\n";
message << "Number of field values: " << binCount << "\n";
message << "Number of bins: " << numBins << "\n";
throw vtkm::cont::ErrorBadValue(message.str());
}
}
//TODO: Need a way to tell if we have been updated
this->Integrator = Energy;
}
void ConnectivityTracerBase::SetBackgroundColor(const vtkm::Vec<vtkm::Float32, 4>& backgroundColor)
{
BackgroundColor = backgroundColor;
}
void ConnectivityTracerBase::SetSampleDistance(const vtkm::Float32& distance)
{
if (distance <= 0.f)
throw vtkm::cont::ErrorBadValue("Sample distance must be positive.");
SampleDistance = distance;
}
void ConnectivityTracerBase::ResetTimers()
{
IntersectTime = 0.;
IntegrateTime = 0.;
SampleTime = 0.;
LostRayTime = 0.;
MeshEntryTime = 0.;
}
void ConnectivityTracerBase::LogTimers()
{
Logger* logger = Logger::GetInstance();
logger->AddLogData("intersect ", IntersectTime);
logger->AddLogData("integrate ", IntegrateTime);
logger->AddLogData("sample_cells ", SampleTime);
logger->AddLogData("lost_rays ", LostRayTime);
logger->AddLogData("mesh_entry", LostRayTime);
}
}
}
}
//============================================================================
// Copyright (c) Kitware, Inc.
// All rights reserved.
// See LICENSE.txt for details.
// This software is distributed WITHOUT ANY WARRANTY; without even
// the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
// PURPOSE. See the above copyright notice for more information.
//
// Copyright 2015 National Technology & Engineering Solutions of Sandia, LLC (NTESS).
// Copyright 2015 UT-Battelle, LLC.
// Copyright 2015 Los Alamos National Security.
//
// Under the terms of Contract DE-NA0003525 with NTESS,
// the U.S. Government retains certain rights in this software.
//
// Under the terms of Contract DE-AC52-06NA25396 with Los Alamos National
// Laboratory (LANL), the U.S. Government retains certain rights in
// this software.
//============================================================================
#ifndef vtk_m_rendering_raytracing_ConnectivityTracerBase_h
#define vtk_m_rendering_raytracing_ConnectivityTracerBase_h
#include <vtkm/rendering/vtkm_rendering_export.h>
#include <vtkm/rendering/raytracing/ConnectivityBase.h>
#include <vtkm/rendering/raytracing/RayOperations.h>
#include <vtkm/Bounds.h>
#include <vtkm/Range.h>
#include <vtkm/cont/ArrayHandle.h>
#include <vtkm/cont/Field.h>
#include <iomanip>
#include <iostream>
namespace vtkm
{
namespace rendering
{
namespace raytracing
{
class VTKM_RENDERING_EXPORT ConnectivityTracerBase : public ConnectivityBase
{
public:
ConnectivityTracerBase();
virtual ~ConnectivityTracerBase();
void Init();
virtual vtkm::Id GetNumberOfMeshCells() = 0;
void SetColorMap(const vtkm::cont::ArrayHandle<vtkm::Vec<vtkm::Float32, 4>>& colorMap) override;
void SetVolumeData(const vtkm::cont::Field& scalarField,
const vtkm::Range& scalarBounds) override;
void SetEnergyData(const vtkm::cont::Field& absorption,
const vtkm::Int32 numBins,
const vtkm::cont::Field& emission) override;
void SetBackgroundColor(const vtkm::Vec<vtkm::Float32, 4>& backgroundColor) override;
void SetSampleDistance(const vtkm::Float32& distance) override;
protected:
vtkm::cont::Field ScalarField;
vtkm::cont::Field EmissionField;
vtkm::Range ScalarBounds;
vtkm::cont::ArrayHandle<vtkm::Vec<vtkm::Float32, 4>> ColorMap;
vtkm::Float32 BoundingBox[6];
vtkm::cont::ArrayHandle<vtkm::Id> PreviousCellIds;
vtkm::Vec<vtkm::Float32, 4> BackgroundColor;
vtkm::Float32 SampleDistance;
bool CountRayStatus;
vtkm::Id RaysLost;
IntegrationMode Integrator;
bool DebugFiltersOn;
bool ReEnterMesh; // Do not try to re-enter the mesh
bool CreatePartialComposites;
bool FieldAssocPoints;
bool HasEmission; // Mode for integrating through engery bins
// timers
vtkm::Float64 IntersectTime;
vtkm::Float64 IntegrateTime;
vtkm::Float64 SampleTime;
vtkm::Float64 LostRayTime;
vtkm::Float64 MeshEntryTime;
template <typename FloatType, typename Device>
void PrintRayStatus(Ray<FloatType>& rays, Device)
{
vtkm::Id raysExited = RayOperations::GetStatusCount(rays, RAY_EXITED_MESH, Device());
vtkm::Id raysActive = RayOperations::GetStatusCount(rays, RAY_ACTIVE, Device());
vtkm::Id raysAbandoned = RayOperations::GetStatusCount(rays, RAY_ABANDONED, Device());
vtkm::Id raysExitedDom = RayOperations::GetStatusCount(rays, RAY_EXITED_DOMAIN, Device());
std::cout << "\r Ray Status " << std::setw(10) << std::left << " Lost " << std::setw(10)
<< std::left << RaysLost << std::setw(10) << std::left << " Exited " << std::setw(10)
<< std::left << raysExited << std::setw(10) << std::left << " Active "
<< std::setw(10) << raysActive << std::setw(10) << std::left << " Abandoned "
<< std::setw(10) << raysAbandoned << " Exited Domain " << std::setw(10) << std::left
<< raysExitedDom << "\n";
}
void ResetTimers();
void LogTimers();
};
}
}
}
#endif