Use a Caps structure to store extension and texture format support.
Removes support for fallbacks in D3D9 texture formats. The fallback
formats did not work properly anyways.
BUG=angle:658
Change-Id: Idfa5183bf71fd8ebf4608f940f9d93177b9eff08
Reviewed-on: https://chromium-review.googlesource.com/200813
Tested-by: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libGLESv2/Context.cpp b/src/libGLESv2/Context.cpp
index 879a560..c004b49 100644
--- a/src/libGLESv2/Context.cpp
+++ b/src/libGLESv2/Context.cpp
@@ -37,15 +37,6 @@
namespace gl
{
-static const char* makeStaticString(const std::string& str)
-{
- static std::set<std::string> strings;
- std::set<std::string>::iterator it = strings.find(str);
- if (it != strings.end())
- return it->c_str();
-
- return strings.insert(str).first->c_str();
-}
Context::Context(int clientVersion, const gl::Context *shareContext, rx::Renderer *renderer, bool notifyResets, bool robustAccess) : mRenderer(renderer)
{
@@ -203,7 +194,6 @@
mState.currentProgram = 0;
mCurrentProgramBinary.set(NULL);
- mCombinedExtensionsString = NULL;
mRendererString = NULL;
mInvalidEnum = false;
@@ -218,12 +208,6 @@
mResetStrategy = (notifyResets ? GL_LOSE_CONTEXT_ON_RESET_EXT : GL_NO_RESET_NOTIFICATION_EXT);
mRobustAccess = robustAccess;
- mSupportsBGRATextures = false;
- mSupportsDXT1Textures = false;
- mSupportsDXT3Textures = false;
- mSupportsDXT5Textures = false;
- mSupportsEventQueries = false;
- mSupportsOcclusionQueries = false;
mNumCompressedTextureFormats = 0;
}
@@ -328,8 +312,6 @@
mMajorShaderModel = mRenderer->getMajorShaderModel();
mMaximumPointSize = mRenderer->getMaxPointSize();
mSupportsVertexTexture = mRenderer->getVertexTextureSupport();
- mSupportsNonPower2Texture = mRenderer->getNonPower2TextureSupport();
- mSupportsInstancing = mRenderer->getInstancingSupport();
mMaxViewportDimension = mRenderer->getMaxViewportDimension();
mMax2DTextureDimension = std::min(std::min(mRenderer->getMaxTextureWidth(), mRenderer->getMaxTextureHeight()),
@@ -343,50 +325,29 @@
mMaxCubeTextureLevel = log2(mMaxCubeTextureDimension) + 1;
mMax3DTextureLevel = log2(mMax3DTextureDimension) + 1;
mMax2DArrayTextureLevel = log2(mMax2DTextureDimension) + 1;
- mMaxTextureAnisotropy = mRenderer->getTextureMaxAnisotropy();
TRACE("Max2DTextureDimension=%d, MaxCubeTextureDimension=%d, Max3DTextureDimension=%d, Max2DArrayTextureLayers = %d, "
"Max2DTextureLevel=%d, MaxCubeTextureLevel=%d, Max3DTextureLevel=%d, Max2DArrayTextureLevel=%d, "
- "MaxRenderbufferDimension=%d, MaxTextureAnisotropy=%f",
+ "MaxRenderbufferDimension=%d",
mMax2DTextureDimension, mMaxCubeTextureDimension, mMax3DTextureDimension, mMax2DArrayTextureLayers,
mMax2DTextureLevel, mMaxCubeTextureLevel, mMax3DTextureLevel, mMax2DArrayTextureLevel,
- mMaxRenderbufferDimension, mMaxTextureAnisotropy);
-
- mSupportsEventQueries = mRenderer->getEventQuerySupport();
- mSupportsOcclusionQueries = mRenderer->getOcclusionQuerySupport();
- mSupportsBGRATextures = mRenderer->getBGRATextureSupport();
- mSupportsDXT1Textures = mRenderer->getDXT1TextureSupport();
- mSupportsDXT3Textures = mRenderer->getDXT3TextureSupport();
- mSupportsDXT5Textures = mRenderer->getDXT5TextureSupport();
- mSupportsFloat32Textures = mRenderer->getFloat32TextureSupport();
- mSupportsFloat32LinearFilter = mRenderer->getFloat32TextureFilteringSupport();
- mSupportsFloat32RenderableTextures = mRenderer->getFloat32TextureRenderingSupport();
- mSupportsFloat16Textures = mRenderer->getFloat16TextureSupport();
- mSupportsFloat16LinearFilter = mRenderer->getFloat16TextureFilteringSupport();
- mSupportsFloat16RenderableTextures = mRenderer->getFloat16TextureRenderingSupport();
- mSupportsLuminanceTextures = mRenderer->getLuminanceTextureSupport();
- mSupportsLuminanceAlphaTextures = mRenderer->getLuminanceAlphaTextureSupport();
- mSupportsRGTextures = mRenderer->getRGTextureSupport();
- mSupportsDepthTextures = mRenderer->getDepthTextureSupport();
- mSupportsTextureFilterAnisotropy = mRenderer->getTextureFilterAnisotropySupport();
- mSupports32bitIndices = mRenderer->get32BitIndexSupport();
- mSupportsPBOs = mRenderer->getPBOSupport();
+ mMaxRenderbufferDimension);
mNumCompressedTextureFormats = 0;
- if (supportsDXT1Textures())
+ if (getCaps().extensions.textureCompressionDXT1)
{
mNumCompressedTextureFormats += 2;
}
- if (supportsDXT3Textures())
+ if (getCaps().extensions.textureCompressionDXT3)
{
mNumCompressedTextureFormats += 1;
}
- if (supportsDXT5Textures())
+ if (getCaps().extensions.textureCompressionDXT5)
{
mNumCompressedTextureFormats += 1;
}
- initExtensionString();
initRendererString();
+ initExtensionStrings();
mState.viewport.x = 0;
mState.viewport.y = 0;
@@ -1412,25 +1373,23 @@
void Context::setRenderbufferStorage(GLsizei width, GLsizei height, GLenum internalformat, GLsizei samples)
{
- const bool color = gl::IsColorRenderingSupported(internalformat, this);
- const bool depth = gl::IsDepthRenderingSupported(internalformat, this);
- const bool stencil = gl::IsStencilRenderingSupported(internalformat, this);
+ const TextureCaps &formatCaps = getCaps().textureCaps.get(internalformat);
RenderbufferStorage *renderbuffer = NULL;
- if (color)
+ if (formatCaps.colorRendering)
{
renderbuffer = new gl::Colorbuffer(mRenderer,width, height, internalformat, samples);
}
- else if (depth && stencil)
+ else if (formatCaps.depthRendering && formatCaps.stencilRendering)
{
renderbuffer = new gl::DepthStencilbuffer(mRenderer, width, height, samples);
}
- else if (depth)
+ else if (formatCaps.depthRendering)
{
renderbuffer = new gl::Depthbuffer(mRenderer, width, height, samples);
}
- else if (stencil)
+ else if (formatCaps.stencilRendering)
{
renderbuffer = new gl::Stencilbuffer(mRenderer, width, height, samples);
}
@@ -1700,8 +1659,8 @@
params[3] = mState.blendColor.alpha;
break;
case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
- ASSERT(supportsTextureFilterAnisotropy());
- *params = mMaxTextureAnisotropy;
+ ASSERT(getCaps().extensions.textureFilterAnisotropic);
+ *params = getCaps().extensions.maxTextureAnisotropy;
break;
default:
UNREACHABLE();
@@ -1849,16 +1808,16 @@
break;
case GL_COMPRESSED_TEXTURE_FORMATS:
{
- if (supportsDXT1Textures())
+ if (getCaps().extensions.textureCompressionDXT1)
{
*params++ = GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
*params++ = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
}
- if (supportsDXT3Textures())
+ if (getCaps().extensions.textureCompressionDXT3)
{
*params++ = GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE;
}
- if (supportsDXT5Textures())
+ if (getCaps().extensions.textureCompressionDXT5)
{
*params++ = GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE;
}
@@ -1976,7 +1935,7 @@
*params = mState.unpack.pixelBuffer.id();
break;
case GL_NUM_EXTENSIONS:
- *params = static_cast<GLint>(getNumExtensions());
+ *params = static_cast<GLint>(mExtensionStrings.size());
break;
default:
UNREACHABLE();
@@ -2180,7 +2139,7 @@
return true;
case GL_MAX_SAMPLES_ANGLE:
{
- if (getMaxSupportedSamples() != 0)
+ if (getCaps().extensions.framebufferMultisample)
{
*type = GL_INT;
*numParams = 1;
@@ -2194,7 +2153,7 @@
case GL_PIXEL_PACK_BUFFER_BINDING:
case GL_PIXEL_UNPACK_BUFFER_BINDING:
{
- if (supportsPBOs())
+ if (getCaps().extensions.pixelBufferObject)
{
*type = GL_INT;
*numParams = 1;
@@ -2268,7 +2227,7 @@
}
return true;
case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
- if (!supportsTextureFilterAnisotropy())
+ if (!getCaps().extensions.maxTextureAnisotropy)
{
return false;
}
@@ -3131,6 +3090,11 @@
return mClientVersion;
}
+const Caps &Context::getCaps() const
+{
+ return mRenderer->getCaps();
+}
+
int Context::getMajorShaderModel() const
{
return mMajorShaderModel;
@@ -3188,66 +3152,6 @@
return mRenderer->getMaxRenderTargets();
}
-bool Context::supportsEventQueries() const
-{
- return mSupportsEventQueries;
-}
-
-bool Context::supportsOcclusionQueries() const
-{
- return mSupportsOcclusionQueries;
-}
-
-bool Context::supportsBGRATextures() const
-{
- return mSupportsBGRATextures;
-}
-
-bool Context::supportsDXT1Textures() const
-{
- return mSupportsDXT1Textures;
-}
-
-bool Context::supportsDXT3Textures() const
-{
- return mSupportsDXT3Textures;
-}
-
-bool Context::supportsDXT5Textures() const
-{
- return mSupportsDXT5Textures;
-}
-
-bool Context::supportsFloat32Textures() const
-{
- return mSupportsFloat32Textures;
-}
-
-bool Context::supportsFloat32LinearFilter() const
-{
- return mSupportsFloat32LinearFilter;
-}
-
-bool Context::supportsFloat32RenderableTextures() const
-{
- return mSupportsFloat32RenderableTextures;
-}
-
-bool Context::supportsFloat16Textures() const
-{
- return mSupportsFloat16Textures;
-}
-
-bool Context::supportsFloat16LinearFilter() const
-{
- return mSupportsFloat16LinearFilter;
-}
-
-bool Context::supportsFloat16RenderableTextures() const
-{
- return mSupportsFloat16RenderableTextures;
-}
-
int Context::getMaximumRenderbufferDimension() const
{
return mMaxRenderbufferDimension;
@@ -3293,56 +3197,6 @@
return mMax2DArrayTextureLevel;
}
-bool Context::supportsLuminanceTextures() const
-{
- return mSupportsLuminanceTextures;
-}
-
-bool Context::supportsLuminanceAlphaTextures() const
-{
- return mSupportsLuminanceAlphaTextures;
-}
-
-bool Context::supportsRGTextures() const
-{
- return mSupportsRGTextures;
-}
-
-bool Context::supportsDepthTextures() const
-{
- return mSupportsDepthTextures;
-}
-
-bool Context::supports32bitIndices() const
-{
- return mSupports32bitIndices;
-}
-
-bool Context::supportsNonPower2Texture() const
-{
- return mSupportsNonPower2Texture;
-}
-
-bool Context::supportsInstancing() const
-{
- return mSupportsInstancing;
-}
-
-bool Context::supportsTextureFilterAnisotropy() const
-{
- return mSupportsTextureFilterAnisotropy;
-}
-
-bool Context::supportsPBOs() const
-{
- return mSupportsPBOs;
-}
-
-float Context::getTextureMaxAnisotropy() const
-{
- return mMaxTextureAnisotropy;
-}
-
void Context::getCurrentReadFormatType(GLenum *internalFormat, GLenum *format, GLenum *type)
{
Framebuffer *framebuffer = getReadFramebuffer();
@@ -3692,175 +3546,6 @@
}
}
-// keep list sorted in following order
-// OES extensions
-// EXT extensions
-// Vendor extensions
-void Context::initExtensionString()
-{
- // Do not report extension in GLES 3 contexts for now
- if (mClientVersion == 2)
- {
- // OES extensions
- if (supports32bitIndices())
- {
- mExtensionStringList.push_back("GL_OES_element_index_uint");
- }
-
- mExtensionStringList.push_back("GL_OES_packed_depth_stencil");
- mExtensionStringList.push_back("GL_OES_get_program_binary");
- mExtensionStringList.push_back("GL_OES_rgb8_rgba8");
-
- if (supportsPBOs())
- {
- mExtensionStringList.push_back("NV_pixel_buffer_object");
- mExtensionStringList.push_back("GL_OES_mapbuffer");
- mExtensionStringList.push_back("GL_EXT_map_buffer_range");
- }
-
- if (mRenderer->getDerivativeInstructionSupport())
- {
- mExtensionStringList.push_back("GL_OES_standard_derivatives");
- }
-
- if (supportsFloat16Textures())
- {
- mExtensionStringList.push_back("GL_OES_texture_half_float");
- }
- if (supportsFloat16LinearFilter())
- {
- mExtensionStringList.push_back("GL_OES_texture_half_float_linear");
- }
- if (supportsFloat32Textures())
- {
- mExtensionStringList.push_back("GL_OES_texture_float");
- }
- if (supportsFloat32LinearFilter())
- {
- mExtensionStringList.push_back("GL_OES_texture_float_linear");
- }
-
- if (supportsRGTextures())
- {
- mExtensionStringList.push_back("GL_EXT_texture_rg");
- }
-
- if (supportsNonPower2Texture())
- {
- mExtensionStringList.push_back("GL_OES_texture_npot");
- }
-
- // Multi-vendor (EXT) extensions
- if (supportsOcclusionQueries())
- {
- mExtensionStringList.push_back("GL_EXT_occlusion_query_boolean");
- }
-
- mExtensionStringList.push_back("GL_EXT_read_format_bgra");
- mExtensionStringList.push_back("GL_EXT_robustness");
- mExtensionStringList.push_back("GL_EXT_shader_texture_lod");
-
- if (supportsDXT1Textures())
- {
- mExtensionStringList.push_back("GL_EXT_texture_compression_dxt1");
- }
-
- if (supportsTextureFilterAnisotropy())
- {
- mExtensionStringList.push_back("GL_EXT_texture_filter_anisotropic");
- }
-
- if (supportsBGRATextures())
- {
- mExtensionStringList.push_back("GL_EXT_texture_format_BGRA8888");
- }
-
- if (mRenderer->getMaxRenderTargets() > 1)
- {
- mExtensionStringList.push_back("GL_EXT_draw_buffers");
- }
-
- mExtensionStringList.push_back("GL_EXT_texture_storage");
- mExtensionStringList.push_back("GL_EXT_frag_depth");
- mExtensionStringList.push_back("GL_EXT_blend_minmax");
-
- // ANGLE-specific extensions
- if (supportsDepthTextures())
- {
- mExtensionStringList.push_back("GL_ANGLE_depth_texture");
- }
-
- mExtensionStringList.push_back("GL_ANGLE_framebuffer_blit");
- if (getMaxSupportedSamples() != 0)
- {
- mExtensionStringList.push_back("GL_ANGLE_framebuffer_multisample");
- }
-
- if (supportsInstancing())
- {
- mExtensionStringList.push_back("GL_ANGLE_instanced_arrays");
- }
-
- mExtensionStringList.push_back("GL_ANGLE_pack_reverse_row_order");
-
- if (supportsDXT3Textures())
- {
- mExtensionStringList.push_back("GL_ANGLE_texture_compression_dxt3");
- }
- if (supportsDXT5Textures())
- {
- mExtensionStringList.push_back("GL_ANGLE_texture_compression_dxt5");
- }
-
- mExtensionStringList.push_back("GL_ANGLE_texture_usage");
- mExtensionStringList.push_back("GL_ANGLE_translated_shader_source");
-
- // Other vendor-specific extensions
- if (supportsEventQueries())
- {
- mExtensionStringList.push_back("GL_NV_fence");
- }
- }
-
- if (mClientVersion == 3)
- {
- mExtensionStringList.push_back("GL_EXT_color_buffer_float");
-
- mExtensionStringList.push_back("GL_EXT_read_format_bgra");
-
- if (supportsBGRATextures())
- {
- mExtensionStringList.push_back("GL_EXT_texture_format_BGRA8888");
- }
- }
-
- // Join the extension strings to one long string for use with GetString
- std::stringstream strstr;
- for (unsigned int extensionIndex = 0; extensionIndex < mExtensionStringList.size(); extensionIndex++)
- {
- strstr << mExtensionStringList[extensionIndex];
- strstr << " ";
- }
-
- mCombinedExtensionsString = makeStaticString(strstr.str());
-}
-
-const char *Context::getCombinedExtensionsString() const
-{
- return mCombinedExtensionsString;
-}
-
-const char *Context::getExtensionString(const GLuint index) const
-{
- ASSERT(index < mExtensionStringList.size());
- return mExtensionStringList[index].c_str();
-}
-
-unsigned int Context::getNumExtensions() const
-{
- return mExtensionStringList.size();
-}
-
void Context::initRendererString()
{
std::ostringstream rendererString;
@@ -3868,7 +3553,7 @@
rendererString << mRenderer->getRendererDescription();
rendererString << ")";
- mRendererString = makeStaticString(rendererString.str());
+ mRendererString = MakeStaticString(rendererString.str());
}
const char *Context::getRendererString() const
@@ -3876,6 +3561,34 @@
return mRendererString;
}
+void Context::initExtensionStrings()
+{
+ std::ostringstream combinedStringStream;
+
+ std::vector<std::string> extensions = getCaps().extensions.getStrings(mClientVersion);
+ for (size_t i = 0; i < extensions.size(); i++)
+ {
+ combinedStringStream << extensions[i] << " ";
+ mExtensionStrings.push_back(MakeStaticString(extensions[i]));
+ }
+ mExtensionString = MakeStaticString(combinedStringStream.str());
+}
+
+const char *Context::getExtensionString() const
+{
+ return mExtensionString;
+}
+
+const char *Context::getExtensionString(size_t idx) const
+{
+ return mExtensionStrings[idx];
+}
+
+size_t Context::getExtensionStringCount() const
+{
+ return mExtensionStrings.size();
+}
+
size_t Context::getBoundFramebufferTextureSerials(FramebufferTextureSerialArray *outSerialArray)
{
size_t serialCount = 0;