Skip to content

Commit 4f797d9

Browse files
committed
WIP of ICPUImage conversion
1 parent 7705a4d commit 4f797d9

File tree

2 files changed

+56
-15
lines changed

2 files changed

+56
-15
lines changed

include/nbl/ext/TextRendering/TextRendering.h

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,11 @@ class TextRenderer : public nbl::core::IReferenceCounted
3434

3535
static constexpr asset::E_FORMAT MSDFTextureFormat = asset::E_FORMAT::EF_R8G8B8A8_SNORM;
3636

37-
// Spits out CPUBuffer containing the image data in SNORM format
38-
core::smart_refctd_ptr<ICPUBuffer> generateShapeMSDF(
39-
msdfgen::Shape glyph, uint32_t msdfPixelRange,
40-
uint32_t2 msdfExtents, float32_t2 scale, float32_t2 translate);
37+
// Takes the CPUBuffer containing the image data in SNORM format and an offset into it
38+
uint32_t generateShapeMSDF(
39+
core::smart_refctd_ptr<ICPUBuffer>& buffer, uint32_t bufferOffset,
40+
msdfgen::Shape glyph, uint32_t msdfPixelRange, uint32_t2 msdfExtents,
41+
float32_t2 scale, float32_t2 translate);
4142

4243
TextRenderer()
4344
{
@@ -121,7 +122,7 @@ class FontFace : public nbl::core::IReferenceCounted
121122
// it will place the glyph in the center of msdfExtents considering the margin of msdfPixelRange
122123
// preserves aspect ratio of the glyph corresponding to metrics of the "glyphId"
123124
// use the `getUV` to address the glyph in your texture correctly.
124-
std::vector<core::smart_refctd_ptr<ICPUBuffer>> generateGlyphMSDF(
125+
core::smart_refctd_ptr<ICPUImage> generateGlyphMSDF(
125126
uint32_t msdfPixelRange, uint32_t glyphId, uint32_t2 textureExtents, uint32_t mipLevels);
126127

127128
// transforms uv in glyph space to uv in the actual texture

src/nbl/ext/TextRendering/TextRendering.cpp

Lines changed: 50 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,21 @@ namespace ext
1717
namespace TextRendering
1818
{
1919

20-
core::smart_refctd_ptr<ICPUBuffer> TextRenderer::generateShapeMSDF(msdfgen::Shape glyph, uint32_t msdfPixelRange, uint32_t2 msdfExtents, float32_t2 scale, float32_t2 translate)
20+
uint32_t TextRenderer::generateShapeMSDF(
21+
core::smart_refctd_ptr<ICPUBuffer>& buffer, uint32_t bufferOffset,
22+
msdfgen::Shape glyph, uint32_t msdfPixelRange, uint32_t2 msdfExtents,
23+
float32_t2 scale, float32_t2 translate)
2124
{
2225
uint32_t glyphW = msdfExtents.x;
2326
uint32_t glyphH = msdfExtents.y;
2427

25-
auto cpuBuf = core::make_smart_refctd_ptr<ICPUBuffer>(glyphW * glyphH * sizeof(int8_t) * 4);
26-
int8_t* data = reinterpret_cast<int8_t*>(cpuBuf->getPointer());
28+
uint32_t bufferSize = glyphW * glyphH * sizeof(int8_t) * 4;
29+
if (buffer->getSize() + bufferOffset < bufferSize)
30+
{
31+
return 0u;
32+
}
33+
34+
int8_t* data = reinterpret_cast<int8_t*>(buffer->getPointer()) + bufferOffset;
2735

2836
auto floatToSNORM8 = [](const float fl) -> int8_t
2937
{
@@ -51,7 +59,7 @@ core::smart_refctd_ptr<ICPUBuffer> TextRenderer::generateShapeMSDF(msdfgen::Shap
5159
}
5260
}
5361

54-
return std::move(cpuBuf);
62+
return bufferSize;
5563
}
5664

5765
constexpr double FreeTypeFontScaling = 1.0 / 64.0;
@@ -76,9 +84,24 @@ FontFace::GlyphMetrics FontFace::getGlyphMetrics(uint32_t glyphId)
7684
};
7785
}
7886

79-
std::vector<core::smart_refctd_ptr<ICPUBuffer>> FontFace::generateGlyphMSDF(uint32_t msdfPixelRange, uint32_t glyphId, uint32_t2 textureExtents, uint32_t mipLevels)
87+
core::smart_refctd_ptr<ICPUImage> FontFace::generateGlyphMSDF(uint32_t msdfPixelRange, uint32_t glyphId, uint32_t2 textureExtents, uint32_t mipLevels)
8088
{
81-
std::vector<core::smart_refctd_ptr<ICPUBuffer>> buffers;
89+
ICPUImage::SCreationParams imgParams;
90+
{
91+
imgParams.flags = static_cast<ICPUImage::E_CREATE_FLAGS>(0u); // no flags
92+
imgParams.type = ICPUImage::ET_2D;
93+
imgParams.format = TextRenderer::MSDFTextureFormat;
94+
imgParams.extent = { textureExtents.x, textureExtents.y, 1 };
95+
imgParams.mipLevels = mipLevels;
96+
imgParams.arrayLayers = 1u;
97+
imgParams.samples = ICPUImage::ESCF_1_BIT;
98+
}
99+
100+
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);
102+
auto regions = core::make_refctd_dynamic_array<core::smart_refctd_dynamic_array<IImage::SBufferCopy>>(mipLevels);
103+
104+
uint32_t bufferOffset = 0u;
82105
for (uint32_t i = 0; i < mipLevels; i++)
83106
{
84107
// we need to generate a msdfgen per mip map, because the msdf generate call consumes the shape
@@ -88,10 +111,22 @@ std::vector<core::smart_refctd_ptr<ICPUBuffer>> FontFace::generateGlyphMSDF(uint
88111
// Empty shapes should've been filtered sooner
89112
assert(!shape.contours.empty());
90113

91-
auto shapeBounds = shape.getBounds();
92-
93114
uint32_t mipW = textureExtents.x / (1 << i);
94115
uint32_t mipH = textureExtents.y / (1 << i);
116+
117+
auto& region = regions->begin()[i];
118+
region.bufferOffset = 0u;
119+
region.bufferRowLength = 0u;
120+
region.bufferImageHeight = 0u;
121+
//region.imageSubresource.aspectMask = wait for Vulkan;
122+
region.imageSubresource.mipLevel = i;
123+
region.imageSubresource.baseArrayLayer = 0u;
124+
region.imageSubresource.layerCount = 1u;
125+
region.imageOffset = { 0u,0u,0u };
126+
region.imageExtent = { mipW, mipH };
127+
128+
auto shapeBounds = shape.getBounds();
129+
95130
float32_t2 mipExtents = float32_t2(float(mipW), float(mipH));
96131
uint32_t mipPixelRange = msdfPixelRange / (1 << i);
97132

@@ -112,9 +147,14 @@ std::vector<core::smart_refctd_ptr<ICPUBuffer>> FontFace::generateGlyphMSDF(uint
112147
const float32_t2 shapeSpaceCenter = float32_t2(shapeBounds.l + shapeBounds.r, shapeBounds.t + shapeBounds.b) * float32_t2(0.5);
113148
const float32_t2 translate = mipExtents / (float32_t2(2.0) * uniformScale) - shapeSpaceCenter;
114149

115-
buffers.push_back(m_textRenderer->generateShapeMSDF(shape, mipPixelRange, mipExtents, float32_t2(uniformScale, uniformScale), translate));
150+
uint32_t result = m_textRenderer->generateShapeMSDF(buffer, bufferOffset, shape, mipPixelRange, mipExtents, float32_t2(uniformScale, uniformScale), translate);
151+
// Failing here means the buffer didn't have enough space
152+
assert(result);
153+
bufferOffset += result;
116154
}
117-
return buffers;
155+
image->setBufferAndRegions(std::move(buffer), std::move(regions));
156+
157+
return image;
118158
}
119159

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

0 commit comments

Comments
 (0)