123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240 |
- --- 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)
|