Skip to content

Commit 31e17d6

Browse files
finally ordering of members is complete
TODO: adjust the resolve descriptor set layout create descriptor sets and shaders
1 parent c6ce1a9 commit 31e17d6

File tree

13 files changed

+568
-611
lines changed

13 files changed

+568
-611
lines changed

examples_tests/22.RaytracedAO/common.glsl

Lines changed: 0 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -24,50 +24,4 @@
2424
#endif
2525

2626

27-
struct RaytraceShaderCommonData_t
28-
{
29-
uvec2 imageDimensions;
30-
uint samplesPerPixelPerDispatch;
31-
uint samplesPerRowPerDispatch;
32-
};
33-
34-
35-
struct SLight
36-
{
37-
#ifdef __cplusplus
38-
SLight() : obb() {}
39-
SLight(const SLight& other) : obb(other.obb) {}
40-
SLight(const irr::core::aabbox3df& bbox, const irr::core::matrix3x4SIMD& tform) : SLight()
41-
{
42-
auto extent = bbox.getExtent();
43-
obb.setScale(irr::core::vectorSIMDf(extent.X,extent.Y,extent.Z));
44-
obb.setTranslation(irr::core::vectorSIMDf(bbox.MinEdge.X,bbox.MinEdge.Y,bbox.MinEdge.Z));
45-
46-
obb = irr::core::concatenateBFollowedByA(tform,obb);
47-
}
48-
49-
inline SLight& operator=(SLight&& other) noexcept
50-
{
51-
std::swap(obb, other.obb);
52-
53-
return *this;
54-
}
55-
56-
// also known as an upper bound on lumens put into the scene
57-
inline float computeFluxBound(const irr::core::vectorSIMDf& radiance) const
58-
{
59-
const irr::core::vectorSIMDf rec709LumaCoeffs(0.2126f, 0.7152f, 0.0722f, 0.f);
60-
const auto unitHemisphereArea = 2.f*irr::core::PI<float>();
61-
62-
const auto unitBoxScale = obb.getScale();
63-
const float obbArea = 2.f*(unitBoxScale.x*unitBoxScale.y+unitBoxScale.x*unitBoxScale.z+unitBoxScale.y*unitBoxScale.z);
64-
65-
return irr::core::dot(radiance,rec709LumaCoeffs).x*unitHemisphereArea*obbArea;
66-
}
67-
#endif
68-
69-
mat4x3 obb; // needs row_major qualifier
70-
};
71-
72-
7327
#endif

examples_tests/22.RaytracedAO/dirty_source/ExtraCrap.cpp

Lines changed: 274 additions & 350 deletions
Large diffs are not rendered by default.

examples_tests/22.RaytracedAO/dirty_source/ExtraCrap.h

Lines changed: 46 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ class Renderer : public irr::core::IReferenceCounted, public irr::core::Interfac
2020
{
2121
public:
2222
#include "../drawCommon.glsl"
23+
#include "../raytraceCommon.glsl"
2324
#ifdef __cplusplus
25+
#undef uint
2426
#undef mat4
2527
#undef mat4x3
2628
#endif
@@ -31,22 +33,23 @@ class Renderer : public irr::core::IReferenceCounted, public irr::core::Interfac
3133

3234
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);
3335

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
3838

3939
void deinit();
4040

4141
void render(irr::ITimer* timer);
4242

43-
bool isRightHanded() { return m_rightHanded; }
44-
4543
auto* getColorBuffer() { return m_colorBuffer; }
4644

4745
const auto& getSceneBound() const { return m_sceneBound; }
4846

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+
}
5053

5154

5255
_IRR_STATIC_INLINE_CONSTEXPR uint32_t MaxDimensions = 6u;
@@ -98,97 +101,82 @@ class Renderer : public irr::core::IReferenceCounted, public irr::core::Interfac
98101
core::smart_refctd_ptr<video::IGPUDescriptorSet> createDS2Raygen(core::smart_refctd_ptr<video::IGPUSampler>& nearstSampler);
99102
core::smart_refctd_ptr<video::IGPUPipelineLayout> createLayoutRaygen();
100103
#endif
101-
104+
// constants
102105
const bool m_useDenoiser;
103106

107+
// managers
104108
irr::video::IVideoDriver* m_driver;
105109

106110
irr::asset::IAssetManager* m_assetManager;
107111
irr::scene::ISceneManager* m_smgr;
108112

109113
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;
110125

111126
irr::core::smart_refctd_ptr<irr::asset::ICPUSpecializedShader> m_visibilityBufferFillShaders[2];
112127
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;
114129
irr::core::smart_refctd_ptr<const irr::video::IGPUDescriptorSetLayout> m_perCameraRasterDSLayout;
115130

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+
121135

