1 --- irrlicht/source/Irrlicht/COGLESTexture.cpp.orig 2014-06-22 17:01:13.266568869 +0200
2 +++ irrlicht/source/Irrlicht/COGLESTexture.cpp 2014-06-22 17:03:59.298572810 +0200
3 @@ -366,112 +366,140 @@
4 void(*convert)(const void*, s32, void*) = 0;
\r
5 getFormatParameters(ColorFormat, InternalFormat, filtering, PixelFormat, PixelType, convert);
\r
7 - // make sure we don't change the internal format of existing images
\r
9 - InternalFormat = oldInternalFormat;
\r
11 - Driver->setActiveTexture(0, this);
\r
13 - if (Driver->testGLError())
\r
14 - os::Printer::log("Could not bind Texture", ELL_ERROR);
\r
16 - // mipmap handling for main texture
\r
17 - if (!level && newTexture)
\r
19 - // auto generate if possible and no mipmap data is given
\r
20 - if (!IsCompressed && HasMipMaps && !mipmapData && Driver->queryFeature(EVDF_MIP_MAP_AUTO_UPDATE))
\r
22 - if (Driver->getTextureCreationFlag(ETCF_OPTIMIZED_FOR_SPEED))
\r
23 - glHint(GL_GENERATE_MIPMAP_HINT, GL_FASTEST);
\r
24 - else if (Driver->getTextureCreationFlag(ETCF_OPTIMIZED_FOR_QUALITY))
\r
25 - glHint(GL_GENERATE_MIPMAP_HINT, GL_NICEST);
\r
27 - glHint(GL_GENERATE_MIPMAP_HINT, GL_DONT_CARE);
\r
28 + bool retry = false;
\r
32 + InternalFormat = GL_RGBA;
\r
33 + PixelFormat = GL_RGBA;
\r
34 + convert = CColorConverter::convert_A8R8G8B8toA8B8G8R8;
\r
36 + // make sure we don't change the internal format of existing images
\r
38 + InternalFormat = oldInternalFormat;
\r
40 - glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
\r
41 - AutomaticMipmapUpdate=true;
\r
43 + Driver->setActiveTexture(0, this);
\r
45 - // enable bilinear filter without mipmaps
\r
46 - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filtering);
\r
47 - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filtering);
\r
49 + if (Driver->testGLError())
\r
50 + os::Printer::log("Could not bind Texture", ELL_ERROR);
\r
52 - // now get image data and upload to GPU
\r
53 + // mipmap handling for main texture
\r
54 + if (!level && newTexture)
\r
56 + // auto generate if possible and no mipmap data is given
\r
57 + if (!IsCompressed && HasMipMaps && !mipmapData && Driver->queryFeature(EVDF_MIP_MAP_AUTO_UPDATE))
\r
59 + if (Driver->getTextureCreationFlag(ETCF_OPTIMIZED_FOR_SPEED))
\r
60 + glHint(GL_GENERATE_MIPMAP_HINT, GL_FASTEST);
\r
61 + else if (Driver->getTextureCreationFlag(ETCF_OPTIMIZED_FOR_QUALITY))
\r
62 + glHint(GL_GENERATE_MIPMAP_HINT, GL_NICEST);
\r
64 + glHint(GL_GENERATE_MIPMAP_HINT, GL_DONT_CARE);
\r
66 + glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
\r
67 + AutomaticMipmapUpdate=true;
\r
70 + // enable bilinear filter without mipmaps
\r
71 + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filtering);
\r
72 + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filtering);
\r
75 - u32 compressedImageSize = IImage::getCompressedImageSize(ColorFormat, image->getDimension().Width, image->getDimension().Height);
\r
76 + // now get image data and upload to GPU
\r
78 - void* source = image->lock();
\r
79 + u32 compressedImageSize = IImage::getCompressedImageSize(ColorFormat, image->getDimension().Width, image->getDimension().Height);
\r
81 - IImage* tmpImage = 0;
\r
82 + void* source = image->lock();
\r
86 - tmpImage = new CImage(image->getColorFormat(), image->getDimension());
\r
87 - void* dest = tmpImage->lock();
\r
88 - convert(source, image->getDimension().getArea(), dest);
\r
92 + IImage* tmpImage = 0;
\r
99 - glCompressedTexImage2D(GL_TEXTURE_2D, 0, InternalFormat, image->getDimension().Width,
\r
100 - image->getDimension().Height, 0, compressedImageSize, source);
\r
101 + tmpImage = new CImage(image->getColorFormat(), image->getDimension());
\r
102 + void* dest = tmpImage->lock();
\r
103 + convert(source, image->getDimension().getArea(), dest);
\r
108 - glTexImage2D(GL_TEXTURE_2D, level, InternalFormat, image->getDimension().Width,
\r
109 - image->getDimension().Height, 0, PixelFormat, PixelType, source);
\r
113 - if (IsCompressed)
\r
117 - glCompressedTexSubImage2D(GL_TEXTURE_2D, level, 0, 0, image->getDimension().Width,
\r
118 - image->getDimension().Height, PixelFormat, compressedImageSize, source);
\r
119 + if (IsCompressed)
\r
121 + glCompressedTexImage2D(GL_TEXTURE_2D, 0, InternalFormat, image->getDimension().Width,
\r
122 + image->getDimension().Height, 0, compressedImageSize, source);
\r
125 + glTexImage2D(GL_TEXTURE_2D, level, InternalFormat, image->getDimension().Width,
\r
126 + image->getDimension().Height, 0, PixelFormat, PixelType, source);
\r
129 - glTexSubImage2D(GL_TEXTURE_2D, level, 0, 0, image->getDimension().Width,
\r
130 - image->getDimension().Height, PixelFormat, PixelType, source);
\r
135 - tmpImage->unlock();
\r
136 - tmpImage->drop();
\r
141 - if (!level && newTexture)
\r
143 - if (IsCompressed && !mipmapData)
\r
145 - if (image->hasMipMaps())
\r
146 - mipmapData = static_cast<u8*>(image->lock())+compressedImageSize;
\r
147 + if (IsCompressed)
\r
149 + glCompressedTexSubImage2D(GL_TEXTURE_2D, level, 0, 0, image->getDimension().Width,
\r
150 + image->getDimension().Height, PixelFormat, compressedImageSize, source);
\r
153 - HasMipMaps = false;
\r
154 + glTexSubImage2D(GL_TEXTURE_2D, level, 0, 0, image->getDimension().Width,
\r
155 + image->getDimension().Height, PixelFormat, PixelType, source);
\r
158 - regenerateMipMapLevels(mipmapData);
\r
160 - if (HasMipMaps) // might have changed in regenerateMipMapLevels
\r
163 - // enable bilinear mipmap filter
\r
164 - GLint filteringMipMaps = GL_LINEAR_MIPMAP_NEAREST;
\r
166 - if (filtering != GL_LINEAR)
\r
167 - filteringMipMaps = GL_NEAREST_MIPMAP_NEAREST;
\r
168 + tmpImage->unlock();
\r
169 + tmpImage->drop();
\r
174 + if (glGetError() != GL_NO_ERROR) {
\r
175 + static bool warned = false;
\r
176 + if ((!retry) && (ColorFormat == ECF_A8R8G8B8)) {
\r
179 + 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);
\r
183 + else if (retry) {
\r
184 + os::Printer::log("Neither uploading texture as GL_BGRA nor, converted one using GL_RGBA succeeded", ELL_ERROR);
\r
192 - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filteringMipMaps);
\r
193 - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filtering);
\r
194 + if (!level && newTexture)
\r
196 + if (IsCompressed && !mipmapData)
\r
198 + if (image->hasMipMaps())
\r
199 + mipmapData = static_cast<u8*>(image->lock())+compressedImageSize;
\r
201 + HasMipMaps = false;
\r
204 + regenerateMipMapLevels(mipmapData);
\r
206 + if (HasMipMaps) // might have changed in regenerateMipMapLevels
\r
208 + // enable bilinear mipmap filter
\r
209 + GLint filteringMipMaps = GL_LINEAR_MIPMAP_NEAREST;
\r
211 + if (filtering != GL_LINEAR)
\r
212 + filteringMipMaps = GL_NEAREST_MIPMAP_NEAREST;
\r
214 + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filteringMipMaps);
\r
215 + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filtering);
\r
220 - if (Driver->testGLError())
\r
221 - os::Printer::log("Could not glTexImage2D", ELL_ERROR);
\r
222 + if (Driver->testGLError())
\r
223 + os::Printer::log("Could not glTexImage2D", ELL_ERROR);
\r
229 --- irrlicht/source/Irrlicht/COGLESTexture.cpp.orig 2014-06-25 00:28:50.820501856 +0200
230 +++ irrlicht/source/Irrlicht/COGLESTexture.cpp 2014-06-25 00:08:37.712544692 +0200
235 + //clear old error
\r