NTrace
GPU ray tracing framework
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
CudaPersistentBVHTracer.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include "gpu/Buffer.hpp"
4 #include "ray/RayBuffer.hpp"
5 #include "bvh/BVH.hpp"
6 #include "Util.hpp"
7 #include "3d/Mesh.hpp"
8 #include "gpu/CudaCompiler.hpp"
9 #include "base/Timer.hpp"
10 /*#include "materials/MaterialCommon.h"
11 #include "textures/TexArray.h"
12 #include "kernels/CudaPool.hpp"
13 #include "kernels/CudaNoStructKernels.hpp"
14 #include "kernels/CudaBuilderKernels.hpp"*/
15 
16 #include "Scene.hpp"
17 
18 namespace FW
19 {
20 
22 {
23  // scene data
24  F32 m_epsilon;
25  S32 m_numVerts;
26  S32 m_numTris;
27  S32 m_numMaterials;
28  S32 m_numShadingNormals;
29  S32 m_numTextureCoords;
30  S32 m_numLights;
31  Vec3f m_bboxMin, m_bboxMax;
32  S32 m_buildNodes;
33  S32 m_buildLeafs;
34 
35  Buffer m_verts;
36  Buffer m_tris;
37  Buffer m_triNormals;
38  //Buffer m_materials;
39  //Buffer m_shadingNormals;
40  //Buffer m_shadedColor;
41  //Buffer m_materialColor;
42 
43  Buffer m_raysIndex;
44  Buffer m_trisIndex;
45  Buffer m_trisCompact;
46  Buffer m_trisBox;
47 
48  Buffer m_trisCompactOut; // Used for COMPACT_LAYOUT
49  Buffer m_trisIndexOut; // Used for COMPACT_LAYOUT
50 
51  Buffer m_lights;
52 
53  /*TexArray m_texArray;
54  Buffer m_textureCoords;*/
55 
56  // GPU task data
57  Buffer m_mallocData;
58  Buffer m_mallocData2;
59  Buffer m_taskData;
60  Buffer m_splitData;
61  Buffer m_bvhData;
62  int m_cutOffDepth;
63  int m_numRays;
64 
65  CudaCompiler m_compiler;
66  CudaModule* m_module;
67 
68  // buffers
69  Buffer m_ppsRays;
70  Buffer m_ppsTris;
71  Buffer m_ppsRaysIndex;
72  Buffer m_ppsTrisIndex;
73  Buffer m_sortRays;
74  Buffer m_sortTris;
75 
76  // Debug buffers
77  Buffer m_debug;
78 
79  // Statistics
80  Timer m_timer;
81  F32 m_cpuTime;
82  F32 m_gpuTime;
83 
84  F32 m_sizeTask;
85  F32 m_sizeSplit;
86  F32 m_sizeADS;
87  F32 m_sizeTri;
88  F32 m_sizeTriIdx;
89  F32 m_heap;
90  String m_kernelFile;
91 
92  void updateConstants();
93  int warpSubtasks(int threads);
94  int floatToOrderedInt(float floatVal);
95  //unsigned int floatToOrderedInt(float floatVal);
96  void allocateSnapshots(Buffer &snapData);
97  void printSnapshots(Buffer &snapData);
98  void initPool(int numRays = 0, Buffer* rayBuffer = NULL, Buffer* nodeBuffer = NULL);
99  void deinitPool(int numRays = 0);
100  /*void printPoolHeader(TaskStackBase* tasks, int* header, int numWarps, FW::String state);
101  void printPool(TaskStackBVH& tasks, int numWarps);
102  void printPool(TaskStack& tasks, int numWarps);*/
103  void traceCpuRay(const Ray& r, RayResult& result, bool anyHit);
104 
105  F32 traceCudaRayBuffer(RayBuffer& rb);
106  F32 traceOnDemandBVHRayBuffer(RayBuffer& rb, bool rebuild);
107  F32 traceOnDemandKdtreeRayBuffer(RayBuffer& rb, bool rebuild);
108  F32 buildCudaBVH();
109  F32 buildCudaKdtree();
110  F32 testSort(S32 arraySize);
111  F32 traceCpuRayBuffer(RayBuffer& rb);
112  void saveBufferSizes(bool ads = true, bool aux = true);
113  void prepareDynamicMemory();
114  int setDynamicMemory();
115 public:
116  CudaPersistentBVHTracer(Scene& scene, F32 epsilon);
117 
118  F32 traceBatch(RayBuffer& rays);
119  F32 buildBVH(bool sbvh);
120  F32 buildKdtree();
121  F32 traceBatchBVH(RayBuffer& rays, RayStats* stats = NULL);
122  F32 traceBatchKdtree(RayBuffer& rays, RayStats* stats = NULL);
123  F32 traceOnDemandBVH(RayBuffer& rays, bool rebuild, int numRays = 0);
124  F32 traceOnDemandKdtree(RayBuffer& rays, bool rebuild, int numRays = 0);
125  void traceOnDemandTrace(RayBuffer& rays, F32& GPUmegakernel, F32& CPUmegakernel, F32& GPUtravKernel, F32& CPUtravKernel, int& buildNodes, RayStats* stats = NULL);
126  F32 test();
127 
128  F32 convertWoop(); // Convert regular triangles to Woop triangles
129  void resetBuffers(bool resetADSBuffers); // Resets all buffers for timing purposes
130  void trimBVHBuffers(); // Sets all buffer sizes to their used extent
131  void trimKdtreeBuffers(); // Sets all buffer sizes to their used extent
132 
133  F32 getCPUTime() { return m_cpuTime; }
134  F32 getGPUTime() { return m_gpuTime; }
135  void getStats(U32& nodes, U32& leaves, U32& emptyLeaves, U32& stackTop, U32& nodeTop, U32& tris, U32& sortedTris, bool sub = true);
136  void getSizes(F32& task, F32& split, F32& ads, F32& tri, F32& triIdx, F32& heap);
137 
138  /*S32 getNumLights() { return m_numLights; }
139 
140  Buffer& getTriangleBuffer() { return m_tris; }
141  Buffer& getTriangleNormalBuffer() { return m_triNormals; }
142  Buffer& getTriangleOutBuffer() { return m_trisCompactOut; }
143  Buffer& getTriangleIndexOutBuffer() { return m_trisIndexOut; }
144  Buffer& getNodeBuffer() { return m_bvhData; }
145  Buffer& getMaterialsBuffer() { return m_materials; }
146  Buffer& getLightBuffer() { return m_lights; }
147  Buffer& getShadingNormalsBuffer() { return m_shadingNormals; }
148  Buffer& getShadedColorBuffer() { return m_shadedColor; }
149  Buffer& getMaterialColorBuffer() { return m_materialColor; }
150  Buffer& getTextureCoordsBuffer() { return m_textureCoords; }*/
151 };
152 
153 }
void resetBuffers(bool resetADSBuffers)
#define NULL
Definition: Defs.hpp:39
void getStats(U32 &nodes, U32 &leaves, U32 &emptyLeaves, U32 &stackTop, U32 &nodeTop, U32 &tris, U32 &sortedTris, bool sub=true)
F32 traceBatchBVH(RayBuffer &rays, RayStats *stats=NULL)
Definition: Util.hpp:62
Structure holding ray statistics. Also provides print to the console. These statistics are used in a ...
Definition: BVH.hpp:45
Declarations for the BVH acceleration structure.
float F32
Definition: Defs.hpp:89
F32 traceOnDemandKdtree(RayBuffer &rays, bool rebuild, int numRays=0)
F32 traceOnDemandBVH(RayBuffer &rays, bool rebuild, int numRays=0)
Ray buffer class. Stores rays.
Definition: RayBuffer.hpp:38
signed int S32
Definition: Defs.hpp:88
void getSizes(F32 &task, F32 &split, F32 &ads, F32 &tri, F32 &triIdx, F32 &heap)
unsigned int U32
Definition: Defs.hpp:85
Class holding 3d scene.
Definition: Scene.hpp:44
F32 traceBatchKdtree(RayBuffer &rays, RayStats *stats=NULL)
CudaPersistentBVHTracer(Scene &scene, F32 epsilon)
void traceOnDemandTrace(RayBuffer &rays, F32 &GPUmegakernel, F32 &CPUmegakernel, F32 &GPUtravKernel, F32 &CPUtravKernel, int &buildNodes, RayStats *stats=NULL)