diff --git a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
index a4d9707cb216be84156a5450c17752e0fb35ee93..c8f0c4e28b473bd4a9da98dfe704c374ba32c424 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
@@ -118,6 +118,7 @@ static constexpr std::array<FormatTuple, SurfaceParams::MaxPixelFormat> tex_form
     {GL_RG16UI, GL_RG_INTEGER, GL_UNSIGNED_SHORT, ComponentType::UInt, false}, // RG16UI
     {GL_RG16I, GL_RG_INTEGER, GL_SHORT, ComponentType::SInt, false},           // RG16I
     {GL_RG16_SNORM, GL_RG, GL_SHORT, ComponentType::SNorm, false},             // RG16S
+    {GL_RGB32F, GL_RGB, GL_FLOAT, ComponentType::Float, false},                // RGB32F
     {GL_SRGB8_ALPHA8, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, ComponentType::UNorm, false}, // SRGBA8
 
     // DepthStencil formats
@@ -218,9 +219,10 @@ static constexpr std::array<void (*)(u32, u32, u32, u8*, Tegra::GPUVAddr),
         MortonCopy<true, PixelFormat::R16UNORM>,     MortonCopy<true, PixelFormat::RG16>,
         MortonCopy<true, PixelFormat::RG16F>,        MortonCopy<true, PixelFormat::RG16UI>,
         MortonCopy<true, PixelFormat::RG16I>,        MortonCopy<true, PixelFormat::RG16S>,
-        MortonCopy<true, PixelFormat::SRGBA8>,       MortonCopy<true, PixelFormat::Z24S8>,
-        MortonCopy<true, PixelFormat::S8Z24>,        MortonCopy<true, PixelFormat::Z32F>,
-        MortonCopy<true, PixelFormat::Z16>,          MortonCopy<true, PixelFormat::Z32FS8>,
+        MortonCopy<true, PixelFormat::RGB32F>,       MortonCopy<true, PixelFormat::SRGBA8>,
+        MortonCopy<true, PixelFormat::Z24S8>,        MortonCopy<true, PixelFormat::S8Z24>,
+        MortonCopy<true, PixelFormat::Z32F>,         MortonCopy<true, PixelFormat::Z16>,
+        MortonCopy<true, PixelFormat::Z32FS8>,
 };
 
 static constexpr std::array<void (*)(u32, u32, u32, u8*, Tegra::GPUVAddr),
@@ -253,6 +255,7 @@ static constexpr std::array<void (*)(u32, u32, u32, u8*, Tegra::GPUVAddr),
         MortonCopy<false, PixelFormat::RG16UI>,
         MortonCopy<false, PixelFormat::RG16I>,
         MortonCopy<false, PixelFormat::RG16S>,
+        MortonCopy<false, PixelFormat::RGB32F>,
         MortonCopy<false, PixelFormat::SRGBA8>,
         MortonCopy<false, PixelFormat::Z24S8>,
         MortonCopy<false, PixelFormat::S8Z24>,
diff --git a/src/video_core/renderer_opengl/gl_rasterizer_cache.h b/src/video_core/renderer_opengl/gl_rasterizer_cache.h
index b73dc2b069793f7906b1a63599fe3226481d2597..4e1e18d9c946e38ad14d7a9b2df05ea47a96a3dc 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer_cache.h
+++ b/src/video_core/renderer_opengl/gl_rasterizer_cache.h
@@ -48,16 +48,17 @@ struct SurfaceParams {
         RG16UI = 23,
         RG16I = 24,
         RG16S = 25,
-        SRGBA8 = 26,
+        RGB32F = 26,
+        SRGBA8 = 27,
 
         MaxColorFormat,
 
         // DepthStencil formats
-        Z24S8 = 27,
-        S8Z24 = 28,
-        Z32F = 29,
-        Z16 = 30,
-        Z32FS8 = 31,
+        Z24S8 = 28,
+        S8Z24 = 29,
+        Z32F = 30,
+        Z16 = 31,
+        Z32FS8 = 32,
 
         MaxDepthStencilFormat,
 
@@ -121,6 +122,7 @@ struct SurfaceParams {
             1, // RG16UI
             1, // RG16I
             1, // RG16S
+            1, // RGB32F
             1, // SRGBA8
             1, // Z24S8
             1, // S8Z24
@@ -164,6 +166,7 @@ struct SurfaceParams {
             32,  // RG16UI
             32,  // RG16I
             32,  // RG16S
+            96,  // RGB32F
             32,  // SRGBA8
             32,  // Z24S8
             32,  // S8Z24
@@ -272,6 +275,8 @@ struct SurfaceParams {
             UNREACHABLE();
         case Tegra::Texture::TextureFormat::R32_G32:
             return PixelFormat::RG32F;
+        case Tegra::Texture::TextureFormat::R32_G32_B32:
+            return PixelFormat::RGB32F;
         case Tegra::Texture::TextureFormat::R16:
             switch (component_type) {
             case Tegra::Texture::ComponentType::FLOAT:
@@ -363,6 +368,8 @@ struct SurfaceParams {
             return Tegra::Texture::TextureFormat::A8R8G8B8;
         case PixelFormat::RGBA32F:
             return Tegra::Texture::TextureFormat::R32_G32_B32_A32;
+        case PixelFormat::RGB32F:
+            return Tegra::Texture::TextureFormat::R32_G32_B32;
         case PixelFormat::RG32F:
             return Tegra::Texture::TextureFormat::R32_G32;
         case PixelFormat::R32F:
diff --git a/src/video_core/textures/decoders.cpp b/src/video_core/textures/decoders.cpp
index d794f8402a62fda76ad6a7386cb04300d616c9c9..65db84ad33d876989826ef86acedaad323a385bf 100644
--- a/src/video_core/textures/decoders.cpp
+++ b/src/video_core/textures/decoders.cpp
@@ -57,6 +57,8 @@ u32 BytesPerPixel(TextureFormat format) {
     case TextureFormat::BC7U:
         // In this case a 'pixel' actually refers to a 4x4 tile.
         return 16;
+    case TextureFormat::R32_G32_B32:
+        return 12;
     case TextureFormat::ASTC_2D_4X4:
     case TextureFormat::A8R8G8B8:
     case TextureFormat::A2B10G10R10:
@@ -131,6 +133,7 @@ std::vector<u8> UnswizzleTexture(VAddr address, TextureFormat format, u32 width,
     case TextureFormat::R16_G16:
     case TextureFormat::BF10GF11RF11:
     case TextureFormat::ASTC_2D_4X4:
+    case TextureFormat::R32_G32_B32:
         CopySwizzledData(width, height, bytes_per_pixel, bytes_per_pixel, data,
                          unswizzled_data.data(), true, block_height);
         break;
@@ -190,6 +193,7 @@ std::vector<u8> DecodeTexture(const std::vector<u8>& texture_data, TextureFormat
     case TextureFormat::R32:
     case TextureFormat::R16:
     case TextureFormat::R16_G16:
+    case TextureFormat::R32_G32_B32:
         // TODO(Subv): For the time being just forward the same data without any decoding.
         rgba_data = texture_data;
         break;