Split IGraphicsContext from IPlatformWindow.

This commit is contained in:
Paul Chote
2018-06-06 20:27:32 +00:00
parent ab14a86d39
commit 9ff177359b
12 changed files with 326 additions and 276 deletions

View File

@@ -523,7 +523,7 @@ namespace OpenRA
Bitmap bitmap;
using (new PerfTimer("Renderer.TakeScreenshot"))
bitmap = Renderer.Window.TakeScreenshot();
bitmap = Renderer.Context.TakeScreenshot();
ThreadPool.QueueUserWorkItem(_ =>
{

View File

@@ -27,7 +27,7 @@ namespace OpenRA.Graphics
public HardwarePalette()
{
Texture = Game.Renderer.Window.CreateTexture();
Texture = Game.Renderer.Context.CreateTexture();
readOnlyModifiablePalettes = modifiablePalettes.AsReadOnly();
}

View File

@@ -300,14 +300,14 @@ namespace OpenRA.Graphics
Game.Renderer.Flush();
fbo.Bind();
Game.Renderer.Window.EnableDepthBuffer();
Game.Renderer.Context.EnableDepthBuffer();
return fbo;
}
void DisableFrameBuffer(IFrameBuffer fbo)
{
Game.Renderer.Flush();
Game.Renderer.Window.DisableDepthBuffer();
Game.Renderer.Context.DisableDepthBuffer();
fbo.Unbind();
}
@@ -356,7 +356,7 @@ namespace OpenRA.Graphics
}
var size = new Size(renderer.SheetSize, renderer.SheetSize);
var framebuffer = renderer.Window.CreateFrameBuffer(size);
var framebuffer = renderer.Context.CreateFrameBuffer(size);
var sheet = new Sheet(SheetType.BGRA, framebuffer.Texture);
mappedBuffers.Add(sheet, framebuffer);

View File

@@ -36,39 +36,40 @@ namespace OpenRA
public interface IPlatformWindow : IDisposable
{
IVertexBuffer<Vertex> CreateVertexBuffer(int length);
ITexture CreateTexture(Bitmap bitmap);
ITexture CreateTexture();
IFrameBuffer CreateFrameBuffer(Size s);
IShader CreateShader(string name);
IGraphicsContext Context { get; }
Size WindowSize { get; }
float WindowScale { get; }
event Action<float, float> OnWindowScaleChanged;
void Clear();
void Present();
Bitmap TakeScreenshot();
void PumpInput(IInputHandler inputHandler);
string GetClipboardText();
bool SetClipboardText(string text);
void DrawPrimitives(PrimitiveType type, int firstVertex, int numVertices);
void EnableScissor(int left, int top, int width, int height);
void DisableScissor();
void EnableDepthBuffer();
void DisableDepthBuffer();
void ClearDepthBuffer();
void SetBlendMode(BlendMode mode);
void GrabWindowMouseFocus();
void ReleaseWindowMouseFocus();
IHardwareCursor CreateHardwareCursor(string name, Size size, byte[] data, int2 hotspot);
void SetHardwareCursor(IHardwareCursor cursor);
}
public interface IGraphicsContext : IDisposable
{
IVertexBuffer<Vertex> CreateVertexBuffer(int size);
ITexture CreateTexture();
ITexture CreateTexture(Bitmap bitmap);
IFrameBuffer CreateFrameBuffer(Size s);
IShader CreateShader(string name);
void EnableScissor(int left, int top, int width, int height);
void DisableScissor();
Bitmap TakeScreenshot();
void Present();
void DrawPrimitives(PrimitiveType pt, int firstVertex, int numVertices);
void Clear();
void EnableDepthBuffer();
void DisableDepthBuffer();
void ClearDepthBuffer();
void SetBlendMode(BlendMode mode);
string GLVersion { get; }
}

View File

@@ -66,7 +66,7 @@ namespace OpenRA.Graphics
{
if (texture == null)
{
texture = Game.Renderer.Window.CreateTexture();
texture = Game.Renderer.Context.CreateTexture();
dirty = true;
}

View File

@@ -43,10 +43,10 @@ namespace OpenRA.Graphics
sheets[i] = null;
}
renderer.Window.SetBlendMode(currentBlend);
renderer.Context.SetBlendMode(currentBlend);
shader.PrepareRender();
renderer.DrawBatch(vertices, nv, PrimitiveType.TriangleList);
renderer.Window.SetBlendMode(BlendMode.None);
renderer.Context.SetBlendMode(BlendMode.None);
nv = 0;
ns = 0;
@@ -131,10 +131,10 @@ namespace OpenRA.Graphics
public void DrawVertexBuffer(IVertexBuffer<Vertex> buffer, int start, int length, PrimitiveType type, Sheet sheet, BlendMode blendMode)
{
shader.SetTexture("Texture0", sheet.GetTexture());
renderer.Window.SetBlendMode(blendMode);
renderer.Context.SetBlendMode(blendMode);
shader.PrepareRender();
renderer.DrawBatch(buffer, start, length, type);
renderer.Window.SetBlendMode(BlendMode.None);
renderer.Context.SetBlendMode(BlendMode.None);
}
// For RGBAColorRenderer

View File

@@ -46,7 +46,7 @@ namespace OpenRA.Graphics
rowStride = 6 * map.MapSize.X;
vertices = new Vertex[rowStride * map.MapSize.Y];
vertexBuffer = Game.Renderer.Window.CreateVertexBuffer(vertices.Length);
vertexBuffer = Game.Renderer.Context.CreateVertexBuffer(vertices.Length);
emptySprite = new Sprite(sheet, Rectangle.Empty, TextureChannel.Alpha);
wr.PaletteInvalidated += UpdatePaletteIndices;

View File

@@ -179,7 +179,7 @@ namespace OpenRA.Graphics
Game.Renderer.EnableScissor(bounds);
if (enableDepthBuffer)
Game.Renderer.Window.EnableDepthBuffer();
Game.Renderer.Context.EnableDepthBuffer();
terrainRenderer.Draw(this, Viewport);
Game.Renderer.Flush();
@@ -203,7 +203,7 @@ namespace OpenRA.Graphics
a.Trait.RenderShroud(renderShroud, this);
if (enableDepthBuffer)
Game.Renderer.Window.DisableDepthBuffer();
Game.Renderer.Context.DisableDepthBuffer();
Game.Renderer.DisableScissor();

View File

@@ -30,6 +30,8 @@ namespace OpenRA
public IReadOnlyDictionary<string, SpriteFont> Fonts;
internal IPlatformWindow Window { get; private set; }
internal IGraphicsContext Context { get; private set; }
internal int SheetSize { get; private set; }
internal int TempBufferSize { get; private set; }
@@ -52,19 +54,20 @@ namespace OpenRA
var resolution = GetResolution(graphicSettings);
Window = platform.CreateWindow(new Size(resolution.Width, resolution.Height), graphicSettings.Mode);
Context = Window.Context;
TempBufferSize = graphicSettings.BatchSize;
SheetSize = graphicSettings.SheetSize;
WorldSpriteRenderer = new SpriteRenderer(this, Window.CreateShader("combined"));
WorldSpriteRenderer = new SpriteRenderer(this, Context.CreateShader("combined"));
WorldRgbaSpriteRenderer = new RgbaSpriteRenderer(WorldSpriteRenderer);
WorldRgbaColorRenderer = new RgbaColorRenderer(WorldSpriteRenderer);
WorldModelRenderer = new ModelRenderer(this, Window.CreateShader("model"));
SpriteRenderer = new SpriteRenderer(this, Window.CreateShader("combined"));
WorldModelRenderer = new ModelRenderer(this, Context.CreateShader("model"));
SpriteRenderer = new SpriteRenderer(this, Context.CreateShader("combined"));
RgbaSpriteRenderer = new RgbaSpriteRenderer(SpriteRenderer);
RgbaColorRenderer = new RgbaColorRenderer(SpriteRenderer);
tempBuffer = Window.CreateVertexBuffer(TempBufferSize);
tempBuffer = Context.CreateVertexBuffer(TempBufferSize);
}
static Size GetResolution(GraphicSettings graphicsSettings)
@@ -113,7 +116,7 @@ namespace OpenRA
public void BeginFrame(int2 scroll, float zoom)
{
Window.Clear();
Context.Clear();
SetViewportParams(scroll, zoom);
}
@@ -154,7 +157,7 @@ namespace OpenRA
{
Flush();
Window.PumpInput(inputHandler);
Window.Present();
Context.Present();
}
public void DrawBatch(Vertex[] vertices, int numVertices, PrimitiveType type)
@@ -168,7 +171,7 @@ namespace OpenRA
where T : struct
{
vertices.Bind();
Window.DrawPrimitives(type, firstVertex, numVertices);
Context.DrawPrimitives(type, firstVertex, numVertices);
PerfHistory.Increment("batches", 1);
}
@@ -201,7 +204,7 @@ namespace OpenRA
public IVertexBuffer<Vertex> CreateVertexBuffer(int length)
{
return Window.CreateVertexBuffer(length);
return Context.CreateVertexBuffer(length);
}
public void EnableScissor(Rectangle rect)
@@ -211,7 +214,7 @@ namespace OpenRA
rect.Intersect(scissorState.Peek());
Flush();
Window.EnableScissor(rect.Left, rect.Top, rect.Width, rect.Height);
Context.EnableScissor(rect.Left, rect.Top, rect.Width, rect.Height);
scissorState.Push(rect);
}
@@ -224,28 +227,28 @@ namespace OpenRA
if (scissorState.Any())
{
var rect = scissorState.Peek();
Window.EnableScissor(rect.Left, rect.Top, rect.Width, rect.Height);
Context.EnableScissor(rect.Left, rect.Top, rect.Width, rect.Height);
}
else
Window.DisableScissor();
Context.DisableScissor();
}
public void EnableDepthBuffer()
{
Flush();
Window.EnableDepthBuffer();
Context.EnableDepthBuffer();
}
public void DisableDepthBuffer()
{
Flush();
Window.DisableDepthBuffer();
Context.DisableDepthBuffer();
}
public void ClearDepthBuffer()
{
Flush();
Window.ClearDepthBuffer();
Context.ClearDepthBuffer();
}
public void GrabWindowMouseFocus()
@@ -282,7 +285,7 @@ namespace OpenRA
public string GLVersion
{
get { return Window.GLVersion; }
get { return Context.GLVersion; }
}
}
}