forked from Mirrorlandia_minetest/minetest
Unify GLES support in gui scaling filter
This commit is contained in:
parent
ca363d3ef8
commit
6c2ded4cac
@ -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
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user