mirror of
				https://git.h3cjp.net/H3cJP/citra.git
				synced 2025-10-30 22:44:58 +00:00 
			
		
		
		
	Merge pull request #791 from bunnei/rg32f-rgba32f-bgra8
gl_rasterizer_cache: Implement formats BGRA8_UNORM/RGBA32_FLOAT/RG32_FLOAT
This commit is contained in:
		
						commit
						1ff3bea6c7
					
				|  | @ -35,9 +35,11 @@ u32 RenderTargetBytesPerPixel(RenderTargetFormat format) { | |||
|     case RenderTargetFormat::RGBA32_FLOAT: | ||||
|         return 16; | ||||
|     case RenderTargetFormat::RGBA16_FLOAT: | ||||
|     case RenderTargetFormat::RG32_FLOAT: | ||||
|         return 8; | ||||
|     case RenderTargetFormat::RGBA8_UNORM: | ||||
|     case RenderTargetFormat::RGB10_A2_UNORM: | ||||
|     case RenderTargetFormat::BGRA8_UNORM: | ||||
|         return 4; | ||||
|     default: | ||||
|         UNIMPLEMENTED_MSG("Unimplemented render target format {}", static_cast<u32>(format)); | ||||
|  |  | |||
|  | @ -18,6 +18,8 @@ enum class RenderTargetFormat : u32 { | |||
|     RGBA32_FLOAT = 0xC0, | ||||
|     RGBA32_UINT = 0xC2, | ||||
|     RGBA16_FLOAT = 0xCA, | ||||
|     RG32_FLOAT = 0xCB, | ||||
|     BGRA8_UNORM = 0xCF, | ||||
|     RGB10_A2_UNORM = 0xD1, | ||||
|     RGBA8_UNORM = 0xD5, | ||||
|     RGBA8_SRGB = 0xD6, | ||||
|  |  | |||
|  | @ -38,7 +38,8 @@ struct FormatTuple { | |||
|     params.addr = config.tic.Address(); | ||||
|     params.is_tiled = config.tic.IsTiled(); | ||||
|     params.block_height = params.is_tiled ? config.tic.BlockHeight() : 0, | ||||
|     params.pixel_format = PixelFormatFromTextureFormat(config.tic.format); | ||||
|     params.pixel_format = | ||||
|         PixelFormatFromTextureFormat(config.tic.format, config.tic.r_type.Value()); | ||||
|     params.component_type = ComponentTypeFromTexture(config.tic.r_type.Value()); | ||||
|     params.type = GetFormatType(params.pixel_format); | ||||
|     params.width = Common::AlignUp(config.tic.Width(), GetCompressionFactor(params.pixel_format)); | ||||
|  | @ -106,6 +107,9 @@ static constexpr std::array<FormatTuple, SurfaceParams::MaxPixelFormat> tex_form | |||
|      true},                                                             // BC7U
 | ||||
|     {GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE, ComponentType::UNorm, false}, // ASTC_2D_4X4
 | ||||
|     {GL_RG8, GL_RG, GL_UNSIGNED_BYTE, ComponentType::UNorm, false},     // G8R8
 | ||||
|     {GL_RGBA8, GL_BGRA, GL_UNSIGNED_BYTE, ComponentType::UNorm, false}, // BGRA8
 | ||||
|     {GL_RGBA32F, GL_RGBA, GL_FLOAT, ComponentType::Float, false},       // RGBA32F
 | ||||
|     {GL_RG32F, GL_RG, GL_FLOAT, ComponentType::Float, false},           // RG32F
 | ||||
| 
 | ||||
|     // DepthStencil formats
 | ||||
|     {GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, ComponentType::UNorm, | ||||
|  | @ -197,9 +201,10 @@ static constexpr std::array<void (*)(u32, u32, u32, u8*, Tegra::GPUVAddr), | |||
|         MortonCopy<true, PixelFormat::DXT1>,         MortonCopy<true, PixelFormat::DXT23>, | ||||
|         MortonCopy<true, PixelFormat::DXT45>,        MortonCopy<true, PixelFormat::DXN1>, | ||||
|         MortonCopy<true, PixelFormat::BC7U>,         MortonCopy<true, PixelFormat::ASTC_2D_4X4>, | ||||
|         MortonCopy<true, PixelFormat::G8R8>,         MortonCopy<true, PixelFormat::Z24S8>, | ||||
|         MortonCopy<true, PixelFormat::S8Z24>,        MortonCopy<true, PixelFormat::Z32F>, | ||||
|         MortonCopy<true, PixelFormat::Z16>, | ||||
|         MortonCopy<true, PixelFormat::G8R8>,         MortonCopy<true, PixelFormat::BGRA8>, | ||||
|         MortonCopy<true, PixelFormat::RGBA32F>,      MortonCopy<true, PixelFormat::RG32F>, | ||||
|         MortonCopy<true, PixelFormat::Z24S8>,        MortonCopy<true, PixelFormat::S8Z24>, | ||||
|         MortonCopy<true, PixelFormat::Z32F>,         MortonCopy<true, PixelFormat::Z16>, | ||||
| }; | ||||
| 
 | ||||
| static constexpr std::array<void (*)(u32, u32, u32, u8*, Tegra::GPUVAddr), | ||||
|  | @ -213,7 +218,7 @@ static constexpr std::array<void (*)(u32, u32, u32, u8*, Tegra::GPUVAddr), | |||
|         MortonCopy<false, PixelFormat::RGBA16F>, | ||||
|         MortonCopy<false, PixelFormat::R11FG11FB10F>, | ||||
|         MortonCopy<false, PixelFormat::RGBA32UI>, | ||||
|         // TODO(Subv): Swizzling the DXT1/DXT23/DXT45/DXN1/BC7U formats is not yet supported
 | ||||
|         // TODO(Subv): Swizzling DXT1/DXT23/DXT45/DXN1/BC7U/ASTC_2D_4X4 formats is not supported
 | ||||
|         nullptr, | ||||
|         nullptr, | ||||
|         nullptr, | ||||
|  | @ -221,6 +226,9 @@ static constexpr std::array<void (*)(u32, u32, u32, u8*, Tegra::GPUVAddr), | |||
|         nullptr, | ||||
|         nullptr, | ||||
|         MortonCopy<false, PixelFormat::G8R8>, | ||||
|         MortonCopy<false, PixelFormat::BGRA8>, | ||||
|         MortonCopy<false, PixelFormat::RGBA32F>, | ||||
|         MortonCopy<false, PixelFormat::RG32F>, | ||||
|         MortonCopy<false, PixelFormat::Z24S8>, | ||||
|         MortonCopy<false, PixelFormat::S8Z24>, | ||||
|         MortonCopy<false, PixelFormat::Z32F>, | ||||
|  |  | |||
|  | @ -37,14 +37,17 @@ struct SurfaceParams { | |||
|         BC7U = 12, | ||||
|         ASTC_2D_4X4 = 13, | ||||
|         G8R8 = 14, | ||||
|         BGRA8 = 15, | ||||
|         RGBA32F = 16, | ||||
|         RG32F = 17, | ||||
| 
 | ||||
|         MaxColorFormat, | ||||
| 
 | ||||
|         // DepthStencil formats
 | ||||
|         Z24S8 = 15, | ||||
|         S8Z24 = 16, | ||||
|         Z32F = 17, | ||||
|         Z16 = 18, | ||||
|         Z24S8 = 18, | ||||
|         S8Z24 = 19, | ||||
|         Z32F = 20, | ||||
|         Z16 = 21, | ||||
| 
 | ||||
|         MaxDepthStencilFormat, | ||||
| 
 | ||||
|  | @ -97,6 +100,9 @@ struct SurfaceParams { | |||
|             4, // BC7U
 | ||||
|             4, // ASTC_2D_4X4
 | ||||
|             1, // G8R8
 | ||||
|             1, // BGRA8
 | ||||
|             1, // RGBA32F
 | ||||
|             1, // RG32F
 | ||||
|             1, // Z24S8
 | ||||
|             1, // S8Z24
 | ||||
|             1, // Z32F
 | ||||
|  | @ -127,6 +133,9 @@ struct SurfaceParams { | |||
|             128, // BC7U
 | ||||
|             32,  // ASTC_2D_4X4
 | ||||
|             16,  // G8R8
 | ||||
|             32,  // BGRA8
 | ||||
|             128, // RGBA32F
 | ||||
|             64,  // RG32F
 | ||||
|             32,  // Z24S8
 | ||||
|             32,  // S8Z24
 | ||||
|             32,  // Z32F
 | ||||
|  | @ -162,10 +171,16 @@ struct SurfaceParams { | |||
|         case Tegra::RenderTargetFormat::RGBA8_UNORM: | ||||
|         case Tegra::RenderTargetFormat::RGBA8_SRGB: | ||||
|             return PixelFormat::ABGR8; | ||||
|         case Tegra::RenderTargetFormat::BGRA8_UNORM: | ||||
|             return PixelFormat::BGRA8; | ||||
|         case Tegra::RenderTargetFormat::RGB10_A2_UNORM: | ||||
|             return PixelFormat::A2B10G10R10; | ||||
|         case Tegra::RenderTargetFormat::RGBA16_FLOAT: | ||||
|             return PixelFormat::RGBA16F; | ||||
|         case Tegra::RenderTargetFormat::RGBA32_FLOAT: | ||||
|             return PixelFormat::RGBA32F; | ||||
|         case Tegra::RenderTargetFormat::RG32_FLOAT: | ||||
|             return PixelFormat::RG32F; | ||||
|         case Tegra::RenderTargetFormat::R11G11B10_FLOAT: | ||||
|             return PixelFormat::R11FG11FB10F; | ||||
|         case Tegra::RenderTargetFormat::RGBA32_UINT: | ||||
|  | @ -176,7 +191,8 @@ struct SurfaceParams { | |||
|         } | ||||
|     } | ||||
| 
 | ||||
|     static PixelFormat PixelFormatFromTextureFormat(Tegra::Texture::TextureFormat format) { | ||||
|     static PixelFormat PixelFormatFromTextureFormat(Tegra::Texture::TextureFormat format, | ||||
|                                                     Tegra::Texture::ComponentType component_type) { | ||||
|         // TODO(Subv): Properly implement this
 | ||||
|         switch (format) { | ||||
|         case Tegra::Texture::TextureFormat::A8R8G8B8: | ||||
|  | @ -196,7 +212,17 @@ struct SurfaceParams { | |||
|         case Tegra::Texture::TextureFormat::BF10GF11RF11: | ||||
|             return PixelFormat::R11FG11FB10F; | ||||
|         case Tegra::Texture::TextureFormat::R32_G32_B32_A32: | ||||
|             return PixelFormat::RGBA32UI; | ||||
|             switch (component_type) { | ||||
|             case Tegra::Texture::ComponentType::FLOAT: | ||||
|                 return PixelFormat::RGBA32F; | ||||
|             case Tegra::Texture::ComponentType::UINT: | ||||
|                 return PixelFormat::RGBA32UI; | ||||
|             } | ||||
|             LOG_CRITICAL(HW_GPU, "Unimplemented component_type={}", | ||||
|                          static_cast<u32>(component_type)); | ||||
|             UNREACHABLE(); | ||||
|         case Tegra::Texture::TextureFormat::R32_G32: | ||||
|             return PixelFormat::RG32F; | ||||
|         case Tegra::Texture::TextureFormat::DXT1: | ||||
|             return PixelFormat::DXT1; | ||||
|         case Tegra::Texture::TextureFormat::DXT23: | ||||
|  | @ -210,7 +236,8 @@ struct SurfaceParams { | |||
|         case Tegra::Texture::TextureFormat::ASTC_2D_4X4: | ||||
|             return PixelFormat::ASTC_2D_4X4; | ||||
|         default: | ||||
|             LOG_CRITICAL(HW_GPU, "Unimplemented format={}", static_cast<u32>(format)); | ||||
|             LOG_CRITICAL(HW_GPU, "Unimplemented format={}, component_type={}", | ||||
|                          static_cast<u32>(format), static_cast<u32>(component_type)); | ||||
|             UNREACHABLE(); | ||||
|         } | ||||
|     } | ||||
|  | @ -248,7 +275,16 @@ struct SurfaceParams { | |||
|             return Tegra::Texture::TextureFormat::BC7U; | ||||
|         case PixelFormat::ASTC_2D_4X4: | ||||
|             return Tegra::Texture::TextureFormat::ASTC_2D_4X4; | ||||
|         case PixelFormat::BGRA8: | ||||
|             // TODO(bunnei): This is fine for unswizzling (since we just need the right component
 | ||||
|             // sizes), but could be a bug if we used this function in different ways.
 | ||||
|             return Tegra::Texture::TextureFormat::A8R8G8B8; | ||||
|         case PixelFormat::RGBA32F: | ||||
|             return Tegra::Texture::TextureFormat::R32_G32_B32_A32; | ||||
|         case PixelFormat::RG32F: | ||||
|             return Tegra::Texture::TextureFormat::R32_G32; | ||||
|         default: | ||||
|             LOG_CRITICAL(HW_GPU, "Unimplemented format={}", static_cast<u32>(format)); | ||||
|             UNREACHABLE(); | ||||
|         } | ||||
|     } | ||||
|  | @ -264,6 +300,7 @@ struct SurfaceParams { | |||
|         case PixelFormat::Z16: | ||||
|             return Tegra::DepthFormat::Z16_UNORM; | ||||
|         default: | ||||
|             LOG_CRITICAL(HW_GPU, "Unimplemented format={}", static_cast<u32>(format)); | ||||
|             UNREACHABLE(); | ||||
|         } | ||||
|     } | ||||
|  | @ -273,6 +310,8 @@ struct SurfaceParams { | |||
|         switch (type) { | ||||
|         case Tegra::Texture::ComponentType::UNORM: | ||||
|             return ComponentType::UNorm; | ||||
|         case Tegra::Texture::ComponentType::FLOAT: | ||||
|             return ComponentType::Float; | ||||
|         default: | ||||
|             LOG_CRITICAL(HW_GPU, "Unimplemented component type={}", static_cast<u32>(type)); | ||||
|             UNREACHABLE(); | ||||
|  | @ -284,10 +323,13 @@ struct SurfaceParams { | |||
|         switch (format) { | ||||
|         case Tegra::RenderTargetFormat::RGBA8_UNORM: | ||||
|         case Tegra::RenderTargetFormat::RGBA8_SRGB: | ||||
|         case Tegra::RenderTargetFormat::BGRA8_UNORM: | ||||
|         case Tegra::RenderTargetFormat::RGB10_A2_UNORM: | ||||
|             return ComponentType::UNorm; | ||||
|         case Tegra::RenderTargetFormat::RGBA16_FLOAT: | ||||
|         case Tegra::RenderTargetFormat::R11G11B10_FLOAT: | ||||
|         case Tegra::RenderTargetFormat::RGBA32_FLOAT: | ||||
|         case Tegra::RenderTargetFormat::RG32_FLOAT: | ||||
|             return ComponentType::Float; | ||||
|         case Tegra::RenderTargetFormat::RGBA32_UINT: | ||||
|             return ComponentType::UInt; | ||||
|  |  | |||
|  | @ -72,6 +72,8 @@ u32 BytesPerPixel(TextureFormat format) { | |||
|         return 8; | ||||
|     case TextureFormat::R32_G32_B32_A32: | ||||
|         return 16; | ||||
|     case TextureFormat::R32_G32: | ||||
|         return 8; | ||||
|     default: | ||||
|         UNIMPLEMENTED_MSG("Format not implemented"); | ||||
|         break; | ||||
|  | @ -118,6 +120,7 @@ std::vector<u8> UnswizzleTexture(VAddr address, TextureFormat format, u32 width, | |||
|     case TextureFormat::G8R8: | ||||
|     case TextureFormat::R16_G16_B16_A16: | ||||
|     case TextureFormat::R32_G32_B32_A32: | ||||
|     case TextureFormat::R32_G32: | ||||
|     case TextureFormat::BF10GF11RF11: | ||||
|     case TextureFormat::ASTC_2D_4X4: | ||||
|         CopySwizzledData(width, height, bytes_per_pixel, bytes_per_pixel, data, | ||||
|  | @ -174,6 +177,7 @@ std::vector<u8> DecodeTexture(const std::vector<u8>& texture_data, TextureFormat | |||
|     case TextureFormat::G8R8: | ||||
|     case TextureFormat::BF10GF11RF11: | ||||
|     case TextureFormat::R32_G32_B32_A32: | ||||
|     case TextureFormat::R32_G32: | ||||
|         // TODO(Subv): For the time being just forward the same data without any decoding.
 | ||||
|         rgba_data = texture_data; | ||||
|         break; | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue