Source code

Revision control

Copy as Markdown

Other Tools

From 9c118e50eb2db17876633d758411c69852c808ab Mon Sep 17 00:00:00 2001
From: Dzmitry Malyshau <dmalyshau@mozilla.com>
Date: Thu, 5 Dec 2019 13:02:14 -0500
Subject: [PATCH] Restrict the slow texture upload workaround to 128bit
formats. (#21)
The workaround is slow for having a CPU-visible mirror of the texture, but that mirror is not properly recycled with regards to GPU usage, thus causing a CPU stall on update.
Original reports were related to WebRender vertex texture updates that are RGBA32F and RGBA32U formats. Limiting the workaround to these formats would allow the affected platforms to upload regular texture data faster without stalls.
Co-authored-by: Erich Gubler <erichdongubler@gmail.com>
---
.../platform/autogen/FeaturesD3D_autogen.h | 6 ++++++
include/platform/d3d_features.json | 7 +++++++
src/libANGLE/renderer/d3d/TextureD3D.cpp | 21 +++++++++++++++++--
src/libANGLE/renderer/d3d/TextureD3D.h | 1 +
.../renderer/d3d/d3d11/renderer11_utils.cpp | 6 ++++--
util/autogen/angle_features_autogen.cpp | 1 +
util/autogen/angle_features_autogen.h | 1 +
7 files changed, 39 insertions(+), 4 deletions(-)
diff --git a/include/platform/autogen/FeaturesD3D_autogen.h b/include/platform/autogen/FeaturesD3D_autogen.h
index 8bd269c..5d38b6e 100644
--- a/include/platform/autogen/FeaturesD3D_autogen.h
+++ b/include/platform/autogen/FeaturesD3D_autogen.h
@@ -32,6 +32,12 @@ struct FeaturesD3D : FeatureSetBase
&members,
};
+ FeatureInfo setDataFasterThanImageUploadOn128bitFormats = {
+ "setDataFasterThanImageUploadOn128bitFormats",
+ FeatureCategory::D3DWorkarounds,
+ &members,
+ };
+
FeatureInfo depthStencilBlitExtraCopy = {
"depthStencilBlitExtraCopy",
FeatureCategory::D3DWorkarounds,
diff --git a/include/platform/d3d_features.json b/include/platform/d3d_features.json
index c718ced..0997289 100644
--- a/include/platform/d3d_features.json
+++ b/include/platform/d3d_features.json
@@ -21,6 +21,13 @@
"Set data faster than image upload"
]
},
+ {
+ "name": "set_data_faster_than_image_upload_on_128bit_formats",
+ "category": "Workarounds",
+ "description": [
+ "Set data faster than image upload on 128bit formats"
+ ]
+ },
{
"name": "depth_stencil_blit_extra_copy",
"category": "Workarounds",
diff --git a/src/libANGLE/renderer/d3d/TextureD3D.cpp b/src/libANGLE/renderer/d3d/TextureD3D.cpp
index caffb44..a0e6708 100644
--- a/src/libANGLE/renderer/d3d/TextureD3D.cpp
+++ b/src/libANGLE/renderer/d3d/TextureD3D.cpp
@@ -281,13 +281,30 @@ angle::Result TextureD3D::setStorageExternalMemory(const gl::Context *context,
return angle::Result::Continue;
}
-bool TextureD3D::shouldUseSetData(const ImageD3D *image) const
+bool TextureD3D::couldUseSetData() const
{
if (!mRenderer->getFeatures().setDataFasterThanImageUpload.enabled)
{
return false;
}
+ if (!mRenderer->getFeatures().setDataFasterThanImageUploadOn128bitFormats.enabled)
+ {
+ gl::InternalFormat internalFormat =
+ gl::GetSizedInternalFormatInfo(getBaseLevelInternalFormat());
+ return internalFormat.pixelBytes < 16;
+ }
+
+ return true;
+}
+
+bool TextureD3D::shouldUseSetData(const ImageD3D *image) const
+{
+ if (!couldUseSetData())
+ {
+ return false;
+ }
+
if (image->isDirty())
{
return false;
@@ -569,7 +586,7 @@ angle::Result TextureD3D::generateMipmapUsingImages(const gl::Context *context,
}
ANGLE_TRY(ensureRenderTarget(context));
}
- else if (mRenderer->getFeatures().setDataFasterThanImageUpload.enabled && mTexStorage)
+ else if (couldUseSetData() && mTexStorage)
{
// When making mipmaps with the setData workaround enabled, the texture storage has
// the image data already. For non-render-target storage, we have to pull it out into
diff --git a/src/libANGLE/renderer/d3d/TextureD3D.h b/src/libANGLE/renderer/d3d/TextureD3D.h
index ee2dbe6..fe25217 100644
--- a/src/libANGLE/renderer/d3d/TextureD3D.h
+++ b/src/libANGLE/renderer/d3d/TextureD3D.h
@@ -227,6 +227,7 @@ class TextureD3D : public TextureImpl, public angle::ObserverInterface
virtual angle::Result updateStorage(const gl::Context *context) = 0;
+ bool couldUseSetData() const;
bool shouldUseSetData(const ImageD3D *image) const;
angle::Result generateMipmapUsingImages(const gl::Context *context, const GLuint maxLevel);
diff --git a/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.cpp b/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.cpp
index d250ea3..d0be62f 100644
--- a/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.cpp
+++ b/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.cpp
@@ -2188,8 +2188,10 @@ void InitializeFeatures(const Renderer11DeviceCaps &deviceCaps,
isIntel && capsVersion >= angle::VersionTriple(16, 0, 0) &&
capsVersion < angle::VersionTriple(16, 4815, 0));
- // Haswell/Ivybridge drivers occasionally corrupt (small?) (vertex?) texture data uploads.
- ANGLE_FEATURE_CONDITION(features, setDataFasterThanImageUpload,
+ // Haswell drivers occasionally corrupt (small?) (vertex?) texture data uploads for 128bit
+ // formats.
+ ANGLE_FEATURE_CONDITION(features, setDataFasterThanImageUpload, true);
+ ANGLE_FEATURE_CONDITION(features, setDataFasterThanImageUploadOn128bitFormats,
!(isIvyBridge || isBroadwell || isHaswell));
ANGLE_FEATURE_CONDITION(features, disableB5G6R5Support,
diff --git a/util/autogen/angle_features_autogen.cpp b/util/autogen/angle_features_autogen.cpp
index ed34de9..2e0c9e2 100644
--- a/util/autogen/angle_features_autogen.cpp
+++ b/util/autogen/angle_features_autogen.cpp
@@ -322,6 +322,7 @@ constexpr PackedEnumMap<Feature, const char *> kFeatureNames = {{
{Feature::ScalarizeVecAndMatConstructorArgs, "scalarizeVecAndMatConstructorArgs"},
{Feature::SelectViewInGeometryShader, "selectViewInGeometryShader"},
{Feature::SetDataFasterThanImageUpload, "setDataFasterThanImageUpload"},
+ {Feature::SetDataFasterThanImageUploadOn128bitFormats, "setDataFasterThanImageUploadOn128bitFormats"},
{Feature::SetNeedInitOnInvalidation, "setNeedInitOnInvalidation"},
{Feature::SetPrimitiveRestartFixedIndexForDrawArrays, "setPrimitiveRestartFixedIndexForDrawArrays"},
{Feature::SetZeroLevelBeforeGenerateMipmap, "setZeroLevelBeforeGenerateMipmap"},
diff --git a/util/autogen/angle_features_autogen.h b/util/autogen/angle_features_autogen.h
index 5d63579..68724b7 100644
--- a/util/autogen/angle_features_autogen.h
+++ b/util/autogen/angle_features_autogen.h
@@ -322,6 +322,7 @@ enum class Feature
ScalarizeVecAndMatConstructorArgs,
SelectViewInGeometryShader,
SetDataFasterThanImageUpload,
+ SetDataFasterThanImageUploadOn128bitFormats,
SetNeedInitOnInvalidation,
SetPrimitiveRestartFixedIndexForDrawArrays,
SetZeroLevelBeforeGenerateMipmap,
--
2.43.0