Przeglądaj źródła

Correct Mipmaps View method in Texture Cache

Fernando Sahmkow 7 lat temu
rodzic
commit
1af4414861

+ 23 - 21
src/video_core/renderer_opengl/gl_texture_cache.cpp

@@ -233,7 +233,8 @@ CachedSurface::CachedSurface(const GPUVAddr gpu_addr, const SurfaceParams& param
     main.num_layers = params.is_layered ? params.depth : 1;
     main.num_layers = params.is_layered ? params.depth : 1;
     main.target = params.target;
     main.target = params.target;
     main_view = CreateView(main);
     main_view = CreateView(main);
-    main_view->DecorateViewName(gpu_addr, params.TargetName() + "V:" + std::to_string(view_count++));
+    main_view->DecorateViewName(gpu_addr,
+                                params.TargetName() + "V:" + std::to_string(view_count++));
 }
 }
 
 
 CachedSurface::~CachedSurface() {
 CachedSurface::~CachedSurface() {
@@ -350,7 +351,7 @@ void CachedSurface::DecorateSurfaceName() {
 }
 }
 
 
 void CachedSurfaceView::DecorateViewName(GPUVAddr gpu_addr, std::string prefix) {
 void CachedSurfaceView::DecorateViewName(GPUVAddr gpu_addr, std::string prefix) {
-    LabelGLObject(GL_TEXTURE, texture_view.texture.handle, gpu_addr, prefix);
+    LabelGLObject(GL_TEXTURE, texture_view.handle, gpu_addr, prefix);
 }
 }
 
 
 View CachedSurface::CreateView(const ViewParams& view_key) {
 View CachedSurface::CreateView(const ViewParams& view_key) {
@@ -364,6 +365,7 @@ CachedSurfaceView::CachedSurfaceView(CachedSurface& surface, const ViewParams& p
     : VideoCommon::ViewBase(params), surface{surface} {
     : VideoCommon::ViewBase(params), surface{surface} {
     target = GetTextureTarget(params.target);
     target = GetTextureTarget(params.target);
     texture_view = CreateTextureView();
     texture_view = CreateTextureView();
+    swizzle = EncodeSwizzle(SwizzleSource::R, SwizzleSource::G, SwizzleSource::B, SwizzleSource::A);
 }
 }
 
 
 CachedSurfaceView::~CachedSurfaceView() = default;
 CachedSurfaceView::~CachedSurfaceView() = default;
@@ -371,20 +373,24 @@ CachedSurfaceView::~CachedSurfaceView() = default;
 void CachedSurfaceView::Attach(GLenum attachment) const {
 void CachedSurfaceView::Attach(GLenum attachment) const {
     ASSERT(params.num_layers == 1 && params.num_levels == 1);
     ASSERT(params.num_layers == 1 && params.num_levels == 1);
 
 
-    switch (params.target) {
+    const auto& owner_params = surface.GetSurfaceParams();
+
+    switch (owner_params.target) {
     case SurfaceTarget::Texture1D:
     case SurfaceTarget::Texture1D:
-        glFramebufferTexture1D(GL_DRAW_FRAMEBUFFER, attachment, target,
-                               surface.GetTexture(), params.base_level);
+        glFramebufferTexture1D(GL_DRAW_FRAMEBUFFER, attachment, surface.GetTarget(),
+                               surface.GetTexture(),
+                               params.base_level);
         break;
         break;
     case SurfaceTarget::Texture2D:
     case SurfaceTarget::Texture2D:
-        glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, attachment, target,
-                               surface.GetTexture(), params.base_level);
+        glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, attachment, surface.GetTarget(),
+                               surface.GetTexture(),
+                               params.base_level);
         break;
         break;
     case SurfaceTarget::Texture1DArray:
     case SurfaceTarget::Texture1DArray:
     case SurfaceTarget::Texture2DArray:
     case SurfaceTarget::Texture2DArray:
     case SurfaceTarget::TextureCubemap:
     case SurfaceTarget::TextureCubemap:
     case SurfaceTarget::TextureCubeArray:
     case SurfaceTarget::TextureCubeArray:
-        glFramebufferTextureLayer(GL_DRAW_FRAMEBUFFER, attachment, target,
+        glFramebufferTextureLayer(GL_DRAW_FRAMEBUFFER, attachment, surface.GetTexture(),
                                   params.base_level, params.base_layer);
                                   params.base_level, params.base_layer);
         break;
         break;
     default:
     default:
@@ -394,22 +400,22 @@ void CachedSurfaceView::Attach(GLenum attachment) const {
 
 
 void CachedSurfaceView::ApplySwizzle(SwizzleSource x_source, SwizzleSource y_source,
 void CachedSurfaceView::ApplySwizzle(SwizzleSource x_source, SwizzleSource y_source,
                                      SwizzleSource z_source, SwizzleSource w_source) {
                                      SwizzleSource z_source, SwizzleSource w_source) {
-    u32 swizzle = EncodeSwizzle(x_source, y_source, z_source, w_source);
-    if (swizzle == texture_view.swizzle)
+    u32 new_swizzle = EncodeSwizzle(x_source, y_source, z_source, w_source);
+    if (new_swizzle == swizzle)
         return;
         return;
+    swizzle = new_swizzle;
     const std::array<GLint, 4> gl_swizzle = {GetSwizzleSource(x_source), GetSwizzleSource(y_source),
     const std::array<GLint, 4> gl_swizzle = {GetSwizzleSource(x_source), GetSwizzleSource(y_source),
                                              GetSwizzleSource(z_source),
                                              GetSwizzleSource(z_source),
                                              GetSwizzleSource(w_source)};
                                              GetSwizzleSource(w_source)};
-    glTextureParameteriv(texture_view.texture.handle, GL_TEXTURE_SWIZZLE_RGBA, gl_swizzle.data());
-    texture_view.swizzle = swizzle;
+    glTextureParameteriv(texture_view.handle, GL_TEXTURE_SWIZZLE_RGBA, gl_swizzle.data());
 }
 }
 
 
-CachedSurfaceView::TextureView CachedSurfaceView::CreateTextureView() const {
+OGLTextureView CachedSurfaceView::CreateTextureView() const {
     const auto& owner_params = surface.GetSurfaceParams();
     const auto& owner_params = surface.GetSurfaceParams();
-    TextureView texture_view;
-    texture_view.texture.Create();
+    OGLTextureView tv;
+    tv.Create();
 
 
-    const GLuint handle{texture_view.texture.handle};
+    const GLuint handle{tv.handle};
     const FormatTuple& tuple{
     const FormatTuple& tuple{
         GetFormatTuple(owner_params.pixel_format, owner_params.component_type)};
         GetFormatTuple(owner_params.pixel_format, owner_params.component_type)};
 
 
@@ -418,11 +424,7 @@ CachedSurfaceView::TextureView CachedSurfaceView::CreateTextureView() const {
 
 
     ApplyTextureDefaults(owner_params, handle);
     ApplyTextureDefaults(owner_params, handle);
 
 
-    u32 swizzle =
-        EncodeSwizzle(SwizzleSource::R, SwizzleSource::G, SwizzleSource::B, SwizzleSource::A);
-    texture_view.swizzle = swizzle;
-
-    return texture_view;
+    return tv;
 }
 }
 
 
 TextureCacheOpenGL::TextureCacheOpenGL(Core::System& system,
 TextureCacheOpenGL::TextureCacheOpenGL(Core::System& system,

+ 4 - 8
src/video_core/renderer_opengl/gl_texture_cache.h

@@ -74,7 +74,7 @@ public:
     void Attach(GLenum attachment) const;
     void Attach(GLenum attachment) const;
 
 
     GLuint GetTexture() {
     GLuint GetTexture() {
-        return texture_view.texture.handle;
+        return texture_view.handle;
     }
     }
 
 
     const SurfaceParams& GetSurfaceParams() const {
     const SurfaceParams& GetSurfaceParams() const {
@@ -104,11 +104,6 @@ public:
     void DecorateViewName(GPUVAddr gpu_addr, std::string prefix);
     void DecorateViewName(GPUVAddr gpu_addr, std::string prefix);
 
 
 private:
 private:
-    struct TextureView {
-        OGLTextureView texture;
-        u32 swizzle;
-    };
-
     u32 EncodeSwizzle(Tegra::Texture::SwizzleSource x_source,
     u32 EncodeSwizzle(Tegra::Texture::SwizzleSource x_source,
                       Tegra::Texture::SwizzleSource y_source,
                       Tegra::Texture::SwizzleSource y_source,
                       Tegra::Texture::SwizzleSource z_source,
                       Tegra::Texture::SwizzleSource z_source,
@@ -117,12 +112,13 @@ private:
                (static_cast<u32>(z_source) << 8) | static_cast<u32>(w_source);
                (static_cast<u32>(z_source) << 8) | static_cast<u32>(w_source);
     }
     }
 
 
-    TextureView CreateTextureView() const;
+    OGLTextureView CreateTextureView() const;
 
 
     CachedSurface& surface;
     CachedSurface& surface;
     GLenum target{};
     GLenum target{};
 
 
-    TextureView texture_view;
+    OGLTextureView texture_view;
+    u32 swizzle;
 };
 };
 
 
 class TextureCacheOpenGL final : public TextureCacheBase {
 class TextureCacheOpenGL final : public TextureCacheBase {

+ 2 - 3
src/video_core/texture_cache/surface_base.h

@@ -282,8 +282,7 @@ public:
             return {};
             return {};
         }
         }
         const std::size_t size = view_params.GetGuestSizeInBytes();
         const std::size_t size = view_params.GetGuestSizeInBytes();
-        const GPUVAddr relative_address = view_addr - gpu_addr;
-        auto layer_mipmap = GetLayerMipmap(relative_address);
+        auto layer_mipmap = GetLayerMipmap(view_addr);
         if (!layer_mipmap) {
         if (!layer_mipmap) {
             return {};
             return {};
         }
         }
@@ -298,7 +297,7 @@ public:
         vp.num_layers = 1;
         vp.num_layers = 1;
         vp.base_level = mipmap;
         vp.base_level = mipmap;
         vp.num_levels = 1;
         vp.num_levels = 1;
-        vp.target = params.target;
+        vp.target = view_params.target;
         return {GetView(vp)};
         return {GetView(vp)};
     }
     }