forked from eden-emu/eden
		
	gl_rasterizer_cache: Implement PixelFormat RGBA16F.
This commit is contained in:
		
							parent
							
								
									4b027ee9f3
								
							
						
					
					
						commit
						995f57bbc1
					
				
					 3 changed files with 22 additions and 6 deletions
				
			
		|  | @ -49,6 +49,7 @@ static constexpr std::array<FormatTuple, SurfaceParams::MaxPixelFormat> tex_form | ||||||
|     {GL_RGB10_A2, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, false},              // A2B10G10R10
 |     {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_RGB5_A1, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, false},                // A1B5G5R5
 | ||||||
|     {GL_R8, GL_RED, GL_UNSIGNED_BYTE, false},                                   // R8
 |     {GL_R8, GL_RED, GL_UNSIGNED_BYTE, false},                                   // R8
 | ||||||
|  |     {GL_RGBA16F, GL_RGBA, GL_HALF_FLOAT, false},                                // RGBA16F
 | ||||||
|     {GL_COMPRESSED_RGB_S3TC_DXT1_EXT, GL_RGB, GL_UNSIGNED_INT_8_8_8_8, true},   // DXT1
 |     {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_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_RGBA_S3TC_DXT5_EXT, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, true}, // DXT45
 | ||||||
|  | @ -59,7 +60,6 @@ static const FormatTuple& GetFormatTuple(PixelFormat pixel_format, ComponentType | ||||||
|     if (type == SurfaceType::ColorTexture) { |     if (type == SurfaceType::ColorTexture) { | ||||||
|         ASSERT(static_cast<size_t>(pixel_format) < tex_format_tuples.size()); |         ASSERT(static_cast<size_t>(pixel_format) < tex_format_tuples.size()); | ||||||
|         // For now only UNORM components are supported
 |         // For now only UNORM components are supported
 | ||||||
|         ASSERT(component_type == ComponentType::UNorm); |  | ||||||
|         return tex_format_tuples[static_cast<unsigned int>(pixel_format)]; |         return tex_format_tuples[static_cast<unsigned int>(pixel_format)]; | ||||||
|     } else if (type == SurfaceType::Depth || type == SurfaceType::DepthStencil) { |     } else if (type == SurfaceType::Depth || type == SurfaceType::DepthStencil) { | ||||||
|         // TODO(Subv): Implement depth formats
 |         // TODO(Subv): Implement depth formats
 | ||||||
|  | @ -110,8 +110,9 @@ static constexpr std::array<void (*)(u32, u32, u32, u8*, Tegra::GPUVAddr, Tegra: | ||||||
|     morton_to_gl_fns = { |     morton_to_gl_fns = { | ||||||
|         MortonCopy<true, PixelFormat::ABGR8>,       MortonCopy<true, PixelFormat::B5G6R5>, |         MortonCopy<true, PixelFormat::ABGR8>,       MortonCopy<true, PixelFormat::B5G6R5>, | ||||||
|         MortonCopy<true, PixelFormat::A2B10G10R10>, MortonCopy<true, PixelFormat::A1B5G5R5>, |         MortonCopy<true, PixelFormat::A2B10G10R10>, MortonCopy<true, PixelFormat::A1B5G5R5>, | ||||||
|         MortonCopy<true, PixelFormat::R8>,          MortonCopy<true, PixelFormat::DXT1>, |         MortonCopy<true, PixelFormat::R8>,          MortonCopy<true, PixelFormat::RGBA16F>, | ||||||
|         MortonCopy<true, PixelFormat::DXT23>,       MortonCopy<true, PixelFormat::DXT45>, |         MortonCopy<true, PixelFormat::DXT1>,        MortonCopy<true, PixelFormat::DXT23>, | ||||||
|  |         MortonCopy<true, PixelFormat::DXT45>, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| static constexpr std::array<void (*)(u32, u32, u32, u8*, Tegra::GPUVAddr, Tegra::GPUVAddr, | static constexpr std::array<void (*)(u32, u32, u32, u8*, Tegra::GPUVAddr, Tegra::GPUVAddr, | ||||||
|  | @ -123,6 +124,7 @@ static constexpr std::array<void (*)(u32, u32, u32, u8*, Tegra::GPUVAddr, Tegra: | ||||||
|         MortonCopy<false, PixelFormat::A2B10G10R10>, |         MortonCopy<false, PixelFormat::A2B10G10R10>, | ||||||
|         MortonCopy<false, PixelFormat::A1B5G5R5>, |         MortonCopy<false, PixelFormat::A1B5G5R5>, | ||||||
|         MortonCopy<false, PixelFormat::R8>, |         MortonCopy<false, PixelFormat::R8>, | ||||||
|  |         MortonCopy<false, PixelFormat::RGBA16F>, | ||||||
|         // TODO(Subv): Swizzling the DXT1/DXT23/DXT45 formats is not yet supported
 |         // TODO(Subv): Swizzling the DXT1/DXT23/DXT45 formats is not yet supported
 | ||||||
|         nullptr, |         nullptr, | ||||||
|         nullptr, |         nullptr, | ||||||
|  |  | ||||||
|  | @ -59,9 +59,10 @@ struct SurfaceParams { | ||||||
|         A2B10G10R10 = 2, |         A2B10G10R10 = 2, | ||||||
|         A1B5G5R5 = 3, |         A1B5G5R5 = 3, | ||||||
|         R8 = 4, |         R8 = 4, | ||||||
|         DXT1 = 5, |         RGBA16F = 5, | ||||||
|         DXT23 = 6, |         DXT1 = 6, | ||||||
|         DXT45 = 7, |         DXT23 = 7, | ||||||
|  |         DXT45 = 8, | ||||||
| 
 | 
 | ||||||
|         Max, |         Max, | ||||||
|         Invalid = 255, |         Invalid = 255, | ||||||
|  | @ -102,6 +103,7 @@ struct SurfaceParams { | ||||||
|             1, // A2B10G10R10
 |             1, // A2B10G10R10
 | ||||||
|             1, // A1B5G5R5
 |             1, // A1B5G5R5
 | ||||||
|             1, // R8
 |             1, // R8
 | ||||||
|  |             2, // RGBA16F
 | ||||||
|             4, // DXT1
 |             4, // DXT1
 | ||||||
|             4, // DXT23
 |             4, // DXT23
 | ||||||
|             4, // DXT45
 |             4, // DXT45
 | ||||||
|  | @ -124,6 +126,7 @@ struct SurfaceParams { | ||||||
|             32,  // A2B10G10R10
 |             32,  // A2B10G10R10
 | ||||||
|             16,  // A1B5G5R5
 |             16,  // A1B5G5R5
 | ||||||
|             8,   // R8
 |             8,   // R8
 | ||||||
|  |             64,  // RGBA16F
 | ||||||
|             64,  // DXT1
 |             64,  // DXT1
 | ||||||
|             128, // DXT23
 |             128, // DXT23
 | ||||||
|             128, // DXT45
 |             128, // DXT45
 | ||||||
|  | @ -143,6 +146,8 @@ struct SurfaceParams { | ||||||
|             return PixelFormat::ABGR8; |             return PixelFormat::ABGR8; | ||||||
|         case Tegra::RenderTargetFormat::RGB10_A2_UNORM: |         case Tegra::RenderTargetFormat::RGB10_A2_UNORM: | ||||||
|             return PixelFormat::A2B10G10R10; |             return PixelFormat::A2B10G10R10; | ||||||
|  |         case Tegra::RenderTargetFormat::RGBA16_FLOAT: | ||||||
|  |             return PixelFormat::RGBA16F; | ||||||
|         default: |         default: | ||||||
|             NGLOG_CRITICAL(HW_GPU, "Unimplemented format={}", static_cast<u32>(format)); |             NGLOG_CRITICAL(HW_GPU, "Unimplemented format={}", static_cast<u32>(format)); | ||||||
|             UNREACHABLE(); |             UNREACHABLE(); | ||||||
|  | @ -172,6 +177,8 @@ struct SurfaceParams { | ||||||
|             return PixelFormat::A1B5G5R5; |             return PixelFormat::A1B5G5R5; | ||||||
|         case Tegra::Texture::TextureFormat::R8: |         case Tegra::Texture::TextureFormat::R8: | ||||||
|             return PixelFormat::R8; |             return PixelFormat::R8; | ||||||
|  |         case Tegra::Texture::TextureFormat::R16_G16_B16_A16: | ||||||
|  |             return PixelFormat::RGBA16F; | ||||||
|         case Tegra::Texture::TextureFormat::DXT1: |         case Tegra::Texture::TextureFormat::DXT1: | ||||||
|             return PixelFormat::DXT1; |             return PixelFormat::DXT1; | ||||||
|         case Tegra::Texture::TextureFormat::DXT23: |         case Tegra::Texture::TextureFormat::DXT23: | ||||||
|  | @ -197,6 +204,8 @@ struct SurfaceParams { | ||||||
|             return Tegra::Texture::TextureFormat::A1B5G5R5; |             return Tegra::Texture::TextureFormat::A1B5G5R5; | ||||||
|         case PixelFormat::R8: |         case PixelFormat::R8: | ||||||
|             return Tegra::Texture::TextureFormat::R8; |             return Tegra::Texture::TextureFormat::R8; | ||||||
|  |         case PixelFormat::RGBA16F: | ||||||
|  |             return Tegra::Texture::TextureFormat::R16_G16_B16_A16; | ||||||
|         case PixelFormat::DXT1: |         case PixelFormat::DXT1: | ||||||
|             return Tegra::Texture::TextureFormat::DXT1; |             return Tegra::Texture::TextureFormat::DXT1; | ||||||
|         case PixelFormat::DXT23: |         case PixelFormat::DXT23: | ||||||
|  | @ -226,6 +235,8 @@ struct SurfaceParams { | ||||||
|         case Tegra::RenderTargetFormat::RGBA8_SRGB: |         case Tegra::RenderTargetFormat::RGBA8_SRGB: | ||||||
|         case Tegra::RenderTargetFormat::RGB10_A2_UNORM: |         case Tegra::RenderTargetFormat::RGB10_A2_UNORM: | ||||||
|             return ComponentType::UNorm; |             return ComponentType::UNorm; | ||||||
|  |         case Tegra::RenderTargetFormat::RGBA16_FLOAT: | ||||||
|  |             return ComponentType::Float; | ||||||
|         default: |         default: | ||||||
|             NGLOG_CRITICAL(HW_GPU, "Unimplemented format={}", static_cast<u32>(format)); |             NGLOG_CRITICAL(HW_GPU, "Unimplemented format={}", static_cast<u32>(format)); | ||||||
|             UNREACHABLE(); |             UNREACHABLE(); | ||||||
|  |  | ||||||
|  | @ -60,6 +60,8 @@ u32 BytesPerPixel(TextureFormat format) { | ||||||
|         return 2; |         return 2; | ||||||
|     case TextureFormat::R8: |     case TextureFormat::R8: | ||||||
|         return 1; |         return 1; | ||||||
|  |     case TextureFormat::R16_G16_B16_A16: | ||||||
|  |         return 8; | ||||||
|     default: |     default: | ||||||
|         UNIMPLEMENTED_MSG("Format not implemented"); |         UNIMPLEMENTED_MSG("Format not implemented"); | ||||||
|         break; |         break; | ||||||
|  | @ -86,6 +88,7 @@ std::vector<u8> UnswizzleTexture(VAddr address, TextureFormat format, u32 width, | ||||||
|     case TextureFormat::A1B5G5R5: |     case TextureFormat::A1B5G5R5: | ||||||
|     case TextureFormat::B5G6R5: |     case TextureFormat::B5G6R5: | ||||||
|     case TextureFormat::R8: |     case TextureFormat::R8: | ||||||
|  |     case TextureFormat::R16_G16_B16_A16: | ||||||
|         CopySwizzledData(width, height, bytes_per_pixel, bytes_per_pixel, data, |         CopySwizzledData(width, height, bytes_per_pixel, bytes_per_pixel, data, | ||||||
|                          unswizzled_data.data(), true, block_height); |                          unswizzled_data.data(), true, block_height); | ||||||
|         break; |         break; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 bunnei
						bunnei