Commit a2d4e55d by Jamie Madill

Add support for pixel unpack buffers to TexImage3D.

TRAC #23846 Signed-off-by: Shannon Woods Signed-off-by: Geoff Lang
parent 065e1a32
...@@ -1723,7 +1723,28 @@ void Texture3D::setImage(GLint level, GLsizei width, GLsizei height, GLsizei dep ...@@ -1723,7 +1723,28 @@ void Texture3D::setImage(GLint level, GLsizei width, GLsizei height, GLsizei dep
: GetSizedInternalFormat(format, type, clientVersion); : GetSizedInternalFormat(format, type, clientVersion);
redefineImage(level, sizedInternalFormat, width, height, depth); redefineImage(level, sizedInternalFormat, width, height, depth);
Texture::setImage(unpack, type, pixels, mImageArray[level]); bool fastUnpacked = false;
// Attempt a fast gpu copy of the pixel data to the surface if the app bound an unpack buffer
if (isFastUnpackable(unpack, sizedInternalFormat))
{
// Will try to create RT storage if it does not exist
rx::RenderTarget *destRenderTarget = getRenderTarget(level);
Box destArea(0, 0, 0, getWidth(level), getHeight(level), getDepth(level));
if (destRenderTarget && fastUnpackPixels(unpack, pixels, destArea, sizedInternalFormat, type, destRenderTarget))
{
// Ensure we don't overwrite our newly initialized data
mImageArray[level]->markClean();
fastUnpacked = true;
}
}
if (!fastUnpacked)
{
Texture::setImage(unpack, type, pixels, mImageArray[level]);
}
} }
void Texture3D::setCompressedImage(GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei depth, GLsizei imageSize, const void *pixels) void Texture3D::setCompressedImage(GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei depth, GLsizei imageSize, const void *pixels)
...@@ -2058,6 +2079,25 @@ void Texture3D::convertToRenderTarget() ...@@ -2058,6 +2079,25 @@ void Texture3D::convertToRenderTarget()
mDirtyImages = true; mDirtyImages = true;
} }
rx::RenderTarget *Texture3D::getRenderTarget(GLint level)
{
// ensure the underlying texture is created
if (getStorage(true) == NULL)
{
return NULL;
}
updateTexture();
// ensure this is NOT a depth texture
if (isDepth(level))
{
return NULL;
}
return mTexStorage->getRenderTarget(level);
}
rx::RenderTarget *Texture3D::getRenderTarget(GLint level, GLint layer) rx::RenderTarget *Texture3D::getRenderTarget(GLint level, GLint layer)
{ {
// ensure the underlying texture is created // ensure the underlying texture is created
......
...@@ -313,6 +313,7 @@ class Texture3D : public Texture ...@@ -313,6 +313,7 @@ class Texture3D : public Texture
protected: protected:
friend class RenderbufferTexture3DLayer; friend class RenderbufferTexture3DLayer;
rx::RenderTarget *getRenderTarget(GLint level);
rx::RenderTarget *getRenderTarget(GLint level, GLint layer); rx::RenderTarget *getRenderTarget(GLint level, GLint layer);
rx::RenderTarget *getDepthStencil(GLint level, GLint layer); rx::RenderTarget *getDepthStencil(GLint level, GLint layer);
virtual int levelCount(); virtual int levelCount();
......
...@@ -146,6 +146,11 @@ void TextureStorageInterface3D::generateMipmap(int level) ...@@ -146,6 +146,11 @@ void TextureStorageInterface3D::generateMipmap(int level)
mInstance->generateMipmap(level); mInstance->generateMipmap(level);
} }
RenderTarget *TextureStorageInterface3D::getRenderTarget(GLint level) const
{
return mInstance->getRenderTarget(level);
}
RenderTarget *TextureStorageInterface3D::getRenderTarget(GLint level, GLint layer) const RenderTarget *TextureStorageInterface3D::getRenderTarget(GLint level, GLint layer) const
{ {
return mInstance->getRenderTargetLayer(level, layer); return mInstance->getRenderTargetLayer(level, layer);
......
...@@ -111,6 +111,7 @@ class TextureStorageInterface3D : public TextureStorageInterface ...@@ -111,6 +111,7 @@ class TextureStorageInterface3D : public TextureStorageInterface
virtual ~TextureStorageInterface3D(); virtual ~TextureStorageInterface3D();
void generateMipmap(int level); void generateMipmap(int level);
RenderTarget *getRenderTarget(GLint level) const;
RenderTarget *getRenderTarget(GLint level, GLint layer) const; RenderTarget *getRenderTarget(GLint level, GLint layer) const;
virtual unsigned int getRenderTargetSerial(GLint level, GLint layer) const; virtual unsigned int getRenderTargetSerial(GLint level, GLint layer) const;
......
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