From 00c0b315b63acc6650db89b14366b8578cdfb205 Mon Sep 17 00:00:00 2001 From: Pedro Pontes Date: Wed, 15 Dec 2021 18:18:30 +0100 Subject: [PATCH] chore: cherry-pick 05e69c75905f from angle --- patches/angle/.patches | 1 + patches/angle/cherry-pick-05e69c75905f.patch | 119 +++++++++++++++++++ patches/config.json | 4 +- 3 files changed, 123 insertions(+), 1 deletion(-) create mode 100644 patches/angle/.patches create mode 100644 patches/angle/cherry-pick-05e69c75905f.patch diff --git a/patches/angle/.patches b/patches/angle/.patches new file mode 100644 index 0000000000000..30489047316a9 --- /dev/null +++ b/patches/angle/.patches @@ -0,0 +1 @@ +cherry-pick-05e69c75905f.patch diff --git a/patches/angle/cherry-pick-05e69c75905f.patch b/patches/angle/cherry-pick-05e69c75905f.patch new file mode 100644 index 0000000000000..8ae8d8394f8ca --- /dev/null +++ b/patches/angle/cherry-pick-05e69c75905f.patch @@ -0,0 +1,119 @@ +From 05e69c75905f4b9109f279ae89d2fbf574fdc442 Mon Sep 17 00:00:00 2001 +From: Lingfeng Yang +Date: Wed, 01 Dec 2021 18:16:14 -0800 +Subject: [PATCH] M96: Vulkan: remove staged updates on storage set + +Previously we would allow staged updates to bigger versions of a texture +to go through even if the texture was redefined via glTexStorage*. + +Bug: chromium:1262080 +Change-Id: I9d861fed68d4a1fdcd0777b97caf729cc74c595e +Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3312718 +Reviewed-by: Charlie Lao +Reviewed-by: Jamie Madill +Reviewed-by: Shahbaz Youssefi +Commit-Queue: Lingfeng Yang +(cherry picked from commit 929c8ed4e8c3912cf027d843e7a2af47b21e5612) +Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3328001 +--- + +diff --git a/src/libANGLE/renderer/vulkan/TextureVk.cpp b/src/libANGLE/renderer/vulkan/TextureVk.cpp +index 7387a14..6050600 100644 +--- a/src/libANGLE/renderer/vulkan/TextureVk.cpp ++++ b/src/libANGLE/renderer/vulkan/TextureVk.cpp +@@ -1272,6 +1272,10 @@ + { + releaseAndDeleteImageAndViews(contextVk); + } ++ else if (mImage) ++ { ++ mImage->releaseStagingBuffer(contextVk->getRenderer()); ++ } + + const vk::Format &format = renderer->getFormat(internalformat); + ANGLE_TRY(ensureImageAllocated(contextVk, format)); +diff --git a/src/tests/gl_tests/TextureTest.cpp b/src/tests/gl_tests/TextureTest.cpp +index 79baa98..633d865 100644 +--- a/src/tests/gl_tests/TextureTest.cpp ++++ b/src/tests/gl_tests/TextureTest.cpp +@@ -9886,6 +9886,73 @@ + glUnmapBuffer(GL_SHADER_STORAGE_BUFFER); + } + ++class TextureChangeStorageUploadTest : public ANGLETest ++{ ++ protected: ++ TextureChangeStorageUploadTest() ++ { ++ setWindowWidth(256); ++ setWindowHeight(256); ++ setConfigRedBits(8); ++ setConfigGreenBits(8); ++ setConfigBlueBits(8); ++ setConfigAlphaBits(8); ++ } ++ ++ void testSetUp() override ++ { ++ mProgram = CompileProgram(essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor()); ++ if (mProgram == 0) ++ { ++ FAIL() << "shader compilation failed."; ++ } ++ ++ mColorLocation = glGetUniformLocation(mProgram, essl1_shaders::ColorUniform()); ++ ++ glUseProgram(mProgram); ++ ++ glClearColor(0, 0, 0, 0); ++ glClearDepthf(0.0); ++ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); ++ ++ glEnable(GL_BLEND); ++ glDisable(GL_DEPTH_TEST); ++ ++ glGenTextures(1, &mTexture); ++ ASSERT_GL_NO_ERROR(); ++ } ++ ++ void testTearDown() override ++ { ++ glDeleteTextures(1, &mTexture); ++ glDeleteProgram(mProgram); ++ } ++ ++ GLuint mProgram; ++ GLint mColorLocation; ++ GLuint mTexture; ++}; ++ ++// Verify that respecifying storage and re-uploading doesn't crash. ++TEST_P(TextureChangeStorageUploadTest, Basic) ++{ ++ constexpr int kImageSize = 8; // 4 doesn't trip ASAN ++ constexpr int kSmallerImageSize = kImageSize / 2; ++ EXPECT_GT(kImageSize, kSmallerImageSize); ++ EXPECT_GT(kSmallerImageSize / 2, 0); ++ ++ std::array kColor; ++ ++ glBindTexture(GL_TEXTURE_2D, mTexture); ++ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, kImageSize, kImageSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, ++ kColor.data()); ++ glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kSmallerImageSize, kSmallerImageSize); ++ // need partial update to sidestep optimizations that remove the full upload ++ glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kSmallerImageSize / 2, kSmallerImageSize / 2, GL_RGBA, ++ GL_UNSIGNED_BYTE, kColor.data()); ++ EXPECT_GL_NO_ERROR(); ++} ++ + // Use this to select which configurations (e.g. which renderer, which GLES major version) these + // tests should be run against. + #define ES2_EMULATE_COPY_TEX_IMAGE() \ +@@ -9999,4 +10066,6 @@ + GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(CopyImageTestES31); + ANGLE_INSTANTIATE_TEST_ES31_AND(CopyImageTestES31, WithDirectSPIRVGeneration(ES31_VULKAN())); + ++ANGLE_INSTANTIATE_TEST_ES3(TextureChangeStorageUploadTest); ++ + } // anonymous namespace diff --git a/patches/config.json b/patches/config.json index e9a2297ba10f2..3b59b7b5108b7 100644 --- a/patches/config.json +++ b/patches/config.json @@ -13,5 +13,7 @@ "src/electron/patches/Mantle": "src/third_party/squirrel.mac/vendor/Mantle", - "src/electron/patches/ReactiveObjC": "src/third_party/squirrel.mac/vendor/ReactiveObjC" + "src/electron/patches/ReactiveObjC": "src/third_party/squirrel.mac/vendor/ReactiveObjC", + + "src/electron/patches/angle": "src/third_party/angle" }