diff options
| author | degasus <wickmarkus@web.de> | 2015-01-17 10:01:41 +0100 |
|---|---|---|
| committer | degasus <wickmarkus@web.de> | 2015-01-18 19:47:48 +0100 |
| commit | 6cd6e6546f8a6481bd343fb9d1e22238491c2578 (patch) | |
| tree | f7c78f911296cf706e769eec6ddd31df87bf62ff /Source/Core/VideoBackends/OGL/TextureCache.cpp | |
| parent | 615ae9f10626171fddbbbd0a23cd3e018fc960ef (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.cpp | 54 |
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, |
