From 84139586c9e6c95a7f3faaa09d04eb11b2bcd70c Mon Sep 17 00:00:00 2001 From: ReinUsesLisp Date: Sun, 14 Apr 2019 18:16:27 -0300 Subject: [PATCH] gl_texture_cache: Attach surface textures instead of views --- .../renderer_opengl/gl_rasterizer.cpp | 22 +++++++-------- .../renderer_opengl/gl_texture_cache.cpp | 27 ++++++++++++++----- .../renderer_opengl/gl_texture_cache.h | 3 ++- 3 files changed, 32 insertions(+), 20 deletions(-) diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index cea268f1e..07c28357e 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp @@ -83,10 +83,10 @@ struct FramebufferCacheKey { bool stencil_enable = false; std::array color_attachments{}; - std::array colors{}; + std::array colors{}; u32 colors_count = 0; - GLuint zeta = 0; + CachedSurfaceView* zeta = nullptr; auto Tie() const { return std::tie(is_single_buffer, stencil_enable, color_attachments, colors, colors_count, @@ -367,25 +367,21 @@ void RasterizerOpenGL::SetupCachedFramebuffer(const FramebufferCacheKey& fbkey, if (fbkey.is_single_buffer) { if (fbkey.color_attachments[0] != GL_NONE) { - glFramebufferTexture(GL_DRAW_FRAMEBUFFER, fbkey.color_attachments[0], fbkey.colors[0], - 0); + fbkey.colors[0]->Attach(fbkey.color_attachments[0]); } glDrawBuffer(fbkey.color_attachments[0]); } else { for (std::size_t index = 0; index < Maxwell::NumRenderTargets; ++index) { if (fbkey.colors[index]) { - glFramebufferTexture(GL_DRAW_FRAMEBUFFER, - GL_COLOR_ATTACHMENT0 + static_cast(index), - fbkey.colors[index], 0); + fbkey.colors[index]->Attach(GL_COLOR_ATTACHMENT0 + static_cast(index)); } } glDrawBuffers(fbkey.colors_count, fbkey.color_attachments.data()); } if (fbkey.zeta) { - GLenum zeta_attachment = - fbkey.stencil_enable ? GL_DEPTH_STENCIL_ATTACHMENT : GL_DEPTH_ATTACHMENT; - glFramebufferTexture(GL_DRAW_FRAMEBUFFER, zeta_attachment, fbkey.zeta, 0); + fbkey.zeta->Attach(fbkey.stencil_enable ? GL_DEPTH_STENCIL_ATTACHMENT + : GL_DEPTH_ATTACHMENT); } } @@ -509,7 +505,7 @@ std::pair RasterizerOpenGL::ConfigureFramebuffers( fbkey.is_single_buffer = true; fbkey.color_attachments[0] = GL_COLOR_ATTACHMENT0 + static_cast(*single_color_target); - fbkey.colors[0] = color_surface != nullptr ? color_surface->GetTexture() : 0; + fbkey.colors[0] = color_surface; } else { // Multiple color attachments are enabled for (std::size_t index = 0; index < Maxwell::NumRenderTargets; ++index) { @@ -529,7 +525,7 @@ std::pair RasterizerOpenGL::ConfigureFramebuffers( fbkey.color_attachments[index] = GL_COLOR_ATTACHMENT0 + regs.rt_control.GetMap(index); - fbkey.colors[index] = color_surface != nullptr ? color_surface->GetTexture() : 0; + fbkey.colors[index] = color_surface; } fbkey.is_single_buffer = false; fbkey.colors_count = regs.rt_control.count; @@ -544,7 +540,7 @@ std::pair RasterizerOpenGL::ConfigureFramebuffers( // the shader doesn't actually write to it. depth_surface->MarkAsModified(true); - fbkey.zeta = depth_surface->GetTexture(); + fbkey.zeta = depth_surface; fbkey.stencil_enable = regs.stencil_enable && depth_surface->GetSurfaceParams().GetType() == SurfaceType::DepthStencil; } diff --git a/src/video_core/renderer_opengl/gl_texture_cache.cpp b/src/video_core/renderer_opengl/gl_texture_cache.cpp index 00f9ab92f..ba6d3af4b 100644 --- a/src/video_core/renderer_opengl/gl_texture_cache.cpp +++ b/src/video_core/renderer_opengl/gl_texture_cache.cpp @@ -428,13 +428,28 @@ CachedSurfaceView::CachedSurfaceView(CachedSurface& surface, ViewKey key) CachedSurfaceView::~CachedSurfaceView() = default; -GLuint CachedSurfaceView::GetTexture() { - // TODO(Rodrigo): Remove this entry and attach the super texture to the framebuffer through - // legacy API (also dropping Intel driver issues). - if (texture_view_2d.texture.handle == 0) { - texture_view_2d = CreateTextureView(GL_TEXTURE_2D); +void CachedSurfaceView::Attach(GLenum attachment) const { + ASSERT(key.num_layers == 1 && key.num_levels == 1); + + switch (params.GetTarget()) { + case SurfaceTarget::Texture1D: + glFramebufferTexture1D(GL_DRAW_FRAMEBUFFER, attachment, surface.GetTarget(), + surface.GetTexture(), key.base_level); + break; + case SurfaceTarget::Texture2D: + glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, attachment, surface.GetTarget(), + surface.GetTexture(), key.base_level); + break; + case SurfaceTarget::Texture1DArray: + case SurfaceTarget::Texture2DArray: + case SurfaceTarget::TextureCubemap: + case SurfaceTarget::TextureCubeArray: + glFramebufferTextureLayer(GL_DRAW_FRAMEBUFFER, attachment, surface.GetTexture(), + key.base_level, key.base_layer); + break; + default: + UNIMPLEMENTED(); } - return texture_view_2d.texture.handle; } GLuint CachedSurfaceView::GetTexture(Tegra::Shader::TextureType texture_type, bool is_array, diff --git a/src/video_core/renderer_opengl/gl_texture_cache.h b/src/video_core/renderer_opengl/gl_texture_cache.h index b18b32d99..80733ac36 100644 --- a/src/video_core/renderer_opengl/gl_texture_cache.h +++ b/src/video_core/renderer_opengl/gl_texture_cache.h @@ -73,7 +73,8 @@ public: explicit CachedSurfaceView(CachedSurface& surface, ViewKey key); ~CachedSurfaceView(); - GLuint GetTexture(); + /// Attaches this texture view to the current bound GL_DRAW_FRAMEBUFFER + void Attach(GLenum attachment) const; GLuint GetTexture(Tegra::Shader::TextureType texture_type, bool is_array, Tegra::Texture::SwizzleSource x_source,