- added new ini setting to see if this helps fix non power of two texture loading for some ATI video cards, user needs to set this in the ini:

EnableATIHacks=true
This commit is contained in:
Mark Vejvoda
2011-04-28 07:48:19 +00:00
parent 95dcd042a3
commit 15489b066f
6 changed files with 117 additions and 2 deletions

View File

@@ -2115,6 +2115,12 @@ int glestMain(int argc, char** argv) {
config.setString("FactorySound","None"); config.setString("FactorySound","None");
} }
bool enableATIHacks = config.getBool("EnableATIHacks","false");
if(enableATIHacks == true) {
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("**WARNING** Enabling ATI video card hacks\n");
TextureGl::setEnableATIHacks(enableATIHacks);
}
// Set some statics based on ini entries // Set some statics based on ini entries
SystemFlags::ENABLE_THREADED_LOGGING = config.getBool("ThreadedLogging","true"); SystemFlags::ENABLE_THREADED_LOGGING = config.getBool("ThreadedLogging","true");
FontGl::setDefault_fontType(config.getString("DefaultFont",FontGl::getDefault_fontType().c_str())); FontGl::setDefault_fontType(config.getString("DefaultFont",FontGl::getDefault_fontType().c_str()));

View File

@@ -28,6 +28,8 @@ protected:
GLuint renderBufferId; GLuint renderBufferId;
GLuint frameBufferId; GLuint frameBufferId;
static bool enableATIHacks;
void initRenderBuffer(); void initRenderBuffer();
void initFrameBuffer(); void initFrameBuffer();
void attachRenderBuffer(); void attachRenderBuffer();
@@ -36,6 +38,9 @@ public:
TextureGl(); TextureGl();
virtual ~TextureGl(); virtual ~TextureGl();
static void setEnableATIHacks(bool value) { enableATIHacks = value; }
static bool getEnableATIHacks() { return enableATIHacks; }
GLuint getHandle() const {return handle;} GLuint getHandle() const {return handle;}
GLuint getRenderBufferHandle() const {return renderBufferId;} GLuint getRenderBufferHandle() const {return renderBufferId;}
GLuint getFrameBufferHandle() const {return frameBufferId;} GLuint getFrameBufferHandle() const {return frameBufferId;}

View File

