diff options
Diffstat (limited to 'src/video_core')
| -rw-r--r-- | src/video_core/gpu.h | 1 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer_cache.cpp | 47 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer_cache.h | 21 | ||||
| -rw-r--r-- | src/video_core/textures/decoders.cpp | 4 | 
4 files changed, 48 insertions, 25 deletions
| diff --git a/src/video_core/gpu.h b/src/video_core/gpu.h index 7b4e9b842..d0a4ac267 100644 --- a/src/video_core/gpu.h +++ b/src/video_core/gpu.h @@ -16,6 +16,7 @@ namespace Tegra {  enum class RenderTargetFormat : u32 {      NONE = 0x0,      RGBA32_FLOAT = 0xC0, +    RGBA32_UINT = 0xC2,      RGBA16_FLOAT = 0xCA,      RGB10_A2_UNORM = 0xD1,      RGBA8_UNORM = 0xD5, diff --git a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp index 63f5999ea..ae48378f3 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp @@ -27,6 +27,7 @@ struct FormatTuple {      GLint internal_format;      GLenum format;      GLenum type; +    ComponentType component_type;      bool compressed;  }; @@ -65,29 +66,33 @@ struct FormatTuple {  }  static constexpr std::array<FormatTuple, SurfaceParams::MaxPixelFormat> tex_format_tuples = {{ -    {GL_RGBA8, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, false},                    // ABGR8 -    {GL_RGB, GL_RGB, GL_UNSIGNED_SHORT_5_6_5_REV, false},                       // B5G6R5 -    {GL_RGB10_A2, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, false},              // A2B10G10R10 -    {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 -    {GL_COMPRESSED_RED_RGTC1, GL_RED, GL_UNSIGNED_INT_8_8_8_8, true},           // DXN1 -    {GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE, false},                               // ASTC_2D_4X4 +    {GL_RGBA8, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, ComponentType::UNorm, false}, // ABGR8 +    {GL_RGB, GL_RGB, GL_UNSIGNED_SHORT_5_6_5_REV, ComponentType::UNorm, false},    // B5G6R5 +    {GL_RGB10_A2, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, ComponentType::UNorm, +     false}, // A2B10G10R10 +    {GL_RGB5_A1, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, ComponentType::UNorm, false}, // A1B5G5R5 +    {GL_R8, GL_RED, GL_UNSIGNED_BYTE, ComponentType::UNorm, false},                    // R8 +    {GL_RGBA16F, GL_RGBA, GL_HALF_FLOAT, ComponentType::Float, false},                 // RGBA16F +    {GL_R11F_G11F_B10F, GL_RGB, GL_UNSIGNED_INT_10F_11F_11F_REV, ComponentType::Float, +     false},                                                                     // R11FG11FB10F +    {GL_RGBA32UI, GL_RGBA_INTEGER, GL_UNSIGNED_INT, ComponentType::UInt, false}, // RGBA32UI +    {GL_COMPRESSED_RGB_S3TC_DXT1_EXT, GL_RGB, GL_UNSIGNED_INT_8_8_8_8, ComponentType::UNorm, +     true}, // DXT1 +    {GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, ComponentType::UNorm, +     true}, // DXT23 +    {GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, ComponentType::UNorm, +     true},                                                                                 // DXT45 +    {GL_COMPRESSED_RED_RGTC1, GL_RED, GL_UNSIGNED_INT_8_8_8_8, ComponentType::UNorm, true}, // DXN1 +    {GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE, ComponentType::UNorm, false}, // ASTC_2D_4X4  }};  static const FormatTuple& GetFormatTuple(PixelFormat pixel_format, ComponentType component_type) {      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 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)]; +        auto& format = tex_format_tuples[static_cast<unsigned int>(pixel_format)]; +        ASSERT(component_type == format.component_type); +        return format;      } else if (type == SurfaceType::Depth || type == SurfaceType::DepthStencil) {          // TODO(Subv): Implement depth formats          ASSERT_MSG(false, "Unimplemented"); @@ -166,9 +171,10 @@ static constexpr std::array<void (*)(u32, u32, u32, u8*, Tegra::GPUVAddr),          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>,         MortonCopy<true, PixelFormat::ASTC_2D_4X4>, +        MortonCopy<true, PixelFormat::R11FG11FB10F>, MortonCopy<true, PixelFormat::RGBA32UI>, +        MortonCopy<true, PixelFormat::DXT1>,         MortonCopy<true, PixelFormat::DXT23>, +        MortonCopy<true, PixelFormat::DXT45>,        MortonCopy<true, PixelFormat::DXN1>, +        MortonCopy<true, PixelFormat::ASTC_2D_4X4>,  };  static constexpr std::array<void (*)(u32, u32, u32, u8*, Tegra::GPUVAddr), @@ -181,6 +187,7 @@ static constexpr std::array<void (*)(u32, u32, u32, u8*, Tegra::GPUVAddr),          MortonCopy<false, PixelFormat::R8>,          MortonCopy<false, PixelFormat::RGBA16F>,          MortonCopy<false, PixelFormat::R11FG11FB10F>, +        MortonCopy<false, PixelFormat::RGBA32UI>,          // 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 85e7c8888..99be250b4 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer_cache.h +++ b/src/video_core/renderer_opengl/gl_rasterizer_cache.h @@ -30,11 +30,12 @@ struct SurfaceParams {          R8 = 4,          RGBA16F = 5,          R11FG11FB10F = 6, -        DXT1 = 7, -        DXT23 = 8, -        DXT45 = 9, -        DXN1 = 10, // This is also known as BC4 -        ASTC_2D_4X4 = 11, +        RGBA32UI = 7, +        DXT1 = 8, +        DXT23 = 9, +        DXT45 = 10, +        DXN1 = 11, // This is also known as BC4 +        ASTC_2D_4X4 = 12,          Max,          Invalid = 255, @@ -77,6 +78,7 @@ struct SurfaceParams {              1, // R8              1, // RGBA16F              1, // R11FG11FB10F +            1, // RGBA32UI              4, // DXT1              4, // DXT23              4, // DXT45 @@ -100,6 +102,7 @@ struct SurfaceParams {              8,   // R8              64,  // RGBA16F              32,  // R11FG11FB10F +            128, // RGBA32UI              64,  // DXT1              128, // DXT23              128, // DXT45 @@ -125,6 +128,8 @@ struct SurfaceParams {              return PixelFormat::RGBA16F;          case Tegra::RenderTargetFormat::R11G11B10_FLOAT:              return PixelFormat::R11FG11FB10F; +        case Tegra::RenderTargetFormat::RGBA32_UINT: +            return PixelFormat::RGBA32UI;          default:              NGLOG_CRITICAL(HW_GPU, "Unimplemented format={}", static_cast<u32>(format));              UNREACHABLE(); @@ -148,6 +153,8 @@ struct SurfaceParams {              return PixelFormat::RGBA16F;          case Tegra::Texture::TextureFormat::BF10GF11RF11:              return PixelFormat::R11FG11FB10F; +        case Tegra::Texture::TextureFormat::R32_G32_B32_A32: +            return PixelFormat::RGBA32UI;          case Tegra::Texture::TextureFormat::DXT1:              return PixelFormat::DXT1;          case Tegra::Texture::TextureFormat::DXT23: @@ -181,6 +188,8 @@ struct SurfaceParams {              return Tegra::Texture::TextureFormat::R16_G16_B16_A16;          case PixelFormat::R11FG11FB10F:              return Tegra::Texture::TextureFormat::BF10GF11RF11; +        case PixelFormat::RGBA32UI: +            return Tegra::Texture::TextureFormat::R32_G32_B32_A32;          case PixelFormat::DXT1:              return Tegra::Texture::TextureFormat::DXT1;          case PixelFormat::DXT23: @@ -217,6 +226,8 @@ struct SurfaceParams {          case Tegra::RenderTargetFormat::RGBA16_FLOAT:          case Tegra::RenderTargetFormat::R11G11B10_FLOAT:              return ComponentType::Float; +        case Tegra::RenderTargetFormat::RGBA32_UINT: +            return ComponentType::UInt;          default:              NGLOG_CRITICAL(HW_GPU, "Unimplemented format={}", static_cast<u32>(format));              UNREACHABLE(); diff --git a/src/video_core/textures/decoders.cpp b/src/video_core/textures/decoders.cpp index 0db4367f1..eaf15da32 100644 --- a/src/video_core/textures/decoders.cpp +++ b/src/video_core/textures/decoders.cpp @@ -65,6 +65,8 @@ u32 BytesPerPixel(TextureFormat format) {          return 1;      case TextureFormat::R16_G16_B16_A16:          return 8; +    case TextureFormat::R32_G32_B32_A32: +        return 16;      default:          UNIMPLEMENTED_MSG("Format not implemented");          break; @@ -94,6 +96,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::R32_G32_B32_A32:      case TextureFormat::BF10GF11RF11:      case TextureFormat::ASTC_2D_4X4:          CopySwizzledData(width, height, bytes_per_pixel, bytes_per_pixel, data, @@ -124,6 +127,7 @@ std::vector<u8> DecodeTexture(const std::vector<u8>& texture_data, TextureFormat      case TextureFormat::B5G6R5:      case TextureFormat::R8:      case TextureFormat::BF10GF11RF11: +    case TextureFormat::R32_G32_B32_A32:          // TODO(Subv): For the time being just forward the same data without any decoding.          rgba_data = texture_data;          break; | 
