summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2019-01-29 20:33:56 -0300
committerGravatar ReinUsesLisp2019-01-29 23:49:02 -0300
commitf58a6152fc89626e4a8f1746af46e9260d17d404 (patch)
tree1a7d46460ca7f43c2f7b38be5829736597ffb1e6 /src
parenthle/ipc_helpers: Fix clang-format warnings (diff)
downloadyuzu-f58a6152fc89626e4a8f1746af46e9260d17d404.tar.gz
yuzu-f58a6152fc89626e4a8f1746af46e9260d17d404.tar.xz
yuzu-f58a6152fc89626e4a8f1746af46e9260d17d404.zip
gl_shader_cache: Fix texture view for cubemaps as cubemap arrays
Cubemaps are considered layered and to create a texture view the texture mustn't be a layered texture, resulting in cubemaps being bound as cubemap arrays. To fix this issue this commit introduces an extra surface parameter called "is_array" and uses this to query for texture view creation. Now that texture views for cubemaps are actually being created, this also fixes the number of layers created for the texture view (since they have to be 6 to create a texture view of cubemaps).
Diffstat (limited to 'src')
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer_cache.cpp8
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer_cache.h3
-rw-r--r--src/video_core/surface.cpp18
-rw-r--r--src/video_core/surface.h2
4 files changed, 28 insertions, 3 deletions
diff --git a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
index a05b8b936..c44e2aca2 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
@@ -167,6 +167,7 @@ std::size_t SurfaceParams::InnerMemorySize(bool force_gl, bool layer_only,
167 } 167 }
168 168
169 params.is_layered = SurfaceTargetIsLayered(params.target); 169 params.is_layered = SurfaceTargetIsLayered(params.target);
170 params.is_array = SurfaceTargetIsArray(params.target);
170 params.max_mip_level = config.tic.max_mip_level + 1; 171 params.max_mip_level = config.tic.max_mip_level + 1;
171 params.rt = {}; 172 params.rt = {};
172 173
@@ -877,10 +878,13 @@ void CachedSurface::EnsureTextureView() {
877 UNIMPLEMENTED_IF(gl_is_compressed); 878 UNIMPLEMENTED_IF(gl_is_compressed);
878 879
879 const GLenum target{TargetLayer()}; 880 const GLenum target{TargetLayer()};
881 const GLuint num_layers{target == GL_TEXTURE_CUBE_MAP_ARRAY ? 6u : 1u};
882 constexpr GLuint min_layer = 0;
883 constexpr GLuint min_level = 0;
880 884
881 texture_view.Create(); 885 texture_view.Create();
882 glTextureView(texture_view.handle, target, texture.handle, gl_internal_format, 0, 886 glTextureView(texture_view.handle, target, texture.handle, gl_internal_format, min_level,
883 params.max_mip_level, 0, 1); 887 params.max_mip_level, min_layer, num_layers);
884 888
885 OpenGLState cur_state = OpenGLState::GetCurState(); 889 OpenGLState cur_state = OpenGLState::GetCurState();
886 const auto& old_tex = cur_state.texture_units[0]; 890 const auto& old_tex = cur_state.texture_units[0];
diff --git a/src/video_core/renderer_opengl/gl_rasterizer_cache.h b/src/video_core/renderer_opengl/gl_rasterizer_cache.h
index 37611c4fc..dae0feb20 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer_cache.h
+++ b/src/video_core/renderer_opengl/gl_rasterizer_cache.h
@@ -225,6 +225,7 @@ struct SurfaceParams {
225 SurfaceTarget target; 225 SurfaceTarget target;
226 u32 max_mip_level; 226 u32 max_mip_level;
227 bool is_layered; 227 bool is_layered;
228 bool is_array;
228 bool srgb_conversion; 229 bool srgb_conversion;
229 // Parameters used for caching 230 // Parameters used for caching
230 VAddr addr; 231 VAddr addr;
@@ -294,7 +295,7 @@ public:
294 } 295 }
295 296
296 const OGLTexture& TextureLayer() { 297 const OGLTexture& TextureLayer() {
297 if (params.is_layered) { 298 if (params.is_array) {
298 return Texture(); 299 return Texture();
299 } 300 }
300 EnsureTextureView(); 301 EnsureTextureView();
diff --git a/src/video_core/surface.cpp b/src/video_core/surface.cpp
index 1a344229f..2f6612a35 100644
--- a/src/video_core/surface.cpp
+++ b/src/video_core/surface.cpp
@@ -50,6 +50,24 @@ bool SurfaceTargetIsLayered(SurfaceTarget target) {
50 } 50 }
51} 51}
52 52
53bool SurfaceTargetIsArray(SurfaceTarget target) {
54 switch (target) {
55 case SurfaceTarget::Texture1D:
56 case SurfaceTarget::Texture2D:
57 case SurfaceTarget::Texture3D:
58 case SurfaceTarget::TextureCubemap:
59 return false;
60 case SurfaceTarget::Texture1DArray:
61 case SurfaceTarget::Texture2DArray:
62 case SurfaceTarget::TextureCubeArray:
63 return true;
64 default:
65 LOG_CRITICAL(HW_GPU, "Unimplemented surface_target={}", static_cast<u32>(target));
66 UNREACHABLE();
67 return false;
68 }
69}
70
53PixelFormat PixelFormatFromDepthFormat(Tegra::DepthFormat format) { 71PixelFormat PixelFormatFromDepthFormat(Tegra::DepthFormat format) {
54 switch (format) { 72 switch (format) {
55 case Tegra::DepthFormat::S8_Z24_UNORM: 73 case Tegra::DepthFormat::S8_Z24_UNORM:
diff --git a/src/video_core/surface.h b/src/video_core/surface.h
index c2259c3c2..edd3816ba 100644
--- a/src/video_core/surface.h
+++ b/src/video_core/surface.h
@@ -441,6 +441,8 @@ SurfaceTarget SurfaceTargetFromTextureType(Tegra::Texture::TextureType texture_t
441 441
442bool SurfaceTargetIsLayered(SurfaceTarget target); 442bool SurfaceTargetIsLayered(SurfaceTarget target);
443 443
444bool SurfaceTargetIsArray(SurfaceTarget target);
445
444PixelFormat PixelFormatFromDepthFormat(Tegra::DepthFormat format); 446PixelFormat PixelFormatFromDepthFormat(Tegra::DepthFormat format);
445 447
446PixelFormat PixelFormatFromRenderTargetFormat(Tegra::RenderTargetFormat format); 448PixelFormat PixelFormatFromRenderTargetFormat(Tegra::RenderTargetFormat format);