Fix dangling pointer in IndirectDrawMetadata
In `IndirectDrawMetadata` (used in `RenderEncoderBase`) all the
`IndirectDraw` structs must be cleared before the `EncodingContext`
object is destroyed (in `RenderPassEncoder` and `RenderBundleEncoder`).
Otherwise any `IndirectDraw.cmd` will become a dangling pointer.
Bug: dawn:2349
Change-Id: I020e516e0d93f055f406f6ca10105269534c88d7
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/179842
Commit-Queue: Jiawei Shao <jiawei.shao@intel.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Austin Eng <enga@chromium.org>
diff --git a/src/dawn/native/IndirectDrawMetadata.cpp b/src/dawn/native/IndirectDrawMetadata.cpp
index 36ff8dc..1ef6980 100644
--- a/src/dawn/native/IndirectDrawMetadata.cpp
+++ b/src/dawn/native/IndirectDrawMetadata.cpp
@@ -233,6 +233,10 @@
it->second.AddIndirectDraw(mMaxDrawCallsPerBatch, mMaxBatchOffsetRange, draw);
}
+void IndirectDrawMetadata::ClearIndexedIndirectBufferValidationInfo() {
+ mIndexedIndirectBufferValidationInfo.clear();
+}
+
bool IndirectDrawMetadata::IndexedIndirectConfig::operator<(
const IndexedIndirectConfig& other) const {
return std::tie(inputIndirectBufferPtr, duplicateBaseVertexInstance, drawType) <
diff --git a/src/dawn/native/IndirectDrawMetadata.h b/src/dawn/native/IndirectDrawMetadata.h
index 6046c25..d86cb9b 100644
--- a/src/dawn/native/IndirectDrawMetadata.h
+++ b/src/dawn/native/IndirectDrawMetadata.h
@@ -63,8 +63,7 @@
// This is a pointer to the command that should be populated with the validated
// indirect scratch buffer. It is only valid up until the encoded command buffer
// is submitted.
- // TODO(https://crbug.com/dawn/2349): Investigate DanglingUntriaged in dawn/native.
- raw_ptr<DrawIndirectCmd, DanglingUntriaged> cmd;
+ raw_ptr<DrawIndirectCmd> cmd;
};
struct IndirectValidationBatch {
@@ -150,6 +149,8 @@
bool duplicateBaseVertexInstance,
DrawIndirectCmd* cmd);
+ void ClearIndexedIndirectBufferValidationInfo();
+
private:
IndexedIndirectBufferValidationInfoMap mIndexedIndirectBufferValidationInfo;
absl::flat_hash_set<RenderBundleBase*> mAddedBundles;
diff --git a/src/dawn/native/RenderBundle.cpp b/src/dawn/native/RenderBundle.cpp
index 7b70502..5e59e97 100644
--- a/src/dawn/native/RenderBundle.cpp
+++ b/src/dawn/native/RenderBundle.cpp
@@ -58,6 +58,7 @@
}
void RenderBundleBase::DestroyImpl() {
+ mIndirectDrawMetadata.ClearIndexedIndirectBufferValidationInfo();
FreeCommands(&mCommands);
// Remove reference to the attachment state so that we don't have lingering references to
diff --git a/src/dawn/native/RenderBundleEncoder.cpp b/src/dawn/native/RenderBundleEncoder.cpp
index cd203e0..ddc9026 100644
--- a/src/dawn/native/RenderBundleEncoder.cpp
+++ b/src/dawn/native/RenderBundleEncoder.cpp
@@ -123,6 +123,7 @@
}
void RenderBundleEncoder::DestroyImpl() {
+ mIndirectDrawMetadata.ClearIndexedIndirectBufferValidationInfo();
mCommandBufferState.End();
RenderEncoderBase::DestroyImpl();
mBundleEncodingContext.Destroy();
diff --git a/src/dawn/native/RenderPassEncoder.cpp b/src/dawn/native/RenderPassEncoder.cpp
index 2571a04..5740c9a 100644
--- a/src/dawn/native/RenderPassEncoder.cpp
+++ b/src/dawn/native/RenderPassEncoder.cpp
@@ -133,6 +133,7 @@
}
void RenderPassEncoder::DestroyImpl() {
+ mIndirectDrawMetadata.ClearIndexedIndirectBufferValidationInfo();
mCommandBufferState.End();
RenderEncoderBase::DestroyImpl();