skia2/tests/GrContextFactoryTest.cpp
Chris Dalton b3c9745911 Remove "nvpr" configs
The majority of our gm testing has been disabling nvpr, which doesn't
match our real-world behavior where we use nvpr whenever available.
This CL fixes the issue by completely removing the explicit nvpr
configs. Now if we have nvpr, you get it.

This CL also lowers the nvpr priority in the path renderer chain and
adds a "NonNVPR" job on Quadro where we can continue to test our
non-nvpr codepaths on NVIDIA.

Bug: skia:
Change-Id: I6a36f1101c8218adcaaf10cab25d2c28e70371f0
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/223828
Reviewed-by: Brian Salomon <bsalomon@google.com>
Commit-Queue: Chris Dalton <csmartdalton@google.com>
2019-06-26 16:53:50 +00:00

112 lines
4.5 KiB
C++

/*
* Copyright 2011 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "include/core/SkTypes.h"
#include "include/core/SkExecutor.h"
#include "src/gpu/GrCaps.h"
#include "src/gpu/GrContextPriv.h"
#include "tests/Test.h"
#include "tools/gpu/GrContextFactory.h"
using namespace sk_gpu_test;
DEF_GPUTEST(GrContextFactory_abandon, reporter, options) {
for (int i = 0; i < GrContextFactory::kContextTypeCnt; ++i) {
GrContextFactory testFactory(options);
GrContextFactory::ContextType ctxType = (GrContextFactory::ContextType) i;
ContextInfo info1 = testFactory.getContextInfo(ctxType);
if (!info1.grContext()) {
continue;
}
REPORTER_ASSERT(reporter, info1.testContext());
// Ref for comparison. The API does not explicitly say that this stays alive.
info1.grContext()->ref();
testFactory.abandonContexts();
// Test that we get different context after abandon.
ContextInfo info2 = testFactory.getContextInfo(ctxType);
REPORTER_ASSERT(reporter, info2.grContext());
REPORTER_ASSERT(reporter, info2.testContext());
REPORTER_ASSERT(reporter, info1.grContext() != info2.grContext());
// The GL context should also change, but it also could get the same address.
info1.grContext()->unref();
}
}
DEF_GPUTEST(GrContextFactory_sharedContexts, reporter, options) {
for (int i = 0; i < GrContextFactory::kContextTypeCnt; ++i) {
GrContextFactory testFactory(options);
GrContextFactory::ContextType ctxType = static_cast<GrContextFactory::ContextType>(i);
ContextInfo info1 = testFactory.getContextInfo(ctxType);
if (!info1.grContext()) {
continue;
}
// Ref for passing in. The API does not explicitly say that this stays alive.
info1.grContext()->ref();
testFactory.abandonContexts();
// Test that creating a context in a share group with an abandoned context fails.
ContextInfo info2 = testFactory.getSharedContextInfo(info1.grContext());
REPORTER_ASSERT(reporter, !info2.grContext());
info1.grContext()->unref();
// Create a new base context
ContextInfo info3 = testFactory.getContextInfo(ctxType);
// Creating a context in a share group may fail, but should never crash.
ContextInfo info4 = testFactory.getSharedContextInfo(info3.grContext());
if (!info4.grContext()) {
continue;
}
REPORTER_ASSERT(reporter, info3.grContext() != info4.grContext());
REPORTER_ASSERT(reporter, info3.testContext() != info4.testContext());
// Passing a different index should create a new (unique) context.
ContextInfo info5 = testFactory.getSharedContextInfo(info3.grContext(), 1);
REPORTER_ASSERT(reporter, info5.grContext());
REPORTER_ASSERT(reporter, info5.testContext());
REPORTER_ASSERT(reporter, info5.grContext() != info4.grContext());
REPORTER_ASSERT(reporter, info5.testContext() != info4.testContext());
}
}
DEF_GPUTEST(GrContextFactory_executorAndTaskGroup, reporter, options) {
for (int i = 0; i < GrContextFactory::kContextTypeCnt; ++i) {
// Verify that contexts have a task group iff we supply an executor with context options
GrContextOptions contextOptions = options;
contextOptions.fExecutor = nullptr;
GrContextFactory serialFactory(contextOptions);
std::unique_ptr<SkExecutor> threadPool = SkExecutor::MakeFIFOThreadPool(1);
contextOptions.fExecutor = threadPool.get();
GrContextFactory threadedFactory(contextOptions);
GrContextFactory::ContextType ctxType = static_cast<GrContextFactory::ContextType>(i);
ContextInfo serialInfo = serialFactory.getContextInfo(ctxType);
if (GrContext* serialContext = serialInfo.grContext()) {
REPORTER_ASSERT(reporter, nullptr == serialContext->priv().getTaskGroup());
}
ContextInfo threadedInfo = threadedFactory.getContextInfo(ctxType);
if (GrContext* threadedContext = threadedInfo.grContext()) {
REPORTER_ASSERT(reporter, nullptr != threadedContext->priv().getTaskGroup());
}
}
}
#ifdef SK_ENABLE_DUMP_GPU
DEF_GPUTEST_FOR_ALL_CONTEXTS(GrContextDump, reporter, ctxInfo) {
// Ensure that GrContext::dump doesn't assert (which is possible, if the JSON code is wrong)
SkString result = ctxInfo.grContext()->priv().dump();
REPORTER_ASSERT(reporter, !result.isEmpty());
}
#endif