GPU: Centralize DestroyAllFBOs().

This cleans up the postshader update code.
This commit is contained in:
Unknown W. Brackets 2020-05-13 00:06:13 -07:00
parent 03e3a935da
commit 22e46b51c2
16 changed files with 52 additions and 157 deletions

View file

@ -839,9 +839,6 @@ void FramebufferManagerCommon::CopyDisplayToOutput(bool reallyDirty) {
u32 offsetX = 0;
u32 offsetY = 0;
CardboardSettings cardboardSettings;
presentation_->GetCardboardSettings(&cardboardSettings);
// If it's not really dirty, we're probably frameskipping. Use the last working one.
u32 fbaddr = reallyDirty ? displayFramebufPtr_ : prevDisplayFramebufPtr_;
prevDisplayFramebufPtr_ = fbaddr;
@ -1705,6 +1702,13 @@ void FramebufferManagerCommon::Resized() {
gstate_c.skipDrawReason &= ~SKIPDRAW_NON_DISPLAYED_FB;
if (UpdateSize()) {
DestroyAllFBOs();
}
// Might have a new post shader - let's compile it.
presentation_->UpdatePostShader();
#ifdef _WIN32
// Seems related - if you're ok with numbers all the time, show some more :)
if (g_Config.iShowFPSCounter != 0) {
@ -1713,6 +1717,29 @@ void FramebufferManagerCommon::Resized() {
#endif
}
void FramebufferManagerCommon::DestroyAllFBOs() {
currentRenderVfb_ = nullptr;
displayFramebuf_ = nullptr;
prevDisplayFramebuf_ = nullptr;
prevPrevDisplayFramebuf_ = nullptr;
for (VirtualFramebuffer *vfb : vfbs_) {
INFO_LOG(FRAMEBUF, "Destroying FBO for %08x : %i x %i x %i", vfb->fb_address, vfb->width, vfb->height, vfb->format);
DestroyFramebuf(vfb);
}
vfbs_.clear();
for (VirtualFramebuffer *vfb : bvfbs_) {
DestroyFramebuf(vfb);
}
bvfbs_.clear();
for (auto &tempFB : tempFBOs_) {
tempFB.second.fbo->Release();
}
tempFBOs_.clear();
}
Draw::Framebuffer *FramebufferManagerCommon::GetTempFBO(TempFBO reason, u16 w, u16 h, Draw::FBColorDepth depth) {
u64 key = ((u64)reason << 48) | ((u64)depth << 32) | ((u32)w << 16) | h;
auto it = tempFBOs_.find(key);

View file

@ -296,6 +296,7 @@ public:
void SetSafeSize(u16 w, u16 h);
virtual void Resized();
virtual void DestroyAllFBOs();
Draw::Framebuffer *GetTempFBO(TempFBO reason, u16 w, u16 h, Draw::FBColorDepth colorDepth = Draw::FBO_8888);

View file

@ -498,39 +498,3 @@ void FramebufferManagerD3D11::EndFrame() {
void FramebufferManagerD3D11::DeviceLost() {
DestroyAllFBOs();
}
void FramebufferManagerD3D11::DestroyAllFBOs() {
currentRenderVfb_ = nullptr;
displayFramebuf_ = nullptr;
prevDisplayFramebuf_ = nullptr;
prevPrevDisplayFramebuf_ = nullptr;
for (size_t i = 0; i < vfbs_.size(); ++i) {
VirtualFramebuffer *vfb = vfbs_[i];
INFO_LOG(FRAMEBUF, "Destroying FBO for %08x : %i x %i x %i", vfb->fb_address, vfb->width, vfb->height, vfb->format);
DestroyFramebuf(vfb);
}
vfbs_.clear();
for (size_t i = 0; i < bvfbs_.size(); ++i) {
VirtualFramebuffer *vfb = bvfbs_[i];
DestroyFramebuf(vfb);
}
bvfbs_.clear();
for (auto &tempFB : tempFBOs_) {
tempFB.second.fbo->Release();
}
tempFBOs_.clear();
}
void FramebufferManagerD3D11::Resized() {
FramebufferManagerCommon::Resized();
if (UpdateSize()) {
DestroyAllFBOs();
}
// Might have a new post shader - let's compile it.
presentation_->UpdatePostShader();
}

View file

@ -41,10 +41,7 @@ public:
void SetDrawEngine(DrawEngineD3D11 *td);
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) override;
void DestroyAllFBOs();
void EndFrame();
void Resized() override;
void DeviceLost();
void ReformatFramebufferFrom(VirtualFramebuffer *vfb, GEBufferFormat old) override;

View file

@ -359,11 +359,12 @@ void GPU_D3D11::DoState(PointerWrap &p) {
// TODO: Some of these things may not be necessary.
// None of these are necessary when saving.
if (p.mode == p.MODE_READ && !PSP_CoreParameter().frozen) {
textureCacheD3D11_->Clear(true);
textureCache_->Clear(true);
depalShaderCache_->Clear();
drawEngine_.ClearTrackedVertexArrays();
gstate_c.Dirty(DIRTY_TEXTURE_IMAGE);
framebufferManagerD3D11_->DestroyAllFBOs();
framebufferManager_->DestroyAllFBOs();
}
}

View file

@ -597,23 +597,7 @@ static const D3DVERTEXELEMENT9 g_FramebufferVertexElements[] = {
}
void FramebufferManagerDX9::DestroyAllFBOs() {
currentRenderVfb_ = 0;
displayFramebuf_ = 0;
prevDisplayFramebuf_ = 0;
prevPrevDisplayFramebuf_ = 0;
for (size_t i = 0; i < vfbs_.size(); ++i) {
VirtualFramebuffer *vfb = vfbs_[i];
INFO_LOG(FRAMEBUF, "Destroying FBO for %08x : %i x %i x %i", vfb->fb_address, vfb->width, vfb->height, vfb->format);
DestroyFramebuf(vfb);
}
vfbs_.clear();
for (size_t i = 0; i < bvfbs_.size(); ++i) {
VirtualFramebuffer *vfb = bvfbs_[i];
DestroyFramebuf(vfb);
}
bvfbs_.clear();
FramebufferManagerCommon::DestroyAllFBOs();
for (auto &it : offscreenSurfaces_) {
it.second.surface->Release();
@ -621,15 +605,6 @@ static const D3DVERTEXELEMENT9 g_FramebufferVertexElements[] = {
offscreenSurfaces_.clear();
}
void FramebufferManagerDX9::Resized() {
FramebufferManagerCommon::Resized();
if (UpdateSize()) {
DestroyAllFBOs();
}
presentation_->UpdatePostShader();
}
bool FramebufferManagerDX9::GetFramebuffer(u32 fb_address, int fb_stride, GEBufferFormat fb_format, GPUDebugBuffer &buffer, int maxRes) {
VirtualFramebuffer *vfb = currentRenderVfb_;
if (!vfb) {

View file

@ -47,7 +47,6 @@ public:
void DestroyAllFBOs();
void EndFrame();
void Resized() override;
void DeviceLost();
void ReformatFramebufferFrom(VirtualFramebuffer *vfb, GEBufferFormat old) override;

View file

@ -396,11 +396,12 @@ void GPU_DX9::DoState(PointerWrap &p) {
// TODO: Some of these things may not be necessary.
// None of these are necessary when saving.
if (p.mode == p.MODE_READ && !PSP_CoreParameter().frozen) {
textureCacheDX9_->Clear(true);
textureCache_->Clear(true);
depalShaderCache_.Clear();
drawEngine_.ClearTrackedVertexArrays();
gstate_c.Dirty(DIRTY_TEXTURE_IMAGE);
framebufferManagerDX9_->DestroyAllFBOs();
framebufferManager_->DestroyAllFBOs();
}
}

View file

@ -449,41 +449,10 @@ void FramebufferManagerGLES::DeviceRestore(Draw::DrawContext *draw) {
CreateDeviceObjects();
}
void FramebufferManagerGLES::DestroyAllFBOs() {
currentRenderVfb_ = 0;
displayFramebuf_ = 0;
prevDisplayFramebuf_ = 0;
prevPrevDisplayFramebuf_ = 0;
for (size_t i = 0; i < vfbs_.size(); ++i) {
VirtualFramebuffer *vfb = vfbs_[i];
INFO_LOG(FRAMEBUF, "Destroying FBO for %08x : %i x %i x %i", vfb->fb_address, vfb->width, vfb->height, vfb->format);
DestroyFramebuf(vfb);
}
vfbs_.clear();
for (size_t i = 0; i < bvfbs_.size(); ++i) {
VirtualFramebuffer *vfb = bvfbs_[i];
DestroyFramebuf(vfb);
}
bvfbs_.clear();
for (auto &tempFB : tempFBOs_) {
tempFB.second.fbo->Release();
}
tempFBOs_.clear();
}
void FramebufferManagerGLES::Resized() {
FramebufferManagerCommon::Resized();
render_->Resize(PSP_CoreParameter().pixelWidth, PSP_CoreParameter().pixelHeight);
if (UpdateSize()) {
DestroyAllFBOs();
}
// Might have a new post shader - let's compile it.
presentation_->UpdatePostShader();
// render_->SetLineWidth(renderWidth_ / 480.0f);
}

View file

@ -43,8 +43,6 @@ public:
// x,y,w,h are relative to destW, destH which fill out the target completely.
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) override;
void DestroyAllFBOs();
virtual void Init() override;
void EndFrame();
void Resized() override;

View file

@ -342,9 +342,7 @@ void GPU_GLES::DeviceRestore() {
void GPU_GLES::Reinitialize() {
GPUCommon::Reinitialize();
textureCacheGL_->Clear(true);
depalShaderCache_.Clear();
framebufferManagerGL_->DestroyAllFBOs();
}
void GPU_GLES::InitClear() {
@ -510,11 +508,12 @@ void GPU_GLES::DoState(PointerWrap &p) {
// None of these are necessary when saving.
// In Freeze-Frame mode, we don't want to do any of this.
if (p.mode == p.MODE_READ && !PSP_CoreParameter().frozen) {
textureCacheGL_->Clear(true);
textureCache_->Clear(true);
depalShaderCache_.Clear();
drawEngine_.ClearTrackedVertexArrays();
gstate_c.Dirty(DIRTY_TEXTURE_IMAGE);
framebufferManagerGL_->DestroyAllFBOs();
framebufferManager_->DestroyAllFBOs();
}
}

View file

@ -459,6 +459,11 @@ void GPUCommon::Reinitialize() {
busyTicks = 0;
timeSpentStepping_ = 0.0;
interruptsEnabled_ = true;
if (textureCache_)
textureCache_->Clear(true);
if (framebufferManager_)
framebufferManager_->DestroyAllFBOs();
}
void GPUCommon::UpdateVsyncInterval(bool force) {

View file

@ -303,10 +303,10 @@ protected:
}
}
FramebufferManagerCommon *framebufferManager_;
TextureCacheCommon *textureCache_;
DrawEngineCommon *drawEngineCommon_;
ShaderManagerCommon *shaderManager_;
FramebufferManagerCommon *framebufferManager_ = nullptr;
TextureCacheCommon *textureCache_ = nullptr;
DrawEngineCommon *drawEngineCommon_ = nullptr;
ShaderManagerCommon *shaderManager_ = nullptr;
GraphicsContext *gfxCtx_;
Draw::DrawContext *draw_;

View file

@ -448,39 +448,3 @@ void FramebufferManagerVulkan::DeviceRestore(VulkanContext *vulkan, Draw::DrawCo
InitDeviceObjects();
}
void FramebufferManagerVulkan::DestroyAllFBOs() {
currentRenderVfb_ = 0;
displayFramebuf_ = 0;
prevDisplayFramebuf_ = 0;
prevPrevDisplayFramebuf_ = 0;
for (size_t i = 0; i < vfbs_.size(); ++i) {
VirtualFramebuffer *vfb = vfbs_[i];
INFO_LOG(FRAMEBUF, "Destroying FBO for %08x : %i x %i x %i", vfb->fb_address, vfb->width, vfb->height, vfb->format);
DestroyFramebuf(vfb);
}
vfbs_.clear();
for (size_t i = 0; i < bvfbs_.size(); ++i) {
VirtualFramebuffer *vfb = bvfbs_[i];
DestroyFramebuf(vfb);
}
bvfbs_.clear();
for (auto &tempFB : tempFBOs_) {
tempFB.second.fbo->Release();
}
tempFBOs_.clear();
}
void FramebufferManagerVulkan::Resized() {
FramebufferManagerCommon::Resized();
if (UpdateSize()) {
DestroyAllFBOs();
}
// Might have a new post shader - let's compile it.
presentation_->UpdatePostShader();
}

View file

@ -46,14 +46,11 @@ public:
// x,y,w,h are relative to destW, destH which fill out the target completely.
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) override;
void DestroyAllFBOs();
virtual void Init() override;
void BeginFrameVulkan(); // there's a BeginFrame in the base class, which this calls
void EndFrame();
void Resized() override;
void DeviceLost();
void DeviceRestore(VulkanContext *vulkan, Draw::DrawContext *draw);
int GetLineWidth();

View file

@ -413,9 +413,7 @@ void GPU_Vulkan::BuildReportingInfo() {
void GPU_Vulkan::Reinitialize() {
GPUCommon::Reinitialize();
textureCacheVulkan_->Clear(true);
depalShaderCache_.Clear();
framebufferManagerVulkan_->DestroyAllFBOs();
}
void GPU_Vulkan::InitClear() {
@ -613,11 +611,11 @@ void GPU_Vulkan::DoState(PointerWrap &p) {
// None of these are necessary when saving.
// In Freeze-Frame mode, we don't want to do any of this.
if (p.mode == p.MODE_READ && !PSP_CoreParameter().frozen) {
textureCacheVulkan_->Clear(true);
textureCache_->Clear(true);
depalShaderCache_.Clear();
gstate_c.Dirty(DIRTY_TEXTURE_IMAGE);
framebufferManagerVulkan_->DestroyAllFBOs();
framebufferManager_->DestroyAllFBOs();
}
}