From 60e129d88e63e79bbe8ef22ed9d3b92526bb88bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Tue, 23 Aug 2022 10:35:58 +0200 Subject: [PATCH] Break out Draw2D in a class --- GPU/Common/Draw2D.cpp | 33 +++++++++++++++++++------ GPU/Common/Draw2D.h | 21 ++++++++++++++++ GPU/Common/FramebufferManagerCommon.cpp | 13 +++++----- GPU/Common/FramebufferManagerCommon.h | 11 +++------ GPU/Common/ReinterpretFramebuffer.cpp | 2 +- 5 files changed, 57 insertions(+), 23 deletions(-) diff --git a/GPU/Common/Draw2D.cpp b/GPU/Common/Draw2D.cpp index 78086bd682..f9e7b13d7f 100644 --- a/GPU/Common/Draw2D.cpp +++ b/GPU/Common/Draw2D.cpp @@ -133,7 +133,24 @@ void GenerateDraw2DVS(ShaderWriter &writer) { writer.EndVSMain(varyings); } -void FramebufferManagerCommon::Ensure2DResources() { +template +static void DoRelease(T *&obj) { + if (obj) + obj->Release(); + obj = nullptr; +} + +void Draw2D::DeviceLost() { + DoRelease(draw2DVs_); + DoRelease(draw2DSamplerLinear_); + DoRelease(draw2DSamplerNearest_); +} + +void Draw2D::DeviceRestore(Draw::DrawContext *draw) { + +} + +void Draw2D::Ensure2DResources() { using namespace Draw; const ShaderLanguageDesc &shaderLanguageDesc = draw_->GetShaderLanguageDesc(); @@ -168,7 +185,7 @@ void FramebufferManagerCommon::Ensure2DResources() { } } -Draw2DPipeline *FramebufferManagerCommon::Create2DPipeline(std::function generate) { +Draw2DPipeline *Draw2D::Create2DPipeline(std::function generate) { Ensure2DResources(); using namespace Draw; @@ -231,7 +248,7 @@ Draw2DPipeline *FramebufferManagerCommon::Create2DPipeline(std::functionWidth() : texW; ub.texSizeY = tex ? tex->Height() : texH; - ub.scaleFactor = (float)renderScaleFactor_; + ub.scaleFactor = (float)scaleFactor; draw_->BindPipeline(pipeline->pipeline); draw_->UpdateDynamicUniformBuffer(&ub, sizeof(ub)); @@ -272,7 +289,7 @@ Draw2DPipeline *FramebufferManagerCommon::Get2DPipeline(Draw2DShader shader) { switch (shader) { case DRAW2D_COPY_COLOR: if (!draw2DPipelineColor_) { - draw2DPipelineColor_ = Create2DPipeline(&GenerateDraw2DCopyColorFs); + draw2DPipelineColor_ = draw2D_.Create2DPipeline(&GenerateDraw2DCopyColorFs); } pipeline = draw2DPipelineColor_; break; @@ -283,7 +300,7 @@ Draw2DPipeline *FramebufferManagerCommon::Get2DPipeline(Draw2DShader shader) { return nullptr; } if (!draw2DPipelineDepth_) { - draw2DPipelineDepth_ = Create2DPipeline(&GenerateDraw2DCopyDepthFs); + draw2DPipelineDepth_ = draw2D_.Create2DPipeline(&GenerateDraw2DCopyDepthFs); } pipeline = draw2DPipelineDepth_; break; @@ -294,7 +311,7 @@ Draw2DPipeline *FramebufferManagerCommon::Get2DPipeline(Draw2DShader shader) { return nullptr; } if (!draw2DPipeline565ToDepth_) { - draw2DPipeline565ToDepth_ = Create2DPipeline(&GenerateDraw2D565ToDepthFs); + draw2DPipeline565ToDepth_ = draw2D_.Create2DPipeline(&GenerateDraw2D565ToDepthFs); } pipeline = draw2DPipeline565ToDepth_; break; @@ -305,7 +322,7 @@ Draw2DPipeline *FramebufferManagerCommon::Get2DPipeline(Draw2DShader shader) { return nullptr; } if (!draw2DPipeline565ToDepthDeswizzle_) { - draw2DPipeline565ToDepthDeswizzle_ = Create2DPipeline(&GenerateDraw2D565ToDepthDeswizzleFs); + draw2DPipeline565ToDepthDeswizzle_ = draw2D_.Create2DPipeline(&GenerateDraw2D565ToDepthDeswizzleFs); } pipeline = draw2DPipeline565ToDepthDeswizzle_; break; diff --git a/GPU/Common/Draw2D.h b/GPU/Common/Draw2D.h index 332c2c707d..086d0fc61e 100644 --- a/GPU/Common/Draw2D.h +++ b/GPU/Common/Draw2D.h @@ -42,3 +42,24 @@ struct Draw2DPipeline { delete this; } }; + +class ShaderWriter; + +class Draw2D { +public: + Draw2D(Draw::DrawContext *draw) : draw_(draw) {} + void DeviceLost(); + void DeviceRestore(Draw::DrawContext *draw); + + Draw2DPipeline *Create2DPipeline(std::function generate); + + void DrawStrip2D(Draw::Texture *tex, Draw2DVertex *verts, int vertexCount, bool linearFilter, Draw2DPipeline *pipeline, float texW = 0.0f, float texH = 0.0f, int scaleFactor = 0); + void Ensure2DResources(); + +private: + Draw::DrawContext *draw_; + + Draw::SamplerState *draw2DSamplerLinear_ = nullptr; + Draw::SamplerState *draw2DSamplerNearest_ = nullptr; + Draw::ShaderModule *draw2DVs_ = nullptr; +}; diff --git a/GPU/Common/FramebufferManagerCommon.cpp b/GPU/Common/FramebufferManagerCommon.cpp index 9d10953967..ffc4777aa2 100644 --- a/GPU/Common/FramebufferManagerCommon.cpp +++ b/GPU/Common/FramebufferManagerCommon.cpp @@ -47,7 +47,7 @@ #include "GPU/GPUState.h" FramebufferManagerCommon::FramebufferManagerCommon(Draw::DrawContext *draw) - : draw_(draw) { + : draw_(draw), draw2D_(draw_) { presentation_ = new PresentationCommon(draw); } @@ -2424,19 +2424,19 @@ void FramebufferManagerCommon::DeviceLost() { } DoRelease(stencilUploadSampler_); DoRelease(stencilUploadPipeline_); - DoRelease(draw2DSamplerNearest_); - DoRelease(draw2DSamplerLinear_); - DoRelease(draw2DVs_); DoRelease(draw2DPipelineColor_); DoRelease(draw2DPipelineDepth_); DoRelease(draw2DPipeline565ToDepth_); DoRelease(draw2DPipeline565ToDepthDeswizzle_); + draw2D_.DeviceLost(); + draw_ = nullptr; } void FramebufferManagerCommon::DeviceRestore(Draw::DrawContext *draw) { draw_ = draw; + draw2D_.DeviceRestore(draw_); presentation_->DeviceRestore(draw); } @@ -2488,7 +2488,7 @@ void FramebufferManagerCommon::DrawActiveTexture(float x, float y, float w, floa // Rearrange to strip form. std::swap(coord[2], coord[3]); - DrawStrip2D(nullptr, coord, 4, (flags & DRAWTEX_LINEAR) != 0, Get2DPipeline(DRAW2D_COPY_COLOR)); + draw2D_.DrawStrip2D(nullptr, coord, 4, (flags & DRAWTEX_LINEAR) != 0, Get2DPipeline(DRAW2D_COPY_COLOR)); gstate_c.Dirty(DIRTY_BLEND_STATE | DIRTY_RASTER_STATE | DIRTY_DEPTHSTENCIL_STATE | DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_TEXTURE_IMAGE | DIRTY_TEXTURE_PARAMS | DIRTY_VERTEXSHADER_STATE | DIRTY_FRAGMENTSHADER_STATE); } @@ -2634,7 +2634,8 @@ void FramebufferManagerCommon::BlitUsingRaster( Draw::Viewport vp{ 0.0f, 0.0f, (float)dest->Width(), (float)dest->Height(), 0.0f, 1.0f }; draw_->SetViewports(1, &vp); draw_->SetScissorRect(0, 0, (int)dest->Width(), (int)dest->Height()); - DrawStrip2D(nullptr, vtx, 4, linearFilter, pipeline, src->Width(), src->Height()); + + draw2D_.DrawStrip2D(nullptr, vtx, 4, linearFilter, pipeline, src->Width(), src->Height(), renderScaleFactor_); gstate_c.Dirty(DIRTY_BLEND_STATE | DIRTY_DEPTHSTENCIL_STATE | DIRTY_RASTER_STATE | DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_VERTEXSHADER_STATE | DIRTY_FRAGMENTSHADER_STATE); } diff --git a/GPU/Common/FramebufferManagerCommon.h b/GPU/Common/FramebufferManagerCommon.h index d0a692d3bf..0efa23cf4a 100644 --- a/GPU/Common/FramebufferManagerCommon.h +++ b/GPU/Common/FramebufferManagerCommon.h @@ -375,11 +375,7 @@ protected: Draw::Texture *MakePixelTexture(const u8 *srcPixels, GEBufferFormat srcPixelFormat, int srcStride, int width, int height); void DrawActiveTexture(float x, float y, float w, float h, float destW, float destH, float u0, float v0, float u1, float v1, int uvRotation, int flags); - Draw2DPipeline *FramebufferManagerCommon::Get2DPipeline(Draw2DShader shader); - void DrawStrip2D(Draw::Texture *tex, Draw2DVertex *verts, int vertexCount, bool linearFilter, Draw2DPipeline *pipeline, float texW = 0.0f, float texH = 0.0f); - - void Ensure2DResources(); - Draw2DPipeline *Create2DPipeline(std::function generate); + Draw2DPipeline *Get2DPipeline(Draw2DShader shader); void CopyToColorFromOverlappingFramebuffers(VirtualFramebuffer *dest); void CopyToDepthFromOverlappingFramebuffers(VirtualFramebuffer *dest); @@ -512,8 +508,7 @@ protected: Draw2DPipeline *draw2DPipelineDepth_ = nullptr; Draw2DPipeline *draw2DPipeline565ToDepth_ = nullptr; Draw2DPipeline *draw2DPipeline565ToDepthDeswizzle_ = nullptr; - Draw::SamplerState *draw2DSamplerLinear_ = nullptr; - Draw::SamplerState *draw2DSamplerNearest_ = nullptr; - Draw::ShaderModule *draw2DVs_ = nullptr; + + Draw2D draw2D_; // The fragment shaders are "owned" by the pipelines since they're 1:1. }; diff --git a/GPU/Common/ReinterpretFramebuffer.cpp b/GPU/Common/ReinterpretFramebuffer.cpp index 8951f08bbd..a981742aa8 100644 --- a/GPU/Common/ReinterpretFramebuffer.cpp +++ b/GPU/Common/ReinterpretFramebuffer.cpp @@ -141,7 +141,7 @@ void FramebufferManagerCommon::ReinterpretFramebuffer(VirtualFramebuffer *vfb, G Draw2DPipeline *pipeline = reinterpretFromTo_[(int)oldFormat][(int)newFormat]; if (!pipeline) { - pipeline = Create2DPipeline([=](ShaderWriter &shaderWriter) -> Draw2DPipelineInfo { + pipeline = draw2D_.Create2DPipeline([=](ShaderWriter &shaderWriter) -> Draw2DPipelineInfo { return GenerateReinterpretFragmentShader(shaderWriter, oldFormat, newFormat); });