@@ -18,7 +18,7 @@ namespace TextRendering
18
18
{
19
19
20
20
uint32_t TextRenderer::generateShapeMSDF (
21
- core::smart_refctd_ptr< ICPUBuffer>& buffer, uint32_t bufferOffset,
21
+ ICPUBuffer* buffer, uint32_t bufferOffset,
22
22
msdfgen::Shape glyph, uint32_t msdfPixelRange, uint32_t2 msdfExtents,
23
23
float32_t2 scale, float32_t2 translate)
24
24
{
@@ -31,7 +31,7 @@ uint32_t TextRenderer::generateShapeMSDF(
31
31
return 0u ;
32
32
}
33
33
34
- int8_t * data = reinterpret_cast <int8_t *>(buffer->getPointer ()) + bufferOffset ;
34
+ int8_t * data = reinterpret_cast <int8_t *>(buffer->getPointer ());
35
35
36
36
auto floatToSNORM8 = [](const float fl) -> int8_t
37
37
{
@@ -52,10 +52,10 @@ uint32_t TextRenderer::generateShapeMSDF(
52
52
for (int x = 0 ; x < msdfExtents.y ; ++x)
53
53
{
54
54
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 ]);
59
59
}
60
60
}
61
61
@@ -97,8 +97,16 @@ core::smart_refctd_ptr<ICPUImage> FontFace::generateGlyphMSDF(uint32_t msdfPixel
97
97
imgParams.samples = ICPUImage::ESCF_1_BIT;
98
98
}
99
99
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
+
100
108
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 );
102
110
auto regions = core::make_refctd_dynamic_array<core::smart_refctd_dynamic_array<IImage::SBufferCopy>>(mipLevels);
103
111
104
112
uint32_t bufferOffset = 0u ;
@@ -116,14 +124,14 @@ core::smart_refctd_ptr<ICPUImage> FontFace::generateGlyphMSDF(uint32_t msdfPixel
116
124
117
125
auto & region = regions->begin ()[i];
118
126
region.bufferOffset = bufferOffset;
119
- region.bufferRowLength = 0u ;
120
- region.bufferImageHeight = 0u ;
127
+ region.bufferRowLength = mipW ;
128
+ region.bufferImageHeight = mipH ;
121
129
region.imageSubresource .aspectMask = asset::IImage::E_ASPECT_FLAGS::EAF_COLOR_BIT;
122
130
region.imageSubresource .mipLevel = i;
123
131
region.imageSubresource .baseArrayLayer = 0u ;
124
132
region.imageSubresource .layerCount = 1u ;
125
133
region.imageOffset = { 0u ,0u ,0u };
126
- region.imageExtent = { mipW, mipH };
134
+ region.imageExtent = { mipW, mipH, 1u };
127
135
128
136
auto shapeBounds = shape.getBounds ();
129
137
@@ -147,14 +155,15 @@ core::smart_refctd_ptr<ICPUImage> FontFace::generateGlyphMSDF(uint32_t msdfPixel
147
155
const float32_t2 shapeSpaceCenter = float32_t2 (shapeBounds.l + shapeBounds.r , shapeBounds.t + shapeBounds.b ) * float32_t2 (0.5 );
148
156
const float32_t2 translate = mipExtents / (float32_t2 (2.0 ) * uniformScale) - shapeSpaceCenter;
149
157
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);
151
159
// Failing here means the buffer didn't have enough space
152
160
assert (result);
153
161
bufferOffset += result;
154
162
}
163
+ assert (bufferOffset <= buffer->getCreationParams ().size );
155
164
image->setBufferAndRegions (std::move (buffer), std::move (regions));
156
165
157
- return image;
166
+ return std::move ( image) ;
158
167
}
159
168
160
169
float32_t2 FontFace::getUV (float32_t2 uv, float32_t2 glyphSize, uint32_t2 textureExtents, uint32_t msdfPixelRange)
0 commit comments