diff options
| author | 2019-05-07 19:09:34 -0400 | |
|---|---|---|
| committer | 2019-06-20 21:36:12 -0300 | |
| commit | 1af4414861fda5cad2549372e65ecda090caf2f8 (patch) | |
| tree | 683e4a726b5009d3b39678c8d9fecb4e7a260bf5 /src | |
| parent | Change texture_cache chaching from GPUAddr to CacheAddr (diff) | |
| download | yuzu-1af4414861fda5cad2549372e65ecda090caf2f8.tar.gz yuzu-1af4414861fda5cad2549372e65ecda090caf2f8.tar.xz yuzu-1af4414861fda5cad2549372e65ecda090caf2f8.zip | |
Correct Mipmaps View method in Texture Cache
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/renderer_opengl/gl_texture_cache.cpp | 44 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_texture_cache.h | 12 | ||||
| -rw-r--r-- | src/video_core/texture_cache/surface_base.h | 5 |
3 files changed, 29 insertions, 32 deletions
diff --git a/src/video_core/renderer_opengl/gl_texture_cache.cpp b/src/video_core/renderer_opengl/gl_texture_cache.cpp index 871608f6d..575608266 100644 --- a/src/video_core/renderer_opengl/gl_texture_cache.cpp +++ b/src/video_core/renderer_opengl/gl_texture_cache.cpp | |||
| @@ -233,7 +233,8 @@ CachedSurface::CachedSurface(const GPUVAddr gpu_addr, const SurfaceParams& param | |||
| 233 | main.num_layers = params.is_layered ? params.depth : 1; | 233 | main.num_layers = params.is_layered ? params.depth : 1; |
| 234 | main.target = params.target; | 234 | main.target = params.target; |
| 235 | main_view = CreateView(main); | 235 | main_view = CreateView(main); |
| 236 | main_view->DecorateViewName(gpu_addr, params.TargetName() + "V:" + std::to_string(view_count++)); | 236 | main_view->DecorateViewName(gpu_addr, |
| 237 | params.TargetName() + "V:" + std::to_string(view_count++)); | ||
| 237 | } | 238 | } |
| 238 | 239 | ||
| 239 | CachedSurface::~CachedSurface() { | 240 | CachedSurface::~CachedSurface() { |
| @@ -350,7 +351,7 @@ void CachedSurface::DecorateSurfaceName() { | |||
| 350 | } | 351 | } |
| 351 | 352 | ||
| 352 | void CachedSurfaceView::DecorateViewName(GPUVAddr gpu_addr, std::string prefix) { | 353 | void CachedSurfaceView::DecorateViewName(GPUVAddr gpu_addr, std::string prefix) { |
| 353 | LabelGLObject(GL_TEXTURE, texture_view.texture.handle, gpu_addr, prefix); | 354 | LabelGLObject(GL_TEXTURE, texture_view.handle, gpu_addr, prefix); |
| 354 | } | 355 | } |
| 355 | 356 | ||
| 356 | View CachedSurface::CreateView(const ViewParams& view_key) { | 357 | View CachedSurface::CreateView(const ViewParams& view_key) { |
| @@ -364,6 +365,7 @@ CachedSurfaceView::CachedSurfaceView(CachedSurface& surface, const ViewParams& p | |||
| 364 | : VideoCommon::ViewBase(params), surface{surface} { | 365 | : VideoCommon::ViewBase(params), surface{surface} { |
| 365 | target = GetTextureTarget(params.target); | 366 | target = GetTextureTarget(params.target); |
| 366 | texture_view = CreateTextureView(); | 367 | texture_view = CreateTextureView(); |
| 368 | swizzle = EncodeSwizzle(SwizzleSource::R, SwizzleSource::G, SwizzleSource::B, SwizzleSource::A); | ||
| 367 | } | 369 | } |
| 368 | 370 | ||
| 369 | CachedSurfaceView::~CachedSurfaceView() = default; | 371 | CachedSurfaceView::~CachedSurfaceView() = default; |
| @@ -371,20 +373,24 @@ CachedSurfaceView::~CachedSurfaceView() = default; | |||
| 371 | void CachedSurfaceView::Attach(GLenum attachment) const { | 373 | void CachedSurfaceView::Attach(GLenum attachment) const { |
| 372 | ASSERT(params.num_layers == 1 && params.num_levels == 1); | 374 | ASSERT(params.num_layers == 1 && params.num_levels == 1); |
| 373 | 375 | ||
| 374 | switch (params.target) { | 376 | const auto& owner_params = surface.GetSurfaceParams(); |
| 377 | |||
| 378 | switch (owner_params.target) { | ||
| 375 | case SurfaceTarget::Texture1D: | 379 | case SurfaceTarget::Texture1D: |
| 376 | glFramebufferTexture1D(GL_DRAW_FRAMEBUFFER, attachment, target, | 380 | glFramebufferTexture1D(GL_DRAW_FRAMEBUFFER, attachment, surface.GetTarget(), |
| 377 | surface.GetTexture(), params.base_level); | 381 | surface.GetTexture(), |
| 382 | params.base_level); | ||
| 378 | break; | 383 | break; |
| 379 | case SurfaceTarget::Texture2D: | 384 | case SurfaceTarget::Texture2D: |
| 380 | glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, attachment, target, | 385 | glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, attachment, surface.GetTarget(), |
| 381 | surface.GetTexture(), params.base_level); | 386 | surface.GetTexture(), |
| 387 | params.base_level); | ||
| 382 | break; | 388 | break; |
| 383 | case SurfaceTarget::Texture1DArray: | 389 | case SurfaceTarget::Texture1DArray: |
| 384 | case SurfaceTarget::Texture2DArray: | 390 | case SurfaceTarget::Texture2DArray: |
| 385 | case SurfaceTarget::TextureCubemap: | 391 | case SurfaceTarget::TextureCubemap: |
| 386 | case SurfaceTarget::TextureCubeArray: | 392 | case SurfaceTarget::TextureCubeArray: |
| 387 | glFramebufferTextureLayer(GL_DRAW_FRAMEBUFFER, attachment, target, | 393 | glFramebufferTextureLayer(GL_DRAW_FRAMEBUFFER, attachment, surface.GetTexture(), |
| 388 | params.base_level, params.base_layer); | 394 | params.base_level, params.base_layer); |
| 389 | break; | 395 | break; |
| 390 | default: | 396 | default: |
| @@ -394,22 +400,22 @@ void CachedSurfaceView::Attach(GLenum attachment) const { | |||
| 394 | 400 | ||
| 395 | void CachedSurfaceView::ApplySwizzle(SwizzleSource x_source, SwizzleSource y_source, | 401 | void CachedSurfaceView::ApplySwizzle(SwizzleSource x_source, SwizzleSource y_source, |
| 396 | SwizzleSource z_source, SwizzleSource w_source) { | 402 | SwizzleSource z_source, SwizzleSource w_source) { |
| 397 | u32 swizzle = EncodeSwizzle(x_source, y_source, z_source, w_source); | 403 | u32 new_swizzle = EncodeSwizzle(x_source, y_source, z_source, w_source); |
| 398 | if (swizzle == texture_view.swizzle) | 404 | if (new_swizzle == swizzle) |
| 399 | return; | 405 | return; |
| 406 | swizzle = new_swizzle; | ||
| 400 | const std::array<GLint, 4> gl_swizzle = {GetSwizzleSource(x_source), GetSwizzleSource(y_source), | 407 | const std::array<GLint, 4> gl_swizzle = {GetSwizzleSource(x_source), GetSwizzleSource(y_source), |
| 401 | GetSwizzleSource(z_source), | 408 | GetSwizzleSource(z_source), |
| 402 | GetSwizzleSource(w_source)}; | 409 | GetSwizzleSource(w_source)}; |
| 403 | glTextureParameteriv(texture_view.texture.handle, GL_TEXTURE_SWIZZLE_RGBA, gl_swizzle.data()); | 410 | glTextureParameteriv(texture_view.handle, GL_TEXTURE_SWIZZLE_RGBA, gl_swizzle.data()); |
| 404 | texture_view.swizzle = swizzle; | ||
| 405 | } | 411 | } |
| 406 | 412 | ||
| 407 | CachedSurfaceView::TextureView CachedSurfaceView::CreateTextureView() const { | 413 | OGLTextureView CachedSurfaceView::CreateTextureView() const { |
| 408 | const auto& owner_params = surface.GetSurfaceParams(); | 414 | const auto& owner_params = surface.GetSurfaceParams(); |
| 409 | TextureView texture_view; | 415 | OGLTextureView tv; |
| 410 | texture_view.texture.Create(); | 416 | tv.Create(); |
| 411 | 417 | ||
| 412 | const GLuint handle{texture_view.texture.handle}; | 418 | const GLuint handle{tv.handle}; |
| 413 | const FormatTuple& tuple{ | 419 | const FormatTuple& tuple{ |
| 414 | GetFormatTuple(owner_params.pixel_format, owner_params.component_type)}; | 420 | GetFormatTuple(owner_params.pixel_format, owner_params.component_type)}; |
| 415 | 421 | ||
| @@ -418,11 +424,7 @@ CachedSurfaceView::TextureView CachedSurfaceView::CreateTextureView() const { | |||
| 418 | 424 | ||
| 419 | ApplyTextureDefaults(owner_params, handle); | 425 | ApplyTextureDefaults(owner_params, handle); |
| 420 | 426 | ||
| 421 | u32 swizzle = | 427 | return tv; |
| 422 | EncodeSwizzle(SwizzleSource::R, SwizzleSource::G, SwizzleSource::B, SwizzleSource::A); | ||
| 423 | texture_view.swizzle = swizzle; | ||
| 424 | |||
| 425 | return texture_view; | ||
| 426 | } | 428 | } |
| 427 | 429 | ||
| 428 | TextureCacheOpenGL::TextureCacheOpenGL(Core::System& system, | 430 | TextureCacheOpenGL::TextureCacheOpenGL(Core::System& system, |
diff --git a/src/video_core/renderer_opengl/gl_texture_cache.h b/src/video_core/renderer_opengl/gl_texture_cache.h index 1722c1bbc..083b5406b 100644 --- a/src/video_core/renderer_opengl/gl_texture_cache.h +++ b/src/video_core/renderer_opengl/gl_texture_cache.h | |||
| @@ -74,7 +74,7 @@ public: | |||
| 74 | void Attach(GLenum attachment) const; | 74 | void Attach(GLenum attachment) const; |
| 75 | 75 | ||
| 76 | GLuint GetTexture() { | 76 | GLuint GetTexture() { |
| 77 | return texture_view.texture.handle; | 77 | return texture_view.handle; |
| 78 | } | 78 | } |
| 79 | 79 | ||
| 80 | const SurfaceParams& GetSurfaceParams() const { | 80 | const SurfaceParams& GetSurfaceParams() const { |
| @@ -104,11 +104,6 @@ public: | |||
| 104 | void DecorateViewName(GPUVAddr gpu_addr, std::string prefix); | 104 | void DecorateViewName(GPUVAddr gpu_addr, std::string prefix); |
| 105 | 105 | ||
| 106 | private: | 106 | private: |
| 107 | struct TextureView { | ||
| 108 | OGLTextureView texture; | ||
| 109 | u32 swizzle; | ||
| 110 | }; | ||
| 111 | |||
| 112 | u32 EncodeSwizzle(Tegra::Texture::SwizzleSource x_source, | 107 | u32 EncodeSwizzle(Tegra::Texture::SwizzleSource x_source, |
| 113 | Tegra::Texture::SwizzleSource y_source, | 108 | Tegra::Texture::SwizzleSource y_source, |
| 114 | Tegra::Texture::SwizzleSource z_source, | 109 | Tegra::Texture::SwizzleSource z_source, |
| @@ -117,12 +112,13 @@ private: | |||
| 117 | (static_cast<u32>(z_source) << 8) | static_cast<u32>(w_source); | 112 | (static_cast<u32>(z_source) << 8) | static_cast<u32>(w_source); |
| 118 | } | 113 | } |
| 119 | 114 | ||
| 120 | TextureView CreateTextureView() const; | 115 | OGLTextureView CreateTextureView() const; |
| 121 | 116 | ||
| 122 | CachedSurface& surface; | 117 | CachedSurface& surface; |
| 123 | GLenum target{}; | 118 | GLenum target{}; |
| 124 | 119 | ||
| 125 | TextureView texture_view; | 120 | OGLTextureView texture_view; |
| 121 | u32 swizzle; | ||
| 126 | }; | 122 | }; |
| 127 | 123 | ||
| 128 | class TextureCacheOpenGL final : public TextureCacheBase { | 124 | class TextureCacheOpenGL final : public TextureCacheBase { |
diff --git a/src/video_core/texture_cache/surface_base.h b/src/video_core/texture_cache/surface_base.h index 74be3237d..486585c9c 100644 --- a/src/video_core/texture_cache/surface_base.h +++ b/src/video_core/texture_cache/surface_base.h | |||
| @@ -282,8 +282,7 @@ public: | |||
| 282 | return {}; | 282 | return {}; |
| 283 | } | 283 | } |
| 284 | const std::size_t size = view_params.GetGuestSizeInBytes(); | 284 | const std::size_t size = view_params.GetGuestSizeInBytes(); |
| 285 | const GPUVAddr relative_address = view_addr - gpu_addr; | 285 | auto layer_mipmap = GetLayerMipmap(view_addr); |
| 286 | auto layer_mipmap = GetLayerMipmap(relative_address); | ||
| 287 | if (!layer_mipmap) { | 286 | if (!layer_mipmap) { |
| 288 | return {}; | 287 | return {}; |
| 289 | } | 288 | } |
| @@ -298,7 +297,7 @@ public: | |||
| 298 | vp.num_layers = 1; | 297 | vp.num_layers = 1; |
| 299 | vp.base_level = mipmap; | 298 | vp.base_level = mipmap; |
| 300 | vp.num_levels = 1; | 299 | vp.num_levels = 1; |
| 301 | vp.target = params.target; | 300 | vp.target = view_params.target; |
| 302 | return {GetView(vp)}; | 301 | return {GetView(vp)}; |
| 303 | } | 302 | } |
| 304 | 303 | ||