Uses CDeviceCommandContext as an input parameter for CCanvas2D.

This was SVN commit r26480.
This commit is contained in:
Vladislav Belov 2022-02-25 08:14:11 +00:00
parent d1f1d41a9f
commit 8a63adc40d
20 changed files with 103 additions and 88 deletions

View File

@ -27,7 +27,6 @@
#include "maths/Rect.h" #include "maths/Rect.h"
#include "maths/Vector2D.h" #include "maths/Vector2D.h"
#include "ps/CStrInternStatic.h" #include "ps/CStrInternStatic.h"
#include "renderer/backend/gl/DeviceCommandContext.h"
#include "renderer/Renderer.h" #include "renderer/Renderer.h"
#include <array> #include <array>
@ -69,9 +68,8 @@ inline void DrawTextureImpl(
class CCanvas2D::Impl class CCanvas2D::Impl
{ {
public: public:
Impl() Impl(Renderer::Backend::GL::CDeviceCommandContext* deviceCommandContext)
// TODO: remove global renderer access as pass as an argument. : DeviceCommandContext(deviceCommandContext)
: DeviceCommandContext(g_Renderer.GetDeviceCommandContext())
{ {
} }
@ -103,7 +101,9 @@ public:
CShaderTechniquePtr Tech; CShaderTechniquePtr Tech;
}; };
CCanvas2D::CCanvas2D() : m(std::make_unique<Impl>()) CCanvas2D::CCanvas2D(
Renderer::Backend::GL::CDeviceCommandContext* deviceCommandContext)
: m(std::make_unique<Impl>(deviceCommandContext))
{ {
} }
@ -319,7 +319,7 @@ void CCanvas2D::DrawText(CTextRenderer& textRenderer)
{ {
m->BindTechIfNeeded(); m->BindTechIfNeeded();
CShaderProgramPtr shader = m->Tech->GetShader(); const CShaderProgramPtr& shader = m->Tech->GetShader();
shader->Uniform(str_grayscaleFactor, 0.0f); shader->Uniform(str_grayscaleFactor, 0.0f);
textRenderer.Render(m->DeviceCommandContext, shader, GetDefaultGuiMatrix()); textRenderer.Render(m->DeviceCommandContext, shader, GetDefaultGuiMatrix());

View File

@ -20,6 +20,7 @@
#include "graphics/Texture.h" #include "graphics/Texture.h"
#include "maths/Vector2D.h" #include "maths/Vector2D.h"
#include "renderer/backend/gl/DeviceCommandContext.h"
#include <memory> #include <memory>
#include <vector> #include <vector>
@ -34,7 +35,7 @@ struct CColor;
class CCanvas2D class CCanvas2D
{ {
public: public:
CCanvas2D(); CCanvas2D(Renderer::Backend::GL::CDeviceCommandContext* deviceCommandContext);
~CCanvas2D(); ~CCanvas2D();
CCanvas2D(const CCanvas2D&) = delete; CCanvas2D(const CCanvas2D&) = delete;

View File

@ -225,6 +225,8 @@ void CTextRenderer::Render(
++it; ++it;
} }
bool transformChanged = false;
CTexture* lastTexture = nullptr; CTexture* lastTexture = nullptr;
for (std::list<SBatch>::iterator it = m_Batches.begin(); it != m_Batches.end(); ++it) for (std::list<SBatch>::iterator it = m_Batches.begin(); it != m_Batches.end(); ++it)
{ {
@ -239,9 +241,13 @@ void CTextRenderer::Render(
shader->BindTexture(str_tex, lastTexture->GetBackendTexture()); shader->BindTexture(str_tex, lastTexture->GetBackendTexture());
} }
CMatrix3D translation; if (batch.translate.X != 0.0f || batch.translate.Y != 0.0f)
translation.SetTranslation(batch.translate.X, batch.translate.Y, 0.0f); {
shader->Uniform(str_transform, transform * translation); CMatrix3D translation;
translation.SetTranslation(batch.translate.X, batch.translate.Y, 0.0f);
shader->Uniform(str_transform, transform * translation);
transformChanged = true;
}
// ALPHA-only textures will have .rgb sampled as 0, so we need to // ALPHA-only textures will have .rgb sampled as 0, so we need to
// replace it with white (but not affect RGBA textures) // replace it with white (but not affect RGBA textures)
@ -320,4 +326,7 @@ void CTextRenderer::Render(
} }
m_Batches.clear(); m_Batches.clear();
if (transformChanged)
shader->Uniform(str_transform, transform);
} }

View File

@ -325,7 +325,7 @@ void CGUI::SendEventToAll(const CStr& eventName, const JS::HandleValueArray& par
object->ScriptEvent(eventName, paramData); object->ScriptEvent(eventName, paramData);
} }
void CGUI::Draw() void CGUI::Draw(CCanvas2D& canvas)
{ {
using Arena = Allocators::DynamicArena<128 * KiB>; using Arena = Allocators::DynamicArena<128 * KiB>;
using ObjectListAllocator = ProxyAllocator<VisibleObject, Arena>; using ObjectListAllocator = ProxyAllocator<VisibleObject, Arena>;
@ -342,7 +342,6 @@ void CGUI::Draw()
return visibleObject1.index < visibleObject2.index; return visibleObject1.index < visibleObject2.index;
}); });
CCanvas2D canvas;
for (const VisibleObject& visibleObject : visibleObjects) for (const VisibleObject& visibleObject : visibleObjects)
visibleObject.object->Draw(canvas); visibleObject.object->Draw(canvas);
} }

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2021 Wildfire Games. /* Copyright (C) 2022 Wildfire Games.
* This file is part of 0 A.D. * This file is part of 0 A.D.
* *
* 0 A.D. is free software: you can redistribute it and/or modify * 0 A.D. is free software: you can redistribute it and/or modify
@ -97,7 +97,7 @@ public:
/** /**
* Displays the whole GUI * Displays the whole GUI
*/ */
void Draw(); void Draw(CCanvas2D& canvas);
/** /**
* Draw GUI Sprite * Draw GUI Sprite

View File

@ -372,12 +372,12 @@ void CGUIManager::TickObjects()
p.gui->TickObjects(); p.gui->TickObjects();
} }
void CGUIManager::Draw() const void CGUIManager::Draw(CCanvas2D& canvas) const
{ {
PROFILE3_GPU("gui"); PROFILE3_GPU("gui");
for (const SGUIPage& p : m_PageStack) for (const SGUIPage& p : m_PageStack)
p.gui->Draw(); p.gui->Draw(canvas);
} }
void CGUIManager::UpdateResolution() void CGUIManager::UpdateResolution()

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2021 Wildfire Games. /* Copyright (C) 2022 Wildfire Games.
* This file is part of 0 A.D. * This file is part of 0 A.D.
* *
* 0 A.D. is free software: you can redistribute it and/or modify * 0 A.D. is free software: you can redistribute it and/or modify
@ -28,6 +28,7 @@
#include <string> #include <string>
#include <unordered_set> #include <unordered_set>
class CCanvas2D;
class CGUI; class CGUI;
/** /**
@ -106,7 +107,7 @@ public:
/** /**
* See CGUI::Draw; applies to @em all loaded pages. * See CGUI::Draw; applies to @em all loaded pages.
*/ */
void Draw() const; void Draw(CCanvas2D& canvas) const;
/** /**
* See CGUI::UpdateResolution; applies to @em all loaded pages. * See CGUI::UpdateResolution; applies to @em all loaded pages.

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2021 Wildfire Games. /* Copyright (C) 2022 Wildfire Games.
* This file is part of 0 A.D. * This file is part of 0 A.D.
* *
* 0 A.D. is free software: you can redistribute it and/or modify * 0 A.D. is free software: you can redistribute it and/or modify
@ -190,15 +190,13 @@ void CConsole::Update(const float deltaRealTime)
} }
} }
void CConsole::Render() void CConsole::Render(CCanvas2D& canvas)
{ {
if (!(m_Visible || m_Toggle)) if (!(m_Visible || m_Toggle))
return; return;
PROFILE3_GPU("console"); PROFILE3_GPU("console");
CCanvas2D canvas;
DrawWindow(canvas); DrawWindow(canvas);
CTextRenderer textRenderer; CTextRenderer textRenderer;

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2021 Wildfire Games. /* Copyright (C) 2022 Wildfire Games.
* This file is part of 0 A.D. * This file is part of 0 A.D.
* *
* 0 A.D. is free software: you can redistribute it and/or modify * 0 A.D. is free software: you can redistribute it and/or modify
@ -60,7 +60,7 @@ public:
*/ */
void Update(const float deltaRealTime); void Update(const float deltaRealTime);
void Render(); void Render(CCanvas2D& canvas);
void InsertChar(const int szChar, const wchar_t cooked); void InsertChar(const int szChar, const wchar_t cooked);

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2021 Wildfire Games. /* Copyright (C) 2022 Wildfire Games.
* This file is part of 0 A.D. * This file is part of 0 A.D.
* *
* 0 A.D. is free software: you can redistribute it and/or modify * 0 A.D. is free software: you can redistribute it and/or modify
@ -203,7 +203,7 @@ void CLogger::WriteWarning(const char* message)
PushRenderMessage(Warning, message); PushRenderMessage(Warning, message);
} }
void CLogger::Render() void CLogger::Render(CCanvas2D& canvas)
{ {
PROFILE3_GPU("logger"); PROFILE3_GPU("logger");
@ -255,7 +255,6 @@ void CLogger::Render()
textRenderer.Translate(0.0f, (float)lineSpacing); textRenderer.Translate(0.0f, (float)lineSpacing);
} }
CCanvas2D canvas;
canvas.DrawText(textRenderer); canvas.DrawText(textRenderer);
} }

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2021 Wildfire Games. /* Copyright (C) 2022 Wildfire Games.
* This file is part of 0 A.D. * This file is part of 0 A.D.
* *
* 0 A.D. is free software: you can redistribute it and/or modify * 0 A.D. is free software: you can redistribute it and/or modify
@ -19,11 +19,12 @@
#define INCLUDED_CLOGGER #define INCLUDED_CLOGGER
#include <deque> #include <deque>
#include <fmt/printf.h>
#include <mutex> #include <mutex>
#include <string> #include <string>
#include <sstream> #include <sstream>
#include <fmt/printf.h> class CCanvas2D;
class CLogger; class CLogger;
extern CLogger* g_Logger; extern CLogger* g_Logger;
@ -69,7 +70,7 @@ public:
void WriteWarning(const char* message); void WriteWarning(const char* message);
// Render recent log messages onto the screen // Render recent log messages onto the screen
void Render(); void Render(CCanvas2D& canvas);
private: private:
void Init(); void Init();

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2021 Wildfire Games. /* Copyright (C) 2022 Wildfire Games.
* This file is part of 0 A.D. * This file is part of 0 A.D.
* *
* 0 A.D. is free software: you can redistribute it and/or modify * 0 A.D. is free software: you can redistribute it and/or modify
@ -15,11 +15,6 @@
* along with 0 A.D. If not, see <http://www.gnu.org/licenses/>. * along with 0 A.D. If not, see <http://www.gnu.org/licenses/>.
*/ */
/*
* Implementation of profile display (containing only display routines,
* the data model(s) are implemented elsewhere).
*/
#include "precompiled.h" #include "precompiled.h"
#include "ProfileViewer.h" #include "ProfileViewer.h"
@ -40,8 +35,8 @@
#include "scriptinterface/Object.h" #include "scriptinterface/Object.h"
#include <algorithm> #include <algorithm>
#include <fstream>
#include <ctime> #include <ctime>
#include <fstream>
struct CProfileViewerInternals struct CProfileViewerInternals
{ {
@ -149,7 +144,7 @@ CProfileViewer::~CProfileViewer()
// Render // Render
void CProfileViewer::RenderProfile() void CProfileViewer::RenderProfile(CCanvas2D& canvas)
{ {
if (!m->profileVisible) if (!m->profileVisible)
return; return;
@ -170,8 +165,6 @@ void CProfileViewer::RenderProfile()
CFontMetrics font(font_name); CFontMetrics font(font_name);
int lineSpacing = font.GetLineSpacing(); int lineSpacing = font.GetLineSpacing();
CCanvas2D canvas;
// Render background. // Render background.
float estimateWidth = 50.0f; float estimateWidth = 50.0f;
for (const ProfileColumn& column : columns) for (const ProfileColumn& column : columns)

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2021 Wildfire Games. /* Copyright (C) 2022 Wildfire Games.
* This file is part of 0 A.D. * This file is part of 0 A.D.
* *
* 0 A.D. is free software: you can redistribute it and/or modify * 0 A.D. is free software: you can redistribute it and/or modify
@ -28,6 +28,8 @@
#include <vector> #include <vector>
class CCanvas2D;
/** /**
* Struct ProfileColumn: Describes one column of an AbstractProfileTable. * Struct ProfileColumn: Describes one column of an AbstractProfileTable.
*/ */
@ -138,7 +140,7 @@ public:
* RenderProfile: Render the profile display using OpenGL if the user * RenderProfile: Render the profile display using OpenGL if the user
* has enabled it. * has enabled it.
*/ */
void RenderProfile(); void RenderProfile(CCanvas2D& canvas);
/** /**
* Input: Filter and handle any input events that the profile display * Input: Filter and handle any input events that the profile display

View File

@ -466,8 +466,6 @@ void CRenderer::RenderFrameImpl(const bool renderGUI, const bool renderLogger)
m->deviceCommandContext->SetFramebuffer( m->deviceCommandContext->SetFramebuffer(
m->deviceCommandContext->GetDevice()->GetCurrentBackbuffer()); m->deviceCommandContext->GetDevice()->GetCurrentBackbuffer());
m->sceneRenderer.RenderTextOverlays();
// If we're in Atlas game view, render special tools // If we're in Atlas game view, render special tools
if (g_AtlasGameLoop && g_AtlasGameLoop->view) if (g_AtlasGameLoop && g_AtlasGameLoop->view)
{ {
@ -481,42 +479,7 @@ void CRenderer::RenderFrameImpl(const bool renderGUI, const bool renderLogger)
ogl_WarnIfError(); ogl_WarnIfError();
} }
if (renderGUI) RenderFrame2D(renderGUI, renderLogger);
{
GPU_SCOPED_LABEL(m->deviceCommandContext.get(), "Render GUI");
// All GUI elements are drawn in Z order to render semi-transparent
// objects correctly.
g_GUI->Draw();
ogl_WarnIfError();
}
// If we're in Atlas game view, render special overlays (e.g. editor bandbox).
if (g_AtlasGameLoop && g_AtlasGameLoop->view)
{
CCanvas2D canvas;
g_AtlasGameLoop->view->DrawOverlays(canvas);
ogl_WarnIfError();
}
{
GPU_SCOPED_LABEL(m->deviceCommandContext.get(), "Render console");
g_Console->Render();
ogl_WarnIfError();
}
if (renderLogger)
{
GPU_SCOPED_LABEL(m->deviceCommandContext.get(), "Render logger");
g_Logger->Render();
ogl_WarnIfError();
}
{
GPU_SCOPED_LABEL(m->deviceCommandContext.get(), "Render profiler");
// Profile information
g_ProfileViewer.RenderProfile();
ogl_WarnIfError();
}
EndFrame(); EndFrame();
@ -535,6 +498,49 @@ void CRenderer::RenderFrameImpl(const bool renderGUI, const bool renderLogger)
ogl_WarnIfError(); ogl_WarnIfError();
} }
void CRenderer::RenderFrame2D(const bool renderGUI, const bool renderLogger)
{
CCanvas2D canvas(m->deviceCommandContext.get());
m->sceneRenderer.RenderTextOverlays(canvas);
if (renderGUI)
{
GPU_SCOPED_LABEL(m->deviceCommandContext.get(), "Render GUI");
// All GUI elements are drawn in Z order to render semi-transparent
// objects correctly.
g_GUI->Draw(canvas);
ogl_WarnIfError();
}
// If we're in Atlas game view, render special overlays (e.g. editor bandbox).
if (g_AtlasGameLoop && g_AtlasGameLoop->view)
{
g_AtlasGameLoop->view->DrawOverlays(canvas);
ogl_WarnIfError();
}
{
GPU_SCOPED_LABEL(m->deviceCommandContext.get(), "Render console");
g_Console->Render(canvas);
ogl_WarnIfError();
}
if (renderLogger)
{
GPU_SCOPED_LABEL(m->deviceCommandContext.get(), "Render logger");
g_Logger->Render(canvas);
ogl_WarnIfError();
}
{
GPU_SCOPED_LABEL(m->deviceCommandContext.get(), "Render profiler");
// Profile information
g_ProfileViewer.RenderProfile(canvas);
ogl_WarnIfError();
}
}
void CRenderer::RenderScreenShot() void CRenderer::RenderScreenShot()
{ {
m_ScreenShotType = ScreenShotType::NONE; m_ScreenShotType = ScreenShotType::NONE;

View File

@ -149,6 +149,7 @@ protected:
bool ShouldRender() const; bool ShouldRender() const;
void RenderFrameImpl(const bool renderGUI, const bool renderLogger); void RenderFrameImpl(const bool renderGUI, const bool renderLogger);
void RenderFrame2D(const bool renderGUI, const bool renderLogger);
void RenderScreenShot(); void RenderScreenShot();
void RenderBigScreenShot(const bool needsPresent); void RenderBigScreenShot(const bool needsPresent);

View File

@ -1025,12 +1025,12 @@ void CSceneRenderer::DisplayFrustum()
} }
// Text overlay rendering // Text overlay rendering
void CSceneRenderer::RenderTextOverlays() void CSceneRenderer::RenderTextOverlays(CCanvas2D& canvas)
{ {
PROFILE3_GPU("text overlays"); PROFILE3_GPU("text overlays");
if (m_DisplayTerrainPriorities) if (m_DisplayTerrainPriorities)
m->terrainRenderer.RenderPriorities(CULL_DEFAULT); m->terrainRenderer.RenderPriorities(canvas, CULL_DEFAULT);
ogl_WarnIfError(); ogl_WarnIfError();
} }

View File

@ -28,6 +28,7 @@
#include <memory> #include <memory>
class CCanvas2D;
class CLightEnv; class CLightEnv;
class CMaterial; class CMaterial;
class CMaterialManager; class CMaterialManager;
@ -109,7 +110,7 @@ public:
* Assumes the caller has set up the GL environment for orthographic rendering * Assumes the caller has set up the GL environment for orthographic rendering
* with texturing and blending. * with texturing and blending.
*/ */
void RenderTextOverlays(); void RenderTextOverlays(CCanvas2D& canvas);
// set the current lighting environment; (note: the passed pointer is just copied to a variable within the renderer, // set the current lighting environment; (note: the passed pointer is just copied to a variable within the renderer,
// so the lightenv passed must be scoped such that it is not destructed until after the renderer is no longer rendering) // so the lightenv passed must be scoped such that it is not destructed until after the renderer is no longer rendering)

View File

@ -612,13 +612,12 @@ void TerrainRenderer::RenderWaterFoamOccluders(
deviceCommandContext->GetDevice()->GetCurrentBackbuffer()); deviceCommandContext->GetDevice()->GetCurrentBackbuffer());
} }
void TerrainRenderer::RenderPriorities(int cullGroup) void TerrainRenderer::RenderPriorities(CCanvas2D& canvas, int cullGroup)
{ {
PROFILE("priorities"); PROFILE("priorities");
ENSURE(m->phase == Phase_Render); ENSURE(m->phase == Phase_Render);
CCanvas2D canvas;
CTextRenderer textRenderer; CTextRenderer textRenderer;
textRenderer.SetCurrentFont(CStrIntern("mono-stroke-10")); textRenderer.SetCurrentFont(CStrIntern("mono-stroke-10"));
textRenderer.SetCurrentColor(CColor(1.0f, 1.0f, 0.0f, 1.0f)); textRenderer.SetCurrentColor(CColor(1.0f, 1.0f, 0.0f, 1.0f));

View File

@ -29,6 +29,7 @@
#include "renderer/backend/gl/Texture.h" #include "renderer/backend/gl/Texture.h"
class CCamera; class CCamera;
class CCanvas2D;
class CMatrix3D; class CMatrix3D;
class CModelDecal; class CModelDecal;
class CPatch; class CPatch;
@ -154,7 +155,7 @@ public:
/** /**
* Render priority text for all submitted patches, for debugging. * Render priority text for all submitted patches, for debugging.
*/ */
void RenderPriorities(int cullGroup); void RenderPriorities(CCanvas2D& canvas, int cullGroup);
/** /**
* Render texture unit 0 over the terrain mesh, with UV coords calculated * Render texture unit 0 over the terrain mesh, with UV coords calculated

View File

@ -21,6 +21,7 @@
#include "View.h" #include "View.h"
#include "graphics/Canvas2D.h"
#include "graphics/ColladaManager.h" #include "graphics/ColladaManager.h"
#include "graphics/LOSTexture.h" #include "graphics/LOSTexture.h"
#include "graphics/MiniMapTexture.h" #include "graphics/MiniMapTexture.h"
@ -524,8 +525,11 @@ void ActorViewer::Render()
g_Renderer.GetSceneRenderer().RenderScene(g_Renderer.GetDeviceCommandContext(), m); g_Renderer.GetSceneRenderer().RenderScene(g_Renderer.GetDeviceCommandContext(), m);
g_Logger->Render(); {
g_ProfileViewer.RenderProfile(); CCanvas2D canvas(g_Renderer.GetDeviceCommandContext());
g_Logger->Render(canvas);
g_ProfileViewer.RenderProfile(canvas);
}
g_Renderer.EndFrame(); g_Renderer.EndFrame();