diff --git a/GPU/Directx9/FramebufferDX9.cpp b/GPU/Directx9/FramebufferDX9.cpp index e658c3e2c3..d0ccd0c3cb 100644 --- a/GPU/Directx9/FramebufferDX9.cpp +++ b/GPU/Directx9/FramebufferDX9.cpp @@ -643,13 +643,13 @@ namespace DX9 { return offscreen; } - void FramebufferManagerDX9::BindFramebufferColor(VirtualFramebuffer *framebuffer, bool skipCopy) { + void FramebufferManagerDX9::BindFramebufferColor(int stage, VirtualFramebuffer *framebuffer, bool skipCopy) { if (framebuffer == NULL) { framebuffer = currentRenderVfb_; } if (!framebuffer->fbo || !useBufferedRendering_) { - pD3Ddevice->SetTexture(0, nullptr); + pD3Ddevice->SetTexture(stage, nullptr); gstate_c.skipDrawReason |= SKIPDRAW_BAD_FB_TEXTURE; return; } @@ -668,12 +668,12 @@ namespace DX9 { BlitFramebuffer(©Info, 0, 0, framebuffer, 0, 0, framebuffer->drawnWidth, framebuffer->drawnHeight, 0, false); RebindFramebuffer(); - fbo_bind_color_as_texture(renderCopy, 0); + pD3Ddevice->SetTexture(stage, fbo_get_color_texture(renderCopy)); } else { - fbo_bind_color_as_texture(framebuffer->fbo, 0); + pD3Ddevice->SetTexture(stage, fbo_get_color_texture(framebuffer->fbo)); } } else { - fbo_bind_color_as_texture(framebuffer->fbo, 0); + pD3Ddevice->SetTexture(stage, fbo_get_color_texture(framebuffer->fbo)); } } diff --git a/GPU/Directx9/FramebufferDX9.h b/GPU/Directx9/FramebufferDX9.h index 99bd972a87..081e5bbb1e 100644 --- a/GPU/Directx9/FramebufferDX9.h +++ b/GPU/Directx9/FramebufferDX9.h @@ -73,7 +73,7 @@ public: void BlitFramebufferDepth(VirtualFramebuffer *src, VirtualFramebuffer *dst); - void BindFramebufferColor(VirtualFramebuffer *framebuffer, bool skipCopy); + void BindFramebufferColor(int stage, VirtualFramebuffer *framebuffer, bool skipCopy); virtual void ReadFramebufferToMemory(VirtualFramebuffer *vfb, bool sync, int x, int y, int w, int h) override; diff --git a/GPU/Directx9/StateMappingDX9.cpp b/GPU/Directx9/StateMappingDX9.cpp index 0e0db2a211..a86b4b9d1b 100644 --- a/GPU/Directx9/StateMappingDX9.cpp +++ b/GPU/Directx9/StateMappingDX9.cpp @@ -145,8 +145,7 @@ bool TransformDrawEngineDX9::ApplyShaderBlending() { return false; } - // TODO: Need a param to set stage 1. - // framebufferManager_->BindFramebufferColor(NULL); + framebufferManager_->BindFramebufferColor(1, nullptr, false); // If we are rendering at a higher resolution, linear is probably best for the dest color. pD3Ddevice->SetSamplerState(1, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); pD3Ddevice->SetSamplerState(1, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); diff --git a/GPU/GLES/Framebuffer.cpp b/GPU/GLES/Framebuffer.cpp index d17ed80f66..272fd636df 100644 --- a/GPU/GLES/Framebuffer.cpp +++ b/GPU/GLES/Framebuffer.cpp @@ -920,13 +920,18 @@ FBO *FramebufferManager::GetTempFBO(u16 w, u16 h, FBOColorDepth depth) { return fbo; } -void FramebufferManager::BindFramebufferColor(VirtualFramebuffer *framebuffer, bool skipCopy) { +void FramebufferManager::BindFramebufferColor(int stage, VirtualFramebuffer *framebuffer, bool skipCopy) { if (framebuffer == NULL) { framebuffer = currentRenderVfb_; } + if (stage != GL_TEXTURE0) { + glActiveTexture(stage); + } + if (!framebuffer->fbo || !useBufferedRendering_) { glBindTexture(GL_TEXTURE_2D, 0); + glActiveTexture(GL_TEXTURE0); gstate_c.skipDrawReason |= SKIPDRAW_BAD_FB_TEXTURE; return; } @@ -952,6 +957,10 @@ void FramebufferManager::BindFramebufferColor(VirtualFramebuffer *framebuffer, b } else { fbo_bind_color_as_texture(framebuffer->fbo, 0); } + + if (stage != GL_TEXTURE1) { + glActiveTexture(stage); + } } void FramebufferManager::CopyDisplayToOutput() { diff --git a/GPU/GLES/Framebuffer.h b/GPU/GLES/Framebuffer.h index f67adfff51..ad0c3162ad 100644 --- a/GPU/GLES/Framebuffer.h +++ b/GPU/GLES/Framebuffer.h @@ -94,7 +94,7 @@ public: void BlitFramebufferDepth(VirtualFramebuffer *src, VirtualFramebuffer *dst); // For use when texturing from a framebuffer. May create a duplicate if target. - void BindFramebufferColor(VirtualFramebuffer *framebuffer, bool skipCopy = false); + void BindFramebufferColor(int stage, VirtualFramebuffer *framebuffer, bool skipCopy = false); // Reads a rectangular subregion of a framebuffer to the right position in its backing memory. virtual void ReadFramebufferToMemory(VirtualFramebuffer *vfb, bool sync, int x, int y, int w, int h) override; diff --git a/GPU/GLES/StateMapping.cpp b/GPU/GLES/StateMapping.cpp index 87b158b24e..1c4c0b214e 100644 --- a/GPU/GLES/StateMapping.cpp +++ b/GPU/GLES/StateMapping.cpp @@ -187,8 +187,8 @@ bool TransformDrawEngine::ApplyShaderBlending() { return false; } + framebufferManager_->BindFramebufferColor(GL_TEXTURE1, NULL); glActiveTexture(GL_TEXTURE1); - framebufferManager_->BindFramebufferColor(NULL); // If we are rendering at a higher resolution, linear is probably best for the dest color. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); diff --git a/GPU/GLES/TextureCache.cpp b/GPU/GLES/TextureCache.cpp index a36d1fb499..3e18142685 100644 --- a/GPU/GLES/TextureCache.cpp +++ b/GPU/GLES/TextureCache.cpp @@ -1052,7 +1052,7 @@ void TextureCache::SetTextureFramebuffer(TexCacheEntry *entry, VirtualFramebuffe glBindTexture(GL_TEXTURE_2D, clutTexture); glActiveTexture(GL_TEXTURE0); - framebufferManager_->BindFramebufferColor(framebuffer, true); + framebufferManager_->BindFramebufferColor(GL_TEXTURE0, framebuffer, true); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); @@ -1087,7 +1087,7 @@ void TextureCache::SetTextureFramebuffer(TexCacheEntry *entry, VirtualFramebuffe gstate_c.textureSimpleAlpha = alphaStatus == TexCacheEntry::STATUS_ALPHA_SIMPLE; } else { entry->status &= ~TexCacheEntry::STATUS_DEPALETTIZE; - framebufferManager_->BindFramebufferColor(framebuffer); + framebufferManager_->BindFramebufferColor(GL_TEXTURE0, framebuffer); gstate_c.textureFullAlpha = framebuffer->drawnFormat == GE_FORMAT_565; gstate_c.textureSimpleAlpha = gstate_c.textureFullAlpha;