@@ -42,10 +42,6 @@ layout (location = 3) out vec2 UV;
42
42
#include <nbl/builtin/glsl/utils/common.glsl>
43
43
#include <nbl/builtin/glsl/utils/transform.glsl>
44
44
45
- layout (push_constant) uniform Block {
46
- uint instDataOffset;
47
- } PC;
48
-
49
45
#ifndef _NBL_VERT_SET1_BINDINGS_DEFINED_
50
46
#define _NBL_VERT_SET1_BINDINGS_DEFINED_
51
47
layout (set = 1, binding = 0, row_major, std140) uniform UBO {
@@ -61,15 +57,14 @@ layout (set = 0, binding = 5, row_major, std430) readonly restrict buffer InstDa
61
57
62
58
void main()
63
59
{
64
- uint instIx = PC.instDataOffset+gl_InstanceIndex;
65
- mat4x3 tform = InstData.data[instIx].tform;
60
+ mat4x3 tform = InstData.data[gl_InstanceIndex].tform;
66
61
mat4 mvp = nbl_glsl_pseudoMul4x4with4x3(CamData.params.MVP, tform);
67
62
gl_Position = nbl_glsl_pseudoMul4x4with3x1(mvp, vPosition);
68
63
WorldPos = nbl_glsl_pseudoMul3x4with3x1(tform, vPosition);
69
- mat3 normalMat = mat3(InstData.data[instIx ].normalMatrixRow0,InstData.data[instIx ].normalMatrixRow1,InstData.data[instIx ].normalMatrixRow2);
64
+ mat3 normalMat = mat3(InstData.data[gl_InstanceIndex ].normalMatrixRow0,InstData.data[gl_InstanceIndex ].normalMatrixRow1,InstData.data[gl_InstanceIndex ].normalMatrixRow2);
70
65
Normal = transpose(normalMat)*normalize(vNormal);
71
66
UV = vUV;
72
- InstanceIndex = instIx ;
67
+ InstanceIndex = gl_InstanceIndex ;
73
68
}
74
69
75
70
)" ;
@@ -547,11 +542,6 @@ static core::smart_refctd_ptr<asset::ICPUImage> createBlendWeightImage(const ass
547
542
548
543
core::smart_refctd_ptr<asset::ICPUPipelineLayout> CMitsubaLoader::createPipelineLayout (asset::IAssetManager* _manager, asset::ICPUVirtualTexture* _vt)
549
544
{
550
- SPushConstantRange pcrng;
551
- pcrng.offset = 0u ;
552
- pcrng.size = sizeof (uint32_t );// instance data offset
553
- pcrng.stageFlags = static_cast <asset::ISpecializedShader::E_SHADER_STAGE>(asset::ISpecializedShader::ESS_FRAGMENT | asset::ISpecializedShader::ESS_VERTEX);
554
-
555
545
core::smart_refctd_ptr<ICPUDescriptorSetLayout> ds0layout; // needs to builtin and cached statically
556
546
{
557
547
auto sizes = _vt->getDSlayoutBindings (nullptr , nullptr );
@@ -594,7 +584,7 @@ core::smart_refctd_ptr<asset::ICPUPipelineLayout> CMitsubaLoader::createPipeline
594
584
}
595
585
auto ds1layout = getBuiltinAsset<ICPUDescriptorSetLayout, IAsset::ET_DESCRIPTOR_SET_LAYOUT>(" nbl/builtin/descriptor_set_layout/basic_view_parameters" , _manager);
596
586
597
- return core::make_smart_refctd_ptr<asset::ICPUPipelineLayout>(&pcrng, &pcrng+ 1 , std::move (ds0layout), std::move (ds1layout), nullptr , nullptr );
587
+ return core::make_smart_refctd_ptr<asset::ICPUPipelineLayout>(nullptr , nullptr , std::move (ds0layout), std::move (ds1layout), nullptr , nullptr );
598
588
}
599
589
600
590
CMitsubaLoader::CMitsubaLoader (asset::IAssetManager* _manager, io::IFileSystem* _fs) : asset::IAssetLoader(), m_manager(_manager), m_filesystem(_fs)
@@ -1548,7 +1538,7 @@ struct nbl_glsl_ext_Mitsuba_Loader_instance_data_t
1548
1538
};
1549
1539
1550
1540
1551
- // Also sets instance data buffer offset into meshbuffers' push constants
1541
+ // Also sets instance data buffer offset into meshbuffers' base instance
1552
1542
template <typename Iter>
1553
1543
inline core::smart_refctd_ptr<asset::ICPUDescriptorSet> CMitsubaLoader::createDS0 (const SContext& _ctx, asset::ICPUPipelineLayout* _layout, const asset::material_compiler::CMaterialCompilerGLSLBackendCommon::result_t & _compResult, Iter meshBegin, Iter meshEnd)
1554
1544
{
@@ -1621,7 +1611,11 @@ inline core::smart_refctd_ptr<asset::ICPUDescriptorSet> CMitsubaLoader::createDS
1621
1611
auto * meta = static_cast <const IMeshMetadata*>(mesh->getMetadata ());
1622
1612
1623
1613
core::vectorSIMDf emissive;
1624
- uint32_t instDataOffset = instanceData.size ();
1614
+ for (uint32_t i = 0u ; i < mesh->getMeshBufferCount (); ++i)
1615
+ {
1616
+ auto * mb = mesh->getMeshBuffer (i);
1617
+ mb->setBaseInstance (instanceData.size ());
1618
+ }
1625
1619
for (const auto & inst : meta->getInstances ()) {
1626
1620
// @Crisspl IIRC lights in mitsuba have "sides" , TODO
1627
1621
emissive = inst.emitter .type ==CElementEmitter::AREA ? inst.emitter .area .radiance : core::vectorSIMDf (0 .f );
@@ -1662,11 +1656,6 @@ inline core::smart_refctd_ptr<asset::ICPUDescriptorSet> CMitsubaLoader::createDS
1662
1656
1663
1657
instanceData.push_back (instData);
1664
1658
}
1665
- for (uint32_t i = 0u ; i < mesh->getMeshBufferCount (); ++i)
1666
- {
1667
- auto * mb = mesh->getMeshBuffer (i);
1668
- reinterpret_cast <uint32_t *>(mb->getPushConstantsDataPtr ())[0 ] = instDataOffset; // use base instance!
1669
- }
1670
1659
}
1671
1660
#ifdef DEBUG_MITSUBA_LOADER
1672
1661
ofile.close ();
0 commit comments