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;