Skip to content

Commit

Permalink
Merge pull request #5508 from Tom94/larger-texture-atlas
Browse files Browse the repository at this point in the history
Implement custom mip map generation & raise maximum texture atlas size to 4096x4096
  • Loading branch information
peppy authored Apr 17, 2023
2 parents 300b8d7 + eb2aea7 commit a7aacf8
Show file tree
Hide file tree
Showing 28 changed files with 657 additions and 164 deletions.
2 changes: 1 addition & 1 deletion osu.Framework.Tests/Visual/Sprites/TestSceneSpriteIcon.cs
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ public void TestOneIconAtATime()

if (++i > icons.Length - 1)
scheduledDelegate?.Cancel();
}, 50, true);
}, 5, true);
});
}

Expand Down
Binary file not shown.
Binary file not shown.
23 changes: 22 additions & 1 deletion osu.Framework/Graphics/OpenGL/Buffers/GLFrameBuffer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ internal class GLFrameBuffer : IFrameBuffer

public readonly int FrameBuffer;

private readonly bool externalTexture;

public GLFrameBuffer(GLRenderer renderer, RenderbufferInternalFormat[]? renderBufferFormats = null, All filteringMode = All.Linear)
{
this.renderer = renderer;
Expand All @@ -45,6 +47,23 @@ public GLFrameBuffer(GLRenderer renderer, RenderbufferInternalFormat[]? renderBu
renderer.UnbindFrameBuffer(this);
}

public GLFrameBuffer(GLRenderer renderer, GLTexture glTexture, int level = 0)
{
this.renderer = renderer;
this.glTexture = glTexture;

FrameBuffer = GL.GenFramebuffer();
Texture = renderer.CreateTexture(glTexture);

externalTexture = true;

renderer.BindFrameBuffer(this);

GL.FramebufferTexture2D(FramebufferTarget.Framebuffer, FramebufferAttachment.ColorAttachment0, TextureTarget2d.Texture2D, glTexture.TextureId, level);

renderer.UnbindFrameBuffer(this);
}

private Vector2 size = Vector2.One;

/// <summary>
Expand Down Expand Up @@ -113,7 +132,9 @@ protected virtual void Dispose(bool disposing)
if (isDisposed)
return;

glTexture.Dispose();
if (!externalTexture)
glTexture.Dispose();

renderer.DeleteFrameBuffer(this);

foreach (var buffer in attachedRenderBuffers)
Expand Down
7 changes: 4 additions & 3 deletions osu.Framework/Graphics/OpenGL/GLRenderer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
using osu.Framework.Statistics;
using osuTK;
using osuTK.Graphics.ES30;
using osuTK.Graphics;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Memory;
using SixLabors.ImageSharp.PixelFormats;
Expand Down Expand Up @@ -354,7 +355,7 @@ protected internal override Image<Rgba32> TakeScreenshot()
return image;
}

protected override IShaderPart CreateShaderPart(ShaderManager manager, string name, byte[]? rawData, ShaderPartType partType)
protected override IShaderPart CreateShaderPart(IShaderStore store, string name, byte[]? rawData, ShaderPartType partType)
{
ShaderType glType;

Expand All @@ -372,7 +373,7 @@ protected override IShaderPart CreateShaderPart(ShaderManager manager, string na
throw new ArgumentException($"Unsupported shader part type: {partType}", nameof(partType));
}

return new GLShaderPart(this, name, rawData, glType, manager);
return new GLShaderPart(this, name, rawData, glType, store);
}

protected override IShader CreateShader(string name, IShaderPart[] parts, IUniformBuffer<GlobalUniformData> globalUniformBuffer)
Expand Down Expand Up @@ -433,7 +434,7 @@ public override IFrameBuffer CreateFrameBuffer(RenderBufferFormat[]? renderBuffe
protected override IUniformBuffer<TData> CreateUniformBuffer<TData>() => new GLUniformBuffer<TData>(this);

protected override INativeTexture CreateNativeTexture(int width, int height, bool manualMipmaps = false, TextureFilteringMode filteringMode = TextureFilteringMode.Linear,
Rgba32 initialisationColour = default)
Color4 initialisationColour = default)
{
All glFilteringMode;

Expand Down
14 changes: 7 additions & 7 deletions osu.Framework/Graphics/OpenGL/Shaders/GLShaderPart.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,14 +27,14 @@ internal class GLShaderPart : IShaderPart

private readonly IRenderer renderer;
private readonly List<string> shaderCodes = new List<string>();
private readonly ShaderManager manager;
private readonly IShaderStore store;

private int partID = -1;

public GLShaderPart(IRenderer renderer, string name, byte[] data, ShaderType type, ShaderManager manager)
public GLShaderPart(IRenderer renderer, string name, byte[] data, ShaderType type, IShaderStore store)
{
this.renderer = renderer;
this.manager = manager;
this.store = store;

Name = name;
Type = type;
Expand Down Expand Up @@ -105,21 +105,21 @@ private string loadFile(byte[] bytes, bool mainFile)
// if (File.Exists(includeName))
// rawData = File.ReadAllBytes(includeName);
//#endif
code += loadFile(manager.LoadRaw(includeName), false) + '\n';
code += loadFile(store.LoadRaw(includeName), false) + '\n';
}
else
code += line + '\n';
}

if (mainFile)
{
string internalIncludes = loadFile(manager.LoadRaw("Internal/sh_Compatibility.h"), false) + "\n";
internalIncludes += loadFile(manager.LoadRaw("Internal/sh_GlobalUniforms.h"), false) + "\n";
string internalIncludes = loadFile(store.LoadRaw("Internal/sh_Compatibility.h"), false) + "\n";
internalIncludes += loadFile(store.LoadRaw("Internal/sh_GlobalUniforms.h"), false) + "\n";
code = internalIncludes + code;

if (Type == ShaderType.VertexShader)
{
string backbufferCode = loadFile(manager.LoadRaw("Internal/sh_Vertex_Output.h"), false);
string backbufferCode = loadFile(store.LoadRaw("Internal/sh_Vertex_Output.h"), false);

if (!string.IsNullOrEmpty(backbufferCode))
{
Expand Down
Loading

0 comments on commit a7aacf8

Please sign in to comment.