|  | /* | 
|  | * Copyright 2020 Google LLC | 
|  | * | 
|  | * Use of this source code is governed by a BSD-style license that can be | 
|  | * found in the LICENSE file. | 
|  | */ | 
|  |  | 
|  | #include "include/core/SkAlphaType.h" | 
|  | #include "include/core/SkCanvas.h" | 
|  | #include "include/core/SkColorType.h" | 
|  | #include "include/core/SkImageInfo.h" | 
|  | #include "include/core/SkPaint.h" | 
|  | #include "include/core/SkRect.h" | 
|  | #include "include/core/SkRefCnt.h" | 
|  | #include "include/core/SkSurface.h" | 
|  | #include "include/core/SkTypes.h" | 
|  | #include "include/gpu/GpuTypes.h" | 
|  | #include "include/gpu/GrContextOptions.h" | 
|  | #include "include/gpu/GrDirectContext.h" | 
|  | #include "include/gpu/GrTypes.h" | 
|  | #include "tests/CtsEnforcement.h" | 
|  | #include "tests/Test.h" | 
|  |  | 
|  | DEF_GANESH_TEST(GrContext_oomed, reporter, originalOptions, CtsEnforcement::kApiLevel_T) { | 
|  | GrContextOptions options = originalOptions; | 
|  | options.fRandomGLOOM = true; | 
|  | options.fSkipGLErrorChecks = GrContextOptions::Enable::kNo; | 
|  | sk_gpu_test::GrContextFactory factory(options); | 
|  | for (int ct = 0; ct < sk_gpu_test::GrContextFactory::kContextTypeCnt; ++ct) { | 
|  | auto contextType = static_cast<sk_gpu_test::GrContextFactory::ContextType>(ct); | 
|  | auto context = factory.get(contextType); | 
|  | if (!context) { | 
|  | continue; | 
|  | } | 
|  | if (context->backend() != GrBackendApi::kOpenGL) { | 
|  | continue; | 
|  | } | 
|  | auto info = SkImageInfo::Make(10, 10, kRGBA_8888_SkColorType, kPremul_SkAlphaType); | 
|  | for (int run = 0; run < 20; ++run) { | 
|  | bool oomed = false; | 
|  | for (int i = 0; i < 500; ++i) { | 
|  | // Make sure we're actually making a significant number of GL calls and not just | 
|  | // issuing a small number calls by reusing scratch resources created in a previous | 
|  | // iteration. | 
|  | context->freeGpuResources(); | 
|  | auto surf = SkSurface::MakeRenderTarget( | 
|  | context, skgpu::Budgeted::kYes, info, 1, nullptr); | 
|  | SkPaint paint; | 
|  | surf->getCanvas()->drawRect(SkRect::MakeLTRB(100, 100, 2000, 2000), paint); | 
|  | surf->flushAndSubmit(); | 
|  | if ((oomed = context->oomed())) { | 
|  | REPORTER_ASSERT(reporter, !context->oomed(), "oomed() wasn't cleared"); | 
|  | break; | 
|  | } | 
|  | } | 
|  | if (!oomed) { | 
|  | ERRORF(reporter, "Did not OOM on %dth run.", run); | 
|  | } | 
|  | } | 
|  | } | 
|  | } |