@@ -499,7 +499,6 @@ void main()
499
499
500
500
)======" ;
501
501
502
- #ifndef NEW_SHADERS
503
502
inline GLuint createComputeShader (const std::string& source)
504
503
{
505
504
GLuint program = COpenGLExtensionHandler::extGlCreateProgram ();
@@ -540,108 +539,15 @@ inline GLuint createComputeShader(const std::string& source)
540
539
return program;
541
540
}
542
541
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
-
636
542
constexpr uint32_t UNFLEXIBLE_MAX_SAMPLES_TODO_REMOVE = 1024u *1024u ;
637
543
638
544
639
545
constexpr uint32_t kOptiXPixelSize = sizeof (uint16_t )*3u ;
640
546
641
547
642
- Renderer::Renderer (IVideoDriver* _driver, IAssetManager* _assetManager, ISceneManager* _smgr, bool useDenoiser) :
548
+ Renderer::Renderer (IVideoDriver* _driver, IAssetManager* _assetManager, irr::scene:: ISceneManager* _smgr, bool useDenoiser) :
643
549
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 ),
645
551
m_rrManager(ext::RadeonRays::Manager::create(m_driver)), m_rightHanded(false ),
646
552
m_depth(), m_albedo(), m_normals(), m_lightIndex(), m_accumulation(), m_tonemapOutput(),
647
553
m_colorBuffer(nullptr ), m_gbuffer(nullptr ), tmpTonemapBuffer(nullptr ),
@@ -655,15 +561,6 @@ Renderer::Renderer(IVideoDriver* _driver, IAssetManager* _assetManager, ISceneMa
655
561
,m_cudaStream(nullptr )
656
562
#endif
657
563
{
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
-
667
564
#ifdef _IRR_BUILD_OPTIX_
668
565
while (useDenoiser)
669
566
{
@@ -721,6 +618,35 @@ Renderer::Renderer(IVideoDriver* _driver, IAssetManager* _assetManager, ISceneMa
721
618
}
722
619
}
723
620
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
+
724
650
Renderer::~Renderer ()
725
651
{
726
652
deinit ();
@@ -749,9 +675,9 @@ void Renderer::init(const SAssetBundle& meshes,
749
675
const ext::MitsubaLoader::CGlobalMitsubaMetadata* globalMeta = nullptr ;
750
676
{
751
677
auto contents = meshes.getContents ();
752
- for (auto cpuit = contents. first ; cpuit!=contents. second ; cpuit++ )
678
+ for (auto & cpumesh_ : contents)
753
679
{
754
- auto cpumesh = static_cast <asset::ICPUMesh*>(cpuit-> get ());
680
+ auto cpumesh = static_cast <asset::ICPUMesh*>(cpumesh_. get ());
755
681
756
682
auto * meta = cpumesh->getMetadata ();
757
683
@@ -762,6 +688,10 @@ void Renderer::init(const SAssetBundle& meshes,
762
688
// ! TODO: fix
763
689
const auto shapeType = meshmeta->getShapeType ()==ext::MitsubaLoader::CElementShape::Type::INSTANCE ? ext::MitsubaLoader::CElementShape::Type::SERIALIZED:meshmeta->getShapeType ();
764
690
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)
765
695
const auto & instances = meshmeta->getInstances ();
766
696
767
697
auto meshBufferCount = cpumesh->getMeshBufferCount ();
@@ -1028,9 +958,9 @@ void Renderer::init(const SAssetBundle& meshes,
1028
958
lightCDF.back () = 0xdeadbeefu ;
1029
959
1030
960
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 ());
1034
964
}
1035
965
1036
966
auto renderPixelCount = renderSize[0 ]*renderSize[1 ]*renderSize[2 ];
@@ -1041,11 +971,10 @@ void Renderer::init(const SAssetBundle& meshes,
1041
971
1042
972
// upload sequence to GPU
1043
973
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);
1046
975
1047
976
// 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);
1049
978
{
1050
979
core::vector<uint32_t > random (renderPixelCount);
1051
980
// generate
@@ -1060,21 +989,21 @@ void Renderer::init(const SAssetBundle& meshes,
1060
989
}
1061
990
}
1062
991
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);
1067
996
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);
1069
998
1070
999
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 ));
1072
1001
1073
1002
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 ));
1078
1007
1079
1008
//
1080
1009
constexpr auto RAYGEN_WORK_GROUP_DIM = 16u ;
@@ -1093,13 +1022,13 @@ void Renderer::init(const SAssetBundle& meshes,
1093
1022
printf (" Using %d samples\n " , m_samplesPerDispatch);
1094
1023
1095
1024
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);
1097
1026
1098
1027
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);
1100
1029
1101
1030
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);
1103
1032
1104
1033
m_rayBufferAsRR = m_rrManager->linkBuffer (m_rayBuffer.get (), CL_MEM_READ_WRITE);
1105
1034
// TODO: clear hit buffer to -1 before usage
@@ -1155,12 +1084,12 @@ void Renderer::init(const SAssetBundle& meshes,
1155
1084
1156
1085
break ;
1157
1086
}
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);
1159
1088
#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);
1161
1090
#endif
1162
1091
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 ));
1164
1093
}
1165
1094
1166
1095
@@ -1283,8 +1212,8 @@ void Renderer::render()
1283
1212
m_framesDone = 0u ;
1284
1213
}
1285
1214
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};
1288
1217
1289
1218
// generate rays
1290
1219
{
@@ -1511,6 +1440,4 @@ void Renderer::render()
1511
1440
m_driver->blitRenderTargets (tmpTonemapBuffer, m_colorBuffer, false , false , {}, {}, true );
1512
1441
m_driver->setViewPort (oldVP);
1513
1442
}
1514
- }
1515
-
1516
- #endif
1443
+ }
0 commit comments