Added parameters for maximum 3D texture size. Renamed maximum 2D texture size methods and variables.

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@2167 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/Context.cpp b/src/libGLESv2/Context.cpp
index 62f6989..16cd755 100644
--- a/src/libGLESv2/Context.cpp
+++ b/src/libGLESv2/Context.cpp
@@ -289,14 +289,17 @@
         mSupportsInstancing = mRenderer->getInstancingSupport();
 
         mMaxViewportDimension = mRenderer->getMaxViewportDimension();
-        mMaxTextureDimension = std::min(std::min(mRenderer->getMaxTextureWidth(), mRenderer->getMaxTextureHeight()),
-                                        (int)gl::IMPLEMENTATION_MAX_TEXTURE_SIZE);
-        mMaxCubeTextureDimension = std::min(mMaxTextureDimension, (int)gl::IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE);
-        mMaxRenderbufferDimension = mMaxTextureDimension;
-        mMaxTextureLevel = log2(mMaxTextureDimension) + 1;
+        mMax2DTextureDimension = std::min(std::min(mRenderer->getMaxTextureWidth(), mRenderer->getMaxTextureHeight()),
+                                          (int)gl::IMPLEMENTATION_MAX_2D_TEXTURE_SIZE);
+        mMaxCubeTextureDimension = std::min(mMax2DTextureDimension, (int)gl::IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE);
+        mMax3DTextureDimension = std::min(std::min(mMax2DTextureDimension, mRenderer->getMaxTextureDepth()),
+                                          (int)gl::IMPLEMENTATION_MAX_3D_TEXTURE_SIZE);
+        mMaxRenderbufferDimension = mMax2DTextureDimension;
+        mMaxTextureLevel = log2(mMax2DTextureDimension) + 1;
         mMaxTextureAnisotropy = mRenderer->getTextureMaxAnisotropy();
-        TRACE("MaxTextureDimension=%d, MaxCubeTextureDimension=%d, MaxRenderbufferDimension=%d, MaxTextureLevel=%d, MaxTextureAnisotropy=%f",
-              mMaxTextureDimension, mMaxCubeTextureDimension, mMaxRenderbufferDimension, mMaxTextureLevel, mMaxTextureAnisotropy);
+        TRACE("Max2DTextureDimension=%d, MaxCubeTextureDimension=%d, Max3DTextureDimension=%d, MaxRenderbufferDimension=%d, "
+              "MaxTextureLevel=%d, MaxTextureAnisotropy=%f", mMax2DTextureDimension, mMaxCubeTextureDimension, mMax3DTextureDimension,
+              mMaxRenderbufferDimension, mMaxTextureLevel, mMaxTextureAnisotropy);
 
         mSupportsEventQueries = mRenderer->getEventQuerySupport();
         mSupportsOcclusionQueries = mRenderer->getOcclusionQuerySupport();
@@ -1466,8 +1469,9 @@
       case GL_STENCIL_BACK_WRITEMASK:           *params = mState.depthStencil.stencilBackWritemask;    break;
       case GL_STENCIL_CLEAR_VALUE:              *params = mState.stencilClearValue;             break;
       case GL_SUBPIXEL_BITS:                    *params = 4;                                    break;
-      case GL_MAX_TEXTURE_SIZE:                 *params = getMaximumTextureDimension();         break;
+      case GL_MAX_TEXTURE_SIZE:                 *params = getMaximum2DTextureDimension();       break;
       case GL_MAX_CUBE_MAP_TEXTURE_SIZE:        *params = getMaximumCubeTextureDimension();     break;
+      case GL_MAX_3D_TEXTURE_SIZE:              *params = getMaximum3DTextureDimension();       break;
       case GL_NUM_COMPRESSED_TEXTURE_FORMATS:   
         params[0] = mNumCompressedTextureFormats;
         break;
@@ -1873,6 +1877,7 @@
       case GL_COPY_WRITE_BUFFER_BINDING:
       case GL_PIXEL_PACK_BUFFER_BINDING:
       case GL_PIXEL_UNPACK_BUFFER_BINDING:
+      case GL_MAX_3D_TEXTURE_SIZE:
         {
             *type = GL_INT;
             *numParams = 1;
@@ -2422,9 +2427,9 @@
     return mMaxRenderbufferDimension;
 }
 
