Check image type in texture completeness test.

TRAC #15703 Issue=86 Signed-off-by: Daniel Koch Author: Nicolas Capens git-svn-id: https://angleproject.googlecode.com/svn/trunk@581 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent 8a0a2db7
...@@ -796,7 +796,7 @@ void Texture::loadCompressedImageData(GLint xoffset, GLint yoffset, GLsizei widt ...@@ -796,7 +796,7 @@ void Texture::loadCompressedImageData(GLint xoffset, GLint yoffset, GLsizei widt
} }
} }
void Texture::createSurface(GLsizei width, GLsizei height, GLenum format, GLenum type, Image *img) void Texture::createSurface(GLsizei width, GLsizei height, GLenum format, GLenum type, Image *image)
{ {
IDirect3DTexture9 *newTexture = NULL; IDirect3DTexture9 *newTexture = NULL;
IDirect3DSurface9 *newSurface = NULL; IDirect3DSurface9 *newSurface = NULL;
...@@ -836,12 +836,17 @@ void Texture::createSurface(GLsizei width, GLsizei height, GLenum format, GLenum ...@@ -836,12 +836,17 @@ void Texture::createSurface(GLsizei width, GLsizei height, GLenum format, GLenum
newTexture->Release(); newTexture->Release();
} }
if (img->surface) img->surface->Release(); if (image->surface)
img->surface = newSurface; {
image->surface->Release();
}
image->surface = newSurface;
img->width = width; image->width = width;
img->height = height; image->height = height;
img->format = format; image->format = format;
image->type = type;
} }
void Texture::setImage(GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels, Image *img) void Texture::setImage(GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels, Image *img)
...@@ -1361,7 +1366,7 @@ void Texture2D::copyImage(GLint level, GLenum format, GLint x, GLint y, GLsizei ...@@ -1361,7 +1366,7 @@ void Texture2D::copyImage(GLint level, GLenum format, GLint x, GLint y, GLsizei
return error(GL_OUT_OF_MEMORY); return error(GL_OUT_OF_MEMORY);
} }
bool redefined = redefineTexture(level, format, width, height, mType); bool redefined = redefineTexture(level, format, width, height, GL_UNSIGNED_BYTE);
if (!isRenderableFormat()) if (!isRenderableFormat())
{ {
...@@ -1397,6 +1402,7 @@ void Texture2D::copyImage(GLint level, GLenum format, GLint x, GLint y, GLsizei ...@@ -1397,6 +1402,7 @@ void Texture2D::copyImage(GLint level, GLenum format, GLint x, GLint y, GLsizei
mImageArray[level].width = width; mImageArray[level].width = width;
mImageArray[level].height = height; mImageArray[level].height = height;
mImageArray[level].format = format; mImageArray[level].format = format;
mImageArray[level].type = GL_UNSIGNED_BYTE;
} }
void Texture2D::copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source) void Texture2D::copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source)
...@@ -1510,6 +1516,11 @@ bool Texture2D::isComplete() const ...@@ -1510,6 +1516,11 @@ bool Texture2D::isComplete() const
return false; return false;
} }
if (mImageArray[level].type != mImageArray[0].type)
{
return false;
}
if (mImageArray[level].width != std::max(1, width >> level)) if (mImageArray[level].width != std::max(1, width >> level))
{ {
return false; return false;
...@@ -1538,11 +1549,10 @@ IDirect3DBaseTexture9 *Texture2D::getBaseTexture() const ...@@ -1538,11 +1549,10 @@ IDirect3DBaseTexture9 *Texture2D::getBaseTexture() const
// Constructs a Direct3D 9 texture resource from the texture images // Constructs a Direct3D 9 texture resource from the texture images
void Texture2D::createTexture() void Texture2D::createTexture()
{ {
IDirect3DTexture9 *texture;
IDirect3DDevice9 *device = getDevice(); IDirect3DDevice9 *device = getDevice();
D3DFORMAT format = selectFormat(mImageArray[0].format, mType); D3DFORMAT format = selectFormat(mImageArray[0].format, mType);
IDirect3DTexture9 *texture = NULL;
HRESULT result = device->CreateTexture(mWidth, mHeight, creationLevels(mWidth, mHeight, 0), 0, format, D3DPOOL_DEFAULT, &texture, NULL); HRESULT result = device->CreateTexture(mWidth, mHeight, creationLevels(mWidth, mHeight, 0), 0, format, D3DPOOL_DEFAULT, &texture, NULL);
if (FAILED(result)) if (FAILED(result))
...@@ -1696,9 +1706,10 @@ void Texture2D::generateMipmaps() ...@@ -1696,9 +1706,10 @@ void Texture2D::generateMipmaps()
mImageArray[i].dirty = false; mImageArray[i].dirty = false;
mImageArray[i].format = mImageArray[0].format;
mImageArray[i].width = std::max(mImageArray[0].width >> i, 1); mImageArray[i].width = std::max(mImageArray[0].width >> i, 1);
mImageArray[i].height = std::max(mImageArray[0].height >> i, 1); mImageArray[i].height = std::max(mImageArray[0].height >> i, 1);
mImageArray[i].format = mImageArray[0].format;
mImageArray[i].type = mImageArray[0].type;
} }
if (mIsRenderable) if (mIsRenderable)
...@@ -1839,7 +1850,7 @@ void TextureCubeMap::setImageNegZ(GLint level, GLsizei width, GLsizei height, GL ...@@ -1839,7 +1850,7 @@ void TextureCubeMap::setImageNegZ(GLint level, GLsizei width, GLsizei height, GL
void TextureCubeMap::setCompressedImage(GLenum face, GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei imageSize, const void *pixels) void TextureCubeMap::setCompressedImage(GLenum face, GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei imageSize, const void *pixels)
{ {
redefineTexture(level, format, width); redefineTexture(level, format, width, GL_UNSIGNED_BYTE);
Texture::setCompressedImage(width, height, format, imageSize, pixels, &mImageArray[faceIndex(face)][level]); Texture::setCompressedImage(width, height, format, imageSize, pixels, &mImageArray[faceIndex(face)][level]);
} }
...@@ -1952,6 +1963,11 @@ bool TextureCubeMap::isComplete() const ...@@ -1952,6 +1963,11 @@ bool TextureCubeMap::isComplete() const
return false; return false;
} }
if (mImageArray[face][level].type != mImageArray[0][0].type)
{
return false;
}
if (mImageArray[face][level].width != std::max(1, size >> level)) if (mImageArray[face][level].width != std::max(1, size >> level))
{ {
return false; return false;
...@@ -1981,8 +1997,7 @@ void TextureCubeMap::createTexture() ...@@ -1981,8 +1997,7 @@ void TextureCubeMap::createTexture()
IDirect3DDevice9 *device = getDevice(); IDirect3DDevice9 *device = getDevice();
D3DFORMAT format = selectFormat(mImageArray[0][0].format, mType); D3DFORMAT format = selectFormat(mImageArray[0][0].format, mType);
IDirect3DCubeTexture9 *texture; IDirect3DCubeTexture9 *texture = NULL;
HRESULT result = device->CreateCubeTexture(mWidth, creationLevels(mWidth, 0), 0, format, D3DPOOL_DEFAULT, &texture, NULL); HRESULT result = device->CreateCubeTexture(mWidth, creationLevels(mWidth, 0), 0, format, D3DPOOL_DEFAULT, &texture, NULL);
if (FAILED(result)) if (FAILED(result))
...@@ -2109,7 +2124,7 @@ void TextureCubeMap::convertToRenderTarget() ...@@ -2109,7 +2124,7 @@ void TextureCubeMap::convertToRenderTarget()
void TextureCubeMap::setImage(int face, GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels) void TextureCubeMap::setImage(int face, GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels)
{ {
redefineTexture(level, format, width); redefineTexture(level, format, width, type);
Texture::setImage(width, height, format, type, unpackAlignment, pixels, &mImageArray[face][level]); Texture::setImage(width, height, format, type, unpackAlignment, pixels, &mImageArray[face][level]);
} }
...@@ -2146,7 +2161,7 @@ bool TextureCubeMap::dirtyImageData() const ...@@ -2146,7 +2161,7 @@ bool TextureCubeMap::dirtyImageData() const
// //
// Returns true if the existing texture was unsuitable had to be destroyed. If so, it will also set // Returns true if the existing texture was unsuitable had to be destroyed. If so, it will also set
// a new size for the texture by working backwards from the given size. // a new size for the texture by working backwards from the given size.
bool TextureCubeMap::redefineTexture(GLint level, GLenum format, GLsizei width) bool TextureCubeMap::redefineTexture(GLint level, GLenum format, GLsizei width, GLenum type)
{ {
// Are these settings compatible with level 0? // Are these settings compatible with level 0?
bool sizeOkay = (mImageArray[0][0].width >> level == width); bool sizeOkay = (mImageArray[0][0].width >> level == width);
...@@ -2187,6 +2202,7 @@ bool TextureCubeMap::redefineTexture(GLint level, GLenum format, GLsizei width) ...@@ -2187,6 +2202,7 @@ bool TextureCubeMap::redefineTexture(GLint level, GLenum format, GLsizei width)
mImageArray[0][0].height = width << level; mImageArray[0][0].height = width << level;
mImageArray[0][0].format = format; mImageArray[0][0].format = format;
mImageArray[0][0].type = type;
} }
return !textureOkay; return !textureOkay;
...@@ -2203,7 +2219,7 @@ void TextureCubeMap::copyImage(GLenum target, GLint level, GLenum format, GLint ...@@ -2203,7 +2219,7 @@ void TextureCubeMap::copyImage(GLenum target, GLint level, GLenum format, GLint
} }
unsigned int faceindex = faceIndex(target); unsigned int faceindex = faceIndex(target);
bool redefined = redefineTexture(level, format, width); bool redefined = redefineTexture(level, format, width, GL_UNSIGNED_BYTE);
if (!isRenderableFormat()) if (!isRenderableFormat())
{ {
...@@ -2240,6 +2256,7 @@ void TextureCubeMap::copyImage(GLenum target, GLint level, GLenum format, GLint ...@@ -2240,6 +2256,7 @@ void TextureCubeMap::copyImage(GLenum target, GLint level, GLenum format, GLint
mImageArray[faceindex][level].width = width; mImageArray[faceindex][level].width = width;
mImageArray[faceindex][level].height = height; mImageArray[faceindex][level].height = height;
mImageArray[faceindex][level].format = format; mImageArray[faceindex][level].format = format;
mImageArray[faceindex][level].type = GL_UNSIGNED_BYTE;
} }
IDirect3DSurface9 *TextureCubeMap::getCubeMapSurface(GLenum face, unsigned int level) IDirect3DSurface9 *TextureCubeMap::getCubeMapSurface(GLenum face, unsigned int level)
...@@ -2275,7 +2292,7 @@ void TextureCubeMap::copySubImage(GLenum target, GLint level, GLint xoffset, GLi ...@@ -2275,7 +2292,7 @@ void TextureCubeMap::copySubImage(GLenum target, GLint level, GLint xoffset, GLi
} }
unsigned int faceindex = faceIndex(target); unsigned int faceindex = faceIndex(target);
bool redefined = redefineTexture(0, mImageArray[0][0].format, mImageArray[0][0].width); bool redefined = redefineTexture(0, mImageArray[0][0].format, mImageArray[0][0].width, GL_UNSIGNED_BYTE);
if (!isRenderableFormat()) if (!isRenderableFormat())
{ {
...@@ -2350,9 +2367,10 @@ void TextureCubeMap::generateMipmaps() ...@@ -2350,9 +2367,10 @@ void TextureCubeMap::generateMipmaps()
mImageArray[f][i].dirty = false; mImageArray[f][i].dirty = false;
mImageArray[f][i].format = mImageArray[f][0].format;
mImageArray[f][i].width = std::max(mImageArray[f][0].width >> i, 1); mImageArray[f][i].width = std::max(mImageArray[f][0].width >> i, 1);
mImageArray[f][i].height = mImageArray[f][i].width; mImageArray[f][i].height = mImageArray[f][i].width;
mImageArray[f][i].format = mImageArray[f][0].format;
mImageArray[f][i].type = mImageArray[f][0].type;
} }
} }
......
...@@ -89,6 +89,7 @@ class Texture : public RefCountObject ...@@ -89,6 +89,7 @@ class Texture : public RefCountObject
GLsizei width; GLsizei width;
GLsizei height; GLsizei height;
GLenum format; GLenum format;
GLenum type;
bool dirty; bool dirty;
...@@ -279,7 +280,7 @@ class TextureCubeMap : public Texture ...@@ -279,7 +280,7 @@ class TextureCubeMap : public Texture
void setImage(int face, GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels); void setImage(int face, GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels);
void commitRect(GLenum faceTarget, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height); void commitRect(GLenum faceTarget, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height);
bool redefineTexture(GLint level, GLenum format, GLsizei width); bool redefineTexture(GLint level, GLenum format, GLsizei width, GLenum type);
Image mImageArray[6][IMPLEMENTATION_MAX_TEXTURE_LEVELS]; Image mImageArray[6][IMPLEMENTATION_MAX_TEXTURE_LEVELS];
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment