-
Notifications
You must be signed in to change notification settings - Fork 15k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
chore: [19-x-y] cherry-pick 1121a459f094 from angle
- Loading branch information
Showing
2 changed files
with
124 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
cherry-pick-1121a459f094.patch |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,123 @@ | ||
From 1121a459f094cd85e8b1b4dff0adcac5ccf0a5d2 Mon Sep 17 00:00:00 2001 | ||
From: Shahbaz Youssefi <syoussefi@chromium.org> | ||
Date: Tue, 26 Jul 2022 21:07:04 -0400 | ||
Subject: [PATCH] M104: Vulkan: Fix xfb buffer redefine to smaller size | ||
|
||
In 89e11878b275b15735eaf273ababfa6fd43a2e3d, a use-after-free bug was | ||
fixed where glBufferData redefined a buffer, leading to a change in | ||
storage. This was only tested for the case where the new buffer was | ||
larger than the old buffer. | ||
|
||
When the new buffer is smaller however, another issue remains where the | ||
buffer size as cached by the transform feedback object used the old | ||
object's size. This is worked around in this change, with a fix for the | ||
real issue (that the buffer state is updated after calling into the | ||
backend instead of before) coming up. | ||
|
||
Bug: chromium:1345042 | ||
Change-Id: I7bafd51b6203a419e5ef123da26b9e1eaf079bf1 | ||
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3812556 | ||
Reviewed-by: Ian Elliott <ianelliott@google.com> | ||
--- | ||
|
||
diff --git a/src/libANGLE/renderer/vulkan/BufferVk.cpp b/src/libANGLE/renderer/vulkan/BufferVk.cpp | ||
index 158d723..5a6e977 100644 | ||
--- a/src/libANGLE/renderer/vulkan/BufferVk.cpp | ||
+++ b/src/libANGLE/renderer/vulkan/BufferVk.cpp | ||
@@ -809,6 +809,7 @@ | ||
} | ||
return angle::Result::Continue; | ||
} | ||
+ | ||
angle::Result BufferVk::directUpdate(ContextVk *contextVk, | ||
const uint8_t *data, | ||
size_t size, | ||
diff --git a/src/libANGLE/renderer/vulkan/ContextVk.cpp b/src/libANGLE/renderer/vulkan/ContextVk.cpp | ||
index b69b80f..f1c05ee 100644 | ||
--- a/src/libANGLE/renderer/vulkan/ContextVk.cpp | ||
+++ b/src/libANGLE/renderer/vulkan/ContextVk.cpp | ||
@@ -763,7 +763,8 @@ | ||
DIRTY_BIT_DESCRIPTOR_SETS, | ||
DIRTY_BIT_DRIVER_UNIFORMS_BINDING, | ||
}; | ||
- if (getFeatures().supportsTransformFeedbackExtension.enabled) | ||
+ if (getFeatures().supportsTransformFeedbackExtension.enabled || | ||
+ getFeatures().emulateTransformFeedback.enabled) | ||
{ | ||
mNewGraphicsCommandBufferDirtyBits.set(DIRTY_BIT_TRANSFORM_FEEDBACK_BUFFERS); | ||
} | ||
diff --git a/src/libANGLE/renderer/vulkan/TransformFeedbackVk.cpp b/src/libANGLE/renderer/vulkan/TransformFeedbackVk.cpp | ||
index bd51bcf..a126706 100644 | ||
--- a/src/libANGLE/renderer/vulkan/TransformFeedbackVk.cpp | ||
+++ b/src/libANGLE/renderer/vulkan/TransformFeedbackVk.cpp | ||
@@ -271,7 +271,8 @@ | ||
ASSERT(bufferVk->isBufferValid()); | ||
mBufferHelpers[index] = &bufferVk->getBuffer(); | ||
mBufferOffsets[index] = binding.getOffset() + mBufferHelpers[index]->getOffset(); | ||
- mBufferSizes[index] = gl::GetBoundBufferAvailableSize(binding); | ||
+ mBufferSizes[index] = std::min<VkDeviceSize>(gl::GetBoundBufferAvailableSize(binding), | ||
+ mBufferHelpers[index]->getSize()); | ||
mBufferObserverBindings[index].bind(bufferVk); | ||
mBufferHandles[index] = mBufferHelpers[index]->getBuffer().getHandle(); | ||
} | ||
diff --git a/src/tests/angle_end2end_tests_expectations.txt b/src/tests/angle_end2end_tests_expectations.txt | ||
index 9dbd129..0c7dae3 100644 | ||
--- a/src/tests/angle_end2end_tests_expectations.txt | ||
+++ b/src/tests/angle_end2end_tests_expectations.txt | ||
@@ -183,6 +183,7 @@ | ||
7206 MAC NVIDIA OPENGL : DrawBuffersTest.BlendWithGaps/ES3_OpenGL = SKIP | ||
7293 MAC INTEL OPENGL : StateChangeTestES3.PolygonOffset/* = SKIP | ||
7314 MAC NVIDIA OPENGL : DepthStencilFormatsTestES3.DrawWithLargeViewport/ES3_OpenGL = SKIP | ||
+7530 MAC NVIDIA OPENGL : TransformFeedbackTest.RenderOnceChangeXfbBufferRenderAgain/* = SKIP | ||
|
||
// BlitFramebufferTest.ScissoredMultisampleStencil failures | ||
3496 MAC INTEL OPENGL : BlitFramebufferTest.ScissoredMultisampleStencil/* = SKIP | ||
diff --git a/src/tests/gl_tests/TransformFeedbackTest.cpp b/src/tests/gl_tests/TransformFeedbackTest.cpp | ||
index aefb2ef..0d0af05 100644 | ||
--- a/src/tests/gl_tests/TransformFeedbackTest.cpp | ||
+++ b/src/tests/gl_tests/TransformFeedbackTest.cpp | ||
@@ -403,7 +403,6 @@ | ||
// Test that transform feedback can cover multiple render passes. | ||
TEST_P(TransformFeedbackTest, SpanMultipleRenderPasses) | ||
{ | ||
- | ||
// TODO(anglebug.com/4533) This fails after the upgrade to the 26.20.100.7870 driver. | ||
ANGLE_SKIP_TEST_IF(IsWindows() && IsIntel() && IsVulkan()); | ||
|
||
@@ -4290,6 +4289,36 @@ | ||
EXPECT_GL_ERROR(GL_INVALID_OPERATION); | ||
} | ||
|
||
+// Test that redefining the transform feedback buffer and starting a new render pass works. | ||
+TEST_P(TransformFeedbackTest, RenderOnceChangeXfbBufferRenderAgain) | ||
+{ | ||
+ std::vector<std::string> tfVaryings; | ||
+ tfVaryings.push_back("gl_Position"); | ||
+ ANGLE_GL_PROGRAM_TRANSFORM_FEEDBACK(drawColor, essl3_shaders::vs::Simple(), | ||
+ essl3_shaders::fs::Red(), tfVaryings, | ||
+ GL_INTERLEAVED_ATTRIBS); | ||
+ | ||
+ GLBuffer buffer; | ||
+ glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buffer); | ||
+ glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 10'000'000, nullptr, GL_DYNAMIC_READ); | ||
+ | ||
+ glUseProgram(drawColor); | ||
+ glBeginTransformFeedback(GL_TRIANGLES); | ||
+ | ||
+ drawQuad(drawColor, essl3_shaders::PositionAttrib(), 0.5f); | ||
+ | ||
+ // Break the render pass | ||
+ EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red); | ||
+ | ||
+ // Redefine the transform feedback buffer | ||
+ glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 40, nullptr, GL_DYNAMIC_READ); | ||
+ | ||
+ // Start a new render pass | ||
+ drawQuad(drawColor, essl3_shaders::PositionAttrib(), 0.5f); | ||
+ | ||
+ glEndTransformFeedback(); | ||
+} | ||
+ | ||
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(TransformFeedbackTest); | ||
ANGLE_INSTANTIATE_TEST_ES3_AND(TransformFeedbackTest, | ||
ES3_VULKAN() |