summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/OGL/TextureCache.cpp
diff options
context:
space:
mode:
authordegasus <wickmarkus@web.de>2015-01-17 10:01:41 +0100
committerdegasus <wickmarkus@web.de>2015-01-18 19:47:48 +0100
commit6cd6e6546f8a6481bd343fb9d1e22238491c2578 (patch)
treef7c78f911296cf706e769eec6ddd31df87bf62ff /Source/Core/VideoBackends/OGL/TextureCache.cpp
parent615ae9f10626171fddbbbd0a23cd3e018fc960ef (diff)
TexCache: merge texture and rendertarget factory function
Diffstat (limited to 'Source/Core/VideoBackends/OGL/TextureCache.cpp')
-rw-r--r--Source/Core/VideoBackends/OGL/TextureCache.cpp54
1 files changed, 17 insertions, 37 deletions
diff --git a/Source/Core/VideoBackends/OGL/TextureCache.cpp b/Source/Core/VideoBackends/OGL/TextureCache.cpp
index 15df7dedb1..1f12d5c148 100644
--- a/Source/Core/VideoBackends/OGL/TextureCache.cpp
+++ b/Source/Core/VideoBackends/OGL/TextureCache.cpp
@@ -109,22 +109,28 @@ bool TextureCache::TCacheEntry::Save(const std::string& filename, unsigned int l
return SaveTexture(filename, GL_TEXTURE_2D_ARRAY, texture, config.width, config.height, level);
}
-TextureCache::TCacheEntryBase* TextureCache::CreateTexture(unsigned int width, unsigned int height, unsigned int tex_levels)
+TextureCache::TCacheEntryBase* TextureCache::CreateTexture(const TCacheEntryConfig& config)
{
- TCacheEntryConfig config;
- config.width = width;
- config.height = height;
- config.levels = tex_levels;
-
- TCacheEntry &entry = *new TCacheEntry(config);
+ TCacheEntry* entry = new TCacheEntry(config);
glActiveTexture(GL_TEXTURE0+9);
- glBindTexture(GL_TEXTURE_2D_ARRAY, entry.texture);
- glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, tex_levels - 1);
+ glBindTexture(GL_TEXTURE_2D_ARRAY, entry->texture);
- TextureCache::SetStage();
+ glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, config.levels - 1);
- return &entry;
+ if (config.rendertarget)
+ {
+ for (u32 level = 0; level <= config.levels; level++)
+ {
+ glTexImage3D(GL_TEXTURE_2D_ARRAY, level, GL_RGBA, config.width, config.height, config.layers, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
+ }
+ glGenFramebuffers(1, &entry->framebuffer);
+ FramebufferManager::SetFramebuffer(entry->framebuffer);
+ FramebufferManager::FramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_ARRAY, entry->texture, 0);
+ }
+
+ TextureCache::SetStage();
+ return entry;
}
void TextureCache::TCacheEntry::Load(unsigned int width, unsigned int height,
@@ -150,32 +156,6 @@ void TextureCache::TCacheEntry::Load(unsigned int width, unsigned int height,
TextureCache::SetStage();
}
-TextureCache::TCacheEntryBase* TextureCache::CreateRenderTargetTexture(
- unsigned int scaled_tex_w, unsigned int scaled_tex_h, unsigned int layers)
-{
- TCacheEntryConfig config;
- config.width = scaled_tex_w;
- config.height = scaled_tex_h;
- config.layers = layers;
- config.rendertarget = true;
- TCacheEntry *const entry = new TCacheEntry(config);
-
- glActiveTexture(GL_TEXTURE0+9);
- glBindTexture(GL_TEXTURE_2D_ARRAY, entry->texture);
-
- glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 0);
- glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, scaled_tex_w, scaled_tex_h, layers, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
- glBindTexture(GL_TEXTURE_2D_ARRAY, 0);
-
- glGenFramebuffers(1, &entry->framebuffer);
- FramebufferManager::SetFramebuffer(entry->framebuffer);
- FramebufferManager::FramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_ARRAY, entry->texture, 0);
-
- SetStage();
-
- return entry;
-}
-
void TextureCache::TCacheEntry::FromRenderTarget(u32 dstAddr, unsigned int dstFormat,
PEControl::PixelFormat srcFormat, const EFBRectangle& srcRect,
bool isIntensity, bool scaleByHalf, unsigned int cbufid,