Commit b27b03a2 by Lingfeng Yang Committed by Commit Bot

GLES1: caps: GLES1-specific context limits

There are some GLES1-specific caps such as the number of multitexturing units and the matrix stack depths. This is important for validation. This uses Table 6.20 and 6.22 from the GLES 1.1 spec. Specify them in Caps.h and minimums in .cpp. Since we will be emulating GLES1, there is no plan to collect the caps from the native implementation; just initialize reasonable values in Context.cpp. In fact, we will go with the values above minimum: - 4 multitexturing units (vs. 2 minimum) - 6 clip plans (vs. 1 minimum) - 16 stack depth for projection matrices (vs. 2 minimum) - 16 stack depth for texture matrices (vs. 2 minimum) + clang-format Caps.cpp / h BUG=angleproject:2306 Change-Id: Ib28c317426be598a2adad7bd01920c03f27dc74a Reviewed-on: https://chromium-review.googlesource.com/925549 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org>
parent 27f4321e
...@@ -6,8 +6,8 @@ ...@@ -6,8 +6,8 @@
#include "libANGLE/Caps.h" #include "libANGLE/Caps.h"
#include "common/debug.h"
#include "common/angleutils.h" #include "common/angleutils.h"
#include "common/debug.h"
#include "libANGLE/formatutils.h" #include "libANGLE/formatutils.h"
...@@ -16,7 +16,9 @@ ...@@ -16,7 +16,9 @@
#include <algorithm> #include <algorithm>
#include <sstream> #include <sstream>
static void InsertExtensionString(const std::string &extension, bool supported, std::vector<std::string> *extensionVector) static void InsertExtensionString(const std::string &extension,
bool supported,
std::vector<std::string> *extensionVector)
{ {
if (supported) if (supported)
{ {
...@@ -27,11 +29,7 @@ static void InsertExtensionString(const std::string &extension, bool supported, ...@@ -27,11 +29,7 @@ static void InsertExtensionString(const std::string &extension, bool supported,
namespace gl namespace gl
{ {
TextureCaps::TextureCaps() TextureCaps::TextureCaps() : texturable(false), filterable(false), renderable(false), sampleCounts()
: texturable(false),
filterable(false),
renderable(false),
sampleCounts()
{ {
} }
...@@ -398,7 +396,9 @@ static bool DetermineRGFloatTextureSupport(const TextureCapsMap &textureCaps) ...@@ -398,7 +396,9 @@ static bool DetermineRGFloatTextureSupport(const TextureCapsMap &textureCaps)
return GetFormatSupport(textureCaps, requiredFormats, true, true, false); return GetFormatSupport(textureCaps, requiredFormats, true, true, false);
} }
static bool DetermineRGTextureSupport(const TextureCapsMap &textureCaps, bool checkHalfFloatFormats, bool checkFloatFormats) static bool DetermineRGTextureSupport(const TextureCapsMap &textureCaps,
bool checkHalfFloatFormats,
bool checkFloatFormats)
{ {
if (checkHalfFloatFormats && !DetermineRGHalfFloatTextureSupport(textureCaps)) if (checkHalfFloatFormats && !DetermineRGHalfFloatTextureSupport(textureCaps))
{ {
...@@ -573,29 +573,29 @@ static bool DetermineTextureNorm16Support(const TextureCapsMap &textureCaps) ...@@ -573,29 +573,29 @@ static bool DetermineTextureNorm16Support(const TextureCapsMap &textureCaps)
void Extensions::setTextureExtensionSupport(const TextureCapsMap &textureCaps) void Extensions::setTextureExtensionSupport(const TextureCapsMap &textureCaps)
{ {
packedDepthStencil = DeterminePackedDepthStencilSupport(textureCaps); packedDepthStencil = DeterminePackedDepthStencilSupport(textureCaps);
rgb8rgba8 = DetermineRGB8AndRGBA8TextureSupport(textureCaps); rgb8rgba8 = DetermineRGB8AndRGBA8TextureSupport(textureCaps);
textureFormatBGRA8888 = DetermineBGRA8TextureSupport(textureCaps); textureFormatBGRA8888 = DetermineBGRA8TextureSupport(textureCaps);
colorBufferHalfFloat = DetermineColorBufferHalfFloatSupport(textureCaps); colorBufferHalfFloat = DetermineColorBufferHalfFloatSupport(textureCaps);
textureHalfFloat = DetermineHalfFloatTextureSupport(textureCaps); textureHalfFloat = DetermineHalfFloatTextureSupport(textureCaps);
textureHalfFloatLinear = DetermineHalfFloatTextureFilteringSupport(textureCaps); textureHalfFloatLinear = DetermineHalfFloatTextureFilteringSupport(textureCaps);
textureFloat = DetermineFloatTextureSupport(textureCaps); textureFloat = DetermineFloatTextureSupport(textureCaps);
textureFloatLinear = DetermineFloatTextureFilteringSupport(textureCaps); textureFloatLinear = DetermineFloatTextureFilteringSupport(textureCaps);
textureRG = DetermineRGTextureSupport(textureCaps, textureHalfFloat, textureFloat); textureRG = DetermineRGTextureSupport(textureCaps, textureHalfFloat, textureFloat);
textureCompressionDXT1 = DetermineDXT1TextureSupport(textureCaps); textureCompressionDXT1 = DetermineDXT1TextureSupport(textureCaps);
textureCompressionDXT3 = DetermineDXT3TextureSupport(textureCaps); textureCompressionDXT3 = DetermineDXT3TextureSupport(textureCaps);
textureCompressionDXT5 = DetermineDXT5TextureSupport(textureCaps); textureCompressionDXT5 = DetermineDXT5TextureSupport(textureCaps);
textureCompressionS3TCsRGB = DetermineS3TCsRGBTextureSupport(textureCaps); textureCompressionS3TCsRGB = DetermineS3TCsRGBTextureSupport(textureCaps);
textureCompressionASTCHDR = DetermineASTCTextureSupport(textureCaps); textureCompressionASTCHDR = DetermineASTCTextureSupport(textureCaps);
textureCompressionASTCLDR = textureCompressionASTCHDR; textureCompressionASTCLDR = textureCompressionASTCHDR;
compressedETC1RGB8Texture = DetermineETC1RGB8TextureSupport(textureCaps); compressedETC1RGB8Texture = DetermineETC1RGB8TextureSupport(textureCaps);
sRGB = DetermineSRGBTextureSupport(textureCaps); sRGB = DetermineSRGBTextureSupport(textureCaps);
depthTextures = DetermineDepthTextureSupport(textureCaps); depthTextures = DetermineDepthTextureSupport(textureCaps);
depth32 = DetermineDepth32Support(textureCaps); depth32 = DetermineDepth32Support(textureCaps);
colorBufferFloatRGB = DetermineColorBufferFloatRGBSupport(textureCaps); colorBufferFloatRGB = DetermineColorBufferFloatRGBSupport(textureCaps);
colorBufferFloatRGBA = DetermineColorBufferFloatRGBASupport(textureCaps); colorBufferFloatRGBA = DetermineColorBufferFloatRGBASupport(textureCaps);
colorBufferFloat = DetermineColorBufferFloatSupport(textureCaps); colorBufferFloat = DetermineColorBufferFloatSupport(textureCaps);
textureNorm16 = DetermineTextureNorm16Support(textureCaps); textureNorm16 = DetermineTextureNorm16Support(textureCaps);
} }
const ExtensionInfoMap &GetExtensionInfoMap() const ExtensionInfoMap &GetExtensionInfoMap()
...@@ -869,7 +869,16 @@ Caps::Caps() ...@@ -869,7 +869,16 @@ Caps::Caps()
// Table 20.46 (GL_EXT_geometry_shader) // Table 20.46 (GL_EXT_geometry_shader)
maxGeometryImageUniforms(0), maxGeometryImageUniforms(0),
maxCombinedGeometryUniformComponents(0) maxCombinedGeometryUniformComponents(0),
// GLES1 emulation: Table 6.20 / 6.22 (ES 1.1 spec)
maxMultitextureUnits(0),
maxClipPlanes(0),
maxLights(0),
maxModelviewMatrixStackDepth(0),
maxProjectionMatrixStackDepth(0),
maxTextureMatrixStackDepth(0)
{ {
for (size_t i = 0; i < 3; ++i) for (size_t i = 0; i < 3; ++i)
{ {
...@@ -885,6 +894,18 @@ Caps GenerateMinimumCaps(const Version &clientVersion, const Extensions &extensi ...@@ -885,6 +894,18 @@ Caps GenerateMinimumCaps(const Version &clientVersion, const Extensions &extensi
{ {
Caps caps; Caps caps;
// GLES1 emulation (Minimums taken from Table 6.20 / 6.22 (ES 1.1 spec))
if (clientVersion < Version(2, 0))
{
caps.maxMultitextureUnits = 2;
caps.maxLights = 8;
caps.maxClipPlanes = 1;
caps.maxModelviewMatrixStackDepth = 16;
caps.maxProjectionMatrixStackDepth = 2;
caps.maxTextureMatrixStackDepth = 2;
}
if (clientVersion >= Version(2, 0)) if (clientVersion >= Version(2, 0))
{ {
// Table 6.18 // Table 6.18
...@@ -1111,8 +1132,7 @@ Caps GenerateMinimumCaps(const Version &clientVersion, const Extensions &extensi ...@@ -1111,8 +1132,7 @@ Caps GenerateMinimumCaps(const Version &clientVersion, const Extensions &extensi
namespace egl namespace egl
{ {
Caps::Caps() Caps::Caps() : textureNPOT(false)
: textureNPOT(false)
{ {
} }
...@@ -1206,8 +1226,7 @@ std::vector<std::string> DisplayExtensions::getStrings() const ...@@ -1206,8 +1226,7 @@ std::vector<std::string> DisplayExtensions::getStrings() const
return extensionStrings; return extensionStrings;
} }
DeviceExtensions::DeviceExtensions() DeviceExtensions::DeviceExtensions() : deviceD3D(false)
: deviceD3D(false)
{ {
} }
...@@ -1215,8 +1234,10 @@ std::vector<std::string> DeviceExtensions::getStrings() const ...@@ -1215,8 +1234,10 @@ std::vector<std::string> DeviceExtensions::getStrings() const
{ {
std::vector<std::string> extensionStrings; std::vector<std::string> extensionStrings;
// clang-format off
// | Extension name | Supported flag | Output vector | // | Extension name | Supported flag | Output vector |
InsertExtensionString("EGL_ANGLE_device_d3d", deviceD3D, &extensionStrings); InsertExtensionString("EGL_ANGLE_device_d3d", deviceD3D, &extensionStrings);
// clang-format on
return extensionStrings; return extensionStrings;
} }
......
...@@ -12,11 +12,11 @@ ...@@ -12,11 +12,11 @@
#include "libANGLE/angletypes.h" #include "libANGLE/angletypes.h"
#include "libANGLE/renderer/Format.h" #include "libANGLE/renderer/Format.h"
#include <array>
#include <map> #include <map>
#include <set> #include <set>
#include <string> #include <string>
#include <vector> #include <vector>
#include <array>
namespace gl namespace gl
{ {
...@@ -155,12 +155,13 @@ struct Extensions ...@@ -155,12 +155,13 @@ struct Extensions
bool textureFloatLinear; bool textureFloatLinear;
// GL_EXT_texture_rg // GL_EXT_texture_rg
// Implies that TextureCaps for GL_R8, GL_RG8 (and floating point R/RG texture formats if floating point extensions // Implies that TextureCaps for GL_R8, GL_RG8 (and floating point R/RG texture formats if
// are also present) exist // floating point extensions are also present) exist
bool textureRG; bool textureRG;
// GL_EXT_texture_compression_dxt1, GL_ANGLE_texture_compression_dxt3 and GL_ANGLE_texture_compression_dxt5 // GL_EXT_texture_compression_dxt1, GL_ANGLE_texture_compression_dxt3 and
// Implies that TextureCaps exist for GL_COMPRESSED_RGB_S3TC_DXT1_EXT, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT // GL_ANGLE_texture_compression_dxt5 Implies that TextureCaps exist for
// GL_COMPRESSED_RGB_S3TC_DXT1_EXT, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
// GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE and GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE // GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE and GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE
bool textureCompressionDXT1; bool textureCompressionDXT1;
bool textureCompressionDXT3; bool textureCompressionDXT3;
...@@ -583,6 +584,14 @@ struct Caps ...@@ -583,6 +584,14 @@ struct Caps
// limits // limits
GLuint maxGeometryImageUniforms; GLuint maxGeometryImageUniforms;
GLuint maxCombinedGeometryUniformComponents; GLuint maxCombinedGeometryUniformComponents;
// GLES1 emulation: Caps for ES 1.1. Taken from Table 6.20 / 6.22 in the OpenGL ES 1.1 spec.
GLuint maxMultitextureUnits;
GLuint maxClipPlanes;
GLuint maxLights;
GLuint maxModelviewMatrixStackDepth;
GLuint maxProjectionMatrixStackDepth;
GLuint maxTextureMatrixStackDepth;
}; };
Caps GenerateMinimumCaps(const Version &clientVersion, const Extensions &extensions); Caps GenerateMinimumCaps(const Version &clientVersion, const Extensions &extensions);
...@@ -779,4 +788,4 @@ struct ClientExtensions ...@@ -779,4 +788,4 @@ struct ClientExtensions
} // namespace egl } // namespace egl
#endif // LIBANGLE_CAPS_H_ #endif // LIBANGLE_CAPS_H_
...@@ -164,8 +164,8 @@ gl::Version GetClientVersion(const egl::AttributeMap &attribs) ...@@ -164,8 +164,8 @@ gl::Version GetClientVersion(const egl::AttributeMap &attribs)
GLenum GetResetStrategy(const egl::AttributeMap &attribs) GLenum GetResetStrategy(const egl::AttributeMap &attribs)
{ {
EGLAttrib attrib = attribs.get(EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT, EGLAttrib attrib =
EGL_NO_RESET_NOTIFICATION); attribs.get(EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT, EGL_NO_RESET_NOTIFICATION);
switch (attrib) switch (attrib)
{ {
case EGL_NO_RESET_NOTIFICATION: case EGL_NO_RESET_NOTIFICATION:
...@@ -2664,6 +2664,17 @@ void Context::initCaps(const egl::DisplayExtensions &displayExtensions, bool rob ...@@ -2664,6 +2664,17 @@ void Context::initCaps(const egl::DisplayExtensions &displayExtensions, bool rob
{ {
mCaps = mImplementation->getNativeCaps(); mCaps = mImplementation->getNativeCaps();
// GLES1 emulation: Initialize caps (Table 6.20 / 6.22 in the ES 1.1 spec)
if (getClientVersion() < Version(2, 0))
{
mCaps.maxMultitextureUnits = 4;
mCaps.maxClipPlanes = 6;
mCaps.maxLights = 8;
mCaps.maxModelviewMatrixStackDepth = 16;
mCaps.maxProjectionMatrixStackDepth = 16;
mCaps.maxTextureMatrixStackDepth = 16;
}
mExtensions = mImplementation->getNativeExtensions(); mExtensions = mImplementation->getNativeExtensions();
mLimitations = mImplementation->getNativeLimitations(); mLimitations = mImplementation->getNativeLimitations();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment