3405800d7a
Remove refcounting from SkGLContext. SkGLContext is expected to behave like GrContextFactory would own it, as implied by the GrContextFactory function. If it is refcounted, this does not hold. Also other use sites, such as in SkOSWindow_win (command buffer gl object), confirm the behavior. The object is explicitly owned and destroyed, not shared. Also fixes potential crashes from using GL context of an abandoned context. Also fixes potential crashes in DM/nanobench, if the GrContext lives longer than GLContext through internal refing of GrContext. Moves the non-trivial implementations from GrContextFactory.h to .cpp, just for consistency sake. Changes pathops_unittest.gyp. The pathops_unittest uses GrContextFactory, but did not link to its implementation. The reason they worked was that the implementation used (constructors, destructors) happened to be in the .h file. This works towards being able to use command buffer and NVPR from the SampleApp. BUG=skia:2992 GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1511773005 Committed: https://skia.googlesource.com/skia/+/830e012187f951d49d7e46e196ac8d1e653a25da Review URL: https://codereview.chromium.org/1511773005
76 lines
2.7 KiB
C++
76 lines
2.7 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 "SkTypes.h"
|
|
|
|
#if SK_SUPPORT_GPU
|
|
|
|
#include "GrContextFactory.h"
|
|
#include "GrCaps.h"
|
|
#include "Test.h"
|
|
|
|
DEF_GPUTEST(GrContextFactory_NVPRContextOptionHasPathRenderingSupport, reporter, /*factory*/) {
|
|
// Test that if NVPR is requested, the context always has path rendering
|
|
// or the context creation fails.
|
|
GrContextFactory testFactory;
|
|
// Test that if NVPR is possible, caps are in sync.
|
|
for (int i = 0; i < GrContextFactory::kGLContextTypeCnt; ++i) {
|
|
GrContextFactory::GLContextType glCtxType = static_cast<GrContextFactory::GLContextType>(i);
|
|
GrContext* context = testFactory.get(glCtxType,
|
|
GrContextFactory::kEnableNVPR_GLContextOptions);
|
|
if (!context) {
|
|
continue;
|
|
}
|
|
REPORTER_ASSERT(
|
|
reporter,
|
|
context->caps()->shaderCaps()->pathRenderingSupport());
|
|
}
|
|
}
|
|
|
|
DEF_GPUTEST(GrContextFactory_NoPathRenderingUnlessNVPRRequested, reporter, /*factory*/) {
|
|
// Test that if NVPR is not requested, the context never has path rendering support.
|
|
|
|
GrContextFactory testFactory;
|
|
for (int i = 0; i <= GrContextFactory::kLastGLContextType; ++i) {
|
|
GrContextFactory::GLContextType glCtxType = (GrContextFactory::GLContextType)i;
|
|
GrContext* context = testFactory.get(glCtxType);
|
|
if (context) {
|
|
REPORTER_ASSERT(
|
|
reporter,
|
|
!context->caps()->shaderCaps()->pathRenderingSupport());
|
|
}
|
|
}
|
|
}
|
|
|
|
DEF_GPUTEST(GrContextFactory_abandon, reporter, /*factory*/) {
|
|
GrContextFactory testFactory;
|
|
for (int i = 0; i < GrContextFactory::kGLContextTypeCnt; ++i) {
|
|
GrContextFactory::GLContextType glCtxType = (GrContextFactory::GLContextType) i;
|
|
GrContextFactory::ContextInfo info1 =
|
|
testFactory.getContextInfo(glCtxType);
|
|
if (!info1.fGrContext) {
|
|
continue;
|
|
}
|
|
REPORTER_ASSERT(reporter, info1.fGLContext);
|
|
// Ref for comparison. The API does not explicitly say that this stays alive.
|
|
info1.fGrContext->ref();
|
|
testFactory.abandonContexts();
|
|
|
|
// Test that we get different context after abandon.
|
|
GrContextFactory::ContextInfo info2 =
|
|
testFactory.getContextInfo(glCtxType);
|
|
REPORTER_ASSERT(reporter, info2.fGrContext);
|
|
REPORTER_ASSERT(reporter, info2.fGLContext);
|
|
REPORTER_ASSERT(reporter, info1.fGrContext != info2.fGrContext);
|
|
// fGLContext should also change, but it also could get the same address.
|
|
|
|
info1.fGrContext->unref();
|
|
}
|
|
}
|
|
|
|
#endif
|