diff options
| -rw-r--r-- | src/video_core/gpu.h | 1 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer_cache.cpp | 19 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer_cache.h | 20 | ||||
| -rw-r--r-- | src/video_core/textures/decoders.cpp | 3 | 
4 files changed, 31 insertions, 12 deletions
diff --git a/src/video_core/gpu.h b/src/video_core/gpu.h index f168a5171..2762a22ec 100644 --- a/src/video_core/gpu.h +++ b/src/video_core/gpu.h @@ -19,6 +19,7 @@ enum class RenderTargetFormat : u32 {      RGB10_A2_UNORM = 0xD1,      RGBA8_UNORM = 0xD5,      RGBA8_SRGB = 0xD6, +    R11G11B10_FLOAT = 0xE0,  };  /// Returns the number of bytes per pixel of each rendertarget format. diff --git a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp index d6048f639..9164d7f34 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp @@ -50,6 +50,7 @@ static constexpr std::array<FormatTuple, SurfaceParams::MaxPixelFormat> tex_form      {GL_RGB5_A1, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, false},                // A1B5G5R5      {GL_R8, GL_RED, GL_UNSIGNED_BYTE, false},                                   // R8      {GL_RGBA16F, GL_RGBA, GL_HALF_FLOAT, false},                                // RGBA16F +    {GL_R11F_G11F_B10F, GL_RGB, GL_UNSIGNED_INT_10F_11F_11F_REV, false},        // R11FG11FB10F      {GL_COMPRESSED_RGB_S3TC_DXT1_EXT, GL_RGB, GL_UNSIGNED_INT_8_8_8_8, true},   // DXT1      {GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, true}, // DXT23      {GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, true}, // DXT45 @@ -60,8 +61,10 @@ static const FormatTuple& GetFormatTuple(PixelFormat pixel_format, ComponentType      const SurfaceType type = SurfaceParams::GetFormatType(pixel_format);      if (type == SurfaceType::ColorTexture) {          ASSERT(static_cast<size_t>(pixel_format) < tex_format_tuples.size()); -        // For now only UNORM components are supported, or RGBA16F which is type FLOAT -        ASSERT(component_type == ComponentType::UNorm || pixel_format == PixelFormat::RGBA16F); +        // For now only UNORM components are supported, or either R11FG11FB10F or RGBA16F which are +        // type FLOAT +        ASSERT(component_type == ComponentType::UNorm || pixel_format == PixelFormat::RGBA16F || +               pixel_format == PixelFormat::R11FG11FB10F);          return tex_format_tuples[static_cast<unsigned int>(pixel_format)];      } else if (type == SurfaceType::Depth || type == SurfaceType::DepthStencil) {          // TODO(Subv): Implement depth formats @@ -110,11 +113,12 @@ static constexpr std::array<void (*)(u32, u32, u32, u8*, Tegra::GPUVAddr, Tegra:                                       Tegra::GPUVAddr),                              SurfaceParams::MaxPixelFormat>      morton_to_gl_fns = { -        MortonCopy<true, PixelFormat::ABGR8>,       MortonCopy<true, PixelFormat::B5G6R5>, -        MortonCopy<true, PixelFormat::A2B10G10R10>, MortonCopy<true, PixelFormat::A1B5G5R5>, -        MortonCopy<true, PixelFormat::R8>,          MortonCopy<true, PixelFormat::RGBA16F>, -        MortonCopy<true, PixelFormat::DXT1>,        MortonCopy<true, PixelFormat::DXT23>, -        MortonCopy<true, PixelFormat::DXT45>,       MortonCopy<true, PixelFormat::DXN1>, +        MortonCopy<true, PixelFormat::ABGR8>,        MortonCopy<true, PixelFormat::B5G6R5>, +        MortonCopy<true, PixelFormat::A2B10G10R10>,  MortonCopy<true, PixelFormat::A1B5G5R5>, +        MortonCopy<true, PixelFormat::R8>,           MortonCopy<true, PixelFormat::RGBA16F>, +        MortonCopy<true, PixelFormat::R11FG11FB10F>, MortonCopy<true, PixelFormat::DXT1>, +        MortonCopy<true, PixelFormat::DXT23>,        MortonCopy<true, PixelFormat::DXT45>, +        MortonCopy<true, PixelFormat::DXN1>,  };  static constexpr std::array<void (*)(u32, u32, u32, u8*, Tegra::GPUVAddr, Tegra::GPUVAddr, @@ -127,6 +131,7 @@ static constexpr std::array<void (*)(u32, u32, u32, u8*, Tegra::GPUVAddr, Tegra:          MortonCopy<false, PixelFormat::A1B5G5R5>,          MortonCopy<false, PixelFormat::R8>,          MortonCopy<false, PixelFormat::RGBA16F>, +        MortonCopy<false, PixelFormat::R11FG11FB10F>,          // TODO(Subv): Swizzling the DXT1/DXT23/DXT45/DXN1 formats is not yet supported          nullptr,          nullptr, diff --git a/src/video_core/renderer_opengl/gl_rasterizer_cache.h b/src/video_core/renderer_opengl/gl_rasterizer_cache.h index 6f08678ab..0f43e863d 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer_cache.h +++ b/src/video_core/renderer_opengl/gl_rasterizer_cache.h @@ -60,10 +60,11 @@ struct SurfaceParams {          A1B5G5R5 = 3,          R8 = 4,          RGBA16F = 5, -        DXT1 = 6, -        DXT23 = 7, -        DXT45 = 8, -        DXN1 = 9, // This is also known as BC4 +        R11FG11FB10F = 6, +        DXT1 = 7, +        DXT23 = 8, +        DXT45 = 9, +        DXN1 = 10, // This is also known as BC4          Max,          Invalid = 255, @@ -104,7 +105,8 @@ struct SurfaceParams {              1, // A2B10G10R10              1, // A1B5G5R5              1, // R8 -            2, // RGBA16F +            1, // RGBA16F +            1, // R11FG11FB10F              4, // DXT1              4, // DXT23              4, // DXT45 @@ -129,6 +131,7 @@ struct SurfaceParams {              16,  // A1B5G5R5              8,   // R8              64,  // RGBA16F +            32,  // R11FG11FB10F              64,  // DXT1              128, // DXT23              128, // DXT45 @@ -151,6 +154,8 @@ struct SurfaceParams {              return PixelFormat::A2B10G10R10;          case Tegra::RenderTargetFormat::RGBA16_FLOAT:              return PixelFormat::RGBA16F; +        case Tegra::RenderTargetFormat::R11G11B10_FLOAT: +            return PixelFormat::R11FG11FB10F;          default:              NGLOG_CRITICAL(HW_GPU, "Unimplemented format={}", static_cast<u32>(format));              UNREACHABLE(); @@ -182,6 +187,8 @@ struct SurfaceParams {              return PixelFormat::R8;          case Tegra::Texture::TextureFormat::R16_G16_B16_A16:              return PixelFormat::RGBA16F; +        case Tegra::Texture::TextureFormat::BF10GF11RF11: +            return PixelFormat::R11FG11FB10F;          case Tegra::Texture::TextureFormat::DXT1:              return PixelFormat::DXT1;          case Tegra::Texture::TextureFormat::DXT23: @@ -211,6 +218,8 @@ struct SurfaceParams {              return Tegra::Texture::TextureFormat::R8;          case PixelFormat::RGBA16F:              return Tegra::Texture::TextureFormat::R16_G16_B16_A16; +        case PixelFormat::R11FG11FB10F: +            return Tegra::Texture::TextureFormat::BF10GF11RF11;          case PixelFormat::DXT1:              return Tegra::Texture::TextureFormat::DXT1;          case PixelFormat::DXT23: @@ -243,6 +252,7 @@ struct SurfaceParams {          case Tegra::RenderTargetFormat::RGB10_A2_UNORM:              return ComponentType::UNorm;          case Tegra::RenderTargetFormat::RGBA16_FLOAT: +        case Tegra::RenderTargetFormat::R11G11B10_FLOAT:              return ComponentType::Float;          default:              NGLOG_CRITICAL(HW_GPU, "Unimplemented format={}", static_cast<u32>(format)); diff --git a/src/video_core/textures/decoders.cpp b/src/video_core/textures/decoders.cpp index 2d2af5554..7bf9c4c4b 100644 --- a/src/video_core/textures/decoders.cpp +++ b/src/video_core/textures/decoders.cpp @@ -55,6 +55,7 @@ u32 BytesPerPixel(TextureFormat format) {          return 16;      case TextureFormat::A8R8G8B8:      case TextureFormat::A2B10G10R10: +    case TextureFormat::BF10GF11RF11:          return 4;      case TextureFormat::A1B5G5R5:      case TextureFormat::B5G6R5: @@ -92,6 +93,7 @@ std::vector<u8> UnswizzleTexture(VAddr address, TextureFormat format, u32 width,      case TextureFormat::B5G6R5:      case TextureFormat::R8:      case TextureFormat::R16_G16_B16_A16: +    case TextureFormat::BF10GF11RF11:          CopySwizzledData(width, height, bytes_per_pixel, bytes_per_pixel, data,                           unswizzled_data.data(), true, block_height);          break; @@ -118,6 +120,7 @@ std::vector<u8> DecodeTexture(const std::vector<u8>& texture_data, TextureFormat      case TextureFormat::A1B5G5R5:      case TextureFormat::B5G6R5:      case TextureFormat::R8: +    case TextureFormat::BF10GF11RF11:          // TODO(Subv): For the time being just forward the same data without any decoding.          rgba_data = texture_data;          break;  | 
