|
@@ -31,6 +31,8 @@ namespace graphics
|
|
namespace opengl
|
|
namespace opengl
|
|
{
|
|
{
|
|
|
|
|
|
|
|
+int Image::imageCount = 0;
|
|
|
|
+
|
|
float Image::maxMipmapSharpness = 0.0f;
|
|
float Image::maxMipmapSharpness = 0.0f;
|
|
|
|
|
|
Texture::FilterMode Image::defaultMipmapFilter = Texture::FILTER_NONE;
|
|
Texture::FilterMode Image::defaultMipmapFilter = Texture::FILTER_NONE;
|
|
@@ -47,10 +49,14 @@ Image::Image(love::image::ImageData *data, Format format)
|
|
, compressed(false)
|
|
, compressed(false)
|
|
, format(format)
|
|
, format(format)
|
|
, usingDefaultTexture(false)
|
|
, usingDefaultTexture(false)
|
|
|
|
+ , textureMemorySize(0)
|
|
{
|
|
{
|
|
width = data->getWidth();
|
|
width = data->getWidth();
|
|
height = data->getHeight();
|
|
height = data->getHeight();
|
|
preload();
|
|
preload();
|
|
|
|
+
|
|
|
|
+ textureMemorySize = data->getSize();
|
|
|
|
+ ++imageCount;
|
|
}
|
|
}
|
|
|
|
|
|
Image::Image(love::image::CompressedData *cdata, Format format)
|
|
Image::Image(love::image::CompressedData *cdata, Format format)
|
|
@@ -64,15 +70,21 @@ Image::Image(love::image::CompressedData *cdata, Format format)
|
|
, compressed(true)
|
|
, compressed(true)
|
|
, format(format)
|
|
, format(format)
|
|
, usingDefaultTexture(false)
|
|
, usingDefaultTexture(false)
|
|
|
|
+ , textureMemorySize(0)
|
|
{
|
|
{
|
|
width = cdata->getWidth(0);
|
|
width = cdata->getWidth(0);
|
|
height = cdata->getHeight(0);
|
|
height = cdata->getHeight(0);
|
|
preload();
|
|
preload();
|
|
|
|
+
|
|
|
|
+ textureMemorySize = cdata->getSize(0);
|
|
|
|
+ ++imageCount;
|
|
}
|
|
}
|
|
|
|
|
|
Image::~Image()
|
|
Image::~Image()
|
|
{
|
|
{
|
|
unload();
|
|
unload();
|
|
|
|
+
|
|
|
|
+ --imageCount;
|
|
}
|
|
}
|
|
|
|
|
|
love::image::ImageData *Image::getImageData() const
|
|
love::image::ImageData *Image::getImageData() const
|
|
@@ -151,8 +163,11 @@ void Image::uploadCompressedMipmaps()
|
|
"compressed image does not have all required levels.");
|
|
"compressed image does not have all required levels.");
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ size_t totalsize = cdata->getSize(0);
|
|
|
|
+
|
|
for (int i = 1; i < count; i++)
|
|
for (int i = 1; i < count; i++)
|
|
{
|
|
{
|
|
|
|
+ totalsize += cdata->getSize(i);
|
|
glCompressedTexImage2DARB(GL_TEXTURE_2D,
|
|
glCompressedTexImage2DARB(GL_TEXTURE_2D,
|
|
i,
|
|
i,
|
|
getCompressedFormat(cdata->getFormat()),
|
|
getCompressedFormat(cdata->getFormat()),
|
|
@@ -162,6 +177,10 @@ void Image::uploadCompressedMipmaps()
|
|
GLsizei(cdata->getSize(i)),
|
|
GLsizei(cdata->getSize(i)),
|
|
cdata->getData(i));
|
|
cdata->getData(i));
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ size_t prevmemsize = textureMemorySize;
|
|
|
|
+ textureMemorySize = totalsize;
|
|
|
|
+ gl.updateTextureMemorySize(prevmemsize, textureMemorySize);
|
|
}
|
|
}
|
|
|
|
|
|
void Image::createMipmaps()
|
|
void Image::createMipmaps()
|
|
@@ -216,6 +235,10 @@ void Image::createMipmaps()
|
|
data->getData());
|
|
data->getData());
|
|
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_FALSE);
|
|
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_FALSE);
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ size_t prevmemsize = textureMemorySize;
|
|
|
|
+ textureMemorySize = paddedWidth * paddedHeight * 4 * 1.3333;
|
|
|
|
+ gl.updateTextureMemorySize(prevmemsize, textureMemorySize);
|
|
}
|
|
}
|
|
|
|
|
|
void Image::checkMipmapsCreated()
|
|
void Image::checkMipmapsCreated()
|
|
@@ -381,6 +404,13 @@ bool Image::loadVolatile()
|
|
if (glerr != GL_NO_ERROR)
|
|
if (glerr != GL_NO_ERROR)
|
|
throw love::Exception("Cannot create image (error code 0x%x)", glerr);
|
|
throw love::Exception("Cannot create image (error code 0x%x)", glerr);
|
|
|
|
|
|
|
|
+ if (isCompressed())
|
|
|
|
+ textureMemorySize = cdata->getSize(0);
|
|
|
|
+ else
|
|
|
|
+ textureMemorySize = paddedWidth * paddedHeight * 4;
|
|
|
|
+
|
|
|
|
+ gl.updateTextureMemorySize(0, textureMemorySize);
|
|
|
|
+
|
|
usingDefaultTexture = false;
|
|
usingDefaultTexture = false;
|
|
mipmapsCreated = false;
|
|
mipmapsCreated = false;
|
|
checkMipmapsCreated();
|
|
checkMipmapsCreated();
|
|
@@ -456,6 +486,9 @@ void Image::unloadVolatile()
|
|
{
|
|
{
|
|
gl.deleteTexture(texture);
|
|
gl.deleteTexture(texture);
|
|
texture = 0;
|
|
texture = 0;
|
|
|
|
+
|
|
|
|
+ gl.updateTextureMemorySize(textureMemorySize, 0);
|
|
|
|
+ textureMemorySize = 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -530,7 +563,7 @@ void Image::drawv(const Matrix &t, const Vertex *v)
|
|
glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), (GLvoid *)&v[0].s);
|
|
glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), (GLvoid *)&v[0].s);
|
|
|
|
|
|
gl.prepareDraw();
|
|
gl.prepareDraw();
|
|
- glDrawArrays(GL_QUADS, 0, 4);
|
|
|
|
|
|
+ gl.drawArrays(GL_QUADS, 0, 4);
|
|
|
|
|
|
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
|
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
|
glDisableClientState(GL_VERTEX_ARRAY);
|
|
glDisableClientState(GL_VERTEX_ARRAY);
|