@@ -22,46 +22,63 @@ constexpr const char* SHADER_OVERRIDES[2] =
22
22
R"(
23
23
#define _NBL_VERT_INPUTS_DEFINED_
24
24
#define _NBL_VERT_MAIN_DEFINED_
25
+ #define _NBL_VERT_OUTPUTS_DEFINED_
26
+ #define _NBL_VERT_SET1_BINDINGS_DEFINED_
25
27
26
28
//pos
27
29
layout(set = 0, binding = 0) uniform samplerBuffer MeshPackedData_R32G32B32_SFLOAT;
28
30
29
31
//uv
30
- // layout(set = 0, binding = 1) uniform samplerBuffer MeshPackedData_R32G32_SFLOAT;
32
+ layout(set = 0, binding = 1) uniform samplerBuffer MeshPackedData_R32G32_SFLOAT;
31
33
32
34
//normal
33
35
layout(set = 0, binding = 2) uniform samplerBuffer MeshPackedData_A2B10G10R10_SNORM_PACK32;
34
36
35
37
layout(set = 0, binding = 3) readonly buffer VertexDataOffsetTable
36
38
{
37
- uint dataOffsetTable[];
39
+ int dataOffsetTable[];
38
40
} vertexPosition;
39
41
40
- layout(set = 0, binding = 4) readonly buffer VertexNormalOffsetTable
42
+ //layout(set = 0, binding = 4) readonly buffer VertexNormalOffsetTable
43
+ //{
44
+ // int dataOffsetTable[];
45
+ //} vertexNormal;
46
+
47
+ layout(push_constant, row_major) uniform PushConstants
41
48
{
42
- uint dataOffsetTable[] ;
43
- } vertexNormal ;
49
+ mat4 vp ;
50
+ } pc ;
44
51
45
52
)" ,
46
53
47
54
R"(
48
55
void main()
49
56
{
50
- vec3 pos = texelFetch(MeshPackedData_R32G32B32_SFLOAT,int(gl_VertexIndex)+vertexPosition.dataOffsetTable[gl_DrawID]).xyz;
51
- LocalPos = pos;
52
- gl_Position = nbl_glsl_pseudoMul4x4with3x1(CamData.params.MVP, pos);
53
- ViewPos = nbl_glsl_pseudoMul3x4with3x1(CamData.params.MV, pos);
54
- mat3 normalMat = nbl_glsl_SBasicViewParameters_GetNormalMat(CamData.params.NormalMatAndEyePos);
57
+ int vtxOffset = int(gl_VertexIndex) + vertexPosiztion.dataOffsetTable[gl_DrawID];
58
+ vec3 pos = texelFetch(MeshPackedData_R32G32B32_SFLOAT, vtxOffset).xyz;
59
+ gl_Position = nbl_glsl_pseudoMul4x4with3x1(pc.vp, pos);
60
+
61
+ //vertex outputs
62
+ //LocalPos = pos;
63
+ //ViewPos = nbl_glsl_pseudoMul3x4with3x1(CamData.params.MV, pos);
64
+
65
+ //mat3 normalMat = nbl_glsl_SBasicViewParameters_GetNormalMat(CamData.params.NormalMatAndEyePos);
55
66
56
- vec3 normal = texelFetch(MeshPackedData_A2B10G10R10_SNORM_PACK32,int(gl_VertexIndex)+vertexNormal.dataOffsetTable[gl_DrawID]).xyz;
67
+ // vec3 normal = texelFetch(MeshPackedData_A2B10G10R10_SNORM_PACK32, int(gl_VertexIndex)+vertexNormal.dataOffsetTable[gl_DrawID]).xyz;
57
68
//Normal = normalMat*normalize(vNormal);
58
- Normal = vec3(1.0, 0.0, 0.0);
69
+ // Normal = vec3(1.0, 0.0, 0.0);
59
70
}
60
71
)"
61
72
62
73
}
63
74
;
64
75
76
+ struct DataOffsetTable
77
+ {
78
+ uint32_t binding;
79
+ core::smart_refctd_ptr<IGPUBuffer> offsetBuffer;
80
+ };
81
+
65
82
core::smart_refctd_ptr<asset::ICPUSpecializedShader> createModifiedVertexShader (asset::ICPUSpecializedShader* _fs)
66
83
{
67
84
const asset::ICPUShader* unspec = _fs->getUnspecialized ();
@@ -78,6 +95,9 @@ core::smart_refctd_ptr<asset::ICPUSpecializedShader> createModifiedVertexShader(
78
95
79
96
resultShaderSrc.insert (firstNewlineAfterVersion, buffersDef);
80
97
resultShaderSrc += mainDef;
98
+ resultShaderSrc.replace (resultShaderSrc.find (" #version 430 core" ), sizeof (" #version 430 core" ), " #version 460 core\n " );
99
+
100
+ std::cout << resultShaderSrc << std::endl;
81
101
82
102
auto unspecNew = core::make_smart_refctd_ptr<asset::ICPUShader>(resultShaderSrc.c_str ());
83
103
auto specinfo = _fs->getSpecializationInfo ();
@@ -89,9 +109,9 @@ core::smart_refctd_ptr<asset::ICPUSpecializedShader> createModifiedVertexShader(
89
109
struct DrawIndexedIndirectInput
90
110
{
91
111
asset::SBufferBinding<video::IGPUBuffer> vtxBindings[video::IGPUMeshBuffer::MAX_ATTR_BUF_BINDING_COUNT];
92
- asset::E_PRIMITIVE_TOPOLOGY mode = asset::EPT_TRIANGLE_LIST;
93
- asset::E_INDEX_TYPE indexType = asset::EIT_16BIT;
94
- core::smart_refctd_ptr<video::IGPUBuffer> indexBuff = nullptr ;
112
+ static constexpr asset::E_PRIMITIVE_TOPOLOGY mode = asset::EPT_TRIANGLE_LIST;
113
+ static constexpr asset::E_INDEX_TYPE indexType = asset::EIT_16BIT;
114
+ core::smart_refctd_ptr<video::IGPUBuffer> idxBuff = nullptr ;
95
115
core::smart_refctd_ptr<video::IGPUBuffer> indirectDrawBuff = nullptr ;
96
116
size_t offset = 0u ;
97
117
size_t maxCount = 0u ;
@@ -103,9 +123,9 @@ struct DrawIndexedIndirectInput
103
123
struct DrawIndexedIndirectInputV2
104
124
{
105
125
asset::SBufferBinding<video::IGPUBuffer> vtxBuffer;
106
- asset::E_PRIMITIVE_TOPOLOGY mode = asset::EPT_TRIANGLE_LIST;
107
- asset::E_INDEX_TYPE indexType = asset::EIT_16BIT;
108
- core::smart_refctd_ptr<video::IGPUBuffer> idxBuffer = nullptr ;
126
+ static constexpr asset::E_PRIMITIVE_TOPOLOGY mode = asset::EPT_TRIANGLE_LIST;
127
+ static constexpr asset::E_INDEX_TYPE indexType = asset::EIT_16BIT;
128
+ core::smart_refctd_ptr<video::IGPUBuffer> idxBuff = nullptr ;
109
129
core::smart_refctd_ptr<video::IGPUBuffer> indirectDrawBuff = nullptr ;
110
130
size_t offset = 0u ;
111
131
size_t maxCount = 0u ;
@@ -151,14 +171,14 @@ void packMeshBuffers(video::IVideoDriver* driver, core::vector<ICPUMeshBuffer*>&
151
171
152
172
for (uint32_t i = 0u ; i < video::IGPUMeshBuffer::MAX_ATTR_BUF_BINDING_COUNT; i++)
153
173
output.vtxBindings [i] = { pmb.vertexBufferBindings [i].offset , gpuVtxBuff };
154
- output.indexBuff = driver->createFilledDeviceLocalGPUBufferOnDedMem (pmb.indexBuffer .buffer ->getSize (), pmb.indexBuffer .buffer ->getPointer ());
174
+ output.idxBuff = driver->createFilledDeviceLocalGPUBufferOnDedMem (pmb.indexBuffer .buffer ->getSize (), pmb.indexBuffer .buffer ->getPointer ());
155
175
output.indirectDrawBuff = driver->createFilledDeviceLocalGPUBufferOnDedMem (pmb.MDIDataBuffer ->getSize (), pmb.MDIDataBuffer ->getPointer ());
156
176
output.maxCount = pmbd.mdiParameterCount ;
157
177
158
178
vipOutput = pmb.vertexInputParams ;
159
179
}
160
180
161
- void packMeshBuffersV2 (video::IVideoDriver* driver, core::vector<ICPUMeshBuffer*>& meshBuffers, DrawIndexedIndirectInputV2& output)
181
+ void packMeshBuffersV2 (video::IVideoDriver* driver, core::vector<ICPUMeshBuffer*>& meshBuffers, DrawIndexedIndirectInputV2& output, DataOffsetTable& posOffsetTable )
162
182
{
163
183
using MeshPacker = CCPUMeshPackerV2<DrawElementsIndirectCommand_t>;
164
184
@@ -179,17 +199,34 @@ void packMeshBuffersV2(video::IVideoDriver* driver, core::vector<ICPUMeshBuffer*
179
199
std::cout << " Alloc failed \n " ;
180
200
181
201
mp.instantiateDataStorage ();
182
- MeshPacker::PackerDataStore<IGPUBuffer> packerDataStore = mp.createGPUPackerDataStore (driver );
202
+ MeshPacker::PackerDataStore packerDataStore = mp.getPackerDataStore ( );
183
203
184
204
IMeshPackerBase::PackedMeshBufferData pmbd[2 ];
185
205
186
206
mp.commit (pmbd, allocData, meshBuffers.begin (), meshBuffers.begin () + 2u );
187
207
188
- output.vtxBuffer = { 0ull , packerDataStore.vertexBuffer };
189
- output.idxBuffer = packerDataStore.indexBuffer ;
190
- output.indirectDrawBuff = packerDataStore.MDIDataBuffer ;
208
+ output.vtxBuffer = { 0ull , driver-> createFilledDeviceLocalGPUBufferOnDedMem ( packerDataStore.vertexBuffer -> getSize (), packerDataStore. vertexBuffer -> getPointer ()) };
209
+ output.idxBuff = driver-> createFilledDeviceLocalGPUBufferOnDedMem ( packerDataStore.indexBuffer -> getSize (), packerDataStore. indexBuffer -> getPointer ()) ;
210
+ output.indirectDrawBuff = driver-> createFilledDeviceLocalGPUBufferOnDedMem ( packerDataStore.MDIDataBuffer -> getSize (), packerDataStore. MDIDataBuffer -> getPointer ()) ;
191
211
192
212
// create offset tables
213
+ int32_t posOffsets[2 ] =
214
+ {
215
+ allocData[0 ].attribAllocParams [0 ].offset ,
216
+ allocData[1 ].attribAllocParams [0 ].offset
217
+ };
218
+
219
+ /* DrawElementsIndirectCommand_t* mdiPtr = static_cast<DrawElementsIndirectCommand_t*>(packerDataStore.MDIDataBuffer->getPointer());
220
+ uint16_t* idxBuffPtr = static_cast<uint16_t*>(packerDataStore.indexBuffer->getPointer());
221
+ float* vtxBuffPtr = static_cast<float*>(packerDataStore.vertexBuffer->getPointer());
222
+
223
+ for (uint32_t i = 0u; i < 50; i++)
224
+ {
225
+ float* firstCoord = vtxBuffPtr + (*(idxBuffPtr + i) * 3u);
226
+ std::cout << *firstCoord << ' ' << *(firstCoord + 1u) << ' ' << *(firstCoord + 2u) << std::endl;
227
+ }*/
228
+
229
+ posOffsetTable.offsetBuffer = driver->createFilledDeviceLocalGPUBufferOnDedMem (sizeof (int32_t ) * 2u , static_cast <void *>(posOffsets));
193
230
}
194
231
195
232
void setPipeline (IVideoDriver* driver, IAssetManager* am, SVertexInputParams& vtxInputParams,
@@ -221,7 +258,7 @@ void setPipeline(IVideoDriver* driver, IAssetManager* am, SVertexInputParams& vt
221
258
}
222
259
223
260
void setPipelineV2 (IVideoDriver* driver, ICPUSpecializedShader* vs, ICPUSpecializedShader* fs,
224
- core::smart_refctd_ptr<IGPUBuffer>& vtxBuffer, std::array<SBufferRange<IGPUBuffer>, 2 >& dataOffsetBuffers,
261
+ core::smart_refctd_ptr<IGPUBuffer>& vtxBuffer, std::array<DataOffsetTable, 1 >& dataOffsetBuffers,
225
262
core::smart_refctd_ptr<IGPUDescriptorSet>& outputGPUDescriptorSet,
226
263
core::smart_refctd_ptr<IGPURenderpassIndependentPipeline>& outputGpuPipeline)
227
264
{
@@ -230,44 +267,43 @@ void setPipelineV2(IVideoDriver* driver, ICPUSpecializedShader* vs, ICPUSpeciali
230
267
231
268
core::smart_refctd_ptr<IGPUDescriptorSetLayout> dsLayout;
232
269
{
233
- IGPUDescriptorSetLayout::SBinding b[5 ];
234
- b[0 ].binding = 0u ; b[1 ].binding = 1u ; b[2 ].binding = 2u ; b[3 ].binding = 3u ; b[ 4 ]. binding = 4u ;
270
+ IGPUDescriptorSetLayout::SBinding b[4 ];
271
+ b[0 ].binding = 0u ; b[1 ].binding = 1u ; b[2 ].binding = 2u ; b[3 ].binding = 3u ;
235
272
b[0 ].type = b[1 ].type = b[2 ].type = EDT_UNIFORM_TEXEL_BUFFER;
236
- b[3 ].type = b[ 4 ]. type = EDT_STORAGE_BUFFER;
237
- b[0 ].stageFlags = b[1 ].stageFlags = b[2 ].stageFlags = b[3 ].stageFlags = b[ 4 ]. stageFlags = ISpecializedShader::ESS_VERTEX;
238
- b[0 ].count = b[1 ].count = b[2 ].count = b[3 ].count = b[ 4 ]. count = 1u ;
239
- dsLayout = driver->createGPUDescriptorSetLayout (b, b + 5u );
273
+ b[3 ].type = EDT_STORAGE_BUFFER;
274
+ b[0 ].stageFlags = b[1 ].stageFlags = b[2 ].stageFlags = b[3 ].stageFlags = ISpecializedShader::ESS_VERTEX;
275
+ b[0 ].count = b[1 ].count = b[2 ].count = b[3 ].count = 1u ;
276
+ dsLayout = driver->createGPUDescriptorSetLayout (b, b + 4u );
240
277
}
241
-
242
- asset::SPushConstantRange pcRange = { asset::ISpecializedShader::ESS_VERTEX, 0u , sizeof (asset::SBasicViewParameters ) };
278
+
279
+ asset::SPushConstantRange pcRange = { asset::ISpecializedShader::ESS_VERTEX, 0u , sizeof (core::matrix4SIMD ) };
243
280
auto pipelineLayout = driver->createGPUPipelineLayout (&pcRange, &pcRange + 1 , core::smart_refctd_ptr (dsLayout));
244
281
245
282
outputGPUDescriptorSet = driver->createGPUDescriptorSet (std::move (dsLayout));
246
283
{
247
- IGPUDescriptorSet::SWriteDescriptorSet w[5 ];
248
- w[0 ].arrayElement = w[1 ].arrayElement = w[2 ].arrayElement = w[3 ].arrayElement = w[ 4 ]. arrayElement = 0u ;
249
- w[0 ].count = w[1 ].count = w[2 ].count = w[3 ].count = w[ 4 ]. count = 1u ;
250
- w[0 ].binding = 0u ; w[1 ].binding = 1u ; w[2 ].binding = 2u ; w[3 ].binding = 3u ; w[ 4 ]. binding = 4u ;
284
+ IGPUDescriptorSet::SWriteDescriptorSet w[4 ];
285
+ w[0 ].arrayElement = w[1 ].arrayElement = w[2 ].arrayElement = w[3 ].arrayElement = 0u ;
286
+ w[0 ].count = w[1 ].count = w[2 ].count = w[3 ].count = 1u ;
287
+ w[0 ].binding = 0u ; w[1 ].binding = 1u ; w[2 ].binding = 2u ; w[3 ].binding = 3u ;
251
288
w[0 ].descriptorType = w[1 ].descriptorType = w[2 ].descriptorType = EDT_UNIFORM_TEXEL_BUFFER;
252
- w[3 ].descriptorType = w[ 4 ]. descriptorType = EDT_STORAGE_BUFFER;
253
- w[0 ].dstSet = w[1 ].dstSet = w[2 ].dstSet = w[3 ].dstSet = w[ 4 ]. dstSet = outputGPUDescriptorSet.get ();
289
+ w[3 ].descriptorType = EDT_STORAGE_BUFFER;
290
+ w[0 ].dstSet = w[1 ].dstSet = w[2 ].dstSet = w[3 ].dstSet = outputGPUDescriptorSet.get ();
254
291
255
- IGPUDescriptorSet::SDescriptorInfo info[3 ];
292
+ IGPUDescriptorSet::SDescriptorInfo info[2 ];
256
293
info[0 ].buffer .offset = 0u ;
257
294
info[0 ].buffer .size = vtxBuffer->getSize ();
258
295
info[0 ].desc = core::smart_refctd_ptr (vtxBuffer);
259
296
297
+ // sampler buffers
260
298
w[0 ].info = w[1 ].info = w[2 ].info = &info[0 ];
261
299
262
- info[1 ].buffer .offset = dataOffsetBuffers[0 ].offset ;
263
- info[1 ].buffer .size = dataOffsetBuffers[0 ].size ;
300
+ // vertex pos offset table
301
+ info[1 ].buffer .offset = 0u ;
302
+ info[1 ].buffer .size = dataOffsetBuffers[0 ].offsetBuffer ->getSize ();
303
+ info[1 ].desc = core::smart_refctd_ptr (dataOffsetBuffers[0 ].offsetBuffer );
264
304
w[3 ].info = &info[1 ];
265
305
266
- info[2 ].buffer .offset = dataOffsetBuffers[1 ].offset ;
267
- info[2 ].buffer .size = dataOffsetBuffers[1 ].size ;
268
- w[4 ].info = &info[2 ];
269
-
270
- driver->updateDescriptorSets (5u , w, 0u , nullptr );
306
+ driver->updateDescriptorSets (4u , w, 0u , nullptr );
271
307
}
272
308
273
309
IGPUSpecializedShader* shaders[2 ] = { gpuShaders->operator [](0 ).get (), gpuShaders->operator [](1 ).get () };
@@ -349,14 +385,12 @@ int main()
349
385
350
386
auto * vtxShader = pipeline->getShaderAtIndex (asset::ICPURenderpassIndependentPipeline::ESSI_VERTEX_SHADER_IX);
351
387
core::smart_refctd_ptr<ICPUSpecializedShader> vs = createModifiedVertexShader (vtxShader);
352
- ICPUSpecializedShader* fs = pipeline->getShaderAtIndex (asset::ICPURenderpassIndependentPipeline::ESSI_FRAGMENT_SHADER_IX);
388
+ ICPUSpecializedShader* fs = IAsset::castDown<ICPUSpecializedShader>(am->getAsset (" ../shader.frag" , lp).getContents ().begin ()->get ());
389
+ std::array<DataOffsetTable, 1 > posOffsetTable;
353
390
354
- packMeshBuffersV2 (driver, meshBuffers, mdiCallParamsV2);
391
+ packMeshBuffersV2 (driver, meshBuffers, mdiCallParamsV2, posOffsetTable[ 0 ] );
355
392
356
- smart_refctd_ptr<IGPUBuffer> tmpVtxBuff;
357
- std::array<SBufferRange<IGPUBuffer>, 2 > tmpSSBO;
358
-
359
- setPipelineV2 (driver, vs.get (), fs, tmpVtxBuff, tmpSSBO, ds ,gpuPipeline2);
393
+ setPipelineV2 (driver, vs.get (), fs, mdiCallParamsV2.vtxBuffer .buffer , posOffsetTable, ds, gpuPipeline2);
360
394
}
361
395
362
396
// ! we want to move around the scene and view it from different angles
@@ -370,6 +404,11 @@ int main()
370
404
smgr->setActiveCamera (camera);
371
405
372
406
uint64_t lastFPSTime = 0 ;
407
+
408
+ // #define USE_MPV1
409
+ #define USE_MPV2
410
+
411
+ #ifdef USE_MPV1
373
412
while (device->run () && receiver.keepOpen ())
374
413
{
375
414
driver->bindGraphicsPipeline (gpuPipeline.get ());
@@ -381,8 +420,41 @@ int main()
381
420
camera->render ();
382
421
383
422
driver->pushConstants (gpuPipeline->getLayout (), asset::ISpecializedShader::ESS_VERTEX, 0u , sizeof (core::matrix4SIMD), camera->getConcatenatedMatrix ().pointer ());
384
- driver->drawIndexedIndirect (mdiCallParams.vtxBindings , mdiCallParams.mode , mdiCallParams.indexType , mdiCallParams.indexBuff .get (), mdiCallParams.indirectDrawBuff .get (), mdiCallParams.offset , mdiCallParams.maxCount , mdiCallParams.stride );
423
+ driver->drawIndexedIndirect (mdiCallParams.vtxBindings , mdiCallParams.mode , mdiCallParams.indexType , mdiCallParams.idxBuff .get (), mdiCallParams.indirectDrawBuff .get (), mdiCallParams.offset , mdiCallParams.maxCount , mdiCallParams.stride );
424
+
385
425
386
426
driver->endScene ();
387
427
}
428
+ #endif
429
+ #ifdef USE_MPV2
430
+ while (device->run () && receiver.keepOpen ())
431
+ {
432
+ driver->bindGraphicsPipeline (gpuPipeline2.get ());
433
+ driver->bindDescriptorSets (video::EPBP_GRAPHICS, gpuPipeline2->getLayout (), 0u , 2u , &ds.get (), nullptr );
434
+
435
+ driver->beginScene (true , true , video::SColor (255 , 0 , 0 , 255 ));
436
+
437
+ // ! This animates (moves) the camera and sets the transforms
438
+ camera->OnAnimate (std::chrono::duration_cast<std::chrono::milliseconds>(device->getTimer ()->getTime ()).count ());
439
+ camera->render ();
440
+
441
+ driver->pushConstants (gpuPipeline->getLayout (), asset::ISpecializedShader::ESS_VERTEX, 0u , sizeof (core::matrix4SIMD), camera->getConcatenatedMatrix ().pointer ());
442
+ SBufferBinding<IGPUBuffer> vtxBufferBindings[IGPUMeshBuffer::MAX_ATTR_BUF_BINDING_COUNT];
443
+ vtxBufferBindings[0 ] = mdiCallParamsV2.vtxBuffer ;
444
+ driver->drawIndexedIndirect (vtxBufferBindings, mdiCallParamsV2.mode , mdiCallParamsV2.indexType , mdiCallParamsV2.idxBuff .get (), mdiCallParamsV2.indirectDrawBuff .get (), mdiCallParamsV2.offset , mdiCallParamsV2.maxCount , mdiCallParamsV2.stride );
445
+
446
+ driver->endScene ();
447
+
448
+ // display frames per second in window title
449
+ uint64_t time = device->getTimer ()->getRealTime ();
450
+ if (time - lastFPSTime > 1000 )
451
+ {
452
+ std::wostringstream str;
453
+ str << L" Meshloaders Demo - IrrlichtBAW Engine [" << driver->getName () << " ] FPS:" << driver->getFPS () << " PrimitvesDrawn:" << driver->getPrimitiveCountDrawn ();
454
+
455
+ device->setWindowCaption (str.str ().c_str ());
456
+ lastFPSTime = time;
457
+ }
458
+ }
459
+ #endif
388
460
}
0 commit comments