@@ -20,7 +20,9 @@ class Renderer : public irr::core::IReferenceCounted, public irr::core::Interfac
20
20
{
21
21
public:
22
22
#include " ../drawCommon.glsl"
23
+ #include " ../raytraceCommon.glsl"
23
24
#ifdef __cplusplus
25
+ #undef uint
24
26
#undef mat4
25
27
#undef mat4x3
26
28
#endif
@@ -31,22 +33,23 @@ class Renderer : public irr::core::IReferenceCounted, public irr::core::Interfac
31
33
32
34
Renderer (irr::video::IVideoDriver* _driver, irr::asset::IAssetManager* _assetManager, irr::scene::ISceneManager* _smgr, irr::core::smart_refctd_ptr<irr::video::IGPUDescriptorSet>&& globalBackendDataDS, bool useDenoiser = true );
33
35
34
- void init ( const irr::asset::SAssetBundle& meshes,
35
- bool isCameraRightHanded,
36
- irr::core::smart_refctd_ptr<irr::asset::ICPUBuffer>&& sampleSequence,
37
- uint32_t rayBufferSize=(sizeof (::RadeonRays::ray)*2u+sizeof(uint32_t )*2u)*MaxResolution[0]*MaxResolution[1]); // 2 samples for MIS, TODO: compute default buffer size
36
+ void init ( const irr::asset::SAssetBundle& meshes, irr::core::smart_refctd_ptr<irr::asset::ICPUBuffer>&& sampleSequence,
37
+ uint32_t rayBufferSize=(sizeof (::RadeonRays::ray)+sizeof(::RadeonRays::Intersection))*2u*MaxResolution[0]*MaxResolution[1]); // 2 samples for MIS, TODO: compute default buffer size
38
38
39
39
void deinit ();
40
40
41
41
void render (irr::ITimer* timer);
42
42
43
- bool isRightHanded () { return m_rightHanded; }
44
-
45
43
auto * getColorBuffer () { return m_colorBuffer; }
46
44
47
45
const auto & getSceneBound () const { return m_sceneBound; }
48
46
49
- uint64_t getTotalSamplesComputed () const { return static_cast <uint64_t >(m_samplesComputedPerPixel)*static_cast <uint64_t >(m_rayCountPerDispatch)/m_samplesPerPixelPerDispatch; }
47
+ uint64_t getTotalSamplesComputed () const
48
+ {
49
+ const auto samplesPerDispatch = static_cast <uint64_t >(m_staticViewData.samplesPerRowPerDispatch *m_staticViewData.imageDimensions .y );
50
+ const auto framesDispatched = static_cast <uint64_t >(m_raytraceCommonData.framesDispatched );
51
+ return framesDispatched*samplesPerDispatch;
52
+ }
50
53
51
54
52
55
_IRR_STATIC_INLINE_CONSTEXPR uint32_t MaxDimensions = 6u ;
@@ -98,97 +101,82 @@ class Renderer : public irr::core::IReferenceCounted, public irr::core::Interfac
98
101
core::smart_refctd_ptr<video::IGPUDescriptorSet> createDS2Raygen (core::smart_refctd_ptr<video::IGPUSampler>& nearstSampler);
99
102
core::smart_refctd_ptr<video::IGPUPipelineLayout> createLayoutRaygen ();
100
103
#endif
101
-
104
+ // constants
102
105
const bool m_useDenoiser;
103
106
107
+ // managers
104
108
irr::video::IVideoDriver* m_driver;
105
109
106
110
irr::asset::IAssetManager* m_assetManager;
107
111
irr::scene::ISceneManager* m_smgr;
108
112
109
113
irr::core::smart_refctd_ptr<irr::ext::RadeonRays::Manager> m_rrManager;
114
+ #ifdef _IRR_BUILD_OPTIX_
115
+ irr::core::smart_refctd_ptr<irr::ext::OptiX::Manager> m_optixManager;
116
+ CUstream m_cudaStream;
117
+ irr::core::smart_refctd_ptr<irr::ext::OptiX::IContext> m_optixContext;
118
+ #endif
119
+
120
+
121
+ // persistent (intialized in constructor
122
+ irr::core::smart_refctd_ptr<irr::video::IGPUDescriptorSetLayout> m_cullDSLayout;
123
+ irr::core::smart_refctd_ptr<const irr::video::IGPUPipelineLayout> m_cullPipelineLayout;
124
+ irr::core::smart_refctd_ptr<irr::video::IGPUComputePipeline> m_cullPipeline;
110
125
111
126
irr::core::smart_refctd_ptr<irr::asset::ICPUSpecializedShader> m_visibilityBufferFillShaders[2 ];
112
127
irr::core::smart_refctd_ptr<irr::asset::ICPUPipelineLayout> m_visibilityBufferFillPipelineLayoutCPU;
113
- irr::core::smart_refctd_ptr<irr::video::IGPUPipelineLayout> m_visibilityBufferFillPipelineLayoutGPU;
128
+ irr::core::smart_refctd_ptr<const irr::video::IGPUPipelineLayout> m_visibilityBufferFillPipelineLayoutGPU;
114
129
irr::core::smart_refctd_ptr<const irr::video::IGPUDescriptorSetLayout> m_perCameraRasterDSLayout;
115
130
116
- irr::core::smart_refctd_ptr<irr::video::IGPUDescriptorSetLayout> m_cullDSLayout;
117
- irr::core::smart_refctd_ptr<irr::video::IGPUPipelineLayout> m_cullPipelineLayout;
118
- irr::core::smart_refctd_ptr<irr::video::IGPUComputePipeline> m_cullPipeline;
119
-
120
- irr::core::smart_refctd_ptr<irr::video::IGPUComputePipeline> m_raygenPipeline,m_resolvePipeline;
131
+ irr::core::smart_refctd_ptr<irr::video::IGPUDescriptorSetLayout> m_commonDSLayout, m_raygenDSLayout, m_resolveDSLayout;
132
+ irr::core::smart_refctd_ptr<const irr::video::IGPUPipelineLayout> m_raygenPipelineLayout, m_resolvePipelineLayout;
133
+ irr::core::smart_refctd_ptr<irr::video::IGPUComputePipeline> m_raygenPipeline, m_resolvePipeline;
134
+
121
135
136
+ // scene specific data
137
+ irr::ext::RadeonRays::Manager::MeshBufferRRShapeCache rrShapeCache;
138
+ #if TODO
139
+ irr::ext::RadeonRays::Manager::MeshNodeRRInstanceCache rrInstances;
140
+ #endif
122
141
123
- irr::core::vectorSIMDf baseEnvColor;
124
142
irr::core::aabbox3df m_sceneBound;
125
- uint32_t m_renderSize[2u ];
126
- bool m_rightHanded;
143
+ StaticViewData_t m_staticViewData;
144
+ RaytraceShaderCommonData_t m_raytraceCommonData;
145
+
146
+ irr::core::smart_refctd_ptr<irr::video::IGPUDescriptorSet> m_globalBackendDataDS,m_commonRaytracingDS;
127
147
128
148
irr::core::smart_refctd_ptr<irr::video::IGPUBuffer> m_indirectDrawBuffers[2 ];
129
149
struct MDICall
130
150
{
131
151
irr::asset::SBufferBinding<irr::video::IGPUBuffer> vertexBindings[irr::video::IGPUMeshBuffer::MAX_ATTR_BUF_BINDING_COUNT];
132
152
irr::core::smart_refctd_ptr<irr::video::IGPUBuffer> indexBuffer;
133
153
irr::core::smart_refctd_ptr<irr::video::IGPURenderpassIndependentPipeline> pipeline;
134
- uint32_t mdiOffset,mdiCount;
154
+ uint32_t mdiOffset, mdiCount;
135
155
};
136
156
irr::core::vector<MDICall> m_mdiDrawCalls;
157
+ irr::core::smart_refctd_ptr<irr::video::IGPUDescriptorSet> m_cullDS;
137
158
CullShaderData_t m_cullPushConstants;
159
+ uint32_t m_cullWorkGroups;
138
160
139
- uint32_t m_lightCount;
140
- irr::core::smart_refctd_ptr<irr::video::IGPUBuffer> m_lightCDFBuffer;
141
- irr::core::smart_refctd_ptr<irr::video::IGPUBuffer> m_lightBuffer;
142
- irr::core::smart_refctd_ptr<irr::video::IGPUBuffer> m_lightRadianceBuffer;
143
-
144
- irr::core::smart_refctd_ptr<irr::video::IGPUDescriptorSet> m_globalBackendDataDS,m_cullDS,m_perCameraRasterDS; // TODO: do we need to keep track of this?
145
-
146
-
147
- irr::ext::RadeonRays::Manager::MeshBufferRRShapeCache rrShapeCache;
148
- #if TODO
149
- irr::core::smart_refctd_ptr<irr::video::IGPUDescriptorSet> m_compostDS2;
150
- irr::core::smart_refctd_ptr<irr::video::IGPUPipelineLayout> m_compostLayout;
151
- irr::core::smart_refctd_ptr<irr::video::IGPUComputePipeline> m_compostPipeline;
161
+ irr::core::smart_refctd_ptr<irr::video::IGPUDescriptorSet> m_perCameraRasterDS;
152
162
163
+ irr::core::smart_refctd_ptr<irr::video::IGPUDescriptorSet> m_raygenDS;
153
164
uint32_t m_raygenWorkGroups[2 ];
154
- uint32_t m_resolveWorkGroups[2 ];
155
165
156
- irr::core::smart_refctd_ptr<irr::video::IGPUDescriptorSet> m_raygenDS2;
157
- irr::core::smart_refctd_ptr<irr::video::IGPUPipelineLayout> m_raygenLayout;
158
-
159
- irr::ext::RadeonRays::Manager::MeshNodeRRInstanceCache rrInstances;
160
- #endif
161
166
struct InteropBuffer
162
167
{
163
168
irr::core::smart_refctd_ptr<irr::video::IGPUBuffer> buffer;
164
- std::pair<::RadeonRays::Buffer*,cl_mem> asRRBuffer;
169
+ std::pair<::RadeonRays::Buffer*, cl_mem> asRRBuffer = { nullptr , 0u } ;
165
170
};
166
171
InteropBuffer m_rayCountBuffer,m_rayBuffer,m_intersectionBuffer;
167
172
173
+ irr::core::smart_refctd_ptr<irr::video::IGPUDescriptorSet> m_resolveDS;
174
+ uint32_t m_resolveWorkGroups[2 ];
168
175
169
- enum E_VISIBILITY_BUFFER_ATTACHMENT
170
- {
171
- EVBA_DEPTH,
172
- EVBA_OBJECTID_AND_TRIANGLEID_AND_FRONTFACING,
173
- // TODO: Once we get geometry packer V2 (virtual geometry) no need for these buffers actually (might want/need a barycentric buffer)
174
- EVBA_NORMALS,
175
- EVBA_UV_COORDINATES,
176
- EVBA_COUNT
177
- };
178
- irr::core::smart_refctd_ptr<irr::video::IGPUImageView> m_visibilityBufferAttachments[EVBA_COUNT];
179
-
180
- uint32_t m_maxSamples, m_samplesPerPixelPerDispatch, m_rayCountPerDispatch;
181
- uint32_t m_framesDone, m_samplesComputedPerPixel;
182
- irr::core::smart_refctd_ptr<irr::video::IGPUBufferView> m_sampleSequence;
183
- irr::core::smart_refctd_ptr<irr::video::IGPUImageView> m_scrambleTexture;
184
-
185
- irr::core::smart_refctd_ptr<irr::video::IGPUImageView> m_accumulation, m_tonemapOutput;
176
+ irr::core::smart_refctd_ptr<irr::video::IGPUImageView> m_accumulation,m_tonemapOutput;
186
177
irr::video::IFrameBuffer* m_visibilityBuffer,* m_colorBuffer,* tmpTonemapBuffer;
187
178
188
179
#ifdef _IRR_BUILD_OPTIX_
189
- irr::core::smart_refctd_ptr<irr::ext::OptiX::Manager> m_optixManager;
190
- CUstream m_cudaStream;
191
- irr::core::smart_refctd_ptr<irr::ext::OptiX::IContext> m_optixContext;
192
180
irr::core::smart_refctd_ptr<irr::ext::OptiX::IDenoiser> m_denoiser;
193
181
OptixDenoiserSizes m_denoiserMemReqs;
194
182
irr::cuda::CCUDAHandler::GraphicsAPIObjLink<irr::video::IGPUBuffer> m_denoiserInputBuffer,m_denoiserStateBuffer,m_denoisedBuffer,m_denoiserScratchBuffer;
0 commit comments