Skip to content

Commit

Permalink
[render] setForCompute in IndexBuffer
Browse files Browse the repository at this point in the history
  • Loading branch information
alemuntoni committed Jan 24, 2025
1 parent 604c31b commit b7b8d22
Show file tree
Hide file tree
Showing 2 changed files with 83 additions and 48 deletions.
41 changes: 31 additions & 10 deletions vclib/render/include/vclib/bgfx/buffers/index_buffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -70,12 +70,23 @@ class IndexBuffer
friend void swap(IndexBuffer& a, IndexBuffer& b) { a.swap(b); }

void set(
const void* bufferIndices,
const uint bufferSize,
bool is32Bit = true)
{
uint64_t flags = is32Bit ? BGFX_BUFFER_INDEX32 : BGFX_BUFFER_NONE;
uint size = is32Bit ? 4 : 2;
set(bgfx::makeRef(bufferIndices, bufferSize * size), flags);
}

void setForCompute(
const void* bufferIndices,
const uint bufferSize,
PrimitiveType type,
uint64_t flags = BGFX_BUFFER_NONE)
bgfx::Access::Enum access = bgfx::Access::Read)
{
flags |= flagsForType(type);
uint64_t flags = flagsForType(type);
flags |= flagsForAccess(access);
set(bgfx::makeRef(bufferIndices, bufferSize * sizeOf(type)), flags);
}

Expand All @@ -84,16 +95,16 @@ class IndexBuffer
mIndexBufferHandle = bgfx::createIndexBuffer(indices, flags);
}

void bind() const
{
bgfx::setIndexBuffer(mIndexBufferHandle);
}

void bindForCompute(
uint8_t stage,
void bind(
uint stage = UINT_NULL,
bgfx::Access::Enum access = bgfx::Access::Read) const
{
bgfx::setBuffer(stage, mIndexBufferHandle, access);
if (stage == UINT_NULL || stage >= 255) {
bgfx::setIndexBuffer(mIndexBufferHandle);
}
else {
bgfx::setBuffer(stage, mIndexBufferHandle, access);
}
}

private:
Expand All @@ -109,6 +120,16 @@ class IndexBuffer
default: return BGFX_BUFFER_NONE;
}
}

static uint64_t flagsForAccess(bgfx::Access::Enum access)
{
switch (access) {
case bgfx::Access::Read: return BGFX_BUFFER_COMPUTE_READ;
case bgfx::Access::Write: return BGFX_BUFFER_COMPUTE_WRITE;
case bgfx::Access::ReadWrite: return BGFX_BUFFER_COMPUTE_READ_WRITE;
default: return BGFX_BUFFER_NONE;
}
}
};

} // namespace vcl
Expand Down
90 changes: 52 additions & 38 deletions vclib/render/include/vclib/bgfx/drawable/mesh/mesh_render_buffers.h
Original file line number Diff line number Diff line change
Expand Up @@ -132,10 +132,10 @@ class MeshRenderBuffers : public vcl::MeshRenderData<MeshType>
if (indexBufferToBind == Base::TRIANGLES) {
mTriangleIndexBuffer.bind();

mTriangleNormalBuffer.bindForCompute(
mTriangleNormalBuffer.bind(
VCL_MRB_PRIMITIVE_NORMAL_BUFFER);

mTriangleColorBuffer.bindForCompute(
mTriangleColorBuffer.bind(
VCL_MRB_PRIMITIVE_COLOR_BUFFER);

if (bgfx::isValid(mTriangleTextureIndexBH)) { // tri texture indices
Expand Down Expand Up @@ -186,55 +186,69 @@ class MeshRenderBuffers : public vcl::MeshRenderData<MeshType>
3,
bgfx::AttribType::Float);

mVertexNormalsBuffer.set(
Base::vertexNormalBufferData(),
Base::vertexNumber() * 3,
bgfx::Attrib::Normal,
3,
bgfx::AttribType::Float);
// vertex buffer (normals)
if (Base::vertexNormalBufferData()) {
mVertexNormalsBuffer.set(
Base::vertexNormalBufferData(),
Base::vertexNumber() * 3,
bgfx::Attrib::Normal,
3,
bgfx::AttribType::Float);
}

mVertexColorsBuffer.set(
Base::vertexColorBufferData(),
Base::vertexNumber() * 4,
bgfx::Attrib::Color0,
4,
bgfx::AttribType::Uint8,
true);

mVertexUVBuffer.set(
Base::vertexTexCoordsBufferData(),
Base::vertexNumber() * 2,
bgfx::Attrib::TexCoord0,
2,
bgfx::AttribType::Float);
// vertex buffer (colors)
if (Base::vertexColorBufferData()) {
mVertexColorsBuffer.set(
Base::vertexColorBufferData(),
Base::vertexNumber() * 4,
bgfx::Attrib::Color0,
4,
bgfx::AttribType::Uint8,
true);
}

// vertex buffer (UVs)
if (Base::vertexTexCoordsBufferData()) {
mVertexUVBuffer.set(
Base::vertexTexCoordsBufferData(),
Base::vertexNumber() * 2,
bgfx::Attrib::TexCoord0,
2,
bgfx::AttribType::Float);
}

// vertex wedges buffer (duplicated vertices)
mVertexWedgeUVBuffer.set(
Base::wedgeTexCoordsBufferData(),
Base::vertexNumber() * 2,
bgfx::Attrib::TexCoord1,
2,
bgfx::AttribType::Float);
if (Base::wedgeTexCoordsBufferData()) {
mVertexWedgeUVBuffer.set(
Base::wedgeTexCoordsBufferData(),
Base::vertexNumber() * 2,
bgfx::Attrib::TexCoord1,
2,
bgfx::AttribType::Float);
}

// triangle index buffer
if (Base::triangleBufferData()) {
mTriangleIndexBuffer.set(
Base::triangleBufferData(),
Base::triangleBufferSize(),
PrimitiveType::UINT);
Base::triangleBufferSize());
}

// triangle normal buffer
mTriangleNormalBuffer.set(
Base::triangleNormalBufferData(),
Base::triangleNumber() * 3,
PrimitiveType::FLOAT, BGFX_BUFFER_COMPUTE_READ);
if (Base::triangleNormalBufferData()) {
mTriangleNormalBuffer.setForCompute(
Base::triangleNormalBufferData(),
Base::triangleNumber() * 3,
PrimitiveType::FLOAT);
}

// triangle color buffer
mTriangleColorBuffer.set(
Base::triangleColorBufferData(),
Base::triangleNumber(),
PrimitiveType::UINT, BGFX_BUFFER_COMPUTE_READ);
if (Base::triangleColorBufferData()) {
mTriangleColorBuffer.setForCompute(
Base::triangleColorBufferData(),
Base::triangleNumber(),
PrimitiveType::UINT);
}

// triangle wedge UV buffer
if (Base::wedgeTexCoordsBufferData()) {
Expand Down

0 comments on commit b7b8d22

Please sign in to comment.