1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2021 Google LLC 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef skiatest_graphite_GraphiteTestContext_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define skiatest_graphite_GraphiteTestContext_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/graphite/GraphiteTypes.h" 13*c8dee2aaSAndroid Build Coastguard Worker 14*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu { 15*c8dee2aaSAndroid Build Coastguard Worker enum class BackendApi : unsigned; 16*c8dee2aaSAndroid Build Coastguard Worker enum class ContextType; 17*c8dee2aaSAndroid Build Coastguard Worker } 18*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::graphite { 19*c8dee2aaSAndroid Build Coastguard Worker class Context; 20*c8dee2aaSAndroid Build Coastguard Worker struct ContextOptions; 21*c8dee2aaSAndroid Build Coastguard Worker class Recording; 22*c8dee2aaSAndroid Build Coastguard Worker } 23*c8dee2aaSAndroid Build Coastguard Worker 24*c8dee2aaSAndroid Build Coastguard Worker namespace sk_gpu_test { class FlushFinishTracker; } 25*c8dee2aaSAndroid Build Coastguard Worker 26*c8dee2aaSAndroid Build Coastguard Worker namespace skiatest::graphite { 27*c8dee2aaSAndroid Build Coastguard Worker 28*c8dee2aaSAndroid Build Coastguard Worker struct TestOptions; 29*c8dee2aaSAndroid Build Coastguard Worker 30*c8dee2aaSAndroid Build Coastguard Worker /** 31*c8dee2aaSAndroid Build Coastguard Worker * An offscreen 3D context. This class is intended for Skia's internal testing needs and not 32*c8dee2aaSAndroid Build Coastguard Worker * for general use. 33*c8dee2aaSAndroid Build Coastguard Worker */ 34*c8dee2aaSAndroid Build Coastguard Worker class GraphiteTestContext { 35*c8dee2aaSAndroid Build Coastguard Worker public: 36*c8dee2aaSAndroid Build Coastguard Worker GraphiteTestContext(const GraphiteTestContext&) = delete; 37*c8dee2aaSAndroid Build Coastguard Worker GraphiteTestContext& operator=(const GraphiteTestContext&) = delete; 38*c8dee2aaSAndroid Build Coastguard Worker 39*c8dee2aaSAndroid Build Coastguard Worker virtual ~GraphiteTestContext(); 40*c8dee2aaSAndroid Build Coastguard Worker 41*c8dee2aaSAndroid Build Coastguard Worker virtual skgpu::BackendApi backend() = 0; 42*c8dee2aaSAndroid Build Coastguard Worker 43*c8dee2aaSAndroid Build Coastguard Worker virtual skgpu::ContextType contextType() = 0; 44*c8dee2aaSAndroid Build Coastguard Worker 45*c8dee2aaSAndroid Build Coastguard Worker virtual std::unique_ptr<skgpu::graphite::Context> makeContext(const TestOptions&) = 0; 46*c8dee2aaSAndroid Build Coastguard Worker getMaxGpuFrameLag(int * maxFrameLag)47*c8dee2aaSAndroid Build Coastguard Worker bool getMaxGpuFrameLag(int *maxFrameLag) const { 48*c8dee2aaSAndroid Build Coastguard Worker *maxFrameLag = kMaxFrameLag; 49*c8dee2aaSAndroid Build Coastguard Worker return true; 50*c8dee2aaSAndroid Build Coastguard Worker } 51*c8dee2aaSAndroid Build Coastguard Worker 52*c8dee2aaSAndroid Build Coastguard Worker /** 53*c8dee2aaSAndroid Build Coastguard Worker * This will insert a Recording and submit work to the GPU. Additionally, we will add a finished 54*c8dee2aaSAndroid Build Coastguard Worker * callback to our insert recording call. We allow ourselves to have kMaxFrameLag number of 55*c8dee2aaSAndroid Build Coastguard Worker * unfinished flushes active on the GPU at a time. If we have 2 outstanding flushes then we will 56*c8dee2aaSAndroid Build Coastguard Worker * wait on the CPU until one has finished. 57*c8dee2aaSAndroid Build Coastguard Worker */ 58*c8dee2aaSAndroid Build Coastguard Worker void submitRecordingAndWaitOnSync(skgpu::graphite::Context*, skgpu::graphite::Recording*); 59*c8dee2aaSAndroid Build Coastguard Worker 60*c8dee2aaSAndroid Build Coastguard Worker /** 61*c8dee2aaSAndroid Build Coastguard Worker * Allow the GPU API to make or detect forward progress on submitted work. For most APIs this is 62*c8dee2aaSAndroid Build Coastguard Worker * a no-op as the API can do this on another thread. 63*c8dee2aaSAndroid Build Coastguard Worker */ tick()64*c8dee2aaSAndroid Build Coastguard Worker virtual void tick() {} 65*c8dee2aaSAndroid Build Coastguard Worker 66*c8dee2aaSAndroid Build Coastguard Worker /** 67*c8dee2aaSAndroid Build Coastguard Worker * If the context supports CPU/GPU sync'ing this calls submit with skgpu::SyncToCpu::kYes. 68*c8dee2aaSAndroid Build Coastguard Worker * Otherwise it calls it with kNo in a busy loop. 69*c8dee2aaSAndroid Build Coastguard Worker */ 70*c8dee2aaSAndroid Build Coastguard Worker void syncedSubmit(skgpu::graphite::Context*); 71*c8dee2aaSAndroid Build Coastguard Worker 72*c8dee2aaSAndroid Build Coastguard Worker protected: 73*c8dee2aaSAndroid Build Coastguard Worker static constexpr int kMaxFrameLag = 3; 74*c8dee2aaSAndroid Build Coastguard Worker 75*c8dee2aaSAndroid Build Coastguard Worker sk_sp<sk_gpu_test::FlushFinishTracker> fFinishTrackers[kMaxFrameLag - 1]; 76*c8dee2aaSAndroid Build Coastguard Worker int fCurrentFlushIdx = 0; 77*c8dee2aaSAndroid Build Coastguard Worker 78*c8dee2aaSAndroid Build Coastguard Worker GraphiteTestContext(); 79*c8dee2aaSAndroid Build Coastguard Worker }; 80*c8dee2aaSAndroid Build Coastguard Worker 81*c8dee2aaSAndroid Build Coastguard Worker 82*c8dee2aaSAndroid Build Coastguard Worker } // namespace skiatest::graphite 83*c8dee2aaSAndroid Build Coastguard Worker 84*c8dee2aaSAndroid Build Coastguard Worker #endif // skiatest_graphite_GraphiteTestContext_DEFINED 85