mirror of
				https://github.com/luanti-org/luanti.git
				synced 2025-11-04 01:05:48 +01:00 
			
		
		
		
	There have been plenty of ppl involved in creating this version. I don't wanna mention names as I'm sure I'd forget someone so I just tell where help has been done: - The partial android versions done by various ppl - Testing on different android devices - reviewing code (especially the in core changes) - testing controls - reviewing texts A big thank you to everyone helping this to be completed!
		
			
				
	
	
		
			241 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			241 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
--- irrlicht/source/Irrlicht/COGLESTexture.cpp.orig	2014-06-22 17:01:13.266568869 +0200
 | 
						|
+++ irrlicht/source/Irrlicht/COGLESTexture.cpp	2014-06-22 17:03:59.298572810 +0200
 | 
						|
@@ -366,112 +366,140 @@
 | 
						|
 	void(*convert)(const void*, s32, void*) = 0;
 | 
						|
 	getFormatParameters(ColorFormat, InternalFormat, filtering, PixelFormat, PixelType, convert);
 | 
						|
 
 | 
						|
-	// make sure we don't change the internal format of existing images
 | 
						|
-	if (!newTexture)
 | 
						|
-		InternalFormat = oldInternalFormat;
 | 
						|
-
 | 
						|
-    Driver->setActiveTexture(0, this);
 | 
						|
-
 | 
						|
-	if (Driver->testGLError())
 | 
						|
-		os::Printer::log("Could not bind Texture", ELL_ERROR);
 | 
						|
-
 | 
						|
-	// mipmap handling for main texture
 | 
						|
-	if (!level && newTexture)
 | 
						|
-	{
 | 
						|
-		// auto generate if possible and no mipmap data is given
 | 
						|
-		if (!IsCompressed && HasMipMaps && !mipmapData && Driver->queryFeature(EVDF_MIP_MAP_AUTO_UPDATE))
 | 
						|
-		{
 | 
						|
-			if (Driver->getTextureCreationFlag(ETCF_OPTIMIZED_FOR_SPEED))
 | 
						|
-				glHint(GL_GENERATE_MIPMAP_HINT, GL_FASTEST);
 | 
						|
-			else if (Driver->getTextureCreationFlag(ETCF_OPTIMIZED_FOR_QUALITY))
 | 
						|
-				glHint(GL_GENERATE_MIPMAP_HINT, GL_NICEST);
 | 
						|
-			else
 | 
						|
-				glHint(GL_GENERATE_MIPMAP_HINT, GL_DONT_CARE);
 | 
						|
+	bool retry = false;
 | 
						|
+	
 | 
						|
+	do { 
 | 
						|
+		if (retry) {
 | 
						|
+			InternalFormat = GL_RGBA;
 | 
						|
+			PixelFormat = GL_RGBA;
 | 
						|
+			convert = CColorConverter::convert_A8R8G8B8toA8B8G8R8;
 | 
						|
+ 		}
 | 
						|
+		// make sure we don't change the internal format of existing images
 | 
						|
+		if (!newTexture)
 | 
						|
+			InternalFormat = oldInternalFormat;
 | 
						|
 
 | 
						|
-            glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
 | 
						|
-			AutomaticMipmapUpdate=true;
 | 
						|
-		}
 | 
						|
+		Driver->setActiveTexture(0, this);
 | 
						|
 
 | 
						|
-		// enable bilinear filter without mipmaps
 | 
						|
-		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filtering);
 | 
						|
-		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filtering);
 | 
						|
-	}
 | 
						|
+		if (Driver->testGLError())
 | 
						|
+			os::Printer::log("Could not bind Texture", ELL_ERROR);
 | 
						|
 
 | 
						|
-	// now get image data and upload to GPU
 | 
						|
+		// mipmap handling for main texture
 | 
						|
+		if (!level && newTexture)
 | 
						|
+		{
 | 
						|
+			// auto generate if possible and no mipmap data is given
 | 
						|
+			if (!IsCompressed && HasMipMaps && !mipmapData && Driver->queryFeature(EVDF_MIP_MAP_AUTO_UPDATE))
 | 
						|
+			{
 | 
						|
+				if (Driver->getTextureCreationFlag(ETCF_OPTIMIZED_FOR_SPEED))
 | 
						|
+					glHint(GL_GENERATE_MIPMAP_HINT, GL_FASTEST);
 | 
						|
+				else if (Driver->getTextureCreationFlag(ETCF_OPTIMIZED_FOR_QUALITY))
 | 
						|
+					glHint(GL_GENERATE_MIPMAP_HINT, GL_NICEST);
 | 
						|
+				else
 | 
						|
+					glHint(GL_GENERATE_MIPMAP_HINT, GL_DONT_CARE);
 | 
						|
+
 | 
						|
+				glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
 | 
						|
+				AutomaticMipmapUpdate=true;
 | 
						|
+			}
 | 
						|
+
 | 
						|
+			// enable bilinear filter without mipmaps
 | 
						|
+			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filtering);
 | 
						|
