Reduce CPU texture usage in D3D11 where possible
Change-Id: I3186d78fa0a5c676611806c6f553c5c7ad06f56a
Reviewed-on: https://chromium-review.googlesource.com/212118
Tested-by: Austin Kinross <aukinros@microsoft.com>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libGLESv2/renderer/d3d/TextureD3D.cpp b/src/libGLESv2/renderer/d3d/TextureD3D.cpp
index 19f7320..d86bf90 100644
--- a/src/libGLESv2/renderer/d3d/TextureD3D.cpp
+++ b/src/libGLESv2/renderer/d3d/TextureD3D.cpp
@@ -219,12 +219,15 @@
TextureD3D_2D::~TextureD3D_2D()
{
- SafeDelete(mTexStorage);
-
+ // Delete the Images before the TextureStorage.
+ // Images might be relying on the TextureStorage for some of their data.
+ // If TextureStorage is deleted before the Images, then their data will be wastefully copied back from the GPU before we delete the Images.
for (int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; ++i)
{
delete mImageArray[i];
}
+
+ SafeDelete(mTexStorage);
}
Image *TextureD3D_2D::getImage(int level, int layer) const
@@ -762,8 +765,9 @@
TextureD3D_Cube::~TextureD3D_Cube()
{
- SafeDelete(mTexStorage);
-
+ // Delete the Images before the TextureStorage.
+ // Images might be relying on the TextureStorage for some of their data.
+ // If TextureStorage is deleted before the Images, then their data will be wastefully copied back from the GPU before we delete the Images.
for (int i = 0; i < 6; i++)
{
for (int j = 0; j < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; ++j)
@@ -771,6 +775,8 @@
SafeDelete(mImageArray[i][j]);
}
}
+
+ SafeDelete(mTexStorage);
}
Image *TextureD3D_Cube::getImage(int level, int layer) const
@@ -1283,12 +1289,15 @@
TextureD3D_3D::~TextureD3D_3D()
{
- SafeDelete(mTexStorage);
-
+ // Delete the Images before the TextureStorage.
+ // Images might be relying on the TextureStorage for some of their data.
+ // If TextureStorage is deleted before the Images, then their data will be wastefully copied back from the GPU before we delete the Images.
for (int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; ++i)
{
delete mImageArray[i];
}
+
+ SafeDelete(mTexStorage);
}
Image *TextureD3D_3D::getImage(int level, int layer) const
@@ -1798,9 +1807,11 @@
TextureD3D_2DArray::~TextureD3D_2DArray()
{
- SafeDelete(mTexStorage);
-
+ // Delete the Images before the TextureStorage.
+ // Images might be relying on the TextureStorage for some of their data.
+ // If TextureStorage is deleted before the Images, then their data will be wastefully copied back from the GPU before we delete the Images.
deleteImages();
+ SafeDelete(mTexStorage);
}
Image *TextureD3D_2DArray::getImage(int level, int layer) const