VR-Forces 5.0.2 Developer's Guide
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
DtGpuCulling.h
Go to the documentation of this file.
1 /******************************************************************************
2 ** Copyright (c) 2022 VT-MAK Technologies, Inc.
3 ** All rights reserved.
4 ******************************************************************************/
5 
9 
10 #pragma once
11 
12 #include <osg/FrameStamp>
13 #include <osg/Camera>
14 
15 #include <vrvOsg/vrvOsg.h>
16 
22 
25 #define CPU_SIDE_COMPILATION 1
26 #include <../data/shaders/indirect/GeometrySpecification.h>
27 
31 
33 
34 #include <unordered_set>
35 
36 namespace osg
37 {
38  class State;
39  class RenderInfo;
40 };
41 
42 namespace makVrv
43 {
44  class DtGlBuffer;
45  class DtIndirectGeometryRegistrar;
46  class DtInstanceContainer;
47  class DtOsgShaderFilesCache;
48  class DtIndirectCullProgram;
49  class DtCpuCullingHelper;
50  class DtOsgLightPointManager;
51  class DtGlDeleteObjectManager;
52  class DtCoreGlBufferCreator;
53  class DtIndirectClearBufferProgram;
54  class DtIndirectModelInfo;
55 
56  class DtIndirectGlTextureResidencyManager;
57 
59  class DtGpuCulling;
60 
63 
65  template <>
66  inline const char* creatorTypeName<DtGpuCulling>(void) { return "DtGpuCullingCreator"; }
67 
83  {
84  public:
88  {
89  int myOffset;
91 
93  {
94  return myOffset == rhs.myOffset && myNumOfInstances == rhs.myNumOfInstances;
95  }
96  };
97 
101  {
102  int myOffset;
104  };
105 
106  typedef std::vector<StateIdOffsetAndMaxCommands> VectorStateIdOffsetAndMaxCommands;
107 
108  //All the culling output buffers need to be per camera so shadows passes work
109  typedef std::map<osg::observer_ptr<const osg::Camera>, DtGlBuffer*> CameraToBufferMap;
110  typedef std::set<osg::observer_ptr<const osg::Camera> > CameraSet;
111 
112  public:
113  //friend class so that it can be created only by its creator
115 
117  virtual ~DtGpuCulling();
118 
119  protected:
121  DtGpuCulling(DtDe& de, DtInstanceContainer& container, const DtCullShaderConfig&);
122 
123  private:
125  DtGpuCulling() = delete;
127  DtGpuCulling(const DtGpuCulling& other) = delete;
129  DtGpuCulling& operator=(const DtGpuCulling& other) = delete;
130 
131  public:
133  virtual void setRegistrar(DtIndirectGeometryRegistrar* registrar);
134 
136  virtual void setRegistrarInvalid(void);
137 
139  virtual void setDebug(bool debug);
140 
142  virtual const DtCullShaderConfig& cullShaderConfig(void) const;
143 
147  virtual void updateGpuBuffers(osg::RenderInfo& renderInfo);
148 
151  virtual void modelIdsToNumInstancesChanged(void);
152 
154  virtual void updatePerInstancePerGeomBuffers(const MapIntToInt& modelIdsToNumInstances, const osg::Camera* camera);
155 
160  virtual void doCulling(const DtIndirectViewParameters& viewParameters
161  , const osg::FrameStamp* frameStamp
162  , const DtGlBuffer* gpuLodVisibleBuffer
163  , const DtGlBuffer* gpuDofTransformBuffer
164  , const DtGlBuffer* gpuSwitchStateBuffer
165  , const DtGlBuffer* gpuPerInstanceDataBuffer
166  , const osg::Camera* camera
167  , bool& outputInstanceBufferChanged);
168 
170  static bool setUpOutputFormatAndBindings();
171 
173  static void unsetUpOutputFormatAndBindings();
174 
179  virtual bool bindGpuOutputInstanceBuffersWithAddressRange(const osg::Camera* camera) const;
180 
186  virtual bool bindCommandBufferAndSsbos(const DtGlBuffer* gpuDofTransformBuffer
187  , const DtGlBuffer* gpuDofModelScaleBuffer
188  , const DtGlBuffer* gpuUvOffsetBuffer
189  , const DtGlBuffer* gpuPerInstanceDataBuffer
190  , const osg::Camera* camera);
191 
193  virtual void unbindCommandBufferAndSsbos(const osg::Camera* camera);
194 
198  // It is an instanced buffer. It advances once per instance.
199  virtual void bindGpuOutputInstanceBufferDebug(const osg::Camera* camera) const;
200 
203  virtual void unbindGpuOutputInstanceBufferDebug(const osg::Camera* camera) const;
204 
208  virtual bool bindIndirectThingsDebug(const DtGlBuffer* gpuDofTransformBuffer, const osg::Camera* camera);
209 
211  virtual void unbindIndirectThingsDebug(const osg::Camera* camera);
212 
215  virtual bool useInstanceCount(void) const;
216 
219  virtual int numDrawCommands(const osg::Camera* camera) const;
220 
222  virtual void releaseGLObjects(osg::State* state) const;
223 
225  virtual void reloadShaders() const;
226 
228  virtual bool buffersInitializedForCamera(const osg::Camera* camera) const;
229 
231  virtual unsigned int maxNumInstances(void) const;
232 
234  virtual const VectorStateIdOffsetAndMaxCommands& stateIdOffsetAndMaxCommands(void) const;
235 
237  virtual const std::vector<InstancesOffsetAndNumOfInstances>& instancesOffsetAndNumInstances(void) const;
238 
240  virtual bool readyToUpdateAndGpuBuffersNeedUpdate() const;
241 
243  virtual bool gpuBuffersNeedUpdate() const;
244 
246  virtual bool textureUpdateDirty() const;
247 
249  virtual void setTextureUpdateDirty(bool flag);
250 
252  virtual bool perGeomInstanceDataDirty() const;
253 
255  virtual void setPerGeomInstanceDataDirty(bool flag);
256 
258  virtual bool instancesInvalidatedDirty() const;
259 
261  virtual void invalidateInstance(int instanceId, int offset, int size);
262 
264  virtual const DtGlBuffer* gpuInputPerGeomInstancesBuffer(void) const;
265 
267  virtual const DtGlBuffer* gpuMaterialsBuffer() const;
268 
270  virtual void fillOutputInstances(std::vector< DtVector4<int> >& outputInstances, const osg::Camera* camera) const;
271 
273  virtual const DtIndirectEffectTexturesTemplate& currentEffectTexturesState() const;
274 
276  virtual void setName(const std::string& name);
277 
279  virtual const std::string& name(void) const;
280 
281  protected:
283  virtual void updateGpuInputPerGeomInstancesBufferByInvalidating();
288  virtual void updateGpuGeometrySpecificationsBuffer();
289  virtual void updateGpuMaterialsBuffer();
290  virtual void updateGpuInputPerGeomInstancesBuffer();
291  virtual void updateGpuLightPointBuffers();
292  virtual void updateGpuIndirectBuffersInstanceCount(const MapIntToInt& modelIdsToNumInstances, const osg::Camera* camera);
293  virtual void updateGpuIndirectBuffersNonInstanceCount(const MapIntToInt& modelIdsToNumInstances, const osg::Camera* camera);
294  virtual void clearGpuIndirectBuffer(const osg::Camera* camera);
295  virtual void clearStateIdCommandCountBuffer();
296  virtual void clearLightSourceIndexOutputBuffer(const osg::Camera* osgCamera, unsigned int maxNumLightSources);
297 
299 
301  virtual void updateGpuTexturesBuffer(const osg::RenderInfo& renderInfo);
302 
304  virtual void updateInstancesOffsetAndInstances(const MapIntToInt& modelIdsToNumInstances);
305 
307  virtual void updateInstancesOffsetAndInstancesBuffer(void);
308 
310  virtual void updateStateIdToMaxNumCommands(const MapIntToInt& modelIdsToNumInstances);
311 
313  virtual void updateStateIdToMaxNumCommandsBuffer(void);
314 
316  virtual bool checkSpecBuffersOk(void) const;
317 
319  virtual void releaseCameraToBufferMap(DtGlDeleteObjectManager& deleteManager, const CameraToBufferMap& cameraToBufferMap, bool untrackResident = false) const;
320 
322  virtual void deleteBuffers(void);
323 
325  virtual void deleteCameraToBufferMap(CameraToBufferMap& cameraToBufferMap);
326 
329  virtual void flushCameraSpecificBuffers();
330 
332  virtual void flushSingleCameraSpecificBufferMap(CameraToBufferMap& cameraToBufferMap);
333 
335  virtual void flushSingleCameraSet(CameraSet& cameraSet);
336 
338  virtual void addHandleToDelete(DtGlDeleteObjectManager& deleteManager, DtGlBuffer* buffer, bool untrackResident = false) const;
339 
342  virtual void setTexture(GLuint64& textureToSet, GLuint textureID);
343 
346  virtual void incrementUsersAndLoadIfNecessary(DtIndirectModelInfo* info);
347 
350  virtual void decrementUsersAndUnLoadIfNecessary();
351 
352  protected:
356 
361 
363  mutable std::vector<DtGeometrySpecification> myMutableGeometrySpecifications;
364 
368 
370  mutable std::vector<DrawElementsIndirectBindlessCommandNV> myMutableBindlessIndexAndVertexBuffers;
371 
374 
378 
381 
383 
386 
390 
393 
395 
397 
399 
400  std::vector<InstancesOffsetAndNumOfInstances> myInstancesOffsetAndNumInstances;
402 
404  unsigned int myMaxNumInstances;
405 
406  unsigned int myMaxNumLightSources;
407 
408  // For when instance count is false or true
410 
411  // For when instance count if false
414 
415  // For when instance count is true
418 
420 
422 
423  //texture state
429 
432 
435 
437 
440 
441  std::string myName;
442 
444 
447 
451 
455 
457 
458  std::unordered_set<DtIndirectModelInfo*> myModelsBeingUsed;
459  };
460 }
461 
unsigned int myMaxNumInstancesPreCulling
Definition: DtGpuCulling.h:403
Contains the DtCullShaderConfig class declaration.
DtCoreGlBufferCreator & myDtCoreGlBufferCreator
Definition: DtGpuCulling.h:438
bool myPerGeomInstanceDataDirty
Definition: DtGpuCulling.h:359
static const int theGpuOutputInstanceOffsetInPerInstanceDataBufferIndex
Definition: DtGpuCulling.h:453
DtIndirectGlTextureResidencyManager & myGlTextureResidencyManager
Definition: DtGpuCulling.h:443
DtIndirectGeometryRegistrar * myRegistrar
Definition: DtGpuCulling.h:353
DtMaterial class declaration.
DtGlBuffer * myGpuInstancesOffsetAndNumInstancesBuffer
Definition: DtGpuCulling.h:401
std::vector< DrawElementsIndirectBindlessCommandNV > myMutableBindlessIndexAndVertexBuffers
the bindless vertex and index buffers
Definition: DtGpuCulling.h:370
const DtInstanceContainer & myInstanceContainer
Definition: DtGpuCulling.h:355
Contains makVrv::DtIndirectInstancesInvalidated class.
DtOsgLightPointManager & myLightPointManager
Definition: DtGpuCulling.h:419
std::vector< InstancesOffsetAndNumOfInstances > myInstancesOffsetAndNumInstances
Definition: DtGpuCulling.h:400
static const int theGpuOutputInstanceBufferDebugIndex
Definition: DtGpuCulling.h:454
#define DT_DLL_VRVOSG
Definition: vrvOsg.h:23
DtIndirectCullProgram * myMutableCullProgram
Definition: DtGpuCulling.h:396
creator for DtCoreGlBuffer
Definition: DtCoreGlBuffer.h:66
This class is a component of the DtIndirectGeometry It inputs are: -&gt; the instances registered with Dt...
Definition: DtGpuCulling.h:82
int myOffset
Definition: DtGpuCulling.h:102
Indirect geometry can have multiple models and their corresponding ids registered in it...
Definition: DtIndirectGeometryRegistrar.h:106
voidpf void uLong size
Definition: ioapi.h:39
Contains makVrv::DtFirstTextureStreamedModelAndIndexTracker class.
unsigned int GLuint
Definition: DtGlTextureBufferObject.h:17
DtGlBuffer * myGpuStateIdToMaxNumCommandsBuffer
Definition: DtGpuCulling.h:412
std::vector< StateIdOffsetAndMaxCommands > VectorStateIdOffsetAndMaxCommands
Definition: DtGpuCulling.h:106
bool operator==(const InstancesOffsetAndNumOfInstances &rhs) const
Definition: DtGpuCulling.h:92
4 dimensional vector
DtGlBuffer * myBindlessIndexAndVertexBuffersBuffer
The gpu buffer holding the same above info.
Definition: DtGpuCulling.h:373
VectorInts myGeomSpecIndexToCommandIndex
Definition: DtGpuCulling.h:416
unsigned int myLastNumUniqueGeometries
Definition: DtGpuCulling.h:427
DtIndirectInstancesInvalidated myInstancesInvalidated
Definition: DtGpuCulling.h:360
shader configuration storage class. Has 3 available options which are described in the constructor&#39;s ...
Definition: DtCullShaderConfig.h:21
DtOsgLightPointManager registers LightPoint nodes so their TBO can be created and updated in a single...
Definition: DtOsgLightPointManager.h:106
std::map< int, int > MapIntToInt
Definition: DtCommonTypes.h:25
DtGlBuffer * myGpuInputPerGeomInstancesBuffer
contains switch states/ lod info
Definition: DtGpuCulling.h:358
DtFirstTextureStreamedModelAndIndexTracker myFirstTextureStreamedModelAndIndexTracker
Keep track of the first model and what index to start using bindless textures.
Definition: DtGpuCulling.h:425
CameraToBufferMap myMutableGpuOutputInstancesBuffers
The re-distributed/culled/switched/lod&#39;ed instances (a subset of the input instances) ...
Definition: DtGpuCulling.h:446
std::vector< DtGeometrySpecification > myMutableGeometrySpecifications
c++ buffer that holds the same info
Definition: DtGpuCulling.h:363
Variadic templated creator class for defining a DtVirtualBaseClass creator that is automatically regi...
Definition: DtVirtualBaseClassCreator.h:22
Contains the DtIndirectEffectTexturesTemplate class declaration.
DtGlBuffer * myGpuSpecIndexToCommandIndexBuffer
Definition: DtGpuCulling.h:417
DtIndirectEffectTexturesTemplate myCurrentEffectTextureState
Definition: DtGpuCulling.h:439
CameraToBufferMap myMutableGpuOutputInstancesBuffersDebug
The re-distributed switched/lod&#39;ed instances but not culled out via cull shader for debugging...
Definition: DtGpuCulling.h:389
holds a set of the instances that need to be invalidated in the instance buffers
Definition: DtIndirectInstancesInvalidated.h:20
Definition: DtModelIdAndStreamedBytesTracker.h:18
unsigned int myMaxNumInstances
Definition: DtGpuCulling.h:404
unsigned int myLastNumEffectTextures
Definition: DtGpuCulling.h:426
std::vector< int > VectorInts
Definition: DtCommonTypes.h:20
handles the running of the compute shader pass for indirect culling, LODing and switches ...
Definition: DtIndirectCullProgram.h:54
DtGlBuffer * myGpuMaterialsBuffer
The spec buffer containing Materials for all the models/lods of the passed in instances.
Definition: DtGpuCulling.h:377
DtIndirectClearBufferProgram * myMutableClearBufferProgram
Definition: DtGpuCulling.h:456
Contains makVrv::DtIndirectModelSubGeometry class.
structure for holding an offset of an instance type (model id), and number of those instances ...
Definition: DtGpuCulling.h:87
4 dimensional vector
Definition: DtMath.h:22
CameraToBufferMap myGpuIndirectBuffersDebug
The indirect command buffer for debugging culling.
Definition: DtGpuCulling.h:392
unsigned int myMaxNumLightSources
Definition: DtGpuCulling.h:406
std::map< osg::observer_ptr< const osg::Camera >, DtGlBuffer * > CameraToBufferMap
Definition: DtGpuCulling.h:109
DtModelIdAndStreamedBytesTracker myMutableSpecBufferTracker
Definition: DtGpuCulling.h:431
A generic OpenGL buffer. This can be: -&gt; a vertex buffer -&gt; an index buffer -&gt; a shader storage buffe...
Definition: DtGlBuffer.h:29
int myNumOfInstances
Definition: DtGpuCulling.h:90
CameraToBufferMap myMutableGpuOutputInstanceOffsetInPerInstanceDataBuffers
The re-distributed/culled/switched/lod&#39;ed instances&#39; offset into the per instance data buffer...
Definition: DtGpuCulling.h:450
DtModelIdAndStreamedBytesTracker myMaterialBufferTracker
Definition: DtGpuCulling.h:430
DtGlBuffer * myGpuStateIdToCommandCountBuffer
Definition: DtGpuCulling.h:413
const DtCullShaderConfig myCullShaderConfig
Definition: DtGpuCulling.h:398
DtVirtualBaseClassCreator< DtGpuCulling, DtInstanceContainer &, const DtCullShaderConfig & > DtGpuCullingCreator
creator
Definition: DtGpuCulling.h:59
CameraToBufferMap myGpuLightSourceIndexOutputBuffers
Definition: DtGpuCulling.h:394
The class that is used to communicate the camera viewing parameters to the DtICullingAndLOD interface...
Definition: DtIndirectViewParameters.h:26
int myNumGeometries
Definition: DtGpuCulling.h:434
std::string myName
Definition: DtGpuCulling.h:441
DtGlBuffer * myGpuGeometrySpecificationsBuffer
The spec buffer containing GeometrySpecifications for all the models/lods of the passed in instances...
Definition: DtGpuCulling.h:367
DtIndirectMaterialVector myMaterials
c++ buffer that holds the same info
Definition: DtGpuCulling.h:380
Manager to delete GLBuffer in the main thread.
Definition: DtGlDeleteObjectManager.h:44
friend DtGpuCullingCreator
Definition: DtGpuCulling.h:114
std::unordered_set< DtIndirectModelInfo * > myModelsBeingUsed
Definition: DtGpuCulling.h:458
This class clears buffers using compute shader Theoretically, there are performance gains to be achie...
Definition: DtIndirectClearBufferProgram.h:33
DtGlBuffer * myGpuTexturesBuffer
Definition: DtGpuCulling.h:382
bool myTextureUpdateDirty
Definition: DtGpuCulling.h:428
CameraToBufferMap myMutableGpuIndirectBuffersBindless
the buffer into which the commands are generated
Definition: DtGpuCulling.h:385
Contains DLL export macros.
DtDe & myDe
Definition: DtGpuCulling.h:421
Enforces a single DtGlTextureResidencyManager across the whole indirect system/vrv (since the DtGlTex...
Definition: DtIndirectGlTextureResidencyManager.h:24
The DtDe is the core component of any VR-Vantage application. It owns a DtRenderer, DtDeCommunicator, as well as a DtDisplay and other things.
Definition: DtDe.h:70
Helper class to manage instances This class allows you to add a DtInstance_64 Internally, however it stores this as a DtInstance (which the GPU can directly read)
Definition: DtInstanceContainer.h:31
static const int theGpuOutputInstanceBufferIndex
Definition: DtGpuCulling.h:452
int myStreamedGeometryOffsetIdx
Definition: DtGpuCulling.h:433
Definition: DtFirstTextureStreamedModelAndIndexTracker.h:16
CameraSet myModelIdsToNumInstancesChanged
Definition: DtGpuCulling.h:436
std::set< osg::observer_ptr< const osg::Camera > > CameraSet
Definition: DtGpuCulling.h:110
voidpf uLong offset
Definition: ioapi.h:42
Contains makVrv::DtIndirectViewParameters class.
bool myRegistrarValid
Definition: DtGpuCulling.h:354
Class that allows you to abstractly register effect texture types the effect texture types are client...
Definition: DtIndirectEffectTexturesTemplate.h:40
VectorStateIdOffsetAndMaxCommands myStateIdToMaxNumCommands
Definition: DtGpuCulling.h:409
Contains the per Model info which the indirect module needs It is owned by the Indirect geometry regi...
Definition: DtIndirectModelInfo.h:44
std::vector< Material > DtIndirectMaterialVector
Each model type can have a number of geometries, each with an own material.
Definition: DtMaterial.h:46
int myMaxCommands
Definition: DtGpuCulling.h:103
Contains makVrv::DtModelIdAndStreamedBytesTracker class.
const char * creatorTypeName< DtGpuCulling >(void)
template specialization for the creator (pass the class being created to the creatorTypeName template...
Definition: DtGpuCulling.h:66
structure for holding an offset of a command of a given type (state id) and the number of commands of...
Definition: DtGpuCulling.h:100

Document ID: Generated on Sun Dec 4 20:22:03 EST 2022 from SVN revision 249613
Copyright © 2005-2021 MAK Technologies. All Rights Reserved (www.mak.com)