Unify GLES support in gui scaling filter

This commit is contained in:
sfan5 2019-07-25 00:11:30 +02:00
parent ca363d3ef8
commit 6c2ded4cac
3 changed files with 45 additions and 39 deletions

@ -23,6 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "util/numeric.h" #include "util/numeric.h"
#include <cstdio> #include <cstdio>
#include "client/renderingengine.h" #include "client/renderingengine.h"
#include "client/tile.h" // hasNPotSupport()
/* Maintain a static cache to store the images that correspond to textures /* Maintain a static cache to store the images that correspond to textures
* in a format that's manipulable by code. Some platforms exhibit issues * in a format that's manipulable by code. Some platforms exhibit issues
@ -113,17 +114,18 @@ video::ITexture *guiScalingResizeCached(video::IVideoDriver *driver,
(u32)destrect.getHeight())); (u32)destrect.getHeight()));
imageScaleNNAA(srcimg, srcrect, destimg); imageScaleNNAA(srcimg, srcrect, destimg);
#ifdef __ANDROID__ #if ENABLE_GLES
// Android is very picky about textures being powers of 2, so expand // Some platforms are picky about textures being powers of 2, so expand
// the image dimensions to the next power of 2, if necessary, for // the image dimensions to the next power of 2, if necessary.
// that platform. if (!hasNPotSupport()) {
video::IImage *po2img = driver->createImage(src->getColorFormat(), video::IImage *po2img = driver->createImage(src->getColorFormat(),
core::dimension2d<u32>(npot2((u32)destrect.getWidth()), core::dimension2d<u32>(npot2((u32)destrect.getWidth()),
npot2((u32)destrect.getHeight()))); npot2((u32)destrect.getHeight())));
po2img->fill(video::SColor(0, 0, 0, 0)); po2img->fill(video::SColor(0, 0, 0, 0));
destimg->copyTo(po2img); destimg->copyTo(po2img);
destimg->drop(); destimg->drop();
destimg = po2img; destimg = po2img;
}
#endif #endif
// Convert the scaled image back into a texture. // Convert the scaled image back into a texture.

@ -995,12 +995,7 @@ video::IImage* TextureSource::generateImage(const std::string &name)
} }
#if ENABLE_GLES #if ENABLE_GLES
/**
* Check and align image to npot2 if required by hardware
* @param image image to check for npot2 alignment
* @param driver driver to use for image operations
* @return image or copy of image aligned to npot2
*/
static inline u16 get_GL_major_version() static inline u16 get_GL_major_version()
{ {
@ -1008,47 +1003,55 @@ static inline u16 get_GL_major_version()
return (u16) (gl_version[0] - '0'); return (u16) (gl_version[0] - '0');
} }
/**
* Check if hardware requires npot2 aligned textures
* @return true if alignment NOT(!) requires, false otherwise
*/
bool hasNPotSupport()
{
// Only GLES2 is trusted to correctly report npot support
// Note: we cache the boolean result, the GL context will never change.
static const bool supported = get_GL_major_version() > 1 &&
glGetString(GL_EXTENSIONS) &&
strstr((char *)glGetString(GL_EXTENSIONS), "GL_OES_texture_npot");
return supported;
}
/**
* Check and align image to npot2 if required by hardware
* @param image image to check for npot2 alignment
* @param driver driver to use for image operations
* @return image or copy of image aligned to npot2
*/
video::IImage * Align2Npot2(video::IImage * image, video::IImage * Align2Npot2(video::IImage * image,
video::IVideoDriver* driver) video::IVideoDriver* driver)
{ {
if (image == NULL) { if (image == NULL)
return image;
if (hasNPotSupport())
return image; return image;
}
core::dimension2d<u32> dim = image->getDimension(); core::dimension2d<u32> dim = image->getDimension();
// Only GLES2 is trusted to correctly report npot support
// Note: we cache the boolean result. GL context will never change on Android.
static const bool hasNPotSupport = get_GL_major_version() > 1 &&
glGetString(GL_EXTENSIONS) &&
strstr((char *)glGetString(GL_EXTENSIONS), "GL_OES_texture_npot");
if (hasNPotSupport)
return image;
unsigned int height = npot2(dim.Height); unsigned int height = npot2(dim.Height);
unsigned int width = npot2(dim.Width); unsigned int width = npot2(dim.Width);
if ((dim.Height == height) && if (dim.Height == height && dim.Width == width)
(dim.Width == width)) {
return image; return image;
}
if (dim.Height > height) { if (dim.Height > height)
height *= 2; height *= 2;
} if (dim.Width > width)
if (dim.Width > width) {
width *= 2; width *= 2;
}
video::IImage *targetimage = video::IImage *targetimage =
driver->createImage(video::ECF_A8R8G8B8, driver->createImage(video::ECF_A8R8G8B8,
core::dimension2d<u32>(width, height)); core::dimension2d<u32>(width, height));
if (targetimage != NULL) { if (targetimage != NULL)
image->copyToScaling(targetimage); image->copyToScaling(targetimage);
}
image->drop(); image->drop();
return targetimage; return targetimage;
} }

@ -135,6 +135,7 @@ public:
IWritableTextureSource *createTextureSource(); IWritableTextureSource *createTextureSource();
#if ENABLE_GLES #if ENABLE_GLES
bool hasNPotSupport();
video::IImage * Align2Npot2(video::IImage * image, irr::video::IVideoDriver* driver); video::IImage * Align2Npot2(video::IImage * image, irr::video::IVideoDriver* driver);
#endif #endif