summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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);