summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Fernando Sahmkow2019-05-07 19:09:34 -0400
committerGravatar ReinUsesLisp2019-06-20 21:36:12 -0300
commit1af4414861fda5cad2549372e65ecda090caf2f8 (patch)
tree683e4a726b5009d3b39678c8d9fecb4e7a260bf5 /src
parentChange texture_cache chaching from GPUAddr to CacheAddr (diff)
downloadyuzu-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.cpp44
-rw-r--r--src/video_core/renderer_opengl/gl_texture_cache.h12
-rw-r--r--src/video_core/texture_cache/surface_base.h5
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
239CachedSurface::~CachedSurface() { 240CachedSurface::~CachedSurface() {
@@ -350,7 +351,7 @@ void CachedSurface::DecorateSurfaceName() {
350} 351}
351 352
352void CachedSurfaceView::DecorateViewName(GPUVAddr gpu_addr, std::string prefix) { 353void 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
356View CachedSurface::CreateView(const ViewParams& view_key) { 357View 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
369CachedSurfaceView::~CachedSurfaceView() = default; 371CachedSurfaceView::~CachedSurfaceView() = default;
@@ -371,20 +373,24 @@ CachedSurfaceView::~CachedSurfaceView() = default;
371void CachedSurfaceView::Attach(GLenum attachment) const { 373void 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
395void CachedSurfaceView::ApplySwizzle(SwizzleSource x_source, SwizzleSource y_source, 401void 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
407CachedSurfaceView::TextureView CachedSurfaceView::CreateTextureView() const { 413OGLTextureView 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
428TextureCacheOpenGL::TextureCacheOpenGL(Core::System& system, 430TextureCacheOpenGL::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
106private: 106private:
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
128class TextureCacheOpenGL final : public TextureCacheBase { 124class 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