Instrumentation

This commit is contained in:
Simon Lübeß
2022-01-14 21:49:15 +01:00
parent 78faf4cb81
commit 06469f3350
44 changed files with 481 additions and 30 deletions
+7
View File
@@ -80,11 +80,18 @@ namespace GlitchyEngine.Renderer
public this(BlendStateDescription desc)
{
Debug.Profiler.ProfileResourceFunction!();
_desc = desc;
PlatformCreateBlendState();
}
public ~this()
{
Debug.Profiler.ProfileResourceFunction!();
}
protected extern void PlatformCreateBlendState();
}
}
@@ -15,6 +15,8 @@ namespace GlitchyEngine.Renderer
[AllowAppend]
public this()
{
Debug.Profiler.ProfileResourceFunction!();
// Todo: append allocate as soon as it's fixed
let buffers = new List<BufferEntry>();
let strToBuf = new Dictionary<String, BufferEntry*>();
@@ -24,6 +26,11 @@ namespace GlitchyEngine.Renderer
_strToBuf = strToBuf;
_idxToBuf = idxToBuf;
}
public ~this()
{
Debug.Profiler.ProfileResourceFunction!();
}
mixin DeleteBufferEntries(List<BufferEntry> entries)
{
@@ -54,6 +61,8 @@ namespace GlitchyEngine.Renderer
public BufferEntry* TryGetBufferEntry(String name)
{
Debug.Profiler.ProfileResourceFunction!();
if(_strToBuf.TryGetValue(name, let buffer))
{
return buffer;
@@ -64,6 +73,8 @@ namespace GlitchyEngine.Renderer
public BufferEntry* TryGetBufferEntry(int index)
{
Debug.Profiler.ProfileResourceFunction!();
if(_idxToBuf.TryGetValue(index, let buffer))
{
return buffer;
@@ -80,6 +91,8 @@ namespace GlitchyEngine.Renderer
*/
public bool TryReplaceBuffer(int idx, Buffer buffer)
{
Debug.Profiler.ProfileResourceFunction!();
if(_idxToBuf.TryGetValue(idx, let bufferEntry))
{
Log.EngineLogger.Assert(idx == bufferEntry.Index);
@@ -105,6 +118,8 @@ namespace GlitchyEngine.Renderer
*/
public bool TryReplaceBuffer(String name, Buffer buffer)
{
Debug.Profiler.ProfileResourceFunction!();
if(_strToBuf.TryGetValue(name, let bufferEntry))
{
Log.EngineLogger.AssertDebug(name == bufferEntry.Name);
@@ -129,6 +144,8 @@ namespace GlitchyEngine.Renderer
public void Add(BufferEntry entry)
{
Debug.Profiler.ProfileResourceFunction!();
BufferEntry copy = (new String(entry.Name), entry.Index, entry.Buffer..AddRef());
_buffers.Add(copy);
@@ -146,6 +163,8 @@ namespace GlitchyEngine.Renderer
*/
int GetIndexOfBuffer(Buffer buffer)
{
Debug.Profiler.ProfileResourceFunction!();
for(int i < _buffers.Count)
{
// Only check for reference equality.
@@ -165,6 +184,8 @@ namespace GlitchyEngine.Renderer
*/
String GetNameOfBuffer(Buffer buffer)
{
Debug.Profiler.ProfileResourceFunction!();
for(int i < _buffers.Count)
{
// Only check for reference equality.
+40
View File
@@ -25,6 +25,8 @@ namespace GlitchyEngine.Renderer
public void Add(Effect effect, String effectName = null)
{
Debug.Profiler.ProfileResourceFunction!();
String name;
if(effectName == null)
@@ -51,6 +53,8 @@ namespace GlitchyEngine.Renderer
*/
public Effect Load(String filepath, String effectName = null)
{
Debug.Profiler.ProfileResourceFunction!();
String name = effectName;
if(name == null)
@@ -80,6 +84,8 @@ namespace GlitchyEngine.Renderer
public Effect Get(String effectName)
{
Debug.Profiler.ProfileResourceFunction!();
Log.EngineLogger.AssertDebug(Exists(effectName), "Effect not found!");
return _effects.GetValue(effectName).Get()..AddRef();
@@ -137,6 +143,8 @@ namespace GlitchyEngine.Renderer
public this(String filename, String vsEntry, String psEntry, String shaderName = null)
{
Debug.Profiler.ProfileResourceFunction!();
CompileFromFile(filename, vsEntry, psEntry);
if(shaderName == null)
@@ -152,6 +160,8 @@ namespace GlitchyEngine.Renderer
public this(String filename, String shaderName = null)
{
Debug.Profiler.ProfileResourceFunction!();
String fileContent = scope String();
String vsName = scope String();
String psName = scope String();
@@ -175,6 +185,8 @@ namespace GlitchyEngine.Renderer
public this(String shaderName, String vsPath, String vsEntry, String psPath, String psEntry)
{
Debug.Profiler.ProfileResourceFunction!();
Compile(vsPath, vsEntry, psPath, psEntry);
_name = new String(shaderName);
@@ -182,6 +194,8 @@ namespace GlitchyEngine.Renderer
public ~this()
{
Debug.Profiler.ProfileResourceFunction!();
for(let entry in _textures)
{
entry.value.Texture?.ReleaseRef();
@@ -190,6 +204,8 @@ namespace GlitchyEngine.Renderer
public void SetTexture(String name, Texture texture)
{
Debug.Profiler.ProfileRendererFunction!();
ref TextureEntry entry = ref _textures[name];
entry.Texture?.ReleaseRef();
@@ -199,6 +215,8 @@ namespace GlitchyEngine.Renderer
private void ApplyTextures()
{
Debug.Profiler.ProfileRendererFunction!();
for(let (name, entry) in _textures)
{
entry.VsSlot?.Texture?.ReleaseRef();
@@ -213,6 +231,8 @@ namespace GlitchyEngine.Renderer
private void ApplyChanges()
{
Debug.Profiler.ProfileRendererFunction!();
for(let buffer in _bufferCollection)
{
if(let cbuffer = buffer.Buffer as ConstantBuffer)
@@ -224,6 +244,8 @@ namespace GlitchyEngine.Renderer
public void Bind(GraphicsContext context)
{
Debug.Profiler.ProfileRendererFunction!();
ApplyTextures();
ApplyChanges();
@@ -235,6 +257,8 @@ namespace GlitchyEngine.Renderer
private void CompileFromFile(String filename, String vsEntry, String psEntry)
{
Debug.Profiler.ProfileResourceFunction!();
let vs = Shader.FromFile!<VertexShader>(filename, vsEntry);
VertexShader = vs;
vs.ReleaseRef();
@@ -245,6 +269,8 @@ namespace GlitchyEngine.Renderer
private void Compile(String fileContent, String vsEntry, String psEntry)
{
Debug.Profiler.ProfileResourceFunction!();
// TODO: vsEntry and psEntry could be empty (which is a valid case.)
let vs = new VertexShader(fileContent, vsEntry);
VertexShader = vs;
@@ -265,6 +291,8 @@ namespace GlitchyEngine.Renderer
*/
private static void ProcessFile(String filename, String fileContent, String vsName, String psName)
{
Debug.Profiler.ProfileResourceFunction!();
File.ReadAllText(filename, fileContent, true);
// append line ending just in case the file doesn't end with one.
fileContent.Append('\n');
@@ -324,6 +352,8 @@ namespace GlitchyEngine.Renderer
private void MergeResources()
{
Debug.Profiler.ProfileResourceFunction!();
MergeConstantBuffers();
MergeBufferVariables();
MergeTextures();
@@ -331,6 +361,8 @@ namespace GlitchyEngine.Renderer
private void MergeConstantBuffers()
{
Debug.Profiler.ProfileResourceFunction!();
_bufferCollection = new BufferCollection();
HashSet<String> bufferNames = scope HashSet<String>();
@@ -374,6 +406,8 @@ namespace GlitchyEngine.Renderer
private void MergeBufferVariables()
{
Debug.Profiler.ProfileResourceFunction!();
_variables = new BufferVariableCollection(false);
for(let buffer in _bufferCollection)
@@ -390,6 +424,8 @@ namespace GlitchyEngine.Renderer
private void AddShaderBuffers(Shader shader, HashSet<String> bufferNames)
{
Debug.Profiler.ProfileResourceFunction!();
if(shader != null)
{
for(let buffer in shader.Buffers)
@@ -402,6 +438,8 @@ namespace GlitchyEngine.Renderer
/// Merges the texture slots of all shaders into one dictionary.
private void MergeTextures()
{
Debug.Profiler.ProfileResourceFunction!();
delete _textures;
_textures = new .();
@@ -414,6 +452,8 @@ namespace GlitchyEngine.Renderer
*/
private void EnumerateShaderTextures<T>(T shader) where T : Shader
{
Debug.Profiler.ProfileResourceFunction!();
//for(var (name, index, texture) in shader.Resources)
for(var shaderEntry in ref shader.Textures)
{
@@ -80,11 +80,15 @@ namespace GlitchyEngine.Renderer
protected override void UpdateProjection()
{
Debug.Profiler.ProfileFunction!();
_projection = Matrix.OrthographicProjectionOffCenter(_left, _right, _top, _bottom, _nearPlane, _farPlane);
}
protected override void UpdateTransform()
{
Debug.Profiler.ProfileFunction!();
_transform = Matrix.Translation(_position) * Matrix.RotationZ(_rotation.Z) * Matrix.RotationY(_rotation.Y) * Matrix.RotationX(_rotation.X);
_view = _transform.Invert();
}
@@ -78,6 +78,8 @@ namespace GlitchyEngine.Renderer
protected override void UpdateProjection()
{
Debug.Profiler.ProfileFunction!();
if(_projectionType == .Limited || _projectionType == .LimitedReversed)
Log.EngineLogger.AssertDebug(_nearPlane < _farPlane, "The near plane must be smaller than the far plane.");
@@ -98,6 +100,8 @@ namespace GlitchyEngine.Renderer
protected override void UpdateTransform()
{
Debug.Profiler.ProfileFunction!();
_transform = Matrix.Translation(_position) * Matrix.RotationZ(_rotation.Z) * Matrix.RotationY(_rotation.Y) * Matrix.RotationX(_rotation.X);
_view = _transform.Invert();
}
@@ -32,6 +32,8 @@ namespace GlitchyEngine.Renderer
[Inline]
public static void Init()
{
Debug.Profiler.ProfileFunction!();
_rendererAPI.Init();
}
@@ -63,6 +63,8 @@ namespace GlitchyEngine.Renderer
public this(RenderTarget2DDescription description)
{
Debug.Profiler.ProfileResourceFunction!();
_description = description;
ApplyChanges();
+20 -1
View File
@@ -29,6 +29,8 @@ namespace GlitchyEngine.Renderer
public static void Init(GraphicsContext context, EffectLibrary effectLibrary)
{
Debug.Profiler.ProfileFunction!();
_context = context..AddRef();
/*
_sceneConstants = new Buffer<SceneConstants>(.(0, .Constant, .Dynamic, .Write));
@@ -46,11 +48,15 @@ namespace GlitchyEngine.Renderer
public static void Deinit()
{
Debug.Profiler.ProfileFunction!();
Renderer2D.Deinit();
}
static void InitLineRenderer(EffectLibrary effectLibrary)
{
Debug.Profiler.ProfileFunction!();
LineEffect = effectLibrary.Load("content\\Shaders\\lineShader.hlsl");
LineGeometry = new GeometryBinding();
@@ -75,6 +81,8 @@ namespace GlitchyEngine.Renderer
public static void BeginScene(EcsWorld world, Entity cameraEntity)
{
Debug.Profiler.ProfileRendererFunction!();
var camera = world.GetComponent<CameraComponent>(cameraEntity);
var transform = world.GetComponent<TransformComponent>(cameraEntity);
@@ -87,15 +95,22 @@ namespace GlitchyEngine.Renderer
public static void BeginScene(Camera camera)
{
Debug.Profiler.ProfileRendererFunction!();
_sceneConstants.ViewProjection = camera.ViewProjection;
//_sceneConstants.Data.ViewProjection = camera.ViewProjection;
//_sceneConstants.Update();
}
public static void EndScene(){}
public static void EndScene()
{
Debug.Profiler.ProfileRendererFunction!();
}
public static void Submit(GeometryBinding geometry, Effect effect, Matrix transform = .Identity)
{
Debug.Profiler.ProfileRendererFunction!();
//effect.PixelShader?.Buffers.TryReplaceBuffer("SceneConstants", _sceneConstants);
//effect.VertexShader?.Buffers.TryReplaceBuffer("SceneConstants", _sceneConstants);
@@ -116,6 +131,8 @@ namespace GlitchyEngine.Renderer
public static void Submit(GeometryBinding geometry, Material material, Matrix transform = .Identity)
{
Debug.Profiler.ProfileRendererFunction!();
material.SetVariable("ViewProjection", _sceneConstants.ViewProjection);
material.SetVariable("Transform", transform);
@@ -175,6 +192,8 @@ namespace GlitchyEngine.Renderer
*/
public static void DrawLine(Vector4 start, Vector4 end, Color color, Matrix transform)
{
Debug.Profiler.ProfileRendererFunction!();
LineVertices.SetData(Vector4[2](start, end), 0, .WriteDiscard);
LineEffect.Variables["ViewProjection"].SetData(_sceneConstants.ViewProjection * transform);
LineEffect.Variables["Color"].SetData(color);
+32
View File
@@ -135,12 +135,16 @@ namespace GlitchyEngine.Renderer
private static void InitEffect()
{
Debug.Profiler.ProfileFunction!();
s_batchEffect = new Effect("content\\Shaders\\spritebatch.hlsl");
s_circleBatchEffect = new Effect("content\\Shaders\\circlebatch.hlsl");
}
private static void InitGeometry()
{
Debug.Profiler.ProfileFunction!();
s_quadGeometry = new GeometryBinding();
s_quadGeometry.SetPrimitiveTopology(.TriangleList);
@@ -171,6 +175,8 @@ namespace GlitchyEngine.Renderer
private static void InitInstancingGeometry()
{
Debug.Profiler.ProfileFunction!();
{
s_instanceBuffer = new VertexBuffer(typeof(BatchVertex), 1024, .Dynamic, .Write);
s_instanceBuffer.SetData(0);
@@ -242,6 +248,8 @@ namespace GlitchyEngine.Renderer
private static void InitWhitetexture()
{
Debug.Profiler.ProfileFunction!();
// Create a texture with a single white pixel
Texture2DDesc tex2Ddesc = .{
Format = .R8G8B8A8_UNorm,
@@ -266,6 +274,8 @@ namespace GlitchyEngine.Renderer
public static void Init()
{
Debug.Profiler.ProfileFunction!();
InitEffect();
InitGeometry();
InitInstancingGeometry();
@@ -280,6 +290,7 @@ namespace GlitchyEngine.Renderer
public static void Deinit()
{
Debug.Profiler.ProfileFunction!();
#if DEBUG
Log.EngineLogger.AssertDebug(s_initialized, "Renderer2D was not initialized.");
#endif
@@ -313,6 +324,7 @@ namespace GlitchyEngine.Renderer
public static void BeginScene(OrthographicCamera camera, DrawOrder drawOrder = .SortByTexture, Effect effect = null, Effect circleEffect = null)
{
Debug.Profiler.ProfileRendererFunction!();
#if DEBUG
Log.EngineLogger.AssertDebug(s_initialized, "Renderer2D was not initialized.");
Log.EngineLogger.AssertDebug(!s_sceneRunning, "You have to call EndScene before you can make another call to BeginScene.");
@@ -352,6 +364,7 @@ namespace GlitchyEngine.Renderer
public static void EndScene()
{
Debug.Profiler.ProfileRendererFunction!();
#if DEBUG
Log.EngineLogger.AssertDebug(s_sceneRunning, "Missing call of BeginScene.");
#endif
@@ -364,6 +377,7 @@ namespace GlitchyEngine.Renderer
public static void Flush()
{
Debug.Profiler.ProfileFunction!();
#if DEBUG
Log.EngineLogger.AssertDebug(s_sceneRunning, "Missing call of BeginScene.");
#endif
@@ -388,6 +402,8 @@ namespace GlitchyEngine.Renderer
private static void FlushInstances()
{
Debug.Profiler.ProfileRendererFunction!();
if(s_setInstances == 0)
return;
@@ -403,6 +419,8 @@ namespace GlitchyEngine.Renderer
private static void FlushCircleInstances()
{
Debug.Profiler.ProfileRendererFunction!();
if(s_setInstances == 0)
return;
@@ -446,6 +464,8 @@ namespace GlitchyEngine.Renderer
private static void SortInstances()
{
Debug.Profiler.ProfileRendererFunction!();
switch(s_drawOrder)
{
case .SortByTexture:
@@ -465,6 +485,8 @@ namespace GlitchyEngine.Renderer
private static void DrawDeferred()
{
Debug.Profiler.ProfileRendererFunction!();
if(s_instanceQueue.IsEmpty && s_circleInstanceQueue.IsEmpty)
return;
@@ -476,6 +498,8 @@ namespace GlitchyEngine.Renderer
private static void DrawDeferredQuads()
{
Debug.Profiler.ProfileRendererFunction!();
if(s_instanceQueue.IsEmpty)
return;
@@ -512,6 +536,8 @@ namespace GlitchyEngine.Renderer
private static void DrawDeferredCircles()
{
Debug.Profiler.ProfileRendererFunction!();
if(s_circleInstanceQueue.IsEmpty)
return;
@@ -583,6 +609,8 @@ namespace GlitchyEngine.Renderer
public static void DrawQuad(Vector3 position, Vector2 size, float rotation, Texture2D texture, ColorRGBA color = .White, Vector4 uvTransform = .(0, 0, 1, 1))
{
Debug.Profiler.ProfileRendererFunction!();
#if DEBUG
Log.EngineLogger.AssertDebug(s_sceneRunning, "Missing call of BeginScene.");
#endif
@@ -599,6 +627,8 @@ namespace GlitchyEngine.Renderer
public static void DrawQuad(Matrix transform, Texture2D texture, ColorRGBA color = .White, Vector4 uvTransform = .(0, 0, 1, 1))
{
Debug.Profiler.ProfileRendererFunction!();
#if DEBUG
Log.EngineLogger.AssertDebug(s_sceneRunning, "Missing call of BeginScene.");
#endif
@@ -636,6 +666,8 @@ namespace GlitchyEngine.Renderer
public static void DrawCircle(Vector3 position, Vector2 size, Texture2D texture, ColorRGBA color = .White, float innerRadius = 1.0f, Vector4 uvTransform = .(0, 0, 1, 1))
{
#if DEBUG
Debug.Profiler.ProfileRendererFunction!();
Log.EngineLogger.AssertDebug(s_sceneRunning, "Missing call of BeginScene.");
#endif
@@ -23,6 +23,8 @@ namespace GlitchyEngine.Renderer
public void Clear(RenderTarget2D renderTarget, ClearOptions options, ColorRGBA color, float depth, uint8 stencil)
{
Debug.Profiler.ProfileRendererFunction!();
var actualRt = (renderTarget ?? GraphicsContext.Get().SwapChain.BackBuffer);
if(options.HasFlag(.Color))
@@ -164,6 +164,8 @@ namespace GlitchyEngine.Renderer
public static void Init()
{
Debug.Profiler.ProfileFunction!();
_samplers = new .();
// Init point samplers
@@ -230,6 +232,8 @@ namespace GlitchyEngine.Renderer
public static void Uninit()
{
Debug.Profiler.ProfileFunction!();
PointClamp.ReleaseRef();
PointWrap.ReleaseRef();
LinearClamp.ReleaseRef();
@@ -249,6 +253,8 @@ namespace GlitchyEngine.Renderer
*/
public static SamplerState GetSampler(SamplerStateDescription desc)
{
Debug.Profiler.ProfileResourceFunction!();
Log.EngineLogger.AssertDebug(_samplers != null, "SamplerStateManager was not initialized.");
if(_samplers.TryGetValue(desc, let sampler))
@@ -299,6 +305,8 @@ namespace GlitchyEngine.Renderer
public this(SamplerStateDescription desc)
{
Debug.Profiler.ProfileResourceFunction!();
_desc = desc;
PlatformCreateSamplerState();
@@ -306,6 +314,8 @@ namespace GlitchyEngine.Renderer
public ~this()
{
Debug.Profiler.ProfileResourceFunction!();
SamplerStateManager.[Friend]Remove(this);
}
+5 -1
View File
@@ -32,6 +32,8 @@ namespace GlitchyEngine.Renderer
[AllowAppend]
public this(String source, String entryPoint, ShaderDefine[] macros = null)
{
Debug.Profiler.ProfileResourceFunction!();
// Todo: append as soon as it's fixed.
//let buffers = new BufferCollection();
_buffers = new BufferCollection();
@@ -42,11 +44,13 @@ namespace GlitchyEngine.Renderer
public ~this()
{
Debug.Profiler.ProfileResourceFunction!();
}
public static mixin FromFile<T>(String fileName, String entryPoint, ShaderDefine[] macros = null) where T : Shader
{
Debug.Profiler.ProfileResourceFunction!();
String fileContent = new String();
File.ReadAllText(fileName, fileContent, true);
+55 -9
View File
@@ -115,6 +115,8 @@ namespace GlitchyEngine.Renderer.Text
public this(String fontPath, uint32 fontSize, bool hasColor = true, char32 firstChar = '\0', uint32 charCount = 128, int32 faceIndex = 0)
{
Debug.Profiler.ProfileResourceFunction!();
// Make sure the fontrenderer is initialized (Font only cares about freetype)
FontRenderer.Init();
@@ -125,11 +127,19 @@ namespace GlitchyEngine.Renderer.Text
_faceIndex = faceIndex;
_hasColor = hasColor;
var res = FreeType.New_Face(FontRenderer.s_Library, fontPath, faceIndex, &_face);
Log.EngineLogger.Assert(res.Success, scope $"New_Face failed({(int)res}): {res}");
{
Debug.Profiler.ProfileResourceScope!("Freetype.New_Face");
res = FreeType.Set_Pixel_Sizes(_face, 0, _fontSize);
Log.EngineLogger.Assert(res.Success, scope $"Set_Pixel_Sizes failed({(int)res}): {res}");
FT_Error res = FreeType.New_Face(FontRenderer.s_Library, fontPath, faceIndex, &_face);
Log.EngineLogger.Assert(res.Success, scope $"New_Face failed({(int)res}): {res}");
}
{
Debug.Profiler.ProfileResourceScope!("Freetype.Set_Pixel_Sizes");
FT_Error res = FreeType.Set_Pixel_Sizes(_face, 0, _fontSize);
Log.EngineLogger.Assert(res.Success, scope $"Set_Pixel_Sizes failed({(int)res}): {res}");
}
double unitsPerEm = F26Dot6ToDouble(_face.units_per_EM);
_geometryScaler = _fontSize / unitsPerEm;
@@ -147,6 +157,8 @@ namespace GlitchyEngine.Renderer.Text
// HarfBuzz
{
Debug.Profiler.ProfileResourceScope!("hb_ft_font_create_referenced");
_harfBuzzFont = hb_ft_font_create_referenced(_face);
hb_font_set_scale(_harfBuzzFont, (.)fontSize * 64, (.)fontSize * 64);
}
@@ -156,6 +168,8 @@ namespace GlitchyEngine.Renderer.Text
public void LoadGlyphs(char32 firstChar, uint32 charCount)
{
Debug.Profiler.ProfileResourceFunction!();
ExtendRange(firstChar, firstChar + charCount);
UpdateAtlas();
@@ -163,6 +177,8 @@ namespace GlitchyEngine.Renderer.Text
public void LoadGlyphs(uint32 firstGlyph, uint32 charCount)
{
Debug.Profiler.ProfileResourceFunction!();
ExtendRange(firstGlyph, firstGlyph + charCount);
UpdateAtlas();
@@ -237,6 +253,8 @@ namespace GlitchyEngine.Renderer.Text
void ExtendRange(char32 firstChar, char32 rangeEnd)
{
Debug.Profiler.ProfileResourceFunction!();
// TODO: refactor
for(char32 char = firstChar; char < rangeEnd; char++)
@@ -266,6 +284,8 @@ namespace GlitchyEngine.Renderer.Text
void ExtendRange(uint32 firstGlyph, uint32 rangeEnd)
{
Debug.Profiler.ProfileResourceFunction!();
// TODO: refactor
for(uint32 glyphId = firstGlyph; glyphId < rangeEnd; glyphId++)
@@ -317,6 +337,8 @@ namespace GlitchyEngine.Renderer.Text
Int3 PrepareAtlas()
{
Debug.Profiler.ProfileResourceFunction!();
const uint32 maxRes = 16384; // D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION
const uint32 maxArray = 2048; // D3D11_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION
@@ -398,11 +420,15 @@ namespace GlitchyEngine.Renderer.Text
void DrawAtlas()
{
Debug.Profiler.ProfileResourceFunction!();
Int3 oldAtlasSize = _atlasSize;
_atlasSize = PrepareAtlas();
if(_atlasSize != oldAtlasSize)
{
Debug.Profiler.ProfileResourceScope!("Recreate Atlas");
var oldAtlas = _atlas;
Texture2DDesc desc;
@@ -444,20 +470,31 @@ namespace GlitchyEngine.Renderer.Text
bool Calculate(ref GlyphDescriptor desc)
{
Debug.Profiler.ProfileResourceFunction!();
// prepare shape
double advance = 0;
Shape shape;
if(!msdfgen.LoadGlyph(out shape, ref _face, desc.GlyphIndex, out advance) || !shape.Validate())
{
return false;
Debug.Profiler.ProfileResourceScope!("msdfgen.LoadGlyph");
if(!msdfgen.LoadGlyph(out shape, ref _face, desc.GlyphIndex, out advance) || !shape.Validate())
{
return false;
}
}
desc.Advance = (float)(advance * _geometryScaler);
//shape.OrientContours();
msdfgen.ResolveShapeGeometry(shape);
{
Debug.Profiler.ProfileResourceScope!("msdfgen.ResolveShapeGeometry");
msdfgen.ResolveShapeGeometry(shape);
}
shape.Normalize();
@@ -616,13 +653,20 @@ namespace GlitchyEngine.Renderer.Text
void GenerateMSDF(GlyphDescriptor desc)
{
Debug.Profiler.ProfileResourceFunction!();
// prepare shape
double advance = 0;
Shape shape;
msdfgen.LoadGlyph(out shape, ref _face, desc.GlyphIndex, out advance);
{
Debug.Profiler.ProfileResourceScope!("msdfgen.LoadGlyph");
msdfgen.LoadGlyph(out shape, ref _face, desc.GlyphIndex, out advance);
}
msdfgen.ResolveShapeGeometry(shape);
shape.Normalize();
@@ -646,6 +690,8 @@ namespace GlitchyEngine.Renderer.Text
using(Bitmap<ColorRGB, const 1> bitmap = .((.)bufferX, (.)bufferY))
{
Debug.Profiler.ProfileResourceScope!("GenerateMSDF");
MSDFGeneratorConfig config = .();
msdfgen.GenerateMSDF(*(Bitmap<float, const 3>*)&bitmap, shape, projection, _range, config);
@@ -20,6 +20,8 @@ namespace GlitchyEngine.Renderer.Text
internal static void Init()
{
Debug.Profiler.ProfileFunction!();
if(s_isInitialized)
return;
@@ -32,6 +34,8 @@ namespace GlitchyEngine.Renderer.Text
internal static void Deinit()
{
Debug.Profiler.ProfileFunction!();
_msdfEffect.ReleaseRef();
DeinitFreetype();
@@ -41,6 +45,8 @@ namespace GlitchyEngine.Renderer.Text
private static void InitFreetype()
{
Debug.Profiler.ProfileFunction!();
if(s_Library == null)
{
var res = FreeType.Init_FreeType(&s_Library);
@@ -50,6 +56,8 @@ namespace GlitchyEngine.Renderer.Text
private static void DeinitFreetype()
{
Debug.Profiler.ProfileFunction!();
FreeType.Done_FreeType(s_Library);
}
@@ -117,6 +125,8 @@ namespace GlitchyEngine.Renderer.Text
public static PreparedText PrepareText(Font font, String text, float fontSize, Color fontColor = .White, Color bitmapColor = .White, float lineSpaceScale = 1.0f, TextDirection direction = .LeftToRight)
{
Debug.Profiler.ProfileRendererFunction!();
if(text.IsWhiteSpace)
return .Empty;
@@ -152,6 +162,8 @@ namespace GlitchyEngine.Renderer.Text
void FlushShapeBuffer()
{
Debug.Profiler.ProfileRendererFunction!();
float fontScale = (float)fontSize / currentFont._fontSize;
hb_buffer_clear_contents(buf);
@@ -294,6 +306,8 @@ namespace GlitchyEngine.Renderer.Text
public static void DrawText(PreparedText text, float x, float y)
{
Debug.Profiler.ProfileRendererFunction!();
text.AddRef();
defer text.ReleaseRef();
@@ -396,6 +410,8 @@ namespace GlitchyEngine.Renderer.Text
*/
public static void DrawText(Font font, String text, float x, float y, float fontSize, Color fontColor = .White, Color bitmapColor = .White, float lineGapOffset = 0)
{
Debug.Profiler.ProfileRendererFunction!();
if(text.IsWhiteSpace)
return;