Moves mipmap generation to texture storage and image objects.

TRAC #21910

Signed-off-by: Daniel Koch

Author:    Shannon Woods

git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@1374 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/renderer/TextureStorage.cpp b/src/libGLESv2/renderer/TextureStorage.cpp
index a2afc3c..4cb561e 100644
--- a/src/libGLESv2/renderer/TextureStorage.cpp
+++ b/src/libGLESv2/renderer/TextureStorage.cpp
@@ -11,6 +11,7 @@
 #include "libGLESv2/main.h"
 #include "libGLESv2/renderer/TextureStorage.h"
 #include "libGLESv2/renderer/SwapChain.h"
+#include "libGLESv2/Blit.h"
 
 #include "common/debug.h"
 
@@ -118,6 +119,12 @@
     return D3DFMT_A8R8G8B8;
 }
 
+Blit *TextureStorage::getBlitter()
+{
+    Context *context = getContext();
+    return context->getBlitter();
+}
+
 bool TextureStorage::isRenderTarget() const
 {
     return (mD3DUsage & (D3DUSAGE_RENDERTARGET | D3DUSAGE_DEPTHSTENCIL)) != 0;
@@ -279,6 +286,20 @@
     return surface;
 }
 
+void TextureStorage2D::generateMipmap(int level)
+{
+    IDirect3DSurface9 *upper = getSurfaceLevel(level - 1, false);
+    IDirect3DSurface9 *lower = getSurfaceLevel(level, true);
+
+    if (upper != NULL && lower != NULL)
+    {
+        getBlitter()->boxFilter(upper, lower);
+    }
+
+    if (upper != NULL) upper->Release();
+    if (lower != NULL) lower->Release();
+}
+
 IDirect3DBaseTexture9 *TextureStorage2D::getBaseTexture() const
 {
     return mTexture;
@@ -370,6 +391,20 @@
     return surface;
 }
 
+void TextureStorageCubeMap::generateMipmap(int face, int level)
+{
+    IDirect3DSurface9 *upper = getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, level - 1, false);
+    IDirect3DSurface9 *lower = getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, level, true);
+
+    if (upper != NULL && lower != NULL)
+    {
+        getBlitter()->boxFilter(upper, lower);
+    }
+
+    if (upper != NULL) upper->Release();
+    if (lower != NULL) lower->Release();
+}
+
 IDirect3DBaseTexture9 *TextureStorageCubeMap::getBaseTexture() const
 {
     return mTexture;