Fix resizing issue. Took some refactoring.

This commit is contained in:
Henrik Rydgård 2022-11-20 12:57:32 +01:00
parent 63cbd9c79b
commit 37ec31dedd
13 changed files with 40 additions and 37 deletions

View file

@ -160,14 +160,7 @@ void GPU_D3D11::InitClear() {
void GPU_D3D11::BeginHostFrame() {
GPUCommon::BeginHostFrame();
UpdateCmdInfo();
if (resized_) {
gstate_c.useFlags = CheckGPUFeatures();
framebufferManager_->Resized();
drawEngine_.NotifyConfigChanged();
textureCache_->NotifyConfigChanged();
shaderManagerD3D11_->DirtyLastShader();
resized_ = false;
}
CheckResized();
}
void GPU_D3D11::ReapplyGfxState() {

View file

@ -66,7 +66,7 @@ private:
}
// void ApplyDrawState(int prim);
void CheckFlushOp(int cmd, u32 diff);
void BuildReportingInfo();
void BuildReportingInfo() override;
void InitClear() override;
void BeginFrame() override;

View file

@ -150,14 +150,7 @@ void GPU_DX9::InitClear() {
void GPU_DX9::BeginHostFrame() {
GPUCommon::BeginHostFrame();
UpdateCmdInfo();
if (resized_) {
gstate_c.useFlags = CheckGPUFeatures();
framebufferManager_->Resized();
drawEngine_.NotifyConfigChanged();
textureCache_->NotifyConfigChanged();
shaderManagerDX9_->DirtyShader();
resized_ = false;
}
CheckResized();
}
void GPU_DX9::ReapplyGfxState() {

View file

@ -63,7 +63,7 @@ private:
drawEngine_.Flush();
}
void CheckFlushOp(int cmd, u32 diff);
void BuildReportingInfo();
void BuildReportingInfo() override;
void InitClear() override;
void BeginFrame() override;

View file

@ -268,14 +268,7 @@ void GPU_GLES::InitClear() {
void GPU_GLES::BeginHostFrame() {
GPUCommon::BeginHostFrame();
UpdateCmdInfo();
if (resized_) {
gstate_c.useFlags = CheckGPUFeatures();
framebufferManager_->Resized();
drawEngine_.NotifyConfigChanged();
textureCache_->NotifyConfigChanged();
shaderManagerGL_->DirtyShader();
resized_ = false;
}
CheckResized();
drawEngine_.BeginFrame();
}

View file

@ -73,7 +73,7 @@ private:
drawEngine_.Flush();
}
void CheckFlushOp(int cmd, u32 diff);
void BuildReportingInfo();
void BuildReportingInfo() override;
void InitClear() override;
void BeginFrame() override;

View file

@ -611,6 +611,20 @@ void GPUCommon::Resized() {
resized_ = true;
}
// Called once per frame. Might also get called during the pause screen
// if "transparent".
void GPUCommon::CheckResized() {
if (resized_) {
gstate_c.useFlags = CheckGPUFeatures();
BuildReportingInfo();
framebufferManager_->Resized();
drawEngineCommon_->NotifyConfigChanged();
textureCache_->NotifyConfigChanged();
shaderManager_->DirtyLastShader();
resized_ = false;
}
}
void GPUCommon::DumpNextFrame() {
dumpNextFrame_ = true;
}

View file

@ -77,6 +77,7 @@ public:
return draw_;
}
virtual u32 CheckGPUFeatures() const;
void CheckResized() override;
void UpdateCmdInfo();
@ -309,6 +310,8 @@ protected:
size_t FormatGPUStatsCommon(char *buf, size_t size);
virtual void BuildReportingInfo() = 0;
FramebufferManagerCommon *framebufferManager_ = nullptr;
TextureCacheCommon *textureCache_ = nullptr;
DrawEngineCommon *drawEngineCommon_ = nullptr;

View file

@ -197,6 +197,7 @@ public:
// Frame managment
virtual void BeginHostFrame() = 0;
virtual void EndHostFrame() = 0;
virtual void CheckResized() = 0;
// Draw queue management
virtual DisplayList* getList(int listid) = 0;

View file

@ -205,6 +205,8 @@ protected:
void CopyToCurrentFboFromDisplayRam(int srcwidth, int srcheight);
void ConvertTextureDescFrom16(Draw::TextureDesc &desc, int srcwidth, int srcheight, const uint16_t *overrideData = nullptr);
void BuildReportingInfo() override {}
private:
void MarkDirty(uint32_t addr, uint32_t stride, uint32_t height, GEBufferFormat fmt, SoftGPUVRAMDirty value);
void MarkDirty(uint32_t addr, uint32_t bytes, SoftGPUVRAMDirty value);

View file

@ -275,15 +275,7 @@ void GPU_Vulkan::BeginHostFrame() {
drawEngine_.BeginFrame();
UpdateCmdInfo();
if (resized_) {
gstate_c.useFlags = CheckGPUFeatures();
// In case the GPU changed.
BuildReportingInfo();
framebufferManager_->Resized();
drawEngine_.NotifyConfigChanged();
textureCache_->NotifyConfigChanged();
resized_ = false;
}
CheckResized();
textureCacheVulkan_->StartFrame();

View file

@ -77,7 +77,7 @@ private:
drawEngine_.Flush();
}
void CheckFlushOp(int cmd, u32 diff);
void BuildReportingInfo();
void BuildReportingInfo() override;
void InitClear() override;
void CopyDisplayToOutput(bool reallyDirty) override;
void Reinitialize() override;

View file

@ -1398,8 +1398,20 @@ void EmuScreen::render() {
// If we're paused and PauseScreen is transparent (will only be in buffered rendering mode), we just copy display to output.
thin3d->BindFramebufferAsRenderTarget(nullptr, { RPAction::CLEAR, RPAction::DONT_CARE, RPAction::DONT_CARE }, "EmuScreen_Paused");
if (PSP_IsInited()) {
gpu->CheckResized();
gpu->CopyDisplayToOutput(true);
}
screenManager()->getUIContext()->BeginFrame();
DrawContext *draw = screenManager()->getDrawContext();
Viewport viewport;
viewport.TopLeftX = 0;
viewport.TopLeftY = 0;
viewport.Width = pixel_xres;
viewport.Height = pixel_yres;
viewport.MaxDepth = 1.0;
viewport.MinDepth = 0.0;
draw->SetViewports(1, &viewport);
return;
}