Hash :
c51c59c7
Author :
Date :
2021-06-15T13:43:50
Test for missing index dirty bit bug
Bug fixed in
https://chromium-review.googlesource.com/c/angle/angle/+/2961690
triggers only in the following situation:
- Context 1: draw indexed -> clears index dirty bit
- Context 1: change state in such a way that closing the render pass is
deferred to dirty bit handling (for example, change FBO)
- Context 1: issue a non-indexed draw call. This closes the render pass
and starts a new one -> bug was that the index dirty bit
was not set
- Context 2: flush the command buffer, which submits the previous render
pass of context 1 (which contained vkCmdBindIndexBuffer).
The primary command buffer is now reset.
- Context 1: issue an indexed draw call. Since the index dirty bit was
not set, this was missing the vkCmdBindIndexBuffer call.
This change implements a regression test based on the above scenario.
Bug: chromium:1183068
Bug: chromium:1190493
Change-Id: I729bd48cd6df2621ca763f6231023a52ac08b0fb
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2963836
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Charlie Lao <cclao@google.com>
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
//
// Copyright 2013 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.
//
#include "gtest/gtest.h"
#include "test_utils/runner/TestSuite.h"
#include "util/OSWindow.h"
void ANGLEProcessTestArgs(int *argc, char *argv[]);
// Register* functions handle setting up special tests that need complex parameterization.
// GoogleTest relies heavily on static initialization to register test functions. This can
// cause all sorts of issues if the right variables aren't initialized in the right order.
// This register function needs to be called explicitly after static initialization and
// before the test launcher starts. This is a safer and generally better way to initialize
// tests. It's also more similar to how the dEQP Test harness works. In the future we should
// likely specialize more register functions more like dEQP instead of relying on static init.
void RegisterContextCompatibilityTests();
// If we ever move to a text-based expectations format, we should move this list in that file.
namespace
{
const char *kSlowTests[] = {"GLSLTest.VerifyMaxVertexUniformVectors*",
"MultiThreadingTest.MultiContextDeleteDraw*"};
constexpr char kTestExpectationsPath[] = "src/tests/angle_end2end_tests_expectations.txt";
} // namespace
int main(int argc, char **argv)
{
angle::TestSuite testSuite(&argc, argv);
ANGLEProcessTestArgs(&argc, argv);
RegisterContextCompatibilityTests();
testSuite.registerSlowTests(kSlowTests, ArraySize(kSlowTests));
constexpr size_t kMaxPath = 512;
std::array<char, kMaxPath> foundDataPath;
if (!angle::FindTestDataPath(kTestExpectationsPath, foundDataPath.data(), foundDataPath.size()))
{
std::cerr << "Unable to find test expectations path (" << kTestExpectationsPath << ")\n";
return EXIT_FAILURE;
}
// end2end test expectations only allow SKIP at the moment.
testSuite.setTestExpectationsAllowMask(angle::GPUTestExpectationsParser::kGpuTestSkip);
if (!testSuite.loadAllTestExpectationsFromFile(std::string(foundDataPath.data())))
{
return EXIT_FAILURE;
}
return testSuite.run();
}