diff options
Diffstat (limited to 'src')
4 files changed, 13 insertions, 2 deletions
diff --git a/src/video_core/engines/maxwell_3d.h b/src/video_core/engines/maxwell_3d.h index c8d1b6478..c8af1c6b6 100644 --- a/src/video_core/engines/maxwell_3d.h +++ b/src/video_core/engines/maxwell_3d.h | |||
| @@ -448,7 +448,10 @@ public: | |||
| 448 | BitField<8, 3, u32> block_depth; | 448 | BitField<8, 3, u32> block_depth; |
| 449 | BitField<12, 1, InvMemoryLayout> type; | 449 | BitField<12, 1, InvMemoryLayout> type; |
| 450 | } memory_layout; | 450 | } memory_layout; |
| 451 | u32 array_mode; | 451 | union { |
| 452 | BitField<0, 16, u32> array_mode; | ||
| 453 | BitField<16, 1, u32> volume; | ||
| 454 | }; | ||
| 452 | u32 layer_stride; | 455 | u32 layer_stride; |
| 453 | u32 base_layer; | 456 | u32 base_layer; |
| 454 | INSERT_PADDING_WORDS(7); | 457 | INSERT_PADDING_WORDS(7); |
diff --git a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp index 1cb77aaf2..9c8925383 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp | |||
| @@ -155,6 +155,7 @@ void SurfaceParams::InitCacheParameters(Tegra::GPUVAddr gpu_addr_) { | |||
| 155 | params.rt.index = static_cast<u32>(index); | 155 | params.rt.index = static_cast<u32>(index); |
| 156 | params.rt.array_mode = config.array_mode; | 156 | params.rt.array_mode = config.array_mode; |
| 157 | params.rt.layer_stride = config.layer_stride; | 157 | params.rt.layer_stride = config.layer_stride; |
| 158 | params.rt.volume = config.volume; | ||
| 158 | params.rt.base_layer = config.base_layer; | 159 | params.rt.base_layer = config.base_layer; |
| 159 | 160 | ||
| 160 | params.InitCacheParameters(config.Address()); | 161 | params.InitCacheParameters(config.Address()); |
| @@ -1122,8 +1123,8 @@ Surface RasterizerCacheOpenGL::GetSurface(const SurfaceParams& params, bool pres | |||
| 1122 | } else if (preserve_contents) { | 1123 | } else if (preserve_contents) { |
| 1123 | // If surface parameters changed and we care about keeping the previous data, recreate | 1124 | // If surface parameters changed and we care about keeping the previous data, recreate |
| 1124 | // the surface from the old one | 1125 | // the surface from the old one |
| 1125 | Unregister(surface); | ||
| 1126 | Surface new_surface{RecreateSurface(surface, params)}; | 1126 | Surface new_surface{RecreateSurface(surface, params)}; |
| 1127 | Unregister(surface); | ||
| 1127 | Register(new_surface); | 1128 | Register(new_surface); |
| 1128 | return new_surface; | 1129 | return new_surface; |
| 1129 | } else { | 1130 | } else { |
| @@ -1220,6 +1221,9 @@ Surface RasterizerCacheOpenGL::RecreateSurface(const Surface& old_surface, | |||
| 1220 | CopySurface(old_surface, new_surface, copy_pbo.handle); | 1221 | CopySurface(old_surface, new_surface, copy_pbo.handle); |
| 1221 | } | 1222 | } |
| 1222 | break; | 1223 | break; |
| 1224 | case SurfaceParams::SurfaceTarget::Texture3D: | ||
| 1225 | AccurateCopySurface(old_surface, new_surface); | ||
| 1226 | break; | ||
| 1223 | case SurfaceParams::SurfaceTarget::TextureCubemap: { | 1227 | case SurfaceParams::SurfaceTarget::TextureCubemap: { |
| 1224 | if (old_params.rt.array_mode != 1) { | 1228 | if (old_params.rt.array_mode != 1) { |
| 1225 | // TODO(bunnei): This is used by Breath of the Wild, I'm not sure how to implement this | 1229 | // TODO(bunnei): This is used by Breath of the Wild, I'm not sure how to implement this |
diff --git a/src/video_core/renderer_opengl/gl_rasterizer_cache.h b/src/video_core/renderer_opengl/gl_rasterizer_cache.h index 7c1cb72d0..0dd0d90a3 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer_cache.h +++ b/src/video_core/renderer_opengl/gl_rasterizer_cache.h | |||
| @@ -132,6 +132,8 @@ struct SurfaceParams { | |||
| 132 | case Tegra::Texture::TextureType::Texture2D: | 132 | case Tegra::Texture::TextureType::Texture2D: |
| 133 | case Tegra::Texture::TextureType::Texture2DNoMipmap: | 133 | case Tegra::Texture::TextureType::Texture2DNoMipmap: |
| 134 | return SurfaceTarget::Texture2D; | 134 | return SurfaceTarget::Texture2D; |
| 135 | case Tegra::Texture::TextureType::Texture3D: | ||
| 136 | return SurfaceTarget::Texture3D; | ||
| 135 | case Tegra::Texture::TextureType::TextureCubemap: | 137 | case Tegra::Texture::TextureType::TextureCubemap: |
| 136 | return SurfaceTarget::TextureCubemap; | 138 | return SurfaceTarget::TextureCubemap; |
| 137 | case Tegra::Texture::TextureType::Texture1DArray: | 139 | case Tegra::Texture::TextureType::Texture1DArray: |
| @@ -791,6 +793,7 @@ struct SurfaceParams { | |||
| 791 | struct { | 793 | struct { |
| 792 | u32 index; | 794 | u32 index; |
| 793 | u32 array_mode; | 795 | u32 array_mode; |
| 796 | u32 volume; | ||
| 794 | u32 layer_stride; | 797 | u32 layer_stride; |
| 795 | u32 base_layer; | 798 | u32 base_layer; |
| 796 | } rt; | 799 | } rt; |
diff --git a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp index 55c33c3a9..f4340a017 100644 --- a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp +++ b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp | |||
| @@ -1142,6 +1142,7 @@ private: | |||
| 1142 | case Tegra::Shader::TextureType::Texture2D: { | 1142 | case Tegra::Shader::TextureType::Texture2D: { |
| 1143 | return 2; | 1143 | return 2; |
| 1144 | } | 1144 | } |
| 1145 | case Tegra::Shader::TextureType::Texture3D: | ||
| 1145 | case Tegra::Shader::TextureType::TextureCube: { | 1146 | case Tegra::Shader::TextureType::TextureCube: { |
| 1146 | return 3; | 1147 | return 3; |
| 1147 | } | 1148 | } |