From 65faeb9b2a984268f248250424443902cdfa0fbd Mon Sep 17 00:00:00 2001 From: Subv Date: Mon, 26 Mar 2018 21:51:56 -0500 Subject: [PATCH] GLCache: Specialize the MortonCopy function for the DXT1 texture format. It will now use the UnswizzleTexture function instead of the MortonCopyPixels128, which doesn't seem to work for textures. --- .../renderer_opengl/gl_rasterizer_cache.cpp | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp index 5495cea45..a7f49c18b 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp @@ -102,7 +102,7 @@ static void MortonCopyTile(u32 stride, u8* tile_buffer, u8* gl_buffer) { } template -static void MortonCopy(u32 stride, u32 height, u8* gl_buffer, VAddr base, VAddr start, VAddr end) { +void MortonCopy(u32 stride, u32 height, u8* gl_buffer, VAddr base, VAddr start, VAddr end) { constexpr u32 bytes_per_pixel = SurfaceParams::GetFormatBpp(format) / 8; constexpr u32 gl_bytes_per_pixel = CachedSurface::GetGLBytesPerPixel(format); @@ -113,6 +113,20 @@ static void MortonCopy(u32 stride, u32 height, u8* gl_buffer, VAddr base, VAddr Memory::GetPointer(base), gl_buffer, morton_to_gl); } +template <> +void MortonCopy(u32 stride, u32 height, u8* gl_buffer, VAddr base, + VAddr start, VAddr end) { + constexpr u32 bytes_per_pixel = SurfaceParams::GetFormatBpp(PixelFormat::DXT1) / 8; + constexpr u32 gl_bytes_per_pixel = CachedSurface::GetGLBytesPerPixel(PixelFormat::DXT1); + + // TODO(bunnei): Assumes the default rendering GOB size of 16 (128 lines). We should check the + // configuration for this and perform more generic un/swizzle + LOG_WARNING(Render_OpenGL, "need to use correct swizzle/GOB parameters!"); + auto data = + Tegra::Texture::UnswizzleTexture(base, Tegra::Texture::TextureFormat::DXT1, stride, height); + std::memcpy(gl_buffer, data.data(), data.size()); +} + static constexpr std::array morton_to_gl_fns = { MortonCopy, MortonCopy,