/* * 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 "tests/Test.h" #include "include/core/SkCanvas.h" #include "include/core/SkSurface.h" #include "include/gpu/GrDirectContext.h" using namespace sk_gpu_test; namespace { struct SubmittedInfo { int* fCount; bool* fSuccess; }; } // namespace static void testing_submitted_proc(void* ctx, bool success) { SubmittedInfo* info = (SubmittedInfo*)ctx; *info->fCount += 1; *info->fSuccess = success; } DEF_GPUTEST_FOR_RENDERING_CONTEXTS(FlushSubmittedProcTest, reporter, ctxInfo) { auto ctx = ctxInfo.directContext(); SkImageInfo info = SkImageInfo::Make(8, 8, kRGBA_8888_SkColorType, kPremul_SkAlphaType); sk_sp surface = SkSurface::MakeRenderTarget(ctx, SkBudgeted::kNo, info); SkCanvas* canvas = surface->getCanvas(); canvas->clear(SK_ColorGREEN); int submittedCount = 0; bool submittedSuccess = false; SubmittedInfo submittedInfo = { &submittedCount, &submittedSuccess }; GrFlushInfo flushInfo; flushInfo.fSubmittedProc = testing_submitted_proc; flushInfo.fSubmittedContext = &submittedInfo; ctx->flush(flushInfo); REPORTER_ASSERT(reporter, submittedCount == 0); ctx->submit(); REPORTER_ASSERT(reporter, submittedCount == 1); REPORTER_ASSERT(reporter, submittedSuccess); // There should be no work so if we flush again the submittedProc should be called immediately surface->flush(SkSurface::BackendSurfaceAccess::kNoAccess, flushInfo); REPORTER_ASSERT(reporter, submittedCount == 2); REPORTER_ASSERT(reporter, submittedSuccess); // However, flushing the context we don't do any checks of work so we still require submit to be // called in order for the callback to trigger. ctx->flush(flushInfo); REPORTER_ASSERT(reporter, submittedCount == 2); ctx->submit(); REPORTER_ASSERT(reporter, submittedCount == 3); REPORTER_ASSERT(reporter, submittedSuccess); // Testing that doing multiple flushes before a submit triggers both submittedProcs to be called canvas->clear(SK_ColorBLUE); surface->flush(SkSurface::BackendSurfaceAccess::kNoAccess, flushInfo); REPORTER_ASSERT(reporter, submittedCount == 3); canvas->clear(SK_ColorRED); surface->flush(SkSurface::BackendSurfaceAccess::kNoAccess, flushInfo); REPORTER_ASSERT(reporter, submittedCount == 3); ctx->submit(); REPORTER_ASSERT(reporter, submittedCount == 5); REPORTER_ASSERT(reporter, submittedSuccess); // Test an abandoned context to get a failed submit immediately when flush is called canvas->clear(SK_ColorCYAN); ctx->abandonContext(); surface->flush(SkSurface::BackendSurfaceAccess::kNoAccess, flushInfo); REPORTER_ASSERT(reporter, submittedCount == 6); REPORTER_ASSERT(reporter, !submittedSuccess); ctx->flush(flushInfo); REPORTER_ASSERT(reporter, submittedCount == 7); REPORTER_ASSERT(reporter, !submittedSuccess); }