@@ -30,6 +30,51 @@ using Shared::Platform::float32;
namespace Shared{ namespace Graphics{ namespace Shared{ namespace Graphics{
/**
* @brief Next power of 2
* @param x The number to be rounded
* @return the rounded number
*
* Rounds an unsigned integer up to the
* next power of 2; i.e. 2, 4, 8, 16, etc.
*/
static inline unsigned int next_power_of_2(unsigned int x)
{
x--;
x |= (x >> 1);
x |= (x >> 2);
x |= (x >> 4);
x |= (x >> 8);
x |= (x >> 16);
return ++x;
}
/**
* @brief Count bits set
* @param w Number in which to count bits
* @return The number of bits set
*
* Counts the number of bits in an unsigned int
* that are set to 1. So, for example, in the
* number 5, hich is 101 in binary, there are
* two bits set to 1.
*/
static inline unsigned int count_bits_set(unsigned int w)
{
/*
* This is faster, and runs in parallel
*/
const int S[] = {1, 2, 4, 8, 16};
const int B[] = {0x55555555, 0x33333333, 0x0F0F0F0F, 0x00FF00FF, 0x0000FFFF};
int c = w;
c = ((c >> S[0]) & B[0]) + (c & B[0]);
c = ((c >> S[1]) & B[1]) + (c & B[1]);
c = ((c >> S[2]) & B[2]) + (c & B[2]);
c = ((c >> S[3]) & B[3]) + (c & B[3]);
c = ((c >> S[4]) & B[4]) + (c & B[4]);
return c;
}
// ===================================================== // =====================================================
// class PixmapIo // class PixmapIo
// ===================================================== // =====================================================
@@ -187,6 +232,8 @@ public:
void init(int w, int h, int components); void init(int w, int h, int components);
~Pixmap2D(); ~Pixmap2D();
void Scale(int format, int newW, int newH);
//load & save //load & save
static Pixmap2D* loadPath(const string& path); static Pixmap2D* loadPath(const string& path);
void load(const string &path); void load(const string &path);

View File

@@ -52,6 +52,8 @@ namespace Shared { namespace Graphics { namespace Gl {
typedef void (APIENTRY * PFNGLRENDERBUFFERSTORAGEEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); typedef void (APIENTRY * PFNGLRENDERBUFFERSTORAGEEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT = NULL; PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT = NULL;
PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT = NULL;
PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT = NULL;
PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT = NULL; PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT = NULL;
PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT = NULL; PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT = NULL;
PFNGLRENDERBUFFERSTORAGEEXTPROC glRenderbufferStorageEXT = NULL; PFNGLRENDERBUFFERSTORAGEEXTPROC glRenderbufferStorageEXT = NULL;
@@ -831,6 +833,16 @@ void Texture2DGl::init(Filter filter, int maxAnisotropy) {
if(isGlExtensionSupported("GL_EXT_texture_filter_anisotropic")) { if(isGlExtensionSupported("GL_EXT_texture_filter_anisotropic")) {
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, maxAnisotropy); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, maxAnisotropy);
} }
if(mipmap) {
GLuint glFilter= filter==fTrilinear? GL_LINEAR_MIPMAP_LINEAR: GL_LINEAR_MIPMAP_NEAREST;
//build mipmaps
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, glFilter);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
/*
* Replaced this call due to: http://www.opengl.org/wiki/Common_Mistakes#gluBuild2DMipmaps
* *
int error= gluBuild2DMipmaps( int error= gluBuild2DMipmaps(
GL_TEXTURE_2D, glCompressionFormat, GL_TEXTURE_2D, glCompressionFormat,
@@ -883,6 +895,14 @@ void Texture2DGl::init(Filter filter, int maxAnisotropy) {
if(error4 == GL_NO_ERROR) { if(error4 == GL_NO_ERROR) {
error = GL_NO_ERROR; error = GL_NO_ERROR;
} }
}
//
if(error != GL_NO_ERROR) {
//throw runtime_error("Error building texture 2D mipmaps");
const char *errorString= reinterpret_cast<const char*>(gluErrorString(error));
char szBuf[1024]="";
sprintf(szBuf,"Error building texture 2D mipmaps [%s], returned: %d [%s] for [%s] w = %d, h = %d, glCompressionFormat = %d",this->path.c_str(),error,errorString,(pixmap.getPath() != "" ? pixmap.getPath().c_str() : this->path.c_str()),pixmap.getW(),pixmap.getH(),glCompressionFormat); sprintf(szBuf,"Error building texture 2D mipmaps [%s], returned: %d [%s] for [%s] w = %d, h = %d, glCompressionFormat = %d",this->path.c_str(),error,errorString,(pixmap.getPath() != "" ? pixmap.getPath().c_str() : this->path.c_str()),pixmap.getW(),pixmap.getH(),glCompressionFormat);
throw runtime_error(szBuf); throw runtime_error(szBuf);
} }
@@ -1072,7 +1092,7 @@ void TextureCubeGl::init(Filter filter, int maxAnisotropy) {
glBindTexture(GL_TEXTURE_CUBE_MAP, handle); glBindTexture(GL_TEXTURE_CUBE_MAP, handle);
//wrap //wrap
GLint wrap= toWrapModeGl(wrapMode); GLint wrap= toWrapModeGl(wrapMode);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, wrap); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, wrap);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, wrap); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, wrap);
@@ -1098,6 +1118,14 @@ void TextureCubeGl::init(Filter filter, int maxAnisotropy) {
glCompressionFormat = glInternalFormat; glCompressionFormat = glInternalFormat;
} }
//pixel init var
const uint8* pixels= pixmapInit? currentPixmap->getPixels(): NULL;
GLenum target= GL_TEXTURE_CUBE_MAP_POSITIVE_X + i;
if(mipmap) {
/*
* Replaced this call due to: http://www.opengl.org/wiki/Common_Mistakes#gluBuild2DMipmaps
* *
int error= gluBuild2DMipmaps( int error= gluBuild2DMipmaps(
target, glCompressionFormat, target, glCompressionFormat,
@@ -1150,6 +1178,15 @@ void TextureCubeGl::init(Filter filter, int maxAnisotropy) {
currentPixmap->getW(), currentPixmap->getH(), currentPixmap->getW(), currentPixmap->getH(),
glFormat, GL_UNSIGNED_BYTE, pixels); glFormat, GL_UNSIGNED_BYTE, pixels);
if(error4 == GL_NO_ERROR) {
error = GL_NO_ERROR;
}
}
//
if(error != GL_NO_ERROR) {
//throw runtime_error("Error building texture cube mipmaps"); //throw runtime_error("Error building texture cube mipmaps");
const char *errorString= reinterpret_cast<const char*>(gluErrorString(error)); const char *errorString= reinterpret_cast<const char*>(gluErrorString(error));
char szBuf[1024]=""; char szBuf[1024]="";

View File

@@ -25,11 +25,12 @@
#include <jpeglib.h> #include <jpeglib.h>
#include <setjmp.h> #include <setjmp.h>
#include <memory> #include <memory>
#include "opengl.h"
#include "leak_dumper.h" #include "leak_dumper.h"
using namespace Shared::Util; using namespace Shared::Util;
using namespace std; using namespace std;
using namespace Shared::Graphics::Gl;
namespace Shared{ namespace Graphics{ namespace Shared{ namespace Graphics{
@@ -868,6 +869,24 @@ Pixmap2D::~Pixmap2D() {
deletePixels(); deletePixels();
} }
void Pixmap2D::Scale(int format, int newW, int newH) {
int useComponents = this->getComponents();
uint8 *newpixels= new uint8[newW * newH * useComponents];
glPixelStorei(GL_PACK_ALIGNMENT, 1);
int error = gluScaleImage( format,
w, h, GL_UNSIGNED_BYTE, pixels,
newW, newH, GL_UNSIGNED_BYTE, newpixels);
if(error != GL_NO_ERROR) {
init(newW,newH,this->components);
pixels = newpixels;
}
else {
assertGl();
}
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
}
Pixmap2D* Pixmap2D::loadPath(const string& path) { Pixmap2D* Pixmap2D::loadPath(const string& path) {
//printf("Loading Pixmap2D [%s]\n",path.c_str()); //printf("Loading Pixmap2D [%s]\n",path.c_str());

View File

@@ -381,6 +381,7 @@ void Window::setupGraphicsScreen(int depthBits, int stencilBits, bool hardware_a
// setup LOD bias factor // setup LOD bias factor
//const float lodBias = std::max(std::min( configHandler->Get("TextureLODBias", 0.0f) , 4.0f), -4.0f); //const float lodBias = std::max(std::min( configHandler->Get("TextureLODBias", 0.0f) , 4.0f), -4.0f);
const float lodBias = max(min(0.0f,4.0f),-4.0f); const float lodBias = max(min(0.0f,4.0f),-4.0f);
//if(SystemFlags::VERBOSE_MODE_ENABLED) printf ("\n\n\n\n\n$$$$ In [%s::%s Line: %d] lodBias = %f\n\n",__FILE__,__FUNCTION__,__LINE__,lodBias);
#ifdef USE_STREFLOP #ifdef USE_STREFLOP
if (streflop::fabs(lodBias) > 0.01f) { if (streflop::fabs(lodBias) > 0.01f) {
#else #else