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