+			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filtering);
 | 
						|
+		}
 | 
						|
 
 | 
						|
-	u32 compressedImageSize = IImage::getCompressedImageSize(ColorFormat, image->getDimension().Width, image->getDimension().Height);
 | 
						|
+		// now get image data and upload to GPU
 | 
						|
 
 | 
						|
-	void* source = image->lock();
 | 
						|
+		u32 compressedImageSize = IImage::getCompressedImageSize(ColorFormat, image->getDimension().Width, image->getDimension().Height);
 | 
						|
 
 | 
						|
-	IImage* tmpImage = 0;
 | 
						|
+		void* source = image->lock();
 | 
						|
 
 | 
						|
-	if (convert)
 | 
						|
-	{
 | 
						|
-		tmpImage = new CImage(image->getColorFormat(), image->getDimension());
 | 
						|
-		void* dest = tmpImage->lock();
 | 
						|
-		convert(source, image->getDimension().getArea(), dest);
 | 
						|
-		image->unlock();
 | 
						|
-		source = dest;
 | 
						|
-	}
 | 
						|
+		IImage* tmpImage = 0;
 | 
						|
 
 | 
						|
-	if (newTexture)
 | 
						|
-	{
 | 
						|
-		if (IsCompressed)
 | 
						|
+		if (convert)
 | 
						|
 		{
 | 
						|
-			glCompressedTexImage2D(GL_TEXTURE_2D, 0, InternalFormat, image->getDimension().Width,
 | 
						|
-				image->getDimension().Height, 0, compressedImageSize, source);
 | 
						|
+			tmpImage = new CImage(image->getColorFormat(), image->getDimension());
 | 
						|
+			void* dest = tmpImage->lock();
 | 
						|
+			convert(source, image->getDimension().getArea(), dest);
 | 
						|
+			image->unlock();
 | 
						|
+			source = dest;
 | 
						|
 		}
 | 
						|
-		else
 | 
						|
-			glTexImage2D(GL_TEXTURE_2D, level, InternalFormat, image->getDimension().Width,
 | 
						|
-				image->getDimension().Height, 0, PixelFormat, PixelType, source);
 | 
						|
-	}
 | 
						|
-	else
 | 
						|
-	{
 | 
						|
-		if (IsCompressed)
 | 
						|
+
 | 
						|
+		if (newTexture)
 | 
						|
 		{
 | 
						|
-			glCompressedTexSubImage2D(GL_TEXTURE_2D, level, 0, 0, image->getDimension().Width,
 | 
						|
-				image->getDimension().Height, PixelFormat, compressedImageSize, source);
 | 
						|
+			if (IsCompressed)
 | 
						|
+			{
 | 
						|
+				glCompressedTexImage2D(GL_TEXTURE_2D, 0, InternalFormat, image->getDimension().Width,
 | 
						|
+					image->getDimension().Height, 0, compressedImageSize, source);
 | 
						|
+			}
 | 
						|
+			else
 | 
						|
+				glTexImage2D(GL_TEXTURE_2D, level, InternalFormat, image->getDimension().Width,
 | 
						|
+					image->getDimension().Height, 0, PixelFormat, PixelType, source);
 | 
						|
 		}
 | 
						|
 		else
 | 
						|
-			glTexSubImage2D(GL_TEXTURE_2D, level, 0, 0, image->getDimension().Width,
 | 
						|
-				image->getDimension().Height, PixelFormat, PixelType, source);
 | 
						|
-	}
 | 
						|
-
 | 
						|
-	if (convert)
 | 
						|
-	{
 | 
						|
-		tmpImage->unlock();
 | 
						|
-		tmpImage->drop();
 | 
						|
-	}
 | 
						|
-	else
 | 
						|
-		image->unlock();
 | 
						|
-
 | 
						|
-	if (!level && newTexture)
 | 
						|
