Edit

kc3-lang/angle/src/tests/gl_tests/VulkanFramebufferTest.cpp

Branch :

  • Show log

    Commit

  • Author : Shahbaz Youssefi
    Date : 2020-06-04 15:36:17
    Hash : 6fad384b
    Message : Vulkan: Add test for RT created from mip-incomplete texture The Vulkan backend creates an image with 3 mips, while it should only create one with a single mip. Bug: angleproject:4686 Change-Id: Ide7f9612c9440bfb9d9650637f6a1ad42be61208 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2230797 Reviewed-by: Tim Van Patten <timvp@google.com> Reviewed-by: Jamie Madill <jmadill@chromium.org> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>

  • src/tests/gl_tests/VulkanFramebufferTest.cpp
  • //
    // 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