Revert "Revert "Merge remote-tracking branch 'aosp/upstream-mirror' into rollangle""
This reverts commit c5f24132a2359a1785f31729a185caf04a1f4127.
Reason for revert: Fix landed in ANGLE
Change-Id: I14b56544a09bbfff5d1e1eebbe3d08b07cb3a3b5
diff --git a/src/tests/gl_tests/VulkanFramebufferTest.cpp b/src/tests/gl_tests/VulkanFramebufferTest.cpp
new file mode 100644
index 0000000..d44405d
--- /dev/null
+++ b/src/tests/gl_tests/VulkanFramebufferTest.cpp
@@ -0,0 +1,83 @@
+//
+// Copyright 2020 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// VulkanFramebufferTest:
+// Tests to validate our Vulkan framebuffer image allocation.
+//
+
+#include "test_utils/ANGLETest.h"
+#include "test_utils/angle_test_instantiate.h"
+// 'None' is defined as 'struct None {};' in
+// third_party/googletest/src/googletest/include/gtest/internal/gtest-type-util.h.
+// But 'None' is also defined as a numeric constant 0L in <X11/X.h>.
+// So we need to include ANGLETest.h first to avoid this conflict.
+
+#include "libANGLE/Context.h"
+#include "libANGLE/angletypes.h"
+#include "libANGLE/renderer/vulkan/ContextVk.h"
+#include "libANGLE/renderer/vulkan/ProgramVk.h"
+#include "libANGLE/renderer/vulkan/TextureVk.h"
+#include "test_utils/gl_raii.h"
+#include "util/EGLWindow.h"
+#include "util/shader_utils.h"
+
+using namespace angle;
+
+namespace
+{
+
+class VulkanFramebufferTest : public ANGLETest
+{
+ protected:
+ rx::ContextVk *hackANGLE() const
+ {
+ // Hack the angle!
+ const gl::Context *context = static_cast<gl::Context *>(getEGLWindow()->getContext());
+ return rx::GetImplAs<rx::ContextVk>(context);
+ }
+
+ rx::TextureVk *hackTexture(GLuint handle) const
+ {
+ // Hack the angle!
+ const gl::Context *context = static_cast<gl::Context *>(getEGLWindow()->getContext());
+ const gl::Texture *texture = context->getTexture({handle});
+ return rx::vk::GetImpl(texture);
+ }
+};
+
+// Test that framebuffer can be created from a mip-incomplete texture, and that its allocation only
+// includes the framebuffer's attached mip.
+TEST_P(VulkanFramebufferTest, TextureAttachmentMipIncomplete)
+{
+ GLFramebuffer framebuffer;
+ glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
+
+ GLTexture texture;
+ glBindTexture(GL_TEXTURE_2D, texture);
+
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 100, 100, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
+ glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
+ glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA8, 5, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
+
+ // Set framebuffer to mip 0. Framebuffer should be complete, and make the texture allocate
+ // an image of only 1 level.
+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
+ EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
+
+ glClearColor(0, 0, 0, 1.0f);
+ glClear(GL_COLOR_BUFFER_BIT);
+ EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
+
+ // http://anglebug.com/4686: The Vulkan backend is allocating three mips of sizes 100x100,
+ // 50x50 and 25x25 instead of one mip of size 100x100.
+ ANGLE_SKIP_TEST_IF(IsVulkan());
+
+ rx::TextureVk *textureVk = hackTexture(texture);
+ EXPECT_EQ(textureVk->getImage().getLevelCount(), 1u);
+}
+
+ANGLE_INSTANTIATE_TEST(VulkanFramebufferTest, ES3_VULKAN());
+
+} // anonymous namespace