136+
// scene specific data
137+
irr::ext::RadeonRays::Manager::MeshBufferRRShapeCache rrShapeCache;
138+
#if TODO
139+
irr::ext::RadeonRays::Manager::MeshNodeRRInstanceCache rrInstances;
140+
#endif
122141

123-
irr::core::vectorSIMDf baseEnvColor;
124142
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;
127147

128148
irr::core::smart_refctd_ptr<irr::video::IGPUBuffer> m_indirectDrawBuffers[2];
129149
struct MDICall
130150
{
131151
irr::asset::SBufferBinding<irr::video::IGPUBuffer> vertexBindings[irr::video::IGPUMeshBuffer::MAX_ATTR_BUF_BINDING_COUNT];
132152
irr::core::smart_refctd_ptr<irr::video::IGPUBuffer> indexBuffer;
133153
irr::core::smart_refctd_ptr<irr::video::IGPURenderpassIndependentPipeline> pipeline;
134-
uint32_t mdiOffset,mdiCount;
154+
uint32_t mdiOffset, mdiCount;
135155
};
136156
irr::core::vector<MDICall> m_mdiDrawCalls;
157+
irr::core::smart_refctd_ptr<irr::video::IGPUDescriptorSet> m_cullDS;
137158
CullShaderData_t m_cullPushConstants;
159+
uint32_t m_cullWorkGroups;
138160

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;
152162

163+
irr::core::smart_refctd_ptr<irr::video::IGPUDescriptorSet> m_raygenDS;
153164
uint32_t m_raygenWorkGroups[2];
154-
uint32_t m_resolveWorkGroups[2];
155165

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
161166
struct InteropBuffer
162167
{
163168
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 };
165170
};
166171
InteropBuffer m_rayCountBuffer,m_rayBuffer,m_intersectionBuffer;
167172

173+
irr::core::smart_refctd_ptr<irr::video::IGPUDescriptorSet> m_resolveDS;
174+
uint32_t m_resolveWorkGroups[2];
168175

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;
186177
irr::video::IFrameBuffer* m_visibilityBuffer,* m_colorBuffer,* tmpTonemapBuffer;
187178

188179
#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;
192180
irr::core::smart_refctd_ptr<irr::ext::OptiX::IDenoiser> m_denoiser;
193181
OptixDenoiserSizes m_denoiserMemReqs;
194182
irr::cuda::CCUDAHandler::GraphicsAPIObjLink<irr::video::IGPUBuffer> m_denoiserInputBuffer,m_denoiserStateBuffer,m_denoisedBuffer,m_denoiserScratchBuffer;

examples_tests/22.RaytracedAO/main.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ int main()
260260
}
261261
}
262262

263-
renderer->init(meshes, rightHandedCamera, std::move(sampleSequence));
263+
renderer->init(meshes, std::move(sampleSequence));
264264
meshes = {}; // free memory
265265

266266

examples_tests/22.RaytracedAO/raygen.comp

Lines changed: 29 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,16 @@
11
#version 430 core
2-
#include "raygenCommon.glsl"
2+
#include "raytraceCommon.glsl"
33

44

55
#include <irr/builtin/glsl/utils/normal_decode.glsl>
6-
//
7-
layout(set = 2, binding = 0, row_major) uniform RaygenData
8-
{
9-
RaygenShaderData_t raygenData;
10-
};
116
// rng
12-
layout(set = 2, binding = 1) uniform usamplerBuffer sampleSequence;
13-
layout(set = 2, binding = 2) uniform usampler2D scramblebuf;
7+
layout(set = 2, binding = 0) uniform usamplerBuffer sampleSequence;
8+
layout(set = 2, binding = 1) uniform usampler2D scramblebuf;
149
// vis buffer
15-
layout(set = 2, binding = 3) uniform sampler2D depthbuf;
16-
layout(set = 2, binding = 4) uniform usampler2D objectTriangleFrontFacing;
17-
layout(set = 2, binding = 5) uniform sampler2D encodedNormal;
18-
layout(set = 2, binding = 6) uniform sampler2D uv;
10+
layout(set = 2, binding = 2) uniform sampler2D depthbuf;
11+
layout(set = 2, binding = 3) uniform usampler2D objectTriangleFrontFacing;
12+
layout(set = 2, binding = 4) uniform sampler2D encodedNormal;
13+
layout(set = 2, binding = 5) uniform sampler2D uv;
1914

2015

2116

@@ -30,7 +25,7 @@ float linearizeZBufferVal(in float nonLinearZBufferVal)
3025
// positive [0,1] Z: `B/(C-A-Cy)/(B/(C-A))`
3126
// positive [0,1] Z: `(C-A)/(C-A-Cy)`
3227
// positive [0,1] Z: `D/(D-Cy)`
33-
return 1.0/(pc.data.depthLinearizationConstant*nonLinearZBufferVal+1.0);
28+
return 1.0/(pc.cummon.depthLinearizationConstant*nonLinearZBufferVal+1.0);
3429
}
3530

3631

@@ -86,7 +81,7 @@ bool gen_sample_ray(out float maxT, out vec3 direction, out vec3 throughput, in
8681
return true;
8782
}
8883

89-
#ifdef TODO
84+
#ifdef TODO
9085
// TODO: define lower and upper bound over `lightCDF`
9186
vec3 light_sample(out vec3 incoming, in uint sampleIx, in uint scramble, inout float maxT, inout bool alive, in vec3 position)
9287
{
@@ -99,7 +94,7 @@ vec3 light_sample(out vec3 incoming, in uint sampleIx, in uint scramble, inout f
9994

10095
#define SHADOW_RAY_LEN 0.93
10196
float factor; // 1.0/light_probability already baked into the light factor
102-
switch (SLight_extractType(light))
97+
switch (SLight_extractType(light))
10398
{
10499
case SLight_ET_ELLIPSOID:
105100
lightSurfaceSample.x = lightSurfaceSample.x*2.0-1.0;
@@ -154,23 +149,23 @@ vec3 light_sample(out vec3 incoming, in uint sampleIx, in uint scramble, inout f
154149
void main()
155150
{
156151
uvec2 outputLocation = gl_GlobalInvocationID.xy;
157-
if (all(lessThan(outputLocation,pc.data.imageDimensions)))
152+
if (all(lessThan(outputLocation,staticViewData.imageDimensions)))
158153
{
159154
ivec2 uv = ivec2(outputLocation);
160155
float revdepth = texelFetch(depthbuf,uv,0).r;
161156

162-
uint outputID = outputLocation.y*pc.data.samplesPerRowPerDispatch+outputLocation.x;
157+
const uint outputID = outputLocation.y*staticViewData.samplesPerRowPerDispatch+outputLocation.x*staticViewData.samplesPerPixelPerDispatch;
163158

164159
SamplingData_t samplingData;
165160
// unproject
166161
vec3 viewDir;
167162
vec3 position;
168163
{
169-
const mat4x3 frustumCorners = pc.data.frustumCorners;
170-
const vec2 NDC = vec2(outputLocation)*pc.data.rcpPixelSize+pc.data.rcpHalfPixelSize;
164+
const mat4x3 frustumCorners = pc.cummon.frustumCorners;
165+
const vec2 NDC = vec2(outputLocation)*staticViewData.rcpPixelSize+staticViewData.rcpHalfPixelSize;
171166

172167
viewDir = mix(frustumCorners[0]*NDC.x+frustumCorners[1],frustumCorners[2]*NDC.x+frustumCorners[3],NDC.yyy);
173-
position = viewDir*linearizeZBufferVal(revdepth)+pc.data.cameraPosition;
168+
position = viewDir*linearizeZBufferVal(revdepth)+pc.cummon.normalMatrixAndCameraPos[3];
174169
}
175170

176171
bool alive = false;
@@ -181,14 +176,24 @@ void main()
181176
if (revdepth>0.0)
182177
{
183178
scramble = texelFetch(scramblebuf,uv,0).r;
179+
180+
const vec3 emissive = vec3(0.0,1.0,0.0);
181+
vec3 acc;
182+
if (pc.cummon.rcpFramesDispatched<1.0)
183+
acc = fetchFramebuffer(uv)+emissive/float(pc.cummon.framesDispatched-1u);
184+
else
185+
acc = emissive;
186+
187+
//
184188

189+
storeFramebuffer(acc,uv);
185190
alive = true;
186191
}
187192
#ifdef USE_OPTIX_DENOISER
188193
// TODO: translate normal into float16_t buff
189194
#endif
190195

191-
for (uint i=0u; i<pc.data.samplesPerPixelPerDispatch; i++)
196+
for (uint i=0u; i<staticViewData.samplesPerPixelPerDispatch; i++)
192197
{
193198
vec3 direction; // TODO: just use irr_glsl_LightSample?
194199
float maxT;
@@ -197,14 +202,16 @@ void main()
197202
bool validRay = false;
198203
if (alive)
199204
{
200-
samplingData.sampleID = pc.data.samplesComputedPerPixel+i;
205+
samplingData.sampleID = pc.cummon.samplesComputedPerPixel+i;
201206
validRay = gen_sample_ray(maxT,direction,throughput.rgb,samplingData);
202207
}
203208

204209
// TODO: repack rays in smem for coalescing
205210
const uint realOutputID = outputID+i;
206211
if (validRay)
207212
{
213+
throughput /= float(staticViewData.samplesPerPixelPerDispatch);
214+
208215
rays[realOutputID].origin = position;/*+newray.direction*err?; TODO */
209216
rays[realOutputID].maxT = 0.0;
210217
rays[realOutputID].direction = direction;

0 commit comments

Comments
 (0)