diff options
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer_cache.cpp | 8 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer_cache.h | 3 | ||||
| -rw-r--r-- | src/video_core/surface.cpp | 18 | ||||
| -rw-r--r-- | src/video_core/surface.h | 2 |
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 | ||
| 53 | bool 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 | |||
| 53 | PixelFormat PixelFormatFromDepthFormat(Tegra::DepthFormat format) { | 71 | PixelFormat 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 | ||
| 442 | bool SurfaceTargetIsLayered(SurfaceTarget target); | 442 | bool SurfaceTargetIsLayered(SurfaceTarget target); |
| 443 | 443 | ||
| 444 | bool SurfaceTargetIsArray(SurfaceTarget target); | ||
| 445 | |||
| 444 | PixelFormat PixelFormatFromDepthFormat(Tegra::DepthFormat format); | 446 | PixelFormat PixelFormatFromDepthFormat(Tegra::DepthFormat format); |
| 445 | 447 | ||
| 446 | PixelFormat PixelFormatFromRenderTargetFormat(Tegra::RenderTargetFormat format); | 448 | PixelFormat PixelFormatFromRenderTargetFormat(Tegra::RenderTargetFormat format); |