HDK
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
GR_GaussianSplatVK.h
Go to the documentation of this file.
1 /*
2  * PROPRIETARY INFORMATION. This software is proprietary to
3  * Side Effects Software Inc., and is not to be reproduced,
4  * transmitted, or disclosed in any way without written permission.
5  *
6  * NAME: GR_GaussianSplatVK ( GR Library, C++)
7  *
8  * COMMENTS:
9  * 3D Gaussian Splat Renderer.
10  */
11 
12 #ifndef GR_GaussianSplatVK_h
13 #define GR_GaussianSplatVK_h
14 
15 #include "GR_API.h"
16 #include "GR_GeoRenderVK.h"
17 
18 #include <GT/GT_PrimPointMesh.h>
19 
20 #include <UT/UT_RadixSort.h>
21 
22 class RV_Geometry;
23 class RV_Render;
25 class RV_ShaderBlock;
26 
27 const uint K_WORKGROUP_SIZE = 256;
28 const uint K_RADIX_SORT_BINS = 256;
29 const uint K_RADIX_PASS = 4;
30 
31 enum ConnectIndex : uint8_t
32 {
33  TriangleIndex, // for gsplat and fullscreen drawing (quad)
34  PointIndex // for point marker decoration
35 };
36 
37 // Unified structure for indirect draw and compute dispatch commands.
38 // This allows reuse of a single buffer across different pipeline stages
40 {
41  // Indirect draw
46 
47  // Indirect compute
54 };
55 
56 struct MVPUboCPU
57 {
61 };
62 
64 {
65  bool useSph;
66 };
67 
69 {
72 
75 };
76 
78 {
82 };
83 
85 {
86 public:
88  ~GR_GaussianSplatVK() override;
89 
90  const char *className() const override { return "GR_GaussianSplatVK"; }
91 
92  void update(RE_RenderContext rc,
93  const GT_PrimitiveHandle &primh,
94  const GR_UpdateParms &parms,
95  const char *cache_name) override;
96 
98  const GR_DisplayOption &opts,
99  const char *cache_name,
100  RE_CacheVersion geo_version,
101  RE_CacheVersion select_version) override;
102 
103  void draw(RE_RenderContext rc,
106  GR_DrawParms dp) override;
107 
108  void getPickConnectGroup(unsigned int pick_mode,
109  GR_PickGeometry pick_geo,
110  int &out_connect_start,
111  int &out_connect_num) override;
112 
113  void getVkDecorGeometry(
115  RV_PrimType render_prim,
116  RV_Geometry &geo,
117  int &out_connect_start,
118  int &out_connect_num) override;
119 
120  exint getNumGLPrimitives() const override;
121  bool hasTransparency() const override { return true; }
122 
123  static bool initShaders(RV_Instance* inst);
124  static void cleanupShaders();
125 
126 private:
127  void frustumCullingGPU(RV_Render *rv, const GR_Uniforms &uniforms);
128  void sortGaussians(RV_Render *rv, const GR_Uniforms &uniforms);
129 
130  void drawGaussians(RV_Render *rv, GR_Uniforms *uniforms,
132  GR_DrawParms dp);
133 
134  void drawPoints(RV_Render *rv, GR_Uniforms *uniforms,
136  GR_DrawParms dp);
137 
138  void createGSplatGeom(RV_Render *rv);
139  void createFullScreenGeom(RV_Render *rv);
140 
141  void fillPointAttrib(RV_Render *rv,
142  const GT_PrimitiveHandle &primh,
143  const GT_PrimPointMesh *pmesh,
144  const GR_UpdateParms &parms);
145 
146  void createGSplatFramebuffer(RV_Render *rv,
147  const GR_Uniforms &uniforms);
148  void transitionToSampling(RV_Render* rv);
149 
150  void initIndirectCmd(RV_Render *rv);
151 
152  void setupAllSets(RV_Render *rv);
153  void uploadAllStaticBuffer(RV_Render *rv);
154  // draw
155  void prepareGaussiansData(const GT_PrimPointMesh& pmesh);
156  void setupDrawSet(RV_Render *rv);
157  void uploadStaticDrawBuffer(RV_Render *rv);
158  void updateDrawBuffer(RV_Render *rv);
159 
160  void setupDrawPointSet(RV_Render *rv);
161  // keys
162  void setupKeysSets(RV_Render *rv);
163  void uploadStaticKeysBuffer(RV_Render *rv);
164  void updateKeysBuffer(RV_Render *rv, const GR_Uniforms& uniforms);
165  bool computeKeys(RV_Render *rv);
166  // update dispatch params
167  void setupIndirectParamsSet(RV_Render *rv);
168  bool computeIndirectParams(RV_Render *rv);
169  // hist
170  void setupHistSets(RV_Render *rv);
171  bool computeHist(RV_Render *rv);
172  // prefix sum
173  void setupPrefixSumSets(RV_Render *rv);
174  bool computePrefixSum(RV_Render *rv);
175  // sort
176  void setupSortSets(RV_Render *rv);
177  void clearSortBuffer(RV_Render *rv);
178  void updateSortBuffer(RV_Render *rv, uint pass);
179  bool computeSort(RV_Render *rv);
180  void pingPongBuffer(RV_Render *rv, uint pass);
181 
182  // full screen with color image and depth reconstruction
183  void setupDepthSet(RV_Render *rv);
184  void drawDepth(RV_Render* rv, GR_Uniforms* uniforms,
186  GR_DrawParms dp);
187 
188  void sortOnCPU(RV_Render *rv,
189  const GR_Uniforms &uniforms);
190 
191  static RV_ShaderProgram *theGSplatDrawShader;
192  static RV_ShaderProgram *theDepthDrawShader;
193  static RV_ShaderProgram *thePointDrawShader;
194 
195  static RV_ShaderCompute *theKeysComputeShader;
196  static RV_ShaderCompute *theIndirectParamsComputeShader;
197  static RV_ShaderCompute *theHistComputeShader;
198  static RV_ShaderCompute *thePrefixSumComputeShader;
199  static RV_ShaderCompute *theSortComputeShader;
200 
201  // Options
202  bool myUseSPH;
203  bool myObjectSelected;
204  bool myIsWireframe;
205 
206  std::mutex myMutex;
207 
208  exint myNumInstances;
209  exint myNumVisibles;
210 
211  UT_UniquePtr<RV_Geometry> myFullScreenGeoVK;
212 
213  UT_UniquePtr<RV_Framebuffer> myFramebuffer;
214  UT_UniquePtr<RV_VKImage> myColorImage;
215  UT_UniquePtr<RV_VKImage> myDepthDataImage;
216 
217  // indirect draw
218  IndirectCmd myIndirectCmd;
219  UT_UniquePtr<RV_ShaderBlock> myIndirectBlock;
220 
221  // gaussians data on CPU
222  MVPUboCPU myMVPUboCPU;
223  DrawSettingsCPU myDrawSettingsCPU;
224  UT_Array<GaussianSphCPU> mySphArray;
225  UT_Array<GaussianCPU> myGaussianArray;
226 
227  // depth sorting data on CPU
228  UT_Array<UT_Vector4F> myMeanArray;
229  UT_Array<uint> myKeysArray;
230  UT_Array<uint> myIndicesArray;
231 
232  // draw shader
234  UT_UniquePtr<RV_ShaderBlock> myDrawBlock;
235  UT_UniquePtr<RV_ShaderBlock> myDrawSphBlock;
236  UT_UniquePtr<RV_ShaderBlock> myDrawSettingsBlock;
237 
238  UT_UniquePtr<RV_ShaderVariableSet> myPointDrawSet;
239 
240  // keys generation compute shader
243 
244  UT_UniquePtr<RV_ShaderBlock> myMVPBlock;
245  UT_UniquePtr<RV_ShaderBlock> myMeanBlock;
246  UT_UniquePtr<RV_ShaderBlock> myKeysBlock;
247  UT_UniquePtr<RV_ShaderBlock> myIndicesBlock;
248  UT_UniquePtr<RV_ShaderBlock> myPushConstBlock;
249  UT_UniquePtr<RV_ShaderBlock> myIndirectParamsBlock;
250 
251  UT_UniquePtr<RV_ShaderVariableSet> myIndirectParamsSet;
252 
253  // depth-sorting compute shader
255 
256  UT_UniquePtr<RV_ShaderVariableSet> myPrefixSumSet;
257 
260  UT_UniquePtr<RV_ShaderVariableSet> mySortPingPongSet;
261 
262  UT_UniquePtr<RV_ShaderBlock> myHistogramBlock;
263  UT_UniquePtr<RV_ShaderBlock> myGlobalHistBlock;
264  UT_UniquePtr<RV_ShaderBlock> mySortedKeysBlock;
265  UT_UniquePtr<RV_ShaderBlock> mySortedIndicesBlock;
266  UT_UniquePtr<RV_ShaderBlock> mySortPushConstBlock;
267 
269 };
270 
271 #endif
const uint K_WORKGROUP_SIZE
A collection of Vulkan UBO, SSBO, and Image shader bindings (descriptor set)
UT_Matrix4F obj
const uint K_RADIX_PASS
GLbitfield flags
Definition: glcorearb.h:1596
virtual void draw(RE_RenderContext r, GR_RenderMode mode, GR_RenderFlags flags, GR_DrawParms draw_parms)=0
Normal drawing method. Only issue rendering commands.
const uint K_RADIX_SORT_BINS
virtual void getVkDecorGeometry(GR_DecorationRender::PrimitiveType prim_type, RV_PrimType render_prim, RV_Geometry &geo, int &out_connect_start, int &out_connect_num)
UT_Vector4F cdAlpha
int64 exint
Definition: SYS_Types.h:125
GT_API const UT_StringHolder cache_name
Object that represents drawable geometry. This object holds vertex, instancing and index buffers for ...
Definition: RV_Geometry.h:165
UT_Vector4F scale
bool hasTransparency() const override
returns true if this drawable renders some transparent elements
Temporary container for either a RV_Render and an RE_Render.
virtual exint getNumGLPrimitives() const =0
std::unique_ptr< T, Deleter > UT_UniquePtr
A smart pointer for unique ownership of dynamically allocated objects.
Definition: UT_UniquePtr.h:39
set of parameters sent to GR_Primitive::update()
Compute shader object.
GR_RenderMode
Definition: GR_Defines.h:48
ConnectIndex
UT_Vector4F mean
RV_API void cleanupShaders()
#define GR_API
Definition: GR_API.h:10
A mesh of unconnected points.
UT_Matrix4F proj
GR_RenderFlags
Definition: GR_Defines.h:88
Handle to the main interface of Vulkan.
Definition: RV_Instance.h:44
UT_Matrix4F view
GLenum mode
Definition: glcorearb.h:99
RV_API bool initShaders(RV_Instance *inst)
virtual void getPickConnectGroup(unsigned int pick_mode, GR_PickGeometry pick_geo, int &out_connect_start, int &out_connect_num)
Definition: GR_GeoRender.h:100
GR_PickGeometry
Definition: GR_PickRecord.h:60
RV_PrimType
Definition: RV_Type.h:424
GA_API const UT_StringHolder parms
Simple class for a mutli-integer cache tag.
virtual void update(RE_RenderContext r, const GT_PrimitiveHandle &primh, const GR_UpdateParms &p, const char *cache_name)=0
GLboolean r
Definition: glcorearb.h:1222
set of parameters sent to GR_Primitive::update()
Definition: GR_Uniforms.h:56
const char * className() const override
unsigned int uint
Definition: SYS_Types.h:45
UT_Vector4F rotate
virtual void viewUpdate(RE_RenderContext r, const GR_DisplayOption &opts, const char *cache_name, RE_CacheVersion geo_version, RE_CacheVersion select_version)
Definition: GR_GeoRender.h:64