diff options
| -rw-r--r-- | src/video_core/gpu.cpp | 1 | ||||
| -rw-r--r-- | src/video_core/gpu.h | 1 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer_cache.cpp | 43 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer_cache.h | 84 | 
4 files changed, 74 insertions, 55 deletions
| diff --git a/src/video_core/gpu.cpp b/src/video_core/gpu.cpp index 834940b83..19e7f1161 100644 --- a/src/video_core/gpu.cpp +++ b/src/video_core/gpu.cpp @@ -70,6 +70,7 @@ u32 RenderTargetBytesPerPixel(RenderTargetFormat format) {      case RenderTargetFormat::RG8_SNORM:          return 2;      case RenderTargetFormat::R8_UNORM: +    case RenderTargetFormat::R8_UINT:          return 1;      default:          UNIMPLEMENTED_MSG("Unimplemented render target format {}", static_cast<u32>(format)); diff --git a/src/video_core/gpu.h b/src/video_core/gpu.h index de5b037be..e008d8f26 100644 --- a/src/video_core/gpu.h +++ b/src/video_core/gpu.h @@ -42,6 +42,7 @@ enum class RenderTargetFormat : u32 {      R16_UINT = 0xF1,      R16_FLOAT = 0xF2,      R8_UNORM = 0xF3, +    R8_UINT = 0xF6,  };  enum class DepthFormat : u32 { diff --git a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp index d055b1dfa..84c250c63 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp @@ -99,6 +99,7 @@ static constexpr std::array<FormatTuple, SurfaceParams::MaxPixelFormat> tex_form       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_R8UI, GL_RED_INTEGER, GL_UNSIGNED_BYTE, ComponentType::UInt, false},           // R8UI      {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 @@ -233,26 +234,27 @@ void MortonCopy(u32 stride, u32 block_height, u32 height, std::vector<u8>& gl_bu  static constexpr std::array<void (*)(u32, u32, u32, std::vector<u8>&, Tegra::GPUVAddr),                              SurfaceParams::MaxPixelFormat>      morton_to_gl_fns = { -        MortonCopy<true, PixelFormat::ABGR8U>,      MortonCopy<true, PixelFormat::ABGR8S>, -        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::RGBA32UI>,    MortonCopy<true, PixelFormat::DXT1>, -        MortonCopy<true, PixelFormat::DXT23>,       MortonCopy<true, PixelFormat::DXT45>, -        MortonCopy<true, PixelFormat::DXN1>,        MortonCopy<true, PixelFormat::DXN2UNORM>, -        MortonCopy<true, PixelFormat::DXN2SNORM>,   MortonCopy<true, PixelFormat::BC7U>, -        MortonCopy<true, PixelFormat::ASTC_2D_4X4>, MortonCopy<true, PixelFormat::G8R8>, -        MortonCopy<true, PixelFormat::BGRA8>,       MortonCopy<true, PixelFormat::RGBA32F>, -        MortonCopy<true, PixelFormat::RG32F>,       MortonCopy<true, PixelFormat::R32F>, -        MortonCopy<true, PixelFormat::R16F>,        MortonCopy<true, PixelFormat::R16UNORM>, -        MortonCopy<true, PixelFormat::R16S>,        MortonCopy<true, PixelFormat::R16UI>, -        MortonCopy<true, PixelFormat::R16I>,        MortonCopy<true, PixelFormat::RG16>, -        MortonCopy<true, PixelFormat::RG16F>,       MortonCopy<true, PixelFormat::RG16UI>, -        MortonCopy<true, PixelFormat::RG16I>,       MortonCopy<true, PixelFormat::RG16S>, -        MortonCopy<true, PixelFormat::RGB32F>,      MortonCopy<true, PixelFormat::SRGBA8>, -        MortonCopy<true, PixelFormat::RG8S>,        MortonCopy<true, PixelFormat::Z24S8>, -        MortonCopy<true, PixelFormat::S8Z24>,       MortonCopy<true, PixelFormat::Z32F>, -        MortonCopy<true, PixelFormat::Z16>,         MortonCopy<true, PixelFormat::Z32FS8>, +        MortonCopy<true, PixelFormat::ABGR8U>,       MortonCopy<true, PixelFormat::ABGR8S>, +        MortonCopy<true, PixelFormat::B5G6R5>,       MortonCopy<true, PixelFormat::A2B10G10R10>, +        MortonCopy<true, PixelFormat::A1B5G5R5>,     MortonCopy<true, PixelFormat::R8>, +        MortonCopy<true, PixelFormat::R8UI>,         MortonCopy<true, PixelFormat::RGBA16F>, +        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::DXN2UNORM>,    MortonCopy<true, PixelFormat::DXN2SNORM>, +        MortonCopy<true, PixelFormat::BC7U>,         MortonCopy<true, PixelFormat::ASTC_2D_4X4>, +        MortonCopy<true, PixelFormat::G8R8>,         MortonCopy<true, PixelFormat::BGRA8>, +        MortonCopy<true, PixelFormat::RGBA32F>,      MortonCopy<true, PixelFormat::RG32F>, +        MortonCopy<true, PixelFormat::R32F>,         MortonCopy<true, PixelFormat::R16F>, +        MortonCopy<true, PixelFormat::R16UNORM>,     MortonCopy<true, PixelFormat::R16S>, +        MortonCopy<true, PixelFormat::R16UI>,        MortonCopy<true, PixelFormat::R16I>, +        MortonCopy<true, PixelFormat::RG16>,         MortonCopy<true, PixelFormat::RG16F>, +        MortonCopy<true, PixelFormat::RG16UI>,       MortonCopy<true, PixelFormat::RG16I>, +        MortonCopy<true, PixelFormat::RG16S>,        MortonCopy<true, PixelFormat::RGB32F>, +        MortonCopy<true, PixelFormat::SRGBA8>,       MortonCopy<true, PixelFormat::RG8S>, +        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, std::vector<u8>&, Tegra::GPUVAddr), @@ -264,6 +266,7 @@ static constexpr std::array<void (*)(u32, u32, u32, std::vector<u8>&, Tegra::GPU          MortonCopy<false, PixelFormat::A2B10G10R10>,          MortonCopy<false, PixelFormat::A1B5G5R5>,          MortonCopy<false, PixelFormat::R8>, +        MortonCopy<false, PixelFormat::R8UI>,          MortonCopy<false, PixelFormat::RGBA16F>,          MortonCopy<false, PixelFormat::R11FG11FB10F>,          MortonCopy<false, PixelFormat::RGBA32UI>, diff --git a/src/video_core/renderer_opengl/gl_rasterizer_cache.h b/src/video_core/renderer_opengl/gl_rasterizer_cache.h index d7a43652e..202257b58 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer_cache.h +++ b/src/video_core/renderer_opengl/gl_rasterizer_cache.h @@ -29,44 +29,45 @@ struct SurfaceParams {          A2B10G10R10 = 3,          A1B5G5R5 = 4,          R8 = 5, -        RGBA16F = 6, -        R11FG11FB10F = 7, -        RGBA32UI = 8, -        DXT1 = 9, -        DXT23 = 10, -        DXT45 = 11, -        DXN1 = 12, // This is also known as BC4 -        DXN2UNORM = 13, -        DXN2SNORM = 14, -        BC7U = 15, -        ASTC_2D_4X4 = 16, -        G8R8 = 17, -        BGRA8 = 18, -        RGBA32F = 19, -        RG32F = 20, -        R32F = 21, -        R16F = 22, -        R16UNORM = 23, -        R16S = 24, -        R16UI = 25, -        R16I = 26, -        RG16 = 27, -        RG16F = 28, -        RG16UI = 29, -        RG16I = 30, -        RG16S = 31, -        RGB32F = 32, -        SRGBA8 = 33, -        RG8S = 34, +        R8UI = 6, +        RGBA16F = 7, +        R11FG11FB10F = 8, +        RGBA32UI = 9, +        DXT1 = 10, +        DXT23 = 11, +        DXT45 = 12, +        DXN1 = 13, // This is also known as BC4 +        DXN2UNORM = 14, +        DXN2SNORM = 15, +        BC7U = 16, +        ASTC_2D_4X4 = 17, +        G8R8 = 18, +        BGRA8 = 19, +        RGBA32F = 20, +        RG32F = 21, +        R32F = 22, +        R16F = 23, +        R16UNORM = 24, +        R16S = 25, +        R16UI = 26, +        R16I = 27, +        RG16 = 28, +        RG16F = 29, +        RG16UI = 30, +        RG16I = 31, +        RG16S = 32, +        RGB32F = 33, +        SRGBA8 = 34, +        RG8S = 35,          MaxColorFormat,          // DepthStencil formats -        Z24S8 = 35, -        S8Z24 = 36, -        Z32F = 37, -        Z16 = 38, -        Z32FS8 = 39, +        Z24S8 = 36, +        S8Z24 = 37, +        Z32F = 38, +        Z16 = 39, +        Z32FS8 = 40,          MaxDepthStencilFormat, @@ -110,6 +111,7 @@ struct SurfaceParams {              1, // A2B10G10R10              1, // A1B5G5R5              1, // R8 +            1, // R8UI              1, // RGBA16F              1, // R11FG11FB10F              1, // RGBA32UI @@ -161,6 +163,7 @@ struct SurfaceParams {              32,  // A2B10G10R10              16,  // A1B5G5R5              8,   // R8 +            8,   // R8UI              64,  // RGBA16F              32,  // R11FG11FB10F              128, // RGBA32UI @@ -250,6 +253,8 @@ struct SurfaceParams {              return PixelFormat::RGBA32UI;          case Tegra::RenderTargetFormat::R8_UNORM:              return PixelFormat::R8; +        case Tegra::RenderTargetFormat::R8_UINT: +            return PixelFormat::R8UI;          case Tegra::RenderTargetFormat::RG16_FLOAT:              return PixelFormat::RG16F;          case Tegra::RenderTargetFormat::RG16_UINT: @@ -301,7 +306,15 @@ struct SurfaceParams {          case Tegra::Texture::TextureFormat::A1B5G5R5:              return PixelFormat::A1B5G5R5;          case Tegra::Texture::TextureFormat::R8: -            return PixelFormat::R8; +            switch (component_type) { +            case Tegra::Texture::ComponentType::UNORM: +                return PixelFormat::R8; +            case Tegra::Texture::ComponentType::UINT: +                return PixelFormat::R8UI; +            } +            LOG_CRITICAL(HW_GPU, "Unimplemented component_type={}", +                         static_cast<u32>(component_type)); +            UNREACHABLE();          case Tegra::Texture::TextureFormat::G8R8:              return PixelFormat::G8R8;          case Tegra::Texture::TextureFormat::R16_G16_B16_A16: @@ -435,6 +448,7 @@ struct SurfaceParams {              return ComponentType::Float;          case Tegra::RenderTargetFormat::RGBA32_UINT:          case Tegra::RenderTargetFormat::RG16_UINT: +        case Tegra::RenderTargetFormat::R8_UINT:          case Tegra::RenderTargetFormat::R16_UINT:              return ComponentType::UInt;          case Tegra::RenderTargetFormat::RG16_SINT: | 
