mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-30 21:30:04 +00:00 
			
		
		
		
	video_core: renderer_opengl: gles color fix
This commit is contained in:
		
							parent
							
								
									acaca4188e
								
							
						
					
					
						commit
						3983b12086
					
				
					 1 changed files with 40 additions and 2 deletions
				
			
		|  | @ -175,6 +175,20 @@ static void MortonCopyTile(u32 stride, u8* tile_buffer, u8* gl_buffer) { | ||||||
|                 if (format == PixelFormat::D24S8) { |                 if (format == PixelFormat::D24S8) { | ||||||
|                     gl_ptr[0] = tile_ptr[3]; |                     gl_ptr[0] = tile_ptr[3]; | ||||||
|                     std::memcpy(gl_ptr + 1, tile_ptr, 3); |                     std::memcpy(gl_ptr + 1, tile_ptr, 3); | ||||||
|  |                 } else if (format == PixelFormat::RGBA8 && GLES) { | ||||||
|  |                     // because GLES does not have BGR format
 | ||||||
|  |                     // so we will do byteswapping here
 | ||||||
|  |                     gl_ptr[0] = tile_ptr[3]; | ||||||
|  |                     gl_ptr[1] = tile_ptr[2]; | ||||||
|  |                     gl_ptr[2] = tile_ptr[1]; | ||||||
|  |                     gl_ptr[3] = tile_ptr[0]; | ||||||
|  |                 } else if (format == PixelFormat::RGB8 && GLES) { | ||||||
|  |                     // the last channel Alpha should keep the same
 | ||||||
|  |                     // position as the original
 | ||||||
|  |                     gl_ptr[0] = tile_ptr[2]; | ||||||
|  |                     gl_ptr[1] = tile_ptr[1]; | ||||||
|  |                     gl_ptr[2] = tile_ptr[0]; | ||||||
|  |                     gl_ptr[3] = tile_ptr[3]; | ||||||
|                 } else { |                 } else { | ||||||
|                     std::memcpy(gl_ptr, tile_ptr, bytes_per_pixel); |                     std::memcpy(gl_ptr, tile_ptr, bytes_per_pixel); | ||||||
|                 } |                 } | ||||||
|  | @ -719,6 +733,9 @@ void RasterizerCacheOpenGL::CopySurface(const Surface& src_surface, const Surfac | ||||||
| MICROPROFILE_DEFINE(OpenGL_SurfaceLoad, "OpenGL", "Surface Load", MP_RGB(128, 192, 64)); | MICROPROFILE_DEFINE(OpenGL_SurfaceLoad, "OpenGL", "Surface Load", MP_RGB(128, 192, 64)); | ||||||
| void CachedSurface::LoadGLBuffer(PAddr load_start, PAddr load_end) { | void CachedSurface::LoadGLBuffer(PAddr load_start, PAddr load_end) { | ||||||
|     ASSERT(type != SurfaceType::Fill); |     ASSERT(type != SurfaceType::Fill); | ||||||
|  |     // FIXME(liushuyu): not endianness-aware, assumed little-endian
 | ||||||
|  |     bool need_swap = | ||||||
|  |         GLES && (pixel_format == PixelFormat::RGBA8 || pixel_format == PixelFormat::RGB8); | ||||||
| 
 | 
 | ||||||
|     const u8* const texture_src_data = VideoCore::g_memory->GetPhysicalPointer(addr); |     const u8* const texture_src_data = VideoCore::g_memory->GetPhysicalPointer(addr); | ||||||
|     if (texture_src_data == nullptr) |     if (texture_src_data == nullptr) | ||||||
|  | @ -743,8 +760,28 @@ void CachedSurface::LoadGLBuffer(PAddr load_start, PAddr load_end) { | ||||||
| 
 | 
 | ||||||
|     if (!is_tiled) { |     if (!is_tiled) { | ||||||
|         ASSERT(type == SurfaceType::Color); |         ASSERT(type == SurfaceType::Color); | ||||||
|         std::memcpy(&gl_buffer[start_offset], texture_src_data + start_offset, |         if (need_swap) { | ||||||
|                     load_end - load_start); |             // TODO(liushuyu): check if the byteswap here is 100% correct
 | ||||||
|  |             // cannot fully test this
 | ||||||
|  |             if (pixel_format == PixelFormat::RGBA8) { | ||||||
|  |                 for (size_t i = start_offset; i < load_end - addr; i += 4) { | ||||||
|  |                     gl_buffer[i] = *(texture_src_data + start_offset + i + 3); | ||||||
|  |                     gl_buffer[i + 1] = *(texture_src_data + start_offset + i + 2); | ||||||
|  |                     gl_buffer[i + 2] = *(texture_src_data + start_offset + i + 1); | ||||||
|  |                     gl_buffer[i + 3] = *(texture_src_data + start_offset + i); | ||||||
|  |                 } | ||||||
|  |             } else if (pixel_format == PixelFormat::RGB8) { | ||||||
|  |                 for (size_t i = start_offset; i < load_end - addr; i += 4) { | ||||||
|  |                     gl_buffer[i] = *(texture_src_data + start_offset + i + 2); | ||||||
|  |                     gl_buffer[i + 1] = *(texture_src_data + start_offset + i + 1); | ||||||
|  |                     gl_buffer[i + 2] = *(texture_src_data + start_offset + i); | ||||||
|  |                     gl_buffer[i + 3] = *(texture_src_data + start_offset + i + 3); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } else { | ||||||
|  |             std::memcpy(&gl_buffer[start_offset], texture_src_data + start_offset, | ||||||
|  |                         load_end - load_start); | ||||||
|  |         } | ||||||
|     } else { |     } else { | ||||||
|         if (type == SurfaceType::Texture) { |         if (type == SurfaceType::Texture) { | ||||||
|             Pica::Texture::TextureInfo tex_info{}; |             Pica::Texture::TextureInfo tex_info{}; | ||||||
|  | @ -764,6 +801,7 @@ void CachedSurface::LoadGLBuffer(PAddr load_start, PAddr load_end) { | ||||||
|                         Pica::Texture::LookupTexture(texture_src_data, x, height - 1 - y, tex_info); |                         Pica::Texture::LookupTexture(texture_src_data, x, height - 1 - y, tex_info); | ||||||
|                     const std::size_t offset = (x + (width * y)) * 4; |                     const std::size_t offset = (x + (width * y)) * 4; | ||||||
|                     std::memcpy(&gl_buffer[offset], vec4.AsArray(), 4); |                     std::memcpy(&gl_buffer[offset], vec4.AsArray(), 4); | ||||||
|  |                     // TODO(liushuyu): byteswap textures
 | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } else { |         } else { | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue