Skip to content

Commit d407366

Browse files
committed
Update
1 parent 27b9a44 commit d407366

File tree

6 files changed

+169
-83
lines changed

6 files changed

+169
-83
lines changed

examples_tests/50.MeshPacking/main.cpp

Lines changed: 126 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -22,46 +22,63 @@ constexpr const char* SHADER_OVERRIDES[2] =
2222
R"(
2323
#define _NBL_VERT_INPUTS_DEFINED_
2424
#define _NBL_VERT_MAIN_DEFINED_
25+
#define _NBL_VERT_OUTPUTS_DEFINED_
26+
#define _NBL_VERT_SET1_BINDINGS_DEFINED_
2527
2628
//pos
2729
layout(set = 0, binding = 0) uniform samplerBuffer MeshPackedData_R32G32B32_SFLOAT;
2830
2931
//uv
30-
//layout(set = 0, binding = 1) uniform samplerBuffer MeshPackedData_R32G32_SFLOAT;
32+
layout(set = 0, binding = 1) uniform samplerBuffer MeshPackedData_R32G32_SFLOAT;
3133
3234
//normal
3335
layout(set = 0, binding = 2) uniform samplerBuffer MeshPackedData_A2B10G10R10_SNORM_PACK32;
3436
3537
layout(set = 0, binding = 3) readonly buffer VertexDataOffsetTable
3638
{
37-
uint dataOffsetTable[];
39+
int dataOffsetTable[];
3840
} vertexPosition;
3941
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
4148
{
42-
uint dataOffsetTable[];
43-
} vertexNormal;
49+
mat4 vp;
50+
} pc;
4451
4552
)",
4653

4754
R"(
4855
void main()
4956
{
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);
5566
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;
5768
//Normal = normalMat*normalize(vNormal);
58-
Normal = vec3(1.0, 0.0, 0.0);
69+
//Normal = vec3(1.0, 0.0, 0.0);
5970
}
6071
)"
6172

6273
}
6374
;
6475

76+
struct DataOffsetTable
77+
{
78+
uint32_t binding;
79+
core::smart_refctd_ptr<IGPUBuffer> offsetBuffer;
80+
};
81+
6582
core::smart_refctd_ptr<asset::ICPUSpecializedShader> createModifiedVertexShader(asset::ICPUSpecializedShader* _fs)
6683
{
6784
const asset::ICPUShader* unspec = _fs->getUnspecialized();
@@ -78,6 +95,9 @@ core::smart_refctd_ptr<asset::ICPUSpecializedShader> createModifiedVertexShader(
7895

7996
resultShaderSrc.insert(firstNewlineAfterVersion, buffersDef);
8097
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;
81101

82102
auto unspecNew = core::make_smart_refctd_ptr<asset::ICPUShader>(resultShaderSrc.c_str());
83103
auto specinfo = _fs->getSpecializationInfo();
@@ -89,9 +109,9 @@ core::smart_refctd_ptr<asset::ICPUSpecializedShader> createModifiedVertexShader(
89109
struct DrawIndexedIndirectInput
90110
{
91111
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;
95115
core::smart_refctd_ptr<video::IGPUBuffer> indirectDrawBuff = nullptr;
96116
size_t offset = 0u;
97117
size_t maxCount = 0u;
@@ -103,9 +123,9 @@ struct DrawIndexedIndirectInput
103123
struct DrawIndexedIndirectInputV2
104124
{
105125
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;
109129
core::smart_refctd_ptr<video::IGPUBuffer> indirectDrawBuff = nullptr;
110130
size_t offset = 0u;
111131
size_t maxCount = 0u;
@@ -151,14 +171,14 @@ void packMeshBuffers(video::IVideoDriver* driver, core::vector<ICPUMeshBuffer*>&
151171

152172
for (uint32_t i = 0u; i < video::IGPUMeshBuffer::MAX_ATTR_BUF_BINDING_COUNT; i++)
153173
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());
155175
output.indirectDrawBuff = driver->createFilledDeviceLocalGPUBufferOnDedMem(pmb.MDIDataBuffer->getSize(), pmb.MDIDataBuffer->getPointer());
156176
output.maxCount = pmbd.mdiParameterCount;
157177

158178
vipOutput = pmb.vertexInputParams;
159179
}
160180

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)
162182
{
163183
using MeshPacker = CCPUMeshPackerV2<DrawElementsIndirectCommand_t>;
164184

@@ -179,17 +199,34 @@ void packMeshBuffersV2(video::IVideoDriver* driver, core::vector<ICPUMeshBuffer*
179199
std::cout << "Alloc failed \n";
180200

181201
mp.instantiateDataStorage();
182-
MeshPacker::PackerDataStore<IGPUBuffer> packerDataStore = mp.createGPUPackerDataStore(driver);
202+
MeshPacker::PackerDataStore packerDataStore = mp.getPackerDataStore();
183203

184204
IMeshPackerBase::PackedMeshBufferData pmbd[2];
185205

186206
mp.commit(pmbd, allocData, meshBuffers.begin(), meshBuffers.begin() + 2u);
187207

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());
191211

192212
//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));
193230
}
194231

195232
void setPipeline(IVideoDriver* driver, IAssetManager* am, SVertexInputParams& vtxInputParams,
@@ -221,7 +258,7 @@ void setPipeline(IVideoDriver* driver, IAssetManager* am, SVertexInputParams& vt
221258
}
222259

223260
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,
225262
core::smart_refctd_ptr<IGPUDescriptorSet>& outputGPUDescriptorSet,
226263
core::smart_refctd_ptr<IGPURenderpassIndependentPipeline>& outputGpuPipeline)
227264
{
@@ -230,44 +267,43 @@ void setPipelineV2(IVideoDriver* driver, ICPUSpecializedShader* vs, ICPUSpeciali
230267

231268
core::smart_refctd_ptr<IGPUDescriptorSetLayout> dsLayout;
232269
{
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;
235272
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);
240277
}
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) };
243280
auto pipelineLayout = driver->createGPUPipelineLayout(&pcRange, &pcRange + 1, core::smart_refctd_ptr(dsLayout));
244281

245282
outputGPUDescriptorSet = driver->createGPUDescriptorSet(std::move(dsLayout));
246283
{
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;
251288
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();
254291

255-
IGPUDescriptorSet::SDescriptorInfo info[3];
292+
IGPUDescriptorSet::SDescriptorInfo info[2];
256293
info[0].buffer.offset = 0u;
257294
info[0].buffer.size = vtxBuffer->getSize();
258295
info[0].desc = core::smart_refctd_ptr(vtxBuffer);
259296

297+
//sampler buffers
260298
w[0].info = w[1].info = w[2].info = &info[0];
261299

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);
264304
w[3].info = &info[1];
265305

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);
271307
}
272308

273309
IGPUSpecializedShader* shaders[2] = { gpuShaders->operator[](0).get(), gpuShaders->operator[](1).get() };
@@ -349,14 +385,12 @@ int main()
349385

350386
auto* vtxShader = pipeline->getShaderAtIndex(asset::ICPURenderpassIndependentPipeline::ESSI_VERTEX_SHADER_IX);
351387
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;
353390

354-
packMeshBuffersV2(driver, meshBuffers, mdiCallParamsV2);
391+
packMeshBuffersV2(driver, meshBuffers, mdiCallParamsV2, posOffsetTable[0]);
355392

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);
360394
}
361395

362396
//! we want to move around the scene and view it from different angles
@@ -370,6 +404,11 @@ int main()
370404
smgr->setActiveCamera(camera);
371405

372406
uint64_t lastFPSTime = 0;
407+
408+
//#define USE_MPV1
409+
#define USE_MPV2
410+
411+
#ifdef USE_MPV1
373412
while (device->run() && receiver.keepOpen())
374413
{
375414
driver->bindGraphicsPipeline(gpuPipeline.get());
@@ -381,8 +420,41 @@ int main()
381420
camera->render();
382421

383422
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+
385425

386426
driver->endScene();
387427
}
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
388460
}
Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1-
#version 430 core
1+
#version 460 core
22

3-
layout(location = 0) in vec3 normal;
3+
//layout(location = 0) in vec3 normal;
44
layout(location = 0) out vec4 color;
55

66
void main()
77
{
8-
vec3 colorTmp = clamp(dot(vec3(0.0, 1.0, 0.0), normal), 0, 1) * vec3(1.0) + vec3(0.2);
9-
color = vec4(colorTmp, 1.0);
8+
//vec3 colorTmp = clamp(dot(vec3(0.0, 1.0, 0.0), normal), 0, 1) * vec3(1.0) + vec3(0.2);
9+
//color = vec4(colorTmp, 1.0);
10+
11+
color = vec4(1.0);
1012
}

0 commit comments

Comments
 (0)