Skip to content

Commit efe2575

Browse files
committed
Fix issues with ICPUBuffer
1 parent 57708ca commit efe2575

File tree

1 file changed

+21
-12
lines changed

1 file changed

+21
-12
lines changed

src/nbl/ext/TextRendering/TextRendering.cpp

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ namespace TextRendering
1818
{
1919

2020
uint32_t TextRenderer::generateShapeMSDF(
21-
core::smart_refctd_ptr<ICPUBuffer>& buffer, uint32_t bufferOffset,
21+
ICPUBuffer* buffer, uint32_t bufferOffset,
2222
msdfgen::Shape glyph, uint32_t msdfPixelRange, uint32_t2 msdfExtents,
2323
float32_t2 scale, float32_t2 translate)
2424
{
@@ -31,7 +31,7 @@ uint32_t TextRenderer::generateShapeMSDF(
3131
return 0u;
3232
}
3333

34-
int8_t* data = reinterpret_cast<int8_t*>(buffer->getPointer()) + bufferOffset;
34+
int8_t* data = reinterpret_cast<int8_t*>(buffer->getPointer());
3535

3636
auto floatToSNORM8 = [](const float fl) -> int8_t
3737
{
@@ -52,10 +52,10 @@ uint32_t TextRenderer::generateShapeMSDF(
5252
for (int x = 0; x < msdfExtents.y; ++x)
5353
{
5454
auto pixel = msdfMap(x, msdfExtents.y - 1 - y);
55-
data[(x + y * msdfExtents.x) * 4 + 0] = floatToSNORM8(pixel[0]);
56-
data[(x + y * msdfExtents.x) * 4 + 1] = floatToSNORM8(pixel[1]);
57-
data[(x + y * msdfExtents.x) * 4 + 2] = floatToSNORM8(pixel[2]);
58-
data[(x + y * msdfExtents.x) * 4 + 3] = floatToSNORM8(pixel[3]);
55+
data[bufferOffset + (x + y * msdfExtents.x) * 4 + 0] = floatToSNORM8(pixel[0]);
56+
data[bufferOffset + (x + y * msdfExtents.x) * 4 + 1] = floatToSNORM8(pixel[1]);
57+
data[bufferOffset + (x + y * msdfExtents.x) * 4 + 2] = floatToSNORM8(pixel[2]);
58+
data[bufferOffset + (x + y * msdfExtents.x) * 4 + 3] = floatToSNORM8(pixel[3]);
5959
}
6060
}
6161

@@ -97,8 +97,16 @@ core::smart_refctd_ptr<ICPUImage> FontFace::generateGlyphMSDF(uint32_t msdfPixel
9797
imgParams.samples = ICPUImage::ESCF_1_BIT;
9898
}
9999

100+
uint32_t bufferSize = 0u;
101+
for (uint32_t i = 0; i < mipLevels; i++)
102+
{
103+
uint32_t mipW = textureExtents.x / (1 << i);
104+
uint32_t mipH = textureExtents.y / (1 << i);
105+
bufferSize += mipW * mipH * sizeof(uint8_t) * 4;
106+
}
107+
100108
auto image = ICPUImage::create(std::move(imgParams));
101-
auto buffer = core::make_smart_refctd_ptr<ICPUBuffer>(textureExtents.x * textureExtents.y * sizeof(uint8_t) * 4 * 2);
109+
auto buffer = core::make_smart_refctd_ptr<ICPUBuffer>(bufferSize);
102110
auto regions = core::make_refctd_dynamic_array<core::smart_refctd_dynamic_array<IImage::SBufferCopy>>(mipLevels);
103111

104112
uint32_t bufferOffset = 0u;
@@ -116,14 +124,14 @@ core::smart_refctd_ptr<ICPUImage> FontFace::generateGlyphMSDF(uint32_t msdfPixel
116124

117125
auto& region = regions->begin()[i];
118126
region.bufferOffset = bufferOffset;
119-
region.bufferRowLength = 0u;
120-
region.bufferImageHeight = 0u;
127+
region.bufferRowLength = mipW;
128+
region.bufferImageHeight = mipH;
121129
region.imageSubresource.aspectMask = asset::IImage::E_ASPECT_FLAGS::EAF_COLOR_BIT;
122130
region.imageSubresource.mipLevel = i;
123131
region.imageSubresource.baseArrayLayer = 0u;
124132
region.imageSubresource.layerCount = 1u;
125133
region.imageOffset = { 0u,0u,0u };
126-
region.imageExtent = { mipW, mipH };
134+
region.imageExtent = { mipW, mipH, 1u };
127135

128136
auto shapeBounds = shape.getBounds();
129137

@@ -147,14 +155,15 @@ core::smart_refctd_ptr<ICPUImage> FontFace::generateGlyphMSDF(uint32_t msdfPixel
147155
const float32_t2 shapeSpaceCenter = float32_t2(shapeBounds.l + shapeBounds.r, shapeBounds.t + shapeBounds.b) * float32_t2(0.5);
148156
const float32_t2 translate = mipExtents / (float32_t2(2.0) * uniformScale) - shapeSpaceCenter;
149157

150-
uint32_t result = m_textRenderer->generateShapeMSDF(buffer, bufferOffset, shape, mipPixelRange, mipExtents, float32_t2(uniformScale, uniformScale), translate);
158+
uint32_t result = m_textRenderer->generateShapeMSDF(buffer.get(), bufferOffset, shape, mipPixelRange, mipExtents, float32_t2(uniformScale, uniformScale), translate);
151159
// Failing here means the buffer didn't have enough space
152160
assert(result);
153161
bufferOffset += result;
154162
}
163+
assert(bufferOffset <= buffer->getCreationParams().size);
155164
image->setBufferAndRegions(std::move(buffer), std::move(regions));
156165

157-
return image;
166+
return std::move(image);
158167
}
159168

160169
float32_t2 FontFace::getUV(float32_t2 uv, float32_t2 glyphSize, uint32_t2 textureExtents, uint32_t msdfPixelRange)

0 commit comments

Comments
 (0)