-int Context::getMaximumTextureDimension() const
+int Context::getMaximum2DTextureDimension() const
 {
-    return mMaxTextureDimension;
+    return mMax2DTextureDimension;
 }
 
 int Context::getMaximumCubeTextureDimension() const
@@ -2432,6 +2437,11 @@
     return mMaxCubeTextureDimension;
 }
 
+int Context::getMaximum3DTextureDimension() const
+{
+    return mMax3DTextureDimension;
+}
+
 int Context::getMaximumTextureLevel() const
 {
     return mMaxTextureLevel;
diff --git a/src/libGLESv2/Context.h b/src/libGLESv2/Context.h
index 34416cb..859287a 100644
--- a/src/libGLESv2/Context.h
+++ b/src/libGLESv2/Context.h
@@ -416,8 +416,9 @@
     unsigned int getMaximumCombinedTextureImageUnits() const;
     unsigned int getMaximumCombinedUniformBufferBindings() const;
     int getMaximumRenderbufferDimension() const;
-    int getMaximumTextureDimension() const;
+    int getMaximum2DTextureDimension() const;
     int getMaximumCubeTextureDimension() const;
+    int getMaximum3DTextureDimension() const;
     int getMaximumTextureLevel() const;
     unsigned int getMaximumRenderTargets() const;
     GLsizei getMaxSupportedSamples() const;
@@ -531,8 +532,9 @@
     bool mSupportsInstancing;
     int  mMaxViewportDimension;
     int  mMaxRenderbufferDimension;
-    int  mMaxTextureDimension;
+    int  mMax2DTextureDimension;
     int  mMaxCubeTextureDimension;
+    int  mMax3DTextureDimension;
     int  mMaxTextureLevel;
     float mMaxTextureAnisotropy;
     bool mSupportsEventQueries;
diff --git a/src/libGLESv2/Texture.h b/src/libGLESv2/Texture.h
index 37fdf4d..71b9878 100644
--- a/src/libGLESv2/Texture.h
+++ b/src/libGLESv2/Texture.h
@@ -46,8 +46,9 @@
     // These are the maximums the implementation can support
     // The actual GL caps are limited by the device caps
     // and should be queried from the Context
-    IMPLEMENTATION_MAX_TEXTURE_SIZE = 16384,
+    IMPLEMENTATION_MAX_2D_TEXTURE_SIZE = 16384,
     IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE = 16384,
+    IMPLEMENTATION_MAX_3D_TEXTURE_SIZE = 2048,
 
     IMPLEMENTATION_MAX_TEXTURE_LEVELS = 15   // 1+log2 of MAX_TEXTURE_SIZE
 };
diff --git a/src/libGLESv2/libGLESv2.cpp b/src/libGLESv2/libGLESv2.cpp
index 8f62330..e512b83 100644
--- a/src/libGLESv2/libGLESv2.cpp
+++ b/src/libGLESv2/libGLESv2.cpp
@@ -1171,8 +1171,8 @@
             switch (target)
             {
               case GL_TEXTURE_2D:
-                if (width > (context->getMaximumTextureDimension() >> level) ||
-                    height > (context->getMaximumTextureDimension() >> level))
+                if (width > (context->getMaximum2DTextureDimension() >> level) ||
+                    height > (context->getMaximum2DTextureDimension() >> level))
                 {
                     return gl::error(GL_INVALID_VALUE);
                 }
@@ -1415,8 +1415,8 @@
             switch (target)
             {
               case GL_TEXTURE_2D:
-                if (width > (context->getMaximumTextureDimension() >> level) ||
-                    height > (context->getMaximumTextureDimension() >> level))
+                if (width > (context->getMaximum2DTextureDimension() >> level) ||
+                    height > (context->getMaximum2DTextureDimension() >> level))
                 {
                     return gl::error(GL_INVALID_VALUE);
                 }
@@ -5538,8 +5538,8 @@
             switch (target)
             {
               case GL_TEXTURE_2D:
-                if (width > (context->getMaximumTextureDimension() >> level) ||
-                    height > (context->getMaximumTextureDimension() >> level))
+                if (width > (context->getMaximum2DTextureDimension() >> level) ||
+                    height > (context->getMaximum2DTextureDimension() >> level))
                 {
                     return gl::error(GL_INVALID_VALUE);
                 }
@@ -5900,8 +5900,8 @@
             switch (target)
             {
               case GL_TEXTURE_2D:
-                if (width > context->getMaximumTextureDimension() ||
-                    height > context->getMaximumTextureDimension())
+                if (width > context->getMaximum2DTextureDimension() ||
+                    height > context->getMaximum2DTextureDimension())
                 {
                     return gl::error(GL_INVALID_VALUE);
                 }
diff --git a/src/libGLESv2/renderer/Renderer.h b/src/libGLESv2/renderer/Renderer.h
index 65e83a9..dd8664a 100644
--- a/src/libGLESv2/renderer/Renderer.h
+++ b/src/libGLESv2/renderer/Renderer.h
@@ -180,6 +180,7 @@
     virtual int getMaxViewportDimension() const = 0;
     virtual int getMaxTextureWidth() const = 0;
     virtual int getMaxTextureHeight() const = 0;
+    virtual int getMaxTextureDepth() const = 0;
     virtual bool get32BitIndexSupport() const = 0;
     virtual int getMinSwapInterval() const = 0;
     virtual int getMaxSwapInterval() const = 0;
diff --git a/src/libGLESv2/renderer/Renderer11.cpp b/src/libGLESv2/renderer/Renderer11.cpp
index 8cc2631..658ad82 100644
--- a/src/libGLESv2/renderer/Renderer11.cpp
+++ b/src/libGLESv2/renderer/Renderer11.cpp
@@ -2378,6 +2378,17 @@
     }
 }
 
+int Renderer11::getMaxTextureDepth() const
+{
+    switch (mFeatureLevel)
+    {
+      case D3D_FEATURE_LEVEL_11_0: return D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION;   // 2048
+      case D3D_FEATURE_LEVEL_10_1:
+      case D3D_FEATURE_LEVEL_10_0: return D3D10_REQ_TEXTURE3D_U_V_OR_W_DIMENSION;   // 2048
+      default: UNREACHABLE();      return 0;
+    }
+}
+
 bool Renderer11::get32BitIndexSupport() const
 {
     switch (mFeatureLevel)
diff --git a/src/libGLESv2/renderer/Renderer11.h b/src/libGLESv2/renderer/Renderer11.h
index 6458212..585fdd1 100644
--- a/src/libGLESv2/renderer/Renderer11.h
+++ b/src/libGLESv2/renderer/Renderer11.h
@@ -126,6 +126,7 @@
     virtual int getMaxViewportDimension() const;
     virtual int getMaxTextureWidth() const;
     virtual int getMaxTextureHeight() const;
+    virtual int getMaxTextureDepth() const;
     virtual bool get32BitIndexSupport() const;
     virtual int getMinSwapInterval() const;
     virtual int getMaxSwapInterval() const;
diff --git a/src/libGLESv2/renderer/Renderer9.cpp b/src/libGLESv2/renderer/Renderer9.cpp
index b4cb5a7..3407301 100644
--- a/src/libGLESv2/renderer/Renderer9.cpp
+++ b/src/libGLESv2/renderer/Renderer9.cpp
@@ -2359,7 +2359,7 @@
 int Renderer9::getMaxViewportDimension() const
 {
     int maxTextureDimension = std::min(std::min(getMaxTextureWidth(), getMaxTextureHeight()),
-                                       (int)gl::IMPLEMENTATION_MAX_TEXTURE_SIZE);
+                                       (int)gl::IMPLEMENTATION_MAX_2D_TEXTURE_SIZE);
     return maxTextureDimension;
 }
 
@@ -2373,6 +2373,12 @@
     return (int)mDeviceCaps.MaxTextureHeight;
 }
 
+int Renderer9::getMaxTextureDepth() const
+{
+    // 3D textures are not available in the D3D9 backend.
+    return 1;
+}
+
 bool Renderer9::get32BitIndexSupport() const
 {
     return mDeviceCaps.MaxVertexIndex >= (1 << 16);
diff --git a/src/libGLESv2/renderer/Renderer9.h b/src/libGLESv2/renderer/Renderer9.h
index 3ec5890..7dde74b 100644
--- a/src/libGLESv2/renderer/Renderer9.h
+++ b/src/libGLESv2/renderer/Renderer9.h
@@ -141,6 +141,7 @@
     virtual int getMaxViewportDimension() const;
     virtual int getMaxTextureWidth() const;
     virtual int getMaxTextureHeight() const;
+    virtual int getMaxTextureDepth() const;
     virtual bool get32BitIndexSupport() const;
     DWORD getCapsDeclTypes() const;
     virtual int getMinSwapInterval() const;