GPU: Centralize DestroyAllFBOs().
This cleans up the postshader update code.
This commit is contained in:
parent
03e3a935da
commit
22e46b51c2
16 changed files with 52 additions and 157 deletions
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -47,7 +47,6 @@ public:
|
|||
void DestroyAllFBOs();
|
||||
|
||||
void EndFrame();
|
||||
void Resized() override;
|
||||
void DeviceLost();
|
||||
void ReformatFramebufferFrom(VirtualFramebuffer *vfb, GEBufferFormat old) override;
|
||||
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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_;
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue