Image::redfine now takes a target parameter, Image11 creates an appropriate…

Image::redfine now takes a target parameter, Image11 creates an appropriate resource based off of the target. TRAC #22705 Signed-off-by: Jamie Madill Signed-off-by: Shannon Woods Author: Geoff Lang git-svn-id: https://angleproject.googlecode.com/svn/branches/es3proto@2174 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent 86740a94
...@@ -416,7 +416,7 @@ void Texture2D::redefineImage(GLint level, GLint internalformat, GLsizei width, ...@@ -416,7 +416,7 @@ void Texture2D::redefineImage(GLint level, GLint internalformat, GLsizei width,
const int storageHeight = std::max(1, mImageArray[0]->getHeight() >> level); const int storageHeight = std::max(1, mImageArray[0]->getHeight() >> level);
const int storageFormat = mImageArray[0]->getInternalFormat(); const int storageFormat = mImageArray[0]->getInternalFormat();
mImageArray[level]->redefine(mRenderer, internalformat, width, height, 1, false); mImageArray[level]->redefine(mRenderer, GL_TEXTURE_2D, internalformat, width, height, 1, false);
if (mTexStorage) if (mTexStorage)
{ {
...@@ -453,7 +453,7 @@ void Texture2D::bindTexImage(egl::Surface *surface) ...@@ -453,7 +453,7 @@ void Texture2D::bindTexImage(egl::Surface *surface)
GLint internalformat = surface->getFormat(); GLint internalformat = surface->getFormat();
mImageArray[0]->redefine(mRenderer, internalformat, surface->getWidth(), surface->getHeight(), 1, true); mImageArray[0]->redefine(mRenderer, GL_TEXTURE_2D, internalformat, surface->getWidth(), surface->getHeight(), 1, true);
delete mTexStorage; delete mTexStorage;
mTexStorage = new rx::TextureStorageInterface2D(mRenderer, surface->getSwapChain()); mTexStorage = new rx::TextureStorageInterface2D(mRenderer, surface->getSwapChain());
...@@ -478,7 +478,7 @@ void Texture2D::releaseTexImage() ...@@ -478,7 +478,7 @@ void Texture2D::releaseTexImage()
for (int i = 0; i < IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++) for (int i = 0; i < IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
{ {
mImageArray[i]->redefine(mRenderer, GL_NONE, 0, 0, 0, true); mImageArray[i]->redefine(mRenderer, GL_TEXTURE_2D, GL_NONE, 0, 0, 0, true);
} }
} }
} }
...@@ -595,14 +595,14 @@ void Texture2D::storage(GLsizei levels, GLenum internalformat, GLsizei width, GL ...@@ -595,14 +595,14 @@ void Texture2D::storage(GLsizei levels, GLenum internalformat, GLsizei width, GL
for (int level = 0; level < levels; level++) for (int level = 0; level < levels; level++)
{ {
mImageArray[level]->redefine(mRenderer, internalformat, width, height, 1, true); mImageArray[level]->redefine(mRenderer, GL_TEXTURE_2D, internalformat, width, height, 1, true);
width = std::max(1, width >> 1); width = std::max(1, width >> 1);
height = std::max(1, height >> 1); height = std::max(1, height >> 1);
} }
for (int level = levels; level < IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++) for (int level = levels; level < IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++)
{ {
mImageArray[level]->redefine(mRenderer, GL_NONE, 0, 0, 0, true); mImageArray[level]->redefine(mRenderer, GL_TEXTURE_2D, GL_NONE, 0, 0, 0, true);
} }
if (mTexStorage->isManaged()) if (mTexStorage->isManaged())
...@@ -1278,7 +1278,7 @@ void TextureCubeMap::redefineImage(int face, GLint level, GLint internalformat, ...@@ -1278,7 +1278,7 @@ void TextureCubeMap::redefineImage(int face, GLint level, GLint internalformat,
const int storageHeight = std::max(1, mImageArray[0][0]->getHeight() >> level); const int storageHeight = std::max(1, mImageArray[0][0]->getHeight() >> level);
const int storageFormat = mImageArray[0][0]->getInternalFormat(); const int storageFormat = mImageArray[0][0]->getInternalFormat();
mImageArray[face][level]->redefine(mRenderer, internalformat, width, height, 1, false); mImageArray[face][level]->redefine(mRenderer, GL_TEXTURE_CUBE_MAP, internalformat, width, height, 1, false);
if (mTexStorage) if (mTexStorage)
{ {
...@@ -1389,7 +1389,7 @@ void TextureCubeMap::storage(GLsizei levels, GLenum internalformat, GLsizei size ...@@ -1389,7 +1389,7 @@ void TextureCubeMap::storage(GLsizei levels, GLenum internalformat, GLsizei size
{ {
for (int face = 0; face < 6; face++) for (int face = 0; face < 6; face++)
{ {
mImageArray[face][level]->redefine(mRenderer, internalformat, size, size, 1, true); mImageArray[face][level]->redefine(mRenderer, GL_TEXTURE_CUBE_MAP, internalformat, size, size, 1, true);
size = std::max(1, size >> 1); size = std::max(1, size >> 1);
} }
} }
...@@ -1398,7 +1398,7 @@ void TextureCubeMap::storage(GLsizei levels, GLenum internalformat, GLsizei size ...@@ -1398,7 +1398,7 @@ void TextureCubeMap::storage(GLsizei levels, GLenum internalformat, GLsizei size
{ {
for (int face = 0; face < 6; face++) for (int face = 0; face < 6; face++)
{ {
mImageArray[face][level]->redefine(mRenderer, GL_NONE, 0, 0, 0, true); mImageArray[face][level]->redefine(mRenderer, GL_TEXTURE_CUBE_MAP, GL_NONE, 0, 0, 0, true);
} }
} }
...@@ -1640,7 +1640,7 @@ void Texture3D::storage(GLsizei levels, GLenum internalformat, GLsizei width, GL ...@@ -1640,7 +1640,7 @@ void Texture3D::storage(GLsizei levels, GLenum internalformat, GLsizei width, GL
for (int level = 0; level < levels; level++) for (int level = 0; level < levels; level++)
{ {
mImageArray[level]->redefine(mRenderer, internalformat, width, height, depth, true); mImageArray[level]->redefine(mRenderer, GL_TEXTURE_3D, internalformat, width, height, depth, true);
width = std::max(1, width >> 1); width = std::max(1, width >> 1);
height = std::max(1, height >> 1); height = std::max(1, height >> 1);
depth = std::max(1, depth >> 1); depth = std::max(1, depth >> 1);
...@@ -1648,7 +1648,7 @@ void Texture3D::storage(GLsizei levels, GLenum internalformat, GLsizei width, GL ...@@ -1648,7 +1648,7 @@ void Texture3D::storage(GLsizei levels, GLenum internalformat, GLsizei width, GL
for (int level = levels; level < IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++) for (int level = levels; level < IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++)
{ {
mImageArray[level]->redefine(mRenderer, GL_NONE, 0, 0, 0, true); mImageArray[level]->redefine(mRenderer, GL_TEXTURE_3D, GL_NONE, 0, 0, 0, true);
} }
if (mTexStorage->isManaged()) if (mTexStorage->isManaged())
...@@ -1897,7 +1897,7 @@ void Texture3D::redefineImage(GLint level, GLint internalformat, GLsizei width, ...@@ -1897,7 +1897,7 @@ void Texture3D::redefineImage(GLint level, GLint internalformat, GLsizei width,
const int storageDepth = std::max(1, mImageArray[0]->getDepth() >> level); const int storageDepth = std::max(1, mImageArray[0]->getDepth() >> level);
const int storageFormat = mImageArray[0]->getInternalFormat(); const int storageFormat = mImageArray[0]->getInternalFormat();
mImageArray[level]->redefine(mRenderer, internalformat, width, height, depth, false); mImageArray[level]->redefine(mRenderer, GL_TEXTURE_3D, internalformat, width, height, depth, false);
if (mTexStorage) if (mTexStorage)
{ {
......
...@@ -21,6 +21,7 @@ Image::Image() ...@@ -21,6 +21,7 @@ Image::Image()
mDepth = 0; mDepth = 0;
mInternalFormat = GL_NONE; mInternalFormat = GL_NONE;
mActualFormat = GL_NONE; mActualFormat = GL_NONE;
mTarget = GL_NONE;
} }
template <typename T> template <typename T>
......
...@@ -36,6 +36,7 @@ class Image ...@@ -36,6 +36,7 @@ class Image
GLsizei getDepth() const { return mDepth; } GLsizei getDepth() const { return mDepth; }
GLenum getInternalFormat() const { return mInternalFormat; } GLenum getInternalFormat() const { return mInternalFormat; }
GLenum getActualFormat() const { return mActualFormat; } GLenum getActualFormat() const { return mActualFormat; }
GLenum getTarget() const { return mTarget; }
void markDirty() {mDirty = true;} void markDirty() {mDirty = true;}
void markClean() {mDirty = false;} void markClean() {mDirty = false;}
...@@ -48,7 +49,7 @@ class Image ...@@ -48,7 +49,7 @@ class Image
virtual bool updateSurface(TextureStorageInterfaceCube *storage, int face, int level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height) = 0; virtual bool updateSurface(TextureStorageInterfaceCube *storage, int face, int level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height) = 0;
virtual bool updateSurface(TextureStorageInterface3D *storage, int level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth) = 0; virtual bool updateSurface(TextureStorageInterface3D *storage, int level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth) = 0;
virtual bool redefine(Renderer *renderer, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, bool forceRelease) = 0; virtual bool redefine(Renderer *renderer, GLenum target, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, bool forceRelease) = 0;
virtual bool isRenderableFormat() const = 0; virtual bool isRenderableFormat() const = 0;
...@@ -155,6 +156,7 @@ class Image ...@@ -155,6 +156,7 @@ class Image
GLsizei mDepth; GLsizei mDepth;
GLint mInternalFormat; GLint mInternalFormat;
GLenum mActualFormat; GLenum mActualFormat;
GLenum mTarget;
bool mDirty; bool mDirty;
......
...@@ -129,7 +129,7 @@ bool Image11::updateSurface(TextureStorageInterface3D *storage, int level, GLint ...@@ -129,7 +129,7 @@ bool Image11::updateSurface(TextureStorageInterface3D *storage, int level, GLint
return storage11->updateSubresourceLevel(getStagingTexture(), getStagingSubresource(), level, 0, xoffset, yoffset, zoffset, width, height, depth); return storage11->updateSubresourceLevel(getStagingTexture(), getStagingSubresource(), level, 0, xoffset, yoffset, zoffset, width, height, depth);
} }
bool Image11::redefine(Renderer *renderer, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, bool forceRelease) bool Image11::redefine(Renderer *renderer, GLenum target, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, bool forceRelease)
{ {
if (mWidth != width || if (mWidth != width ||
mHeight != height || mHeight != height ||
...@@ -142,6 +142,7 @@ bool Image11::redefine(Renderer *renderer, GLint internalformat, GLsizei width, ...@@ -142,6 +142,7 @@ bool Image11::redefine(Renderer *renderer, GLint internalformat, GLsizei width,
mHeight = height; mHeight = height;
mDepth = depth; mDepth = depth;
mInternalFormat = internalformat; mInternalFormat = internalformat;
mTarget = target;
// compute the d3d format that will be used // compute the d3d format that will be used
mDXGIFormat = gl_d3d11::ConvertTextureFormat(internalformat); mDXGIFormat = gl_d3d11::ConvertTextureFormat(internalformat);
mActualFormat = d3d11_gl::ConvertTextureInternalFormat(mDXGIFormat); mActualFormat = d3d11_gl::ConvertTextureInternalFormat(mDXGIFormat);
...@@ -394,7 +395,6 @@ void Image11::createStagingTexture() ...@@ -394,7 +395,6 @@ void Image11::createStagingTexture()
return; return;
} }
int lodOffset = 1;
const DXGI_FORMAT dxgiFormat = getDXGIFormat(); const DXGI_FORMAT dxgiFormat = getDXGIFormat();
ASSERT(!d3d11::IsDepthStencilFormat(dxgiFormat)); // We should never get here for depth textures ASSERT(!d3d11::IsDepthStencilFormat(dxgiFormat)); // We should never get here for depth textures
...@@ -402,13 +402,14 @@ void Image11::createStagingTexture() ...@@ -402,13 +402,14 @@ void Image11::createStagingTexture()
{ {
ID3D11Device *device = mRenderer->getDevice(); ID3D11Device *device = mRenderer->getDevice();
int lodOffset = 1;
GLsizei width = mWidth; GLsizei width = mWidth;
GLsizei height = mHeight; GLsizei height = mHeight;
// adjust size if needed for compressed textures // adjust size if needed for compressed textures
gl::MakeValidSize(false, d3d11::IsCompressed(dxgiFormat), &width, &height, &lodOffset); gl::MakeValidSize(false, d3d11::IsCompressed(dxgiFormat), &width, &height, &lodOffset);
if (mDepth > 1) if (mTarget == GL_TEXTURE_3D)
{ {
ID3D11Texture3D *newTexture = NULL; ID3D11Texture3D *newTexture = NULL;
...@@ -434,7 +435,7 @@ void Image11::createStagingTexture() ...@@ -434,7 +435,7 @@ void Image11::createStagingTexture()
mStagingTexture = newTexture; mStagingTexture = newTexture;
mStagingSubresource = D3D11CalcSubresource(lodOffset, 0, lodOffset + 1); mStagingSubresource = D3D11CalcSubresource(lodOffset, 0, lodOffset + 1);
} }
else else if (mTarget == GL_TEXTURE_2D || mTarget == GL_TEXTURE_2D_ARRAY || mTarget == GL_TEXTURE_CUBE_MAP)
{ {
ID3D11Texture2D *newTexture = NULL; ID3D11Texture2D *newTexture = NULL;
...@@ -463,6 +464,10 @@ void Image11::createStagingTexture() ...@@ -463,6 +464,10 @@ void Image11::createStagingTexture()
mStagingTexture = newTexture; mStagingTexture = newTexture;
mStagingSubresource = D3D11CalcSubresource(lodOffset, 0, lodOffset + 1); mStagingSubresource = D3D11CalcSubresource(lodOffset, 0, lodOffset + 1);
} }
else
{
UNREACHABLE();
}
} }
mDirty = false; mDirty = false;
......
...@@ -42,7 +42,7 @@ class Image11 : public Image ...@@ -42,7 +42,7 @@ class Image11 : public Image
virtual bool updateSurface(TextureStorageInterfaceCube *storage, int face, int level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height); virtual bool updateSurface(TextureStorageInterfaceCube *storage, int face, int level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height);
virtual bool updateSurface(TextureStorageInterface3D *storage, int level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth); virtual bool updateSurface(TextureStorageInterface3D *storage, int level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth);
virtual bool redefine(Renderer *renderer, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, bool forceRelease); virtual bool redefine(Renderer *renderer, GLenum target, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, bool forceRelease);
virtual bool isRenderableFormat() const; virtual bool isRenderableFormat() const;
DXGI_FORMAT getDXGIFormat() const; DXGI_FORMAT getDXGIFormat() const;
......
...@@ -141,11 +141,14 @@ void Image9::copyLockableSurfaces(IDirect3DSurface9 *dest, IDirect3DSurface9 *so ...@@ -141,11 +141,14 @@ void Image9::copyLockableSurfaces(IDirect3DSurface9 *dest, IDirect3DSurface9 *so
else UNREACHABLE(); else UNREACHABLE();
} }
bool Image9::redefine(rx::Renderer *renderer, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, bool forceRelease) bool Image9::redefine(rx::Renderer *renderer, GLenum target, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, bool forceRelease)
{ {
// 3D textures are not supported by the D3D9 backend. // 3D textures are not supported by the D3D9 backend.
ASSERT(depth <= 1); ASSERT(depth <= 1);
// Only 2D and cube texture are supported by the D3D9 backend.
ASSERT(target == GL_TEXTURE_2D || target == GL_TEXTURE_CUBE_MAP);
if (mWidth != width || if (mWidth != width ||
mHeight != height || mHeight != height ||
mDepth != depth || mDepth != depth ||
......
...@@ -37,7 +37,7 @@ class Image9 : public Image ...@@ -37,7 +37,7 @@ class Image9 : public Image
static void generateMip(IDirect3DSurface9 *destSurface, IDirect3DSurface9 *sourceSurface); static void generateMip(IDirect3DSurface9 *destSurface, IDirect3DSurface9 *sourceSurface);
static void copyLockableSurfaces(IDirect3DSurface9 *dest, IDirect3DSurface9 *source); static void copyLockableSurfaces(IDirect3DSurface9 *dest, IDirect3DSurface9 *source);
virtual bool redefine(Renderer *renderer, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, bool forceRelease); virtual bool redefine(Renderer *renderer, GLenum target, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, bool forceRelease);
virtual bool isRenderableFormat() const; virtual bool isRenderableFormat() const;
D3DFORMAT getD3DFormat() const; D3DFORMAT getD3DFormat() 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