Added GL_MAX_ARRAY_TEXTURE_LAYERS.

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@2177 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/Context.cpp b/src/libGLESv2/Context.cpp
index 3173fb0..2cb5e12 100644
--- a/src/libGLESv2/Context.cpp
+++ b/src/libGLESv2/Context.cpp
@@ -296,11 +296,13 @@
         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);
+        mMax2DArrayTextureLayers = mRenderer->getMaxTextureArrayLayers();
         mMaxRenderbufferDimension = mMax2DTextureDimension;
         mMaxTextureLevel = log2(mMax2DTextureDimension) + 1;
         mMaxTextureAnisotropy = mRenderer->getTextureMaxAnisotropy();
-        TRACE("Max2DTextureDimension=%d, MaxCubeTextureDimension=%d, Max3DTextureDimension=%d, MaxRenderbufferDimension=%d, "
-              "MaxTextureLevel=%d, MaxTextureAnisotropy=%f", mMax2DTextureDimension, mMaxCubeTextureDimension, mMax3DTextureDimension,
+        TRACE("Max2DTextureDimension=%d, MaxCubeTextureDimension=%d, Max3DTextureDimension=%d, Max2DArrayTextureLayers = %d, "
+              "MaxRenderbufferDimension=%d, MaxTextureLevel=%d, MaxTextureAnisotropy=%f",
+              mMax2DTextureDimension, mMaxCubeTextureDimension, mMax3DTextureDimension, mMax2DArrayTextureLayers,
               mMaxRenderbufferDimension, mMaxTextureLevel, mMaxTextureAnisotropy);
 
         mSupportsEventQueries = mRenderer->getEventQuerySupport();
@@ -1487,6 +1489,7 @@
       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_MAX_ARRAY_TEXTURE_LAYERS:         *params = getMaximum2DArrayTextureLayers();     break;
       case GL_NUM_COMPRESSED_TEXTURE_FORMATS:   
         params[0] = mNumCompressedTextureFormats;
         break;
@@ -1905,6 +1908,7 @@
       case GL_PIXEL_UNPACK_BUFFER_BINDING:
       case GL_TEXTURE_BINDING_3D:
       case GL_MAX_3D_TEXTURE_SIZE:
+      case GL_MAX_ARRAY_TEXTURE_LAYERS:
         {
             *type = GL_INT;
             *numParams = 1;
@@ -2469,6 +2473,11 @@
     return mMax3DTextureDimension;
 }
 
+int Context::getMaximum2DArrayTextureLayers() const
+{
+    return mMax2DArrayTextureLayers;
+}
+
 int Context::getMaximumTextureLevel() const
 {
     return mMaxTextureLevel;
diff --git a/src/libGLESv2/Context.h b/src/libGLESv2/Context.h
index aebef20..307d0b3 100644
--- a/src/libGLESv2/Context.h
+++ b/src/libGLESv2/Context.h
@@ -422,6 +422,7 @@
     int getMaximum2DTextureDimension() const;
     int getMaximumCubeTextureDimension() const;
     int getMaximum3DTextureDimension() const;
+    int getMaximum2DArrayTextureLayers() const;
     int getMaximumTextureLevel() const;
     unsigned int getMaximumRenderTargets() const;
     GLsizei getMaxSupportedSamples() const;
@@ -539,6 +540,7 @@
     int  mMax2DTextureDimension;
     int  mMaxCubeTextureDimension;
     int  mMax3DTextureDimension;
+    int  mMax2DArrayTextureLayers;
     int  mMaxTextureLevel;
     float mMaxTextureAnisotropy;
     bool mSupportsEventQueries;
diff --git a/src/libGLESv2/Texture.h b/src/libGLESv2/Texture.h
index 7f75ce5..118a8c8 100644
--- a/src/libGLESv2/Texture.h
+++ b/src/libGLESv2/Texture.h
@@ -50,6 +50,7 @@
     IMPLEMENTATION_MAX_2D_TEXTURE_SIZE = 16384,
     IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE = 16384,
     IMPLEMENTATION_MAX_3D_TEXTURE_SIZE = 2048,
+    IMPLEMENTATION_MAX_2D_ARRAY_TEXTURE_LAYERS = 2048,
 
     IMPLEMENTATION_MAX_TEXTURE_LEVELS = 15   // 1+log2 of MAX_TEXTURE_SIZE
 };
diff --git a/src/libGLESv2/renderer/Renderer.h b/src/libGLESv2/renderer/Renderer.h
index 6602ef6..0b2891d 100644
--- a/src/libGLESv2/renderer/Renderer.h
+++ b/src/libGLESv2/renderer/Renderer.h
@@ -182,6 +182,7 @@
     virtual int getMaxTextureWidth() const = 0;
     virtual int getMaxTextureHeight() const = 0;
     virtual int getMaxTextureDepth() const = 0;
+    virtual int getMaxTextureArrayLayers() 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 da6d389..61e64d3 100644
--- a/src/libGLESv2/renderer/Renderer11.cpp
+++ b/src/libGLESv2/renderer/Renderer11.cpp
@@ -2389,6 +2389,17 @@
     }
 }
 
+int Renderer11::getMaxTextureArrayLayers() const
+{
+    switch (mFeatureLevel)
+    {
+      case D3D_FEATURE_LEVEL_11_0: return D3D11_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION;   // 2048
+      case D3D_FEATURE_LEVEL_10_1:
+      case D3D_FEATURE_LEVEL_10_0: return D3D10_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION;   // 512
+      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 aaad498..0ecf0a7 100644
--- a/src/libGLESv2/renderer/Renderer11.h
+++ b/src/libGLESv2/renderer/Renderer11.h
@@ -127,6 +127,7 @@
     virtual int getMaxTextureWidth() const;
     virtual int getMaxTextureHeight() const;
     virtual int getMaxTextureDepth() const;
+    virtual int getMaxTextureArrayLayers() 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 2771348..cff3aa9 100644
--- a/src/libGLESv2/renderer/Renderer9.cpp
+++ b/src/libGLESv2/renderer/Renderer9.cpp
@@ -2379,6 +2379,12 @@
     return 1;
 }
 
+int Renderer9::getMaxTextureArrayLayers() const
+{
+    // 2D array 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 bb00b1f..0b3e921 100644
--- a/src/libGLESv2/renderer/Renderer9.h
+++ b/src/libGLESv2/renderer/Renderer9.h
@@ -142,6 +142,7 @@
     virtual int getMaxTextureWidth() const;
     virtual int getMaxTextureHeight() const;
     virtual int getMaxTextureDepth() const;
+    virtual int getMaxTextureArrayLayers() const;
     virtual bool get32BitIndexSupport() const;
     DWORD getCapsDeclTypes() const;
     virtual int getMinSwapInterval() const;