mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu.git
				synced 2025-05-12 00:45:25 +00:00 
			
		
		
		
	Merge pull request #601 from Subv/rgba32_ui
GPU: Implement the RGBA32_UINT rendertarget format.
This commit is contained in:
		
						commit
						b611d852db
					
				| @ -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, | ||||
|  | ||||
| @ -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, | ||||
|  | ||||
| @ -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(); | ||||
|  | ||||
| @ -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; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 bunnei
						bunnei