-	{
 | 
						|
-		if (IsCompressed && !mipmapData)
 | 
						|
 		{
 | 
						|
-			if (image->hasMipMaps())
 | 
						|
-				mipmapData = static_cast<u8*>(image->lock())+compressedImageSize;
 | 
						|
+			if (IsCompressed)
 | 
						|
+			{
 | 
						|
+				glCompressedTexSubImage2D(GL_TEXTURE_2D, level, 0, 0, image->getDimension().Width,
 | 
						|
+					image->getDimension().Height, PixelFormat, compressedImageSize, source);
 | 
						|
+			}
 | 
						|
 			else
 | 
						|
-				HasMipMaps = false;
 | 
						|
+				glTexSubImage2D(GL_TEXTURE_2D, level, 0, 0, image->getDimension().Width,
 | 
						|
+					image->getDimension().Height, PixelFormat, PixelType, source);
 | 
						|
 		}
 | 
						|
 
 | 
						|
-		regenerateMipMapLevels(mipmapData);
 | 
						|
-
 | 
						|
-		if (HasMipMaps) // might have changed in regenerateMipMapLevels
 | 
						|
+		if (convert)
 | 
						|
 		{
 | 
						|
-			// enable bilinear mipmap filter
 | 
						|
-			GLint filteringMipMaps = GL_LINEAR_MIPMAP_NEAREST;
 | 
						|
-
 | 
						|
-			if (filtering != GL_LINEAR)
 | 
						|
-				filteringMipMaps = GL_NEAREST_MIPMAP_NEAREST;
 | 
						|
+			tmpImage->unlock();
 | 
						|
+			tmpImage->drop();
 | 
						|
+		}
 | 
						|
+		else
 | 
						|
+			image->unlock();
 | 
						|
+		
 | 
						|
+		if (glGetError() != GL_NO_ERROR) {
 | 
						|
+			static bool warned = false;
 | 
						|
+			if ((!retry) && (ColorFormat == ECF_A8R8G8B8)) {
 | 
						|
+
 | 
						|
+				if (!warned) {
 | 
						|
+					os::Printer::log("Your driver claims to support GL_BGRA but fails on trying to upload a texture, converting to GL_RGBA and trying again", ELL_ERROR);
 | 
						|
+					warned = true;
 | 
						|
+				}
 | 
						|
+			}
 | 
						|
+			else if (retry) {
 | 
						|
+				os::Printer::log("Neither uploading texture as GL_BGRA nor, converted one using GL_RGBA succeeded", ELL_ERROR);
 | 
						|
+			}
 | 
						|
+			retry = !retry;
 | 
						|
+			continue;
 | 
						|
+		} else {
 | 
						|
+			retry = false;
 | 
						|
+		}
 | 
						|
 
 | 
						|
-			glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filteringMipMaps);
 | 
						|
-			glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filtering);
 | 
						|
+		if (!level && newTexture)
 | 
						|
+		{
 | 
						|
+			if (IsCompressed && !mipmapData)
 | 
						|
+			{
 | 
						|
+				if (image->hasMipMaps())
 | 
						|
+					mipmapData = static_cast<u8*>(image->lock())+compressedImageSize;
 | 
						|
+				else
 | 
						|
+					HasMipMaps = false;
 | 
						|
+			}
 | 
						|
+
 | 
						|
+			regenerateMipMapLevels(mipmapData);
 | 
						|
+
 | 
						|
+			if (HasMipMaps) // might have changed in regenerateMipMapLevels
 | 
						|
+			{
 | 
						|
+				// enable bilinear mipmap filter
 | 
						|
+				GLint filteringMipMaps = GL_LINEAR_MIPMAP_NEAREST;
 | 
						|
+
 | 
						|
+				if (filtering != GL_LINEAR)
 | 
						|
+					filteringMipMaps = GL_NEAREST_MIPMAP_NEAREST;
 | 
						|
+
 | 
						|
+				glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filteringMipMaps);
 | 
						|
+				glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filtering);
 | 
						|
+			}
 | 
						|
 		}
 | 
						|
-	}
 | 
						|
 
 | 
						|
-	if (Driver->testGLError())
 | 
						|
-		os::Printer::log("Could not glTexImage2D", ELL_ERROR);
 | 
						|
+		if (Driver->testGLError())
 | 
						|
+			os::Printer::log("Could not glTexImage2D", ELL_ERROR);
 | 
						|
+	}
 | 
						|
+	while(retry);
 | 
						|
 }
 | 
						|
 
 | 
						|
 
 | 
						|
--- irrlicht/source/Irrlicht/COGLESTexture.cpp.orig	2014-06-25 00:28:50.820501856 +0200
 | 
						|
+++ irrlicht/source/Irrlicht/COGLESTexture.cpp	2014-06-25 00:08:37.712544692 +0200
 | 
						|
@@ -422,6 +422,9 @@
 | 
						|
 			source = dest;
 | 
						|
 		}
 | 
						|
 
 | 
						|
+		//clear old error
 | 
						|
+		glGetError();
 | 
						|
+
 | 
						|
 		if (newTexture)
 | 
						|
 		{
 | 
						|
 			if (IsCompressed)
 |