Skip to content

Commit c3bae00

Browse files
backpedal on using R16G16B16_UINT for index buffer
1 parent da35063 commit c3bae00

File tree

8 files changed

+40
-23
lines changed

8 files changed

+40
-23
lines changed

examples_tests/41.VisibilityBuffer/common.glsl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
struct BatchInstanceData
1616
{
1717
vec3 Ka;
18-
uint baseTriangle;
18+
uint baseVertex;
1919
vec3 Kd;
2020
nbl_glsl_VG_VirtualAttributePacked_t vAttrPos;
2121
vec3 Ks;

examples_tests/41.VisibilityBuffer/fillVBuffer.frag

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ layout(location = 0) out uvec4 triangleIDdrawID_unorm16Bary_dBarydScreenHalf2x2;
1111
uint nbl_glsl_barycentric_frag_getDrawID() {return drawGUID;}
1212
vec3 nbl_glsl_barycentric_frag_getVertexPos(in uint drawID, in uint primID, in uint primsVx)
1313
{
14-
const uvec3 tri = nbl_glsl_VG_fetchTriangle(primID+batchInstanceData[drawID].baseTriangle); // can optimize, preload only the y,z component
15-
return nbl_glsl_fetchVtxPos(tri[primsVx],drawID);
14+
const uint ix = nbl_glsl_VG_fetchTriangleVertexIndex(primID*3u+batchInstanceData[drawID].baseVertex,primsVx);
15+
return nbl_glsl_fetchVtxPos(ix,drawID);
1616
}
1717

1818
void main()

examples_tests/41.VisibilityBuffer/main.cpp

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -609,6 +609,9 @@ int main()
609609
driver->updateDescriptorSets(writesVT.size(),writesVT.data(),0u,nullptr);
610610
}
611611
smart_refctd_ptr<IGPUDescriptorSetLayout> vgDSLayout;
612+
// msvc is incredibly dumb and complains about type mismatches in code sections guarded by if constexpr
613+
std::conditional_t<useSSBO,GPUMeshPacker::DSLayoutParamsSSBO,GPUMeshPacker::DSLayoutParamsUTB> tmp;
614+
[&](auto& layoutParams) -> void
612615
{
613616
// layout
614617
core::vector<IGPUDescriptorSetLayout::SBinding> vgBindings((useSSBO ? gpump->getDSlayoutBindingsForSSBO(nullptr):gpump->getDSlayoutBindingsForUTB(nullptr))+1u);
@@ -619,9 +622,20 @@ int main()
619622
materialDataBinding.samplers = nullptr; // not sampler interpolated
620623
auto* actualVGBindings = vgBindings.data()+1u;
621624
if constexpr (useSSBO)
622-
gpump->getDSlayoutBindingsForSSBO(actualVGBindings);
625+
{
626+
layoutParams.uintBufferBinding = 1u;
627+
layoutParams.uvec2BufferBinding = 2u;
628+
layoutParams.uvec3BufferBinding = 3u;
629+
layoutParams.uvec4BufferBinding = 4u;
630+
layoutParams.indexBufferBinding = 5u;
631+
gpump->getDSlayoutBindingsForSSBO(actualVGBindings,layoutParams);
632+
}
623633
else
624-
gpump->getDSlayoutBindingsForUTB(actualVGBindings);
634+
{
635+
layoutParams.usamplersBinding = 1u;
636+
layoutParams.fsamplersBinding = 2u;
637+
gpump->getDSlayoutBindingsForUTB(actualVGBindings,layoutParams);
638+
}
625639
for (auto& binding : vgBindings)
626640
binding.stageFlags = static_cast<ISpecializedShader::E_SHADER_STAGE>(ISpecializedShader::ESS_VERTEX|ISpecializedShader::ESS_COMPUTE|ISpecializedShader::ESS_FRAGMENT);
627641

@@ -652,11 +666,11 @@ int main()
652666
infos->desc = std::move(batchDataSSBO);
653667
infos++;
654668
if constexpr (useSSBO)
655-
gpump->getDescriptorSetWritesForSSBO(writes,infos,sceneData.vgDS.get());
669+
gpump->getDescriptorSetWritesForSSBO(writes,infos,sceneData.vgDS.get(),layoutParams);
656670
else
657-
gpump->getDescriptorSetWritesForUTB(writes,infos,sceneData.vgDS.get());
671+
gpump->getDescriptorSetWritesForUTB(writes,infos,sceneData.vgDS.get(),layoutParams);
658672
driver->updateDescriptorSets(writeCount,writesVG.data(),0u,nullptr);
659-
}
673+
}(tmp);
660674

661675
//
662676
std::string extraCode = useSSBO ? gpump->getGLSLForSSBO():gpump->getGLSLForUTB();

examples_tests/41.VisibilityBuffer/shadeVBuffer.comp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,10 @@ void main()
100100
);
101101

102102
gBatchInstance = batchInstanceData[drawID];
103-
const uvec3 vertexIDs = nbl_glsl_VG_fetchTriangle(triangleID+gBatchInstance.baseTriangle);
103+
uvec3 vertexIDs;
104+
const uint baseTriangleVertex = triangleID*3u+gBatchInstance.baseTriangle;
105+
for (uint i=0u; i<3u; i++)
106+
vertexIDs[i] = nbl_glsl_VG_fetchTriangleVertexIndex(baseTriangleVertex,i)
104107

105108
vec3 pos,normal;
106109
vec2 uv;

include/nbl/asset/utils/CCPUMeshPackerV2.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,9 @@ class CCPUMeshPackerV2 final : public IMeshPackerV2<ICPUBuffer,ICPUDescriptorSet
5555
const typename base_t::DSLayoutParamsUTB& params = {}
5656
) const
5757
{
58-
auto createBufferView = [&](E_FORMAT format) -> core::smart_refctd_ptr<IDescriptor>
58+
auto createBufferView = [&](core::smart_refctd_ptr<ICPUBuffer>&& buff, E_FORMAT format) -> core::smart_refctd_ptr<IDescriptor>
5959
{
60-
return core::make_smart_refctd_ptr<ICPUBufferView>(core::smart_refctd_ptr(m_packerDataStore.vertexBuffer),format);
60+
return core::make_smart_refctd_ptr<ICPUBufferView>(std::move(buff),format);
6161
};
6262
return base_t::getDescriptorSetWritesForUTB(outWrites,outInfo,dstSet,createBufferView,params);
6363
}

include/nbl/asset/utils/IMeshPackerV2.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -363,7 +363,7 @@ class IMeshPackerV2 : public IMeshPacker<MeshBufferType,MDIStructType>, public I
363363

364364
inline std::pair<uint32_t,uint32_t> getDescriptorSetWritesForUTB(
365365
typename DescriptorSetType::SWriteDescriptorSet* outWrites, typename DescriptorSetType::SDescriptorInfo* outInfo, DescriptorSetType* dstSet,
366-
std::function<core::smart_refctd_ptr<IDescriptor>(E_FORMAT)> createBufferView, const DSLayoutParamsUTB& params = {}
366+
std::function<core::smart_refctd_ptr<IDescriptor>(core::smart_refctd_ptr<BufferType>&&,E_FORMAT)> createBufferView, const DSLayoutParamsUTB& params = {}
367367
) const
368368
{
369369
const uint32_t writeCount = getDSlayoutBindingsForUTB(nullptr);
@@ -391,7 +391,7 @@ class IMeshPackerV2 : public IMeshPacker<MeshBufferType,MDIStructType>, public I
391391
default:
392392
break;
393393
}
394-
info->desc = createBufferView(format);
394+
info->desc = createBufferView(core::smart_refctd_ptr(m_packerDataStore.vertexBuffer),format);
395395
info->buffer.offset = 0u;
396396
info->buffer.size = m_packerDataStore.vertexBuffer->getSize();
397397
info++;
@@ -413,18 +413,18 @@ class IMeshPackerV2 : public IMeshPacker<MeshBufferType,MDIStructType>, public I
413413
writeBinding(params.usamplersBinding,1u+m_virtualAttribConfig.uintArrayElementsCnt);
414414
if (m_virtualAttribConfig.uintArrayElementsCnt)
415415
fillInfoStruct(E_UTB_ARRAY_TYPE::EUAT_UINT);
416-
info->desc = createBufferView(EF_R16G16_UINT);
416+
info->desc = createBufferView(core::smart_refctd_ptr(m_packerDataStore.indexBuffer),EF_R16_UINT);
417417
info->buffer.offset = 0u;
418418
info->buffer.size = m_packerDataStore.indexBuffer->getSize();
419419
info++;
420420
if (m_virtualAttribConfig.floatArrayElementsCnt)
421421
{
422-
writeBinding(params.fsamplersBinding,1u+m_virtualAttribConfig.floatArrayElementsCnt);
422+
writeBinding(params.fsamplersBinding,m_virtualAttribConfig.floatArrayElementsCnt);
423423
fillInfoStruct(E_UTB_ARRAY_TYPE::EUAT_FLOAT);
424424
}
425425
if (m_virtualAttribConfig.intArrayElementsCnt)
426426
{
427-
writeBinding(params.isamplersBinding,1u+m_virtualAttribConfig.intArrayElementsCnt);
427+
writeBinding(params.isamplersBinding,m_virtualAttribConfig.intArrayElementsCnt);
428428
fillInfoStruct(E_UTB_ARRAY_TYPE::EUAT_INT);
429429
}
430430

include/nbl/builtin/glsl/virtual_geometry/descriptors.glsl

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@
2929

3030
#if _NBL_VG_UINT_BUFFERS_COUNT
3131
layout(set = _NBL_VG_DESCRIPTOR_SET, binding = _NBL_VG_UINT_BUFFERS_BINDING) uniform usamplerBuffer MeshPackedDataUintSample[_NBL_VG_UINT_BUFFERS_COUNT];
32-
uvec3 nbl_glsl_VG_fetchTriangle(in uint baseVertex)
32+
uint nbl_glsl_VG_fetchTriangleVertexIndex(in uint baseVertex, in uint triangleVx)
3333
{
34-
return texelFetch(MeshPackedDataUintSample[_NBL_VG_UINT_BUFFERS_COUNT-1u],baseVertex).xyz;
34+
return texelFetch(MeshPackedDataUintSample[_NBL_VG_UINT_BUFFERS_COUNT-1u],int(baseVertex+triangleVx)).x;
3535
}
3636
#endif
3737
#if _NBL_VG_FLOAT_BUFFERS_COUNT
@@ -106,11 +106,11 @@ layout(set = _NBL_VG_SSBO_DESCRIPTOR_SET, binding = _NBL_VG_SSBO_UVEC4_BINDING,
106106
#ifdef _NBL_VG_USE_SSBO_INDEX
107107
layout(set = _NBL_VG_SSBO_DESCRIPTOR_SET, binding = _NBL_VG_SSBO_INDEX_BINDING, std430) readonly buffer TrianglePackedData
108108
{
109-
u16vec3 indices[];
109+
uint16_t indices[];
110110
} trianglePackedData;
111-
uvec3 nbl_glsl_VG_fetchTriangle(in uint baseTriangle)
111+
uint nbl_glsl_VG_fetchTriangleVertexIndex(in uint baseVertex, in uint triangleVx)
112112
{
113-
return uvec3(trianglePackedData.indices[baseTriangle]);
113+
return uint(trianglePackedData.indices[baseVertex+triangleVx]);
114114
}
115115
#endif
116116

include/nbl/video/CGPUMeshPackerV2.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,9 @@ class CGPUMeshPackerV2 final : public asset::IMeshPackerV2<IGPUBuffer,IGPUDescri
6262
const typename base_t::DSLayoutParamsUTB& params = {}
6363
) const
6464
{
65-
auto createBufferView = [&](E_FORMAT format) -> core::smart_refctd_ptr<IDescriptor>
65+
auto createBufferView = [&](core::smart_refctd_ptr<IGPUBuffer>&& buff, E_FORMAT format) -> core::smart_refctd_ptr<IDescriptor>
6666
{
67-
return m_driver->createGPUBufferView(m_packerDataStore.vertexBuffer.get(),format);
67+
return m_driver->createGPUBufferView(buff.get(),format);
6868
};
6969
return base_t::getDescriptorSetWritesForUTB(outWrites,outInfo,dstSet,createBufferView,params);
7070
}

0 commit comments

Comments
 (0)