gl_rasterizer_cache: Fixes to how we do render to cubemap.
- Fixes issues with Splatoon 2.
This commit is contained in:
		| @@ -1058,9 +1058,6 @@ Surface RasterizerCacheOpenGL::RecreateSurface(const Surface& old_surface, | ||||
|         } | ||||
|         break; | ||||
|     case SurfaceParams::SurfaceTarget::TextureCubemap: { | ||||
|         const u32 byte_stride{old_params.rt.layer_stride * | ||||
|                               (SurfaceParams::GetFormatBpp(old_params.pixel_format) / CHAR_BIT)}; | ||||
|  | ||||
|         if (old_params.rt.array_mode != 1) { | ||||
|             // TODO(bunnei): This is used by Breath of the Wild, I'm not sure how to implement this | ||||
|             // yet (array rendering used as a cubemap texture). | ||||
| @@ -1070,15 +1067,14 @@ Surface RasterizerCacheOpenGL::RecreateSurface(const Surface& old_surface, | ||||
|         } | ||||
|  | ||||
|         // This seems to be used for render-to-cubemap texture | ||||
|         const std::size_t size_with_mipmaps{new_params.SizeInBytes2DWithMipmap()}; | ||||
|         ASSERT_MSG(size_with_mipmaps == byte_stride, "Unexpected"); | ||||
|         ASSERT_MSG(old_params.target == SurfaceParams::SurfaceTarget::Texture2D, "Unexpected"); | ||||
|         ASSERT_MSG(old_params.pixel_format == new_params.pixel_format, "Unexpected"); | ||||
|         ASSERT_MSG(old_params.width == new_params.width, "Unexpected"); | ||||
|         ASSERT_MSG(old_params.height == new_params.height, "Unexpected"); | ||||
|         ASSERT_MSG(old_params.rt.array_mode == 1, "Unexpected"); | ||||
|         ASSERT_MSG(old_params.rt.base_layer == 0, "Unimplemented"); | ||||
|  | ||||
|         // TODO(bunnei): Verify the below - this stride seems to be in 32-bit words, not pixels. | ||||
|         // Tested with Splatoon 2, Super Mario Odyssey, and Breath of the Wild. | ||||
|         const std::size_t byte_stride{old_params.rt.layer_stride * sizeof(u32)}; | ||||
|  | ||||
|         for (std::size_t index = 0; index < new_params.depth; ++index) { | ||||
|             Surface face_surface{TryGetReservedSurface(old_params)}; | ||||
|             ASSERT_MSG(face_surface, "Unexpected"); | ||||
| @@ -1092,7 +1088,7 @@ Surface RasterizerCacheOpenGL::RecreateSurface(const Surface& old_surface, | ||||
|                             face_surface->GetSurfaceParams().rt.index, new_params.rt.index, index); | ||||
|             } | ||||
|  | ||||
|             old_params.addr += size_with_mipmaps; | ||||
|             old_params.addr += byte_stride; | ||||
|         } | ||||
|         break; | ||||
|     } | ||||
|   | ||||
| @@ -707,29 +707,6 @@ struct SurfaceParams { | ||||
|         return SizeInBytes2D() * depth; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the size in bytes of the 2D surface with mipmaps. Each mipmap level proceeds the | ||||
|      * previous with half the width and half the height. Once the size of the next mip reaches 0, we | ||||
|      * are done. | ||||
|      */ | ||||
|     std::size_t SizeInBytes2DWithMipmap() const { | ||||
|         std::size_t size_in_bytes{}; | ||||
|         auto mip_params{*this}; | ||||
|         for (std::size_t level = 0; level < max_mip_level; level++) { | ||||
|             size_in_bytes += mip_params.SizeInBytes2D(); | ||||
|  | ||||
|             mip_params.width /= 2; | ||||
|             mip_params.height /= 2; | ||||
|  | ||||
|             if (!mip_params.width || !mip_params.height) { | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         // TODO(bunnei): This alignup is unverified, but necessary in games tested (e.g. in SMO) | ||||
|         return Common::AlignUp(size_in_bytes, 0x1000); | ||||
|     } | ||||
|  | ||||
|     /// Creates SurfaceParams from a texture configuration | ||||
|     static SurfaceParams CreateForTexture(const Tegra::Texture::FullTextureInfo& config, | ||||
|                                           const GLShader::SamplerEntry& entry); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user