Commit d04a5593 by Jamie Madill Committed by Commit Bot

Vulkan: Add RenderPass count test.

Bug: angleproject:4911 Change-Id: I4c4e187b6b048118ce1231ae8924340ad382c43f Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2331741Reviewed-by: 's avatarCharlie Lao <cclao@google.com> Reviewed-by: 's avatarShahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>
parent dae77893
...@@ -4432,10 +4432,10 @@ angle::Result ContextVk::endRenderPass() ...@@ -4432,10 +4432,10 @@ angle::Result ContextVk::endRenderPass()
onRenderPassFinished(); onRenderPassFinished();
mRenderPassCounter++;
if (mGpuEventsEnabled) if (mGpuEventsEnabled)
{ {
mRenderPassCounter++;
EventName eventName = GetTraceEventName("RP", mRenderPassCounter); EventName eventName = GetTraceEventName("RP", mRenderPassCounter);
ANGLE_TRY(traceGpuEvent(&mOutsideRenderPassCommands->getCommandBuffer(), ANGLE_TRY(traceGpuEvent(&mOutsideRenderPassCommands->getCommandBuffer(),
TRACE_EVENT_PHASE_BEGIN, eventName)); TRACE_EVENT_PHASE_BEGIN, eventName));
......
...@@ -597,6 +597,8 @@ class ContextVk : public ContextImpl, public vk::Context ...@@ -597,6 +597,8 @@ class ContextVk : public ContextImpl, public vk::Context
vk::BufferHelper &getEmptyBuffer() { return mEmptyBuffer; } vk::BufferHelper &getEmptyBuffer() { return mEmptyBuffer; }
vk::DynamicBuffer *getStagingBufferStorage() { return &mStagingBufferStorage; } vk::DynamicBuffer *getStagingBufferStorage() { return &mStagingBufferStorage; }
uint32_t getRenderPassCounter() const { return mRenderPassCounter; }
private: private:
// Dirty bits. // Dirty bits.
enum DirtyBitType : size_t enum DirtyBitType : size_t
......
...@@ -20,5 +20,6 @@ angle_white_box_tests_win_sources = [ ...@@ -20,5 +20,6 @@ angle_white_box_tests_win_sources = [
angle_white_box_tests_vulkan_sources = [ angle_white_box_tests_vulkan_sources = [
"gl_tests/VulkanFormatTablesTest.cpp", "gl_tests/VulkanFormatTablesTest.cpp",
"gl_tests/VulkanFramebufferTest.cpp", "gl_tests/VulkanFramebufferTest.cpp",
"gl_tests/VulkanRenderPassCountTest.cpp",
"gl_tests/VulkanUniformUpdatesTest.cpp", "gl_tests/VulkanUniformUpdatesTest.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.
//
// VulkanRenderPassCountTest:
// Validates that specific GL calls don't break RenderPasses.
#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 "test_utils/gl_raii.h"
using namespace angle;
namespace
{
class VulkanRenderPassCountTest : 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);
}
};
// Tests that texture updates to unused textures don't break the RP.
TEST_P(VulkanRenderPassCountTest, NewTextureDoesNotBreakRenderPass)
{
// TODO(jmadill): Fix test. http://anglebug.com/4911
ANGLE_SKIP_TEST_IF(IsVulkan());
rx::ContextVk *contextVk = hackANGLE();
GLColor kInitialData[4] = {GLColor::red, GLColor::blue, GLColor::green, GLColor::yellow};
// Step 1: Set up a simple 2D Texture rendering loop.
GLTexture texture;
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, kInitialData);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
auto quadVerts = GetQuadVertices();
GLBuffer vertexBuffer;
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, quadVerts.size() * sizeof(quadVerts[0]), quadVerts.data(),
GL_STATIC_DRAW);
ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Texture2D(), essl1_shaders::fs::Texture2D());
glUseProgram(program);
GLint posLoc = glGetAttribLocation(program, essl1_shaders::PositionAttrib());
ASSERT_NE(-1, posLoc);
glVertexAttribPointer(posLoc, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
glEnableVertexAttribArray(posLoc);
ASSERT_GL_NO_ERROR();
glDrawArrays(GL_TRIANGLES, 0, 6);
ASSERT_GL_NO_ERROR();
uint32_t expectedRenderPassCount = contextVk->getRenderPassCounter();
// Step 2: Introduce a new 2D Texture with the same Program and Framebuffer.
GLTexture newTexture;
glBindTexture(GL_TEXTURE_2D, newTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, kInitialData);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glDrawArrays(GL_TRIANGLES, 0, 6);
ASSERT_GL_NO_ERROR();
uint32_t actualRenderPassCount = contextVk->getRenderPassCounter();
EXPECT_EQ(expectedRenderPassCount, actualRenderPassCount);
}
ANGLE_INSTANTIATE_TEST(VulkanRenderPassCountTest, ES2_VULKAN(), ES3_VULKAN());
} // anonymous namespace
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment