summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorJules Blok <jules.blok@gmail.com>2014-11-04 00:53:14 +0100
committerJules Blok <jules.blok@gmail.com>2014-11-23 14:27:40 +0100
commitee76c03160b72731facbce135be26d7ef8cebba5 (patch)
treeb03e45c1fc917f3a53fcebdaccdb75bfd5ceb95b /Source/Core
parent4d075c2efb4c1dda695cd8044b42cf7894b52e5a (diff)
TextureCache: Recompile EFB2Tex shaders when stereo 3D is toggled.
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/VideoBackends/D3D/TextureCache.h3
-rw-r--r--Source/Core/VideoBackends/OGL/TextureCache.cpp44
-rw-r--r--Source/Core/VideoBackends/OGL/TextureCache.h3
-rw-r--r--Source/Core/VideoCommon/TextureCacheBase.cpp7
-rw-r--r--Source/Core/VideoCommon/TextureCacheBase.h4
5 files changed, 44 insertions, 17 deletions
diff --git a/Source/Core/VideoBackends/D3D/TextureCache.h b/Source/Core/VideoBackends/D3D/TextureCache.h
index 6045d3f7db..79cd8145a8 100644
--- a/Source/Core/VideoBackends/D3D/TextureCache.h
+++ b/Source/Core/VideoBackends/D3D/TextureCache.h
@@ -43,6 +43,9 @@ private:
TCacheEntryBase* CreateRenderTargetTexture(unsigned int scaled_tex_w, unsigned int scaled_tex_h) override;
u64 EncodeToRamFromTexture(u32 address, void* source_texture, u32 SourceW, u32 SourceH, bool bFromZBuffer, bool bIsIntensityFmt, u32 copyfmt, int bScaleByHalf, const EFBRectangle& source) {return 0;};
+
+ void CompileShaders() override { }
+ void DeleteShaders() override { }
};
}
diff --git a/Source/Core/VideoBackends/OGL/TextureCache.cpp b/Source/Core/VideoBackends/OGL/TextureCache.cpp
index 3c2661b043..547a527818 100644
--- a/Source/Core/VideoBackends/OGL/TextureCache.cpp
+++ b/Source/Core/VideoBackends/OGL/TextureCache.cpp
@@ -319,6 +319,32 @@ void TextureCache::TCacheEntry::FromRenderTarget(u32 dstAddr, unsigned int dstFo
TextureCache::TextureCache()
{
+ CompileShaders();
+
+ s_ActiveTexture = -1;
+ for (auto& gtex : s_Textures)
+ gtex = -1;
+}
+
+
+TextureCache::~TextureCache()
+{
+ DeleteShaders();
+}
+
+void TextureCache::DisableStage(unsigned int stage)
+{
+}
+
+void TextureCache::SetStage()
+{
+ // -1 is the initial value as we don't know which texture should be bound
+ if (s_ActiveTexture != (u32)-1)
+ glActiveTexture(GL_TEXTURE0 + s_ActiveTexture);
+}
+
+void TextureCache::CompileShaders()
+{
const char *pColorMatrixProg =
"SAMPLER_BINDING(9) uniform sampler2DArray samp9;\n"
"uniform vec4 colmat[7];\n"
@@ -414,28 +440,12 @@ TextureCache::TextureCache()
s_ColorCopyPositionUniform = glGetUniformLocation(s_ColorMatrixProgram.glprogid, "copy_position");
s_DepthCopyPositionUniform = glGetUniformLocation(s_DepthMatrixProgram.glprogid, "copy_position");
-
- s_ActiveTexture = -1;
- for (auto& gtex : s_Textures)
- gtex = -1;
}
-
-TextureCache::~TextureCache()
+void TextureCache::DeleteShaders()
{
s_ColorMatrixProgram.Destroy();
s_DepthMatrixProgram.Destroy();
}
-void TextureCache::DisableStage(unsigned int stage)
-{
-}
-
-void TextureCache::SetStage ()
-{
- // -1 is the initial value as we don't know which texture should be bound
- if (s_ActiveTexture != (u32)-1)
- glActiveTexture(GL_TEXTURE0 + s_ActiveTexture);
-}
-
}
diff --git a/Source/Core/VideoBackends/OGL/TextureCache.h b/Source/Core/VideoBackends/OGL/TextureCache.h
index e1e2ec694c..f8d181e8e1 100644
--- a/Source/Core/VideoBackends/OGL/TextureCache.h
+++ b/Source/Core/VideoBackends/OGL/TextureCache.h
@@ -57,6 +57,9 @@ private:
unsigned int expanded_width, unsigned int tex_levels, PC_TexFormat pcfmt) override;
TCacheEntryBase* CreateRenderTargetTexture(unsigned int scaled_tex_w, unsigned int scaled_tex_h) override;
+
+ void CompileShaders() override;
+ void DeleteShaders() override;
};
bool SaveTexture(const std::string& filename, u32 textarget, u32 tex, int virtual_width, int virtual_height, unsigned int level);
diff --git a/Source/Core/VideoCommon/TextureCacheBase.cpp b/Source/Core/VideoCommon/TextureCacheBase.cpp
index 4037a7470b..651bb90708 100644
--- a/Source/Core/VideoCommon/TextureCacheBase.cpp
+++ b/Source/Core/VideoCommon/TextureCacheBase.cpp
@@ -115,6 +115,12 @@ void TextureCache::OnConfigChanged(VideoConfig& config)
{
g_texture_cache->ClearRenderTargets();
}
+
+ if ((config.iStereoMode > 0) != backup_config.s_stereo_3d)
+ {
+ g_texture_cache->DeleteShaders();
+ g_texture_cache->CompileShaders();
+ }
}
backup_config.s_colorsamples = config.iSafeTextureCache_ColorSamples;
@@ -126,6 +132,7 @@ void TextureCache::OnConfigChanged(VideoConfig& config)
backup_config.s_texfmt_overlay_center = config.bTexFmtOverlayCenter;
backup_config.s_hires_textures = config.bHiresTextures;
backup_config.s_copy_cache_enable = config.bEFBCopyCacheEnable;
+ backup_config.s_stereo_3d = config.iStereoMode > 0;
}
void TextureCache::Cleanup()
diff --git a/Source/Core/VideoCommon/TextureCacheBase.h b/Source/Core/VideoCommon/TextureCacheBase.h
index 77bdec14fa..7fc3e49a2f 100644
--- a/Source/Core/VideoCommon/TextureCacheBase.h
+++ b/Source/Core/VideoCommon/TextureCacheBase.h
@@ -102,6 +102,9 @@ public:
unsigned int expanded_width, unsigned int tex_levels, PC_TexFormat pcfmt) = 0;
virtual TCacheEntryBase* CreateRenderTargetTexture(unsigned int scaled_tex_w, unsigned int scaled_tex_h) = 0;
+ virtual void CompileShaders() = 0; // currently only implemented by OGL
+ virtual void DeleteShaders() = 0; // currently only implemented by OGL
+
static TCacheEntryBase* Load(unsigned int stage, u32 address, unsigned int width, unsigned int height,
int format, unsigned int tlutaddr, int tlutfmt, bool use_mipmaps, unsigned int maxlevel, bool from_tmem);
static void CopyRenderTargetToTexture(u32 dstAddr, unsigned int dstFormat, PEControl::PixelFormat srcFormat,
@@ -141,6 +144,7 @@ private:
bool s_texfmt_overlay_center;
bool s_hires_textures;
bool s_copy_cache_enable;
+ bool s_stereo_3d;
} backup_config;
};