Skip to content

Commit c2766af

Browse files
committed
Better generateShapeMSDF api
1 parent b27efb7 commit c2766af

File tree

3 files changed

+18
-23
lines changed

3 files changed

+18
-23
lines changed

include/nbl/ext/TextRendering/TextRendering.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,9 @@ class TextRenderer : public nbl::core::IReferenceCounted
3535
static constexpr asset::E_FORMAT MSDFTextureFormat = asset::E_FORMAT::EF_R8G8B8A8_SNORM;
3636

3737
// Takes the CPUBuffer containing the image data in SNORM format and an offset into it
38-
uint32_t generateShapeMSDF(
39-
ICPUBuffer* buffer,
40-
uint32_t bufferOffset,
38+
void generateShapeMSDF(
39+
ICPUBuffer* bufferToFill,
40+
size_t* bufferOffset,
4141
msdfgen::Shape glyph,
4242
float32_t msdfPixelRange,
4343
uint32_t2 msdfExtents,

src/nbl/ext/TextRendering/TextRendering.cpp

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ namespace ext
1717
namespace TextRendering
1818
{
1919

20-
uint32_t TextRenderer::generateShapeMSDF(
21-
ICPUBuffer* buffer,
22-
uint32_t bufferOffset,
20+
void TextRenderer::generateShapeMSDF(
21+
ICPUBuffer* bufferToFill,
22+
size_t* bufferOffset,
2323
msdfgen::Shape glyph,
2424
float32_t msdfPixelRange,
2525
uint32_t2 msdfExtents,
@@ -29,13 +29,11 @@ uint32_t TextRenderer::generateShapeMSDF(
2929
uint32_t glyphW = msdfExtents.x;
3030
uint32_t glyphH = msdfExtents.y;
3131

32-
uint32_t bufferSize = glyphW * glyphH * sizeof(int8_t) * 4;
33-
if (buffer->getSize() + bufferOffset < bufferSize)
34-
{
35-
return 0u;
36-
}
32+
size_t& offset = *bufferOffset;
33+
size_t bufferSize = glyphW * glyphH * sizeof(int8_t) * 4;
34+
assert(bufferToFill->getSize() >= bufferSize + bufferOffset);
3735

38-
int8_t* data = reinterpret_cast<int8_t*>(buffer->getPointer());
36+
int8_t* data = reinterpret_cast<int8_t*>(bufferToFill->getPointer());
3937

4038
auto floatToSNORM8 = [](const float fl) -> int8_t
4139
{
@@ -57,14 +55,14 @@ uint32_t TextRenderer::generateShapeMSDF(
5755
for (int x = 0; x < msdfExtents.y; ++x)
5856
{
5957
auto pixel = msdfMap(x, msdfExtents.y - 1 - y);
60-
data[bufferOffset + (x + y * msdfExtents.x) * 4 + 0] = floatToSNORM8(pixel[0]);
61-
data[bufferOffset + (x + y * msdfExtents.x) * 4 + 1] = floatToSNORM8(pixel[1]);
62-
data[bufferOffset + (x + y * msdfExtents.x) * 4 + 2] = floatToSNORM8(pixel[2]);
63-
data[bufferOffset + (x + y * msdfExtents.x) * 4 + 3] = floatToSNORM8(pixel[3]);
58+
data[offset + (x + y * msdfExtents.x) * 4 + 0] = floatToSNORM8(pixel[0]);
59+
data[offset + (x + y * msdfExtents.x) * 4 + 1] = floatToSNORM8(pixel[1]);
60+
data[offset + (x + y * msdfExtents.x) * 4 + 2] = floatToSNORM8(pixel[2]);
61+
data[offset + (x + y * msdfExtents.x) * 4 + 3] = floatToSNORM8(pixel[3]);
6462
}
6563
}
6664

67-
return bufferSize;
65+
offset += bufferSize;
6866
}
6967

7068
constexpr double FreeTypeFontScaling = 1.0 / 64.0;
@@ -114,7 +112,7 @@ core::smart_refctd_ptr<ICPUImage> FontFace::generateGlyphMSDF(uint32_t baseMSDFP
114112
auto buffer = core::make_smart_refctd_ptr<ICPUBuffer>(bufferSize);
115113
auto regions = core::make_refctd_dynamic_array<core::smart_refctd_dynamic_array<IImage::SBufferCopy>>(mipLevels);
116114

117-
uint32_t bufferOffset = 0u;
115+
size_t bufferOffset = 0ull;
118116
for (uint32_t i = 0; i < mipLevels; i++)
119117
{
120118
// we need to generate a msdfgen per mip map, because the msdf generate call consumes the shape
@@ -163,10 +161,7 @@ core::smart_refctd_ptr<ICPUImage> FontFace::generateGlyphMSDF(uint32_t baseMSDFP
163161
// We are using `baseMSDFPixelRange`, because we still need larger range for smaller mips when aa feather is relatively large.
164162
// WARNING: HWTrilinear filtering will not give correct results.
165163
//because now the baseMSDFPixelRange is being used for all mips as it's wrong to mix/lerp values that have different scales (pixel ranges)
166-
uint32_t result = m_textRenderer->generateShapeMSDF(buffer.get(), bufferOffset, shape, baseMSDFPixelRange, mipExtents, float32_t2(uniformScale, uniformScale), translate);
167-
// Failing here means the buffer didn't have enough space
168-
assert(result);
169-
bufferOffset += result;
164+
m_textRenderer->generateShapeMSDF(buffer.get(), &bufferOffset, shape, baseMSDFPixelRange, mipExtents, float32_t2(uniformScale, uniformScale), translate);
170165
}
171166
assert(bufferOffset <= buffer->getCreationParams().size);
172167
image->setBufferAndRegions(std::move(buffer), std::move(regions));

0 commit comments

Comments
 (0)