Skip to content

Commit dbb6b93

Browse files
committed
ex22 rtao little update
not much but i inserted some useful comments
1 parent af016b4 commit dbb6b93

File tree

4 files changed

+79
-170
lines changed

4 files changed

+79
-170
lines changed

examples_tests/22.RaytracedAO/dirty_source/ExtraCrap.cpp

Lines changed: 61 additions & 134 deletions
Original file line numberDiff line numberDiff line change
@@ -499,7 +499,6 @@ void main()
499499
500500
)======";
501501

502-
#ifndef NEW_SHADERS
503502
inline GLuint createComputeShader(const std::string& source)
504503
{
505504
GLuint program = COpenGLExtensionHandler::extGlCreateProgram();
@@ -540,108 +539,15 @@ inline GLuint createComputeShader(const std::string& source)
540539
return program;
541540
}
542541

543-
544-
545-
class SimpleCallBack : public video::IShaderConstantSetCallBack
546-
{
547-
Renderer* renderer;
548-
video::E_MATERIAL_TYPE currentMat;
549-
550-
int32_t mvpUniformLocation[video::EMT_COUNT+2];
551-
int32_t nUniformLocation[video::EMT_COUNT+2];
552-
int32_t flipFacesUniformLocation[video::EMT_COUNT+2];
553-
int32_t colorUniformLocation[video::EMT_COUNT+2];
554-
int32_t nastyUniformLocation[video::EMT_COUNT+2];
555-
int32_t lightIDUniformLocation[video::EMT_COUNT+2];
556-
video::E_SHADER_CONSTANT_TYPE mvpUniformType[video::EMT_COUNT+2];
557-
video::E_SHADER_CONSTANT_TYPE nUniformType[video::EMT_COUNT+2];
558-
video::E_SHADER_CONSTANT_TYPE flipFacesUniformType[video::EMT_COUNT+2];
559-
video::E_SHADER_CONSTANT_TYPE colorUniformType[video::EMT_COUNT+2];
560-
video::E_SHADER_CONSTANT_TYPE nastyUniformType[video::EMT_COUNT+2];
561-
video::E_SHADER_CONSTANT_TYPE lightIDUniformType[video::EMT_COUNT+2];
562-
public:
563-
SimpleCallBack(Renderer* _renderer) : renderer(_renderer), currentMat(video::EMT_SOLID)
564-
{
565-
std::fill(mvpUniformLocation, reinterpret_cast<int32_t*>(mvpUniformType), -1);
566-
}
567-
568-
virtual void PostLink(video::IMaterialRendererServices* services, const video::E_MATERIAL_TYPE& materialType, const core::vector<video::SConstantLocationNamePair>& constants)
569-
{
570-
for (size_t i=0; i<constants.size(); i++)
571-
{
572-
if (constants[i].name == "MVP")
573-
{
574-
mvpUniformLocation[materialType] = constants[i].location;
575-
mvpUniformType[materialType] = constants[i].type;
576-
}
577-
else if (constants[i].name == "NormalMatrix")
578-
{
579-
nUniformLocation[materialType] = constants[i].location;
580-
nUniformType[materialType] = constants[i].type;
581-
}
582-
else if (constants[i].name == "flipFaces")
583-
{
584-
flipFacesUniformLocation[materialType] = constants[i].location;
585-
flipFacesUniformType[materialType] = constants[i].type;
586-
}
587-
else if (constants[i].name == "color")
588-
{
589-
colorUniformLocation[materialType] = constants[i].location;
590-
colorUniformType[materialType] = constants[i].type;
591-
}
592-
else if (constants[i].name == "nasty")
593-
{
594-
nastyUniformLocation[materialType] = constants[i].location;
595-
nastyUniformType[materialType] = constants[i].type;
596-
}
597-
else if (constants[i].name == "lightID")
598-
{
599-
lightIDUniformLocation[materialType] = constants[i].location;
600-
lightIDUniformType[materialType] = constants[i].type;
601-
}
602-
}
603-
}
604-
605-
virtual void OnSetMaterial(video::IMaterialRendererServices* services, const video::SGPUMaterial& material, const video::SGPUMaterial& lastMaterial)
606-
{
607-
currentMat = material.MaterialType;
608-
services->setShaderConstant(&material.AmbientColor, colorUniformLocation[currentMat], colorUniformType[currentMat], 1);
609-
services->setShaderConstant(&material.MaterialTypeParam, nastyUniformLocation[currentMat], nastyUniformType[currentMat], 1);
610-
services->setShaderConstant(&material.userData, lightIDUniformLocation[currentMat], lightIDUniformType[currentMat], 1);
611-
}
612-
613-
virtual void OnSetConstants(video::IMaterialRendererServices* services, int32_t userData)
614-
{
615-
auto world = services->getVideoDriver()->getTransform(video::E4X3TS_WORLD);
616-
if (flipFacesUniformLocation[currentMat]>=0)
617-
{
618-
auto tmp = world.getPseudoDeterminant();
619-
if (renderer->isRightHanded())
620-
tmp = -tmp;
621-
services->setShaderConstant(tmp.pointer, flipFacesUniformLocation[currentMat], flipFacesUniformType[currentMat], 1);
622-
}
623-
if (nUniformLocation[currentMat]>=0)
624-
{
625-
float tmp[9];
626-
world.getSub3x3InverseTransposePacked(tmp);
627-
services->setShaderConstant(tmp, nUniformLocation[currentMat], nUniformType[currentMat], 1);
628-
}
629-
if (mvpUniformLocation[currentMat]>=0)
630-
services->setShaderConstant(services->getVideoDriver()->getTransform(video::EPTS_PROJ_VIEW_WORLD).pointer(), mvpUniformLocation[currentMat], mvpUniformType[currentMat], 1);
631-
}
632-
633-
virtual void OnUnsetMaterial() {}
634-
};
635-
636542
constexpr uint32_t UNFLEXIBLE_MAX_SAMPLES_TODO_REMOVE = 1024u*1024u;
637543

638544

639545
constexpr uint32_t kOptiXPixelSize = sizeof(uint16_t)*3u;
640546

641547

642-
Renderer::Renderer(IVideoDriver* _driver, IAssetManager* _assetManager, ISceneManager* _smgr, bool useDenoiser) :
548+
Renderer::Renderer(IVideoDriver* _driver, IAssetManager* _assetManager, irr::scene::ISceneManager* _smgr, bool useDenoiser) :
643549
m_driver(_driver), m_smgr(_smgr), m_assetManager(_assetManager),
644-
nonInstanced(static_cast<E_MATERIAL_TYPE>(-1)), m_raygenProgram(0u), m_compostProgram(0u),
550+
m_raygenProgram(0u), m_compostProgram(0u),
645551
m_rrManager(ext::RadeonRays::Manager::create(m_driver)), m_rightHanded(false),
646552
m_depth(), m_albedo(), m_normals(), m_lightIndex(), m_accumulation(), m_tonemapOutput(),
647553
m_colorBuffer(nullptr), m_gbuffer(nullptr), tmpTonemapBuffer(nullptr),
@@ -655,15 +561,6 @@ Renderer::Renderer(IVideoDriver* _driver, IAssetManager* _assetManager, ISceneMa
655561
,m_cudaStream(nullptr)
656562
#endif
657563
{
658-
SimpleCallBack* cb = new SimpleCallBack(this);
659-
nonInstanced = (E_MATERIAL_TYPE)m_driver->getGPUProgrammingServices()->addHighLevelShaderMaterialFromFiles("../mesh.vert",
660-
"", "", "", //! No Geometry or Tessellation Shaders
661-
"../mesh.frag",
662-
3, EMT_SOLID, //! 3 vertices per primitive (this is tessellation shader relevant only
663-
cb, //! Our Shader Callback
664-
0); //! No custom user data
665-
cb->drop();
666-
667564
#ifdef _IRR_BUILD_OPTIX_
668565
while (useDenoiser)
669566
{
@@ -721,6 +618,35 @@ Renderer::Renderer(IVideoDriver* _driver, IAssetManager* _assetManager, ISceneMa
721618
}
722619
}
723620

621+
core::smart_refctd_ptr<video::IGPUImageView> Renderer::createGPUTexture(const uint32_t* extent, uint32_t mips, E_FORMAT format)
622+
{
623+
IGPUImage::SCreationParams imgparams;
624+
imgparams.extent = { extent[0], extent[1], 1u };
625+
imgparams.arrayLayers = 1u;
626+
imgparams.flags = static_cast<IImage::E_CREATE_FLAGS>(0);
627+
imgparams.format = format;
628+
imgparams.mipLevels = mips;
629+
imgparams.samples = IImage::ESCF_1_BIT;
630+
imgparams.type = IImage::ET_2D;
631+
632+
auto memreqs = m_driver->getDeviceLocalGPUMemoryReqs();
633+
634+
auto img = m_driver->createGPUImageOnDedMem(std::move(imgparams), memreqs);
635+
636+
IGPUImageView::SCreationParams viewparams;
637+
viewparams.flags = static_cast<IGPUImageView::E_CREATE_FLAGS>(0);
638+
viewparams.format = format;
639+
viewparams.image = std::move(img);
640+
viewparams.viewType = IGPUImageView::ET_2D;
641+
viewparams.subresourceRange.aspectMask = static_cast<IImage::E_ASPECT_FLAGS>(0);
642+
viewparams.subresourceRange.baseArrayLayer = 0u;
643+
viewparams.subresourceRange.layerCount = 1u;
644+
viewparams.subresourceRange.baseMipLevel = 0u;
645+
viewparams.subresourceRange.levelCount = 1u;
646+
647+
return m_driver->createGPUImageView(std::move(viewparams));
648+
}
649+
724650
Renderer::~Renderer()
725651
{
726652
deinit();
@@ -749,9 +675,9 @@ void Renderer::init(const SAssetBundle& meshes,
749675
const ext::MitsubaLoader::CGlobalMitsubaMetadata* globalMeta = nullptr;
750676
{
751677
auto contents = meshes.getContents();
752-
for (auto cpuit = contents.first; cpuit!=contents.second; cpuit++)
678+
for (auto& cpumesh_ : contents)
753679
{
754-
auto cpumesh = static_cast<asset::ICPUMesh*>(cpuit->get());
680+
auto cpumesh = static_cast<asset::ICPUMesh*>(cpumesh_.get());
755681

756682
auto* meta = cpumesh->getMetadata();
757683

@@ -762,6 +688,10 @@ void Renderer::init(const SAssetBundle& meshes,
762688
//! TODO: fix
763689
const auto shapeType = meshmeta->getShapeType()==ext::MitsubaLoader::CElementShape::Type::INSTANCE ? ext::MitsubaLoader::CElementShape::Type::SERIALIZED:meshmeta->getShapeType();
764690

691+
// WARNING!!!
692+
// all this instance-related things is a rework candidate since mitsuba loader supports instances
693+
// (all this metadata should still be attached to meshes, but meshbuffers has instanceCount correctly set
694+
// and DS with per-instance data (transform, normal matrix, instructions offsets, etc)
765695
const auto& instances = meshmeta->getInstances();
766696

767697
auto meshBufferCount = cpumesh->getMeshBufferCount();
@@ -1028,9 +958,9 @@ void Renderer::init(const SAssetBundle& meshes,
1028958
lightCDF.back() = 0xdeadbeefu;
1029959

1030960
m_lightCount = lights.size();
1031-
m_lightCDFBuffer = core::smart_refctd_ptr<IGPUBuffer>(m_driver->createFilledDeviceLocalGPUBufferOnDedMem(lightCDF.size()*sizeof(uint32_t),lightCDF.data()),core::dont_grab);
1032-
m_lightBuffer = core::smart_refctd_ptr<IGPUBuffer>(m_driver->createFilledDeviceLocalGPUBufferOnDedMem(lights.size()*sizeof(SLight),lights.data()),core::dont_grab);
1033-
m_lightRadianceBuffer = core::smart_refctd_ptr<IGPUBuffer>(m_driver->createFilledDeviceLocalGPUBufferOnDedMem(lightRadiances.size()*sizeof(core::vectorSIMDf),lightRadiances.data()),core::dont_grab);
961+
m_lightCDFBuffer = m_driver->createFilledDeviceLocalGPUBufferOnDedMem(lightCDF.size()*sizeof(uint32_t),lightCDF.data());
962+
m_lightBuffer = m_driver->createFilledDeviceLocalGPUBufferOnDedMem(lights.size()*sizeof(SLight),lights.data());
963+
m_lightRadianceBuffer = m_driver->createFilledDeviceLocalGPUBufferOnDedMem(lightRadiances.size()*sizeof(core::vectorSIMDf),lightRadiances.data());
1034964
}
1035965

1036966
auto renderPixelCount = renderSize[0]*renderSize[1]*renderSize[2];
@@ -1041,11 +971,10 @@ void Renderer::init(const SAssetBundle& meshes,
1041971

1042972
// upload sequence to GPU
1043973
auto gpubuf = m_driver->createFilledDeviceLocalGPUBufferOnDedMem(sampleSequence->getSize(), sampleSequence->getPointer());
1044-
m_sampleSequence = core::smart_refctd_ptr<ITextureBufferObject>(m_driver->addTextureBufferObject(gpubuf, ITextureBufferObject::ETBOF_RG32UI), core::dont_grab);
1045-
gpubuf->drop();
974+
m_sampleSequence = m_driver->createGPUBufferView(gpubuf.get(), asset::EF_R32G32_UINT);
1046975

1047976
// create scramble texture
1048-
m_scrambleTexture = m_driver->createGPUTexture(ITexture::ETT_2D, &renderSize[0], 1u, EF_R32_UINT);
977+
m_scrambleTexture = createGPUTexture(&renderSize[0], 1u, EF_R32_UINT);
1049978
{
1050979
core::vector<uint32_t> random(renderPixelCount);
1051980
// generate
@@ -1060,21 +989,21 @@ void Renderer::init(const SAssetBundle& meshes,
1060989
}
1061990
}
1062991

1063-
m_depth = m_driver->createGPUTexture(ITexture::ETT_2D, &renderSize[0], 1, EF_D32_SFLOAT);
1064-
m_albedo = m_driver->createGPUTexture(ITexture::ETT_2D, &renderSize[0], 1, EF_R8G8B8_SRGB);
1065-
m_normals = m_driver->createGPUTexture(ITexture::ETT_2D, &renderSize[0], 1, EF_R16G16_SNORM);
1066-
m_lightIndex = m_driver->createGPUTexture(ITexture::ETT_2D, &renderSize[0], 1, EF_R32_UINT);
992+
m_depth = createGPUTexture(&renderSize[0], 1, EF_D32_SFLOAT);
993+
m_albedo = createGPUTexture(&renderSize[0], 1, EF_R8G8B8_SRGB);
994+
m_normals = createGPUTexture(&renderSize[0], 1, EF_R16G16_SNORM);
995+
m_lightIndex = createGPUTexture(&renderSize[0], 1, EF_R32_UINT);
1067996

1068-
m_accumulation = m_driver->createGPUTexture(ITexture::ETT_2D, &renderSize[0], 1, EF_R32G32B32A32_SFLOAT);
997+
m_accumulation = createGPUTexture(&renderSize[0], 1, EF_R32G32B32A32_SFLOAT);
1069998

1070999
tmpTonemapBuffer = m_driver->addFrameBuffer();
1071-
tmpTonemapBuffer->attach(EFAP_COLOR_ATTACHMENT0, m_accumulation.get());
1000+
tmpTonemapBuffer->attach(EFAP_COLOR_ATTACHMENT0, core::smart_refctd_ptr(m_accumulation));
10721001

10731002
m_gbuffer = m_driver->addFrameBuffer();
1074-
m_gbuffer->attach(EFAP_DEPTH_ATTACHMENT, m_depth.get());
1075-
m_gbuffer->attach(EFAP_COLOR_ATTACHMENT0, m_albedo.get());
1076-
m_gbuffer->attach(EFAP_COLOR_ATTACHMENT1, m_normals.get());
1077-
m_gbuffer->attach(EFAP_COLOR_ATTACHMENT2, m_lightIndex.get());
1003+
m_gbuffer->attach(EFAP_DEPTH_ATTACHMENT, core::smart_refctd_ptr(m_depth));
1004+
m_gbuffer->attach(EFAP_COLOR_ATTACHMENT0, core::smart_refctd_ptr(m_albedo));
1005+
m_gbuffer->attach(EFAP_COLOR_ATTACHMENT1, core::smart_refctd_ptr(m_normals));
1006+
m_gbuffer->attach(EFAP_COLOR_ATTACHMENT2, core::smart_refctd_ptr(m_lightIndex));
10781007

10791008
//
10801009
constexpr auto RAYGEN_WORK_GROUP_DIM = 16u;
@@ -1093,13 +1022,13 @@ void Renderer::init(const SAssetBundle& meshes,
10931022
printf("Using %d samples\n", m_samplesPerDispatch);
10941023

10951024
raygenBufferSize *= m_samplesPerDispatch;
1096-
m_rayBuffer = core::smart_refctd_ptr<IGPUBuffer>(m_driver->createDeviceLocalGPUBufferOnDedMem(raygenBufferSize), core::dont_grab);
1025+
m_rayBuffer = m_driver->createDeviceLocalGPUBufferOnDedMem(raygenBufferSize);
10971026

10981027
shadowBufferSize *= m_samplesPerDispatch;
1099-
m_intersectionBuffer = core::smart_refctd_ptr<IGPUBuffer>(m_driver->createDeviceLocalGPUBufferOnDedMem(shadowBufferSize),core::dont_grab);
1028+
m_intersectionBuffer = m_driver->createDeviceLocalGPUBufferOnDedMem(shadowBufferSize);
11001029

11011030
m_rayCount = m_samplesPerDispatch*renderPixelCount;
1102-
m_rayCountBuffer = core::smart_refctd_ptr<IGPUBuffer>(m_driver->createFilledDeviceLocalGPUBufferOnDedMem(sizeof(uint32_t),&m_rayCount), core::dont_grab);
1031+
m_rayCountBuffer = m_driver->createFilledDeviceLocalGPUBufferOnDedMem(sizeof(uint32_t),&m_rayCount);
11031032

11041033
m_rayBufferAsRR = m_rrManager->linkBuffer(m_rayBuffer.get(), CL_MEM_READ_WRITE);
11051034
// TODO: clear hit buffer to -1 before usage
@@ -1155,12 +1084,12 @@ void Renderer::init(const SAssetBundle& meshes,
11551084

11561085
break;
11571086
}
1158-
m_tonemapOutput = m_driver->createGPUTexture(ITexture::ETT_2D, &renderSize[0], 1, m_denoiserScratchBuffer.getObject() ? EF_A2B10G10R10_UNORM_PACK32:EF_R8G8B8_SRGB);
1087+
m_tonemapOutput = createGPUTexture(&renderSize[0], 1, m_denoiserScratchBuffer.getObject() ? EF_A2B10G10R10_UNORM_PACK32:EF_R8G8B8_SRGB);
11591088
#else
1160-
m_tonemapOutput = m_driver->createGPUTexture(ITexture::ETT_2D, &renderSize[0], 1, EF_R8G8B8_SRGB);
1089+
m_tonemapOutput = createGPUTexture(&renderSize[0], 1, EF_R8G8B8_SRGB);
11611090
#endif
11621091
m_colorBuffer = m_driver->addFrameBuffer();
1163-
m_colorBuffer->attach(EFAP_COLOR_ATTACHMENT0, m_tonemapOutput.get());
1092+
m_colorBuffer->attach(EFAP_COLOR_ATTACHMENT0, core::smart_refctd_ptr(m_tonemapOutput));
11641093
}
11651094

11661095

@@ -1283,8 +1212,8 @@ void Renderer::render()
12831212
m_framesDone = 0u;
12841213
}
12851214

1286-
auto rSize = m_depth->getSize();
1287-
uint32_t uImageWidth_ImageArea_TotalImageSamples_Samples[4] = {rSize[0],rSize[0]*rSize[1],rSize[0]*rSize[1]*m_samplesPerDispatch,m_samplesPerDispatch};
1215+
auto rSize = m_depth->getCreationParameters().image->getCreationParameters().extent;
1216+
uint32_t uImageWidth_ImageArea_TotalImageSamples_Samples[4] = {rSize.width,rSize.width*rSize.height,rSize.width*rSize.height*m_samplesPerDispatch,m_samplesPerDispatch};
12881217

12891218
// generate rays
12901219
{
@@ -1511,6 +1440,4 @@ void Renderer::render()
15111440
m_driver->blitRenderTargets(tmpTonemapBuffer, m_colorBuffer, false, false, {}, {}, true);
15121441
m_driver->setViewPort(oldVP);
15131442
}
1514-
}
1515-
1516-
#endif
1443+
}

examples_tests/22.RaytracedAO/dirty_source/ExtraCrap.h

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@
77
// pesky leaking defines
88
#undef PI
99

10+
#include "irr/ext/MitsubaLoader/CMitsubaLoader.h"
11+
12+
#include <ISceneManager.h>
13+
1014
#ifdef _IRR_BUILD_OPTIX_
1115
#include "irr/ext/OptiX/Manager.h"
1216
#endif
@@ -159,7 +163,7 @@ class Renderer : public irr::core::IReferenceCounted, public irr::core::Interfac
159163
};
160164
*/
161165
};
162-
#ifndef NEW_SHADERS
166+
163167
static_assert(sizeof(SLight)==112u,"Can't keep alignment straight!");
164168

165169
// No 8k yet, too many rays to store
@@ -185,6 +189,7 @@ class Renderer : public irr::core::IReferenceCounted, public irr::core::Interfac
185189

186190
uint64_t getTotalSamplesComputed() const { return static_cast<uint64_t>(m_samplesComputed)*static_cast<uint64_t>(m_rayCount)/m_samplesPerDispatch; }
187191

192+
core::smart_refctd_ptr<video::IGPUImageView> createGPUTexture(const uint32_t* extent, uint32_t mips, E_FORMAT format);
188193

189194
_IRR_STATIC_INLINE_CONSTEXPR uint32_t MaxDimensions = 4u;
190195
protected:
@@ -202,12 +207,11 @@ class Renderer : public irr::core::IReferenceCounted, public irr::core::Interfac
202207

203208
bool m_rightHanded;
204209

205-
irr::core::smart_refctd_ptr<irr::video::ITextureBufferObject> m_sampleSequence;
206-
irr::core::smart_refctd_ptr<irr::video::ITexture> m_scrambleTexture;
210+
irr::core::smart_refctd_ptr<irr::video::IGPUBufferView> m_sampleSequence;
211+
irr::core::smart_refctd_ptr<irr::video::IGPUImageView> m_scrambleTexture;
207212

208-
irr::video::E_MATERIAL_TYPE nonInstanced;
209213
uint32_t m_raygenProgram, m_compostProgram;
210-
irr::core::smart_refctd_ptr<irr::video::ITexture> m_depth,m_albedo,m_normals,m_lightIndex,m_accumulation,m_tonemapOutput;
214+
irr::core::smart_refctd_ptr<irr::video::IGPUImageView> m_depth,m_albedo,m_normals,m_lightIndex,m_accumulation,m_tonemapOutput;
211215
irr::video::IFrameBuffer* m_colorBuffer,* m_gbuffer,* tmpTonemapBuffer;
212216

213217
uint32_t m_maxSamples;
@@ -234,7 +238,6 @@ class Renderer : public irr::core::IReferenceCounted, public irr::core::Interfac
234238
irr::core::smart_refctd_ptr<irr::video::IGPUBuffer> m_lightCDFBuffer;
235239
irr::core::smart_refctd_ptr<irr::video::IGPUBuffer> m_lightBuffer;
236240
irr::core::smart_refctd_ptr<irr::video::IGPUBuffer> m_lightRadianceBuffer;
237-
#endif
238241

239242
#ifdef _IRR_BUILD_OPTIX_
240243
irr::core::smart_refctd_ptr<irr::ext::OptiX::Manager> m_optixManager;

0 commit comments

Comments
 (0)