summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer_cache.cpp14
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer_cache.h2
-rw-r--r--src/video_core/surface.cpp3
-rw-r--r--src/video_core/surface.h1
4 files changed, 20 insertions, 0 deletions
diff --git a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
index f194a7687..752c4ee84 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
@@ -128,6 +128,13 @@ std::size_t SurfaceParams::InnerMemorySize(bool force_gl, bool layer_only,
128 params.target = SurfaceTarget::Texture2D; 128 params.target = SurfaceTarget::Texture2D;
129 } 129 }
130 break; 130 break;
131 case SurfaceTarget::TextureCubeArray:
132 params.depth = config.tic.Depth() * 6;
133 if (!entry.IsArray()) {
134 ASSERT(params.depth == 6);
135 params.target = SurfaceTarget::TextureCubemap;
136 }
137 break;
131 default: 138 default:
132 LOG_CRITICAL(HW_GPU, "Unknown depth for target={}", static_cast<u32>(params.target)); 139 LOG_CRITICAL(HW_GPU, "Unknown depth for target={}", static_cast<u32>(params.target));
133 UNREACHABLE(); 140 UNREACHABLE();
@@ -334,6 +341,8 @@ static GLenum SurfaceTargetToGL(SurfaceTarget target) {
334 return GL_TEXTURE_2D_ARRAY; 341 return GL_TEXTURE_2D_ARRAY;
335 case SurfaceTarget::TextureCubemap: 342 case SurfaceTarget::TextureCubemap:
336 return GL_TEXTURE_CUBE_MAP; 343 return GL_TEXTURE_CUBE_MAP;
344 case SurfaceTarget::TextureCubeArray:
345 return GL_TEXTURE_CUBE_MAP_ARRAY_ARB;
337 } 346 }
338 LOG_CRITICAL(Render_OpenGL, "Unimplemented texture target={}", static_cast<u32>(target)); 347 LOG_CRITICAL(Render_OpenGL, "Unimplemented texture target={}", static_cast<u32>(target));
339 UNREACHABLE(); 348 UNREACHABLE();
@@ -754,6 +763,7 @@ static void CopySurface(const Surface& src_surface, const Surface& dst_surface,
754 break; 763 break;
755 case SurfaceTarget::Texture3D: 764 case SurfaceTarget::Texture3D:
756 case SurfaceTarget::Texture2DArray: 765 case SurfaceTarget::Texture2DArray:
766 case SurfaceTarget::TextureCubeArray:
757 glTextureSubImage3D(dst_surface->Texture().handle, 0, 0, 0, 0, width, height, 767 glTextureSubImage3D(dst_surface->Texture().handle, 0, 0, 0, 0, width, height,
758 static_cast<GLsizei>(dst_params.depth), dest_format.format, 768 static_cast<GLsizei>(dst_params.depth), dest_format.format,
759 dest_format.type, nullptr); 769 dest_format.type, nullptr);
@@ -806,6 +816,7 @@ CachedSurface::CachedSurface(const SurfaceParams& params)
806 break; 816 break;
807 case SurfaceTarget::Texture3D: 817 case SurfaceTarget::Texture3D:
808 case SurfaceTarget::Texture2DArray: 818 case SurfaceTarget::Texture2DArray:
819 case SurfaceTarget::TextureCubeArray:
809 glTexStorage3D(SurfaceTargetToGL(params.target), params.max_mip_level, 820 glTexStorage3D(SurfaceTargetToGL(params.target), params.max_mip_level,
810 format_tuple.internal_format, rect.GetWidth(), rect.GetHeight(), 821 format_tuple.internal_format, rect.GetWidth(), rect.GetHeight(),
811 params.depth); 822 params.depth);
@@ -1055,6 +1066,7 @@ void CachedSurface::UploadGLMipmapTexture(u32 mip_map, GLuint read_fb_handle,
1055 &gl_buffer[mip_map][buffer_offset]); 1066 &gl_buffer[mip_map][buffer_offset]);
1056 break; 1067 break;
1057 case SurfaceTarget::Texture2DArray: 1068 case SurfaceTarget::Texture2DArray:
1069 case SurfaceTarget::TextureCubeArray:
1058 glCompressedTexImage3D(SurfaceTargetToGL(params.target), mip_map, tuple.internal_format, 1070 glCompressedTexImage3D(SurfaceTargetToGL(params.target), mip_map, tuple.internal_format,
1059 static_cast<GLsizei>(params.MipWidth(mip_map)), 1071 static_cast<GLsizei>(params.MipWidth(mip_map)),
1060 static_cast<GLsizei>(params.MipHeight(mip_map)), 1072 static_cast<GLsizei>(params.MipHeight(mip_map)),
@@ -1104,6 +1116,7 @@ void CachedSurface::UploadGLMipmapTexture(u32 mip_map, GLuint read_fb_handle,
1104 tuple.format, tuple.type, &gl_buffer[mip_map][buffer_offset]); 1116 tuple.format, tuple.type, &gl_buffer[mip_map][buffer_offset]);
1105 break; 1117 break;
1106 case SurfaceTarget::Texture2DArray: 1118 case SurfaceTarget::Texture2DArray:
1119 case SurfaceTarget::TextureCubeArray:
1107 glTexSubImage3D(SurfaceTargetToGL(params.target), mip_map, x0, y0, 0, 1120 glTexSubImage3D(SurfaceTargetToGL(params.target), mip_map, x0, y0, 0,
1108 static_cast<GLsizei>(rect.GetWidth()), 1121 static_cast<GLsizei>(rect.GetWidth()),
1109 static_cast<GLsizei>(rect.GetHeight()), params.depth, tuple.format, 1122 static_cast<GLsizei>(rect.GetHeight()), params.depth, tuple.format,
@@ -1306,6 +1319,7 @@ Surface RasterizerCacheOpenGL::RecreateSurface(const Surface& old_surface,
1306 break; 1319 break;
1307 case SurfaceTarget::TextureCubemap: 1320 case SurfaceTarget::TextureCubemap:
1308 case SurfaceTarget::Texture3D: 1321 case SurfaceTarget::Texture3D:
1322 case SurfaceTarget::TextureCubeArray:
1309 AccurateCopySurface(old_surface, new_surface); 1323 AccurateCopySurface(old_surface, new_surface);
1310 break; 1324 break;
1311 default: 1325 default:
diff --git a/src/video_core/renderer_opengl/gl_rasterizer_cache.h b/src/video_core/renderer_opengl/gl_rasterizer_cache.h
index f255f4419..5a5f2cec0 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer_cache.h
+++ b/src/video_core/renderer_opengl/gl_rasterizer_cache.h
@@ -49,6 +49,8 @@ struct SurfaceParams {
49 return "Texture2DArray"; 49 return "Texture2DArray";
50 case SurfaceTarget::TextureCubemap: 50 case SurfaceTarget::TextureCubemap:
51 return "TextureCubemap"; 51 return "TextureCubemap";
52 case SurfaceTarget::TextureCubeArray:
53 return "TextureCubeArray";
52 default: 54 default:
53 LOG_CRITICAL(HW_GPU, "Unimplemented surface_target={}", static_cast<u32>(target)); 55 LOG_CRITICAL(HW_GPU, "Unimplemented surface_target={}", static_cast<u32>(target));
54 UNREACHABLE(); 56 UNREACHABLE();
diff --git a/src/video_core/surface.cpp b/src/video_core/surface.cpp
index d9a97e30b..e6941b95f 100644
--- a/src/video_core/surface.cpp
+++ b/src/video_core/surface.cpp
@@ -19,6 +19,8 @@ SurfaceTarget SurfaceTargetFromTextureType(Tegra::Texture::TextureType texture_t
19 return SurfaceTarget::Texture3D; 19 return SurfaceTarget::Texture3D;
20 case Tegra::Texture::TextureType::TextureCubemap: 20 case Tegra::Texture::TextureType::TextureCubemap:
21 return SurfaceTarget::TextureCubemap; 21 return SurfaceTarget::TextureCubemap;
22 case Tegra::Texture::TextureType::TextureCubeArray:
23 return SurfaceTarget::TextureCubeArray;
22 case Tegra::Texture::TextureType::Texture1DArray: 24 case Tegra::Texture::TextureType::Texture1DArray:
23 return SurfaceTarget::Texture1DArray; 25 return SurfaceTarget::Texture1DArray;
24 case Tegra::Texture::TextureType::Texture2DArray: 26 case Tegra::Texture::TextureType::Texture2DArray:
@@ -39,6 +41,7 @@ bool SurfaceTargetIsLayered(SurfaceTarget target) {
39 case SurfaceTarget::Texture1DArray: 41 case SurfaceTarget::Texture1DArray:
40 case SurfaceTarget::Texture2DArray: 42 case SurfaceTarget::Texture2DArray:
41 case SurfaceTarget::TextureCubemap: 43 case SurfaceTarget::TextureCubemap:
44 case SurfaceTarget::TextureCubeArray:
42 return true; 45 return true;
43 default: 46 default:
44 LOG_CRITICAL(HW_GPU, "Unimplemented surface_target={}", static_cast<u32>(target)); 47 LOG_CRITICAL(HW_GPU, "Unimplemented surface_target={}", static_cast<u32>(target));
diff --git a/src/video_core/surface.h b/src/video_core/surface.h
index 3232e437f..25300a193 100644
--- a/src/video_core/surface.h
+++ b/src/video_core/surface.h
@@ -118,6 +118,7 @@ enum class SurfaceTarget {
118 Texture1DArray, 118 Texture1DArray,
119 Texture2DArray, 119 Texture2DArray,
120 TextureCubemap, 120 TextureCubemap,
121 TextureCubeArray,
121}; 122};
122 123
123/** 124/**