1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2020 Google LLC 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#ifndef SurfaceFillContext_v1_DEFINED 9cb93a386Sopenharmony_ci#define SurfaceFillContext_v1_DEFINED 10cb93a386Sopenharmony_ci 11cb93a386Sopenharmony_ci#include "include/core/SkSize.h" 12cb93a386Sopenharmony_ci#include "include/private/GrTypesPriv.h" 13cb93a386Sopenharmony_ci#include "src/gpu/GrImageInfo.h" 14cb93a386Sopenharmony_ci#include "src/gpu/GrSwizzle.h" 15cb93a386Sopenharmony_ci#include "src/gpu/SurfaceFillContext.h" 16cb93a386Sopenharmony_ci#include "src/gpu/ops/OpsTask.h" 17cb93a386Sopenharmony_ci 18cb93a386Sopenharmony_ci#include <array> 19cb93a386Sopenharmony_ci#include <tuple> 20cb93a386Sopenharmony_ci 21cb93a386Sopenharmony_ciclass GrFragmentProcessor; 22cb93a386Sopenharmony_ciclass GrImageContext; 23cb93a386Sopenharmony_ciclass GrOp; 24cb93a386Sopenharmony_ciclass GrBackendFormat; 25cb93a386Sopenharmony_ciclass GrRecordingContext; 26cb93a386Sopenharmony_ciclass GrSurfaceProxyView; 27cb93a386Sopenharmony_ciclass SkColorSpace; 28cb93a386Sopenharmony_ci 29cb93a386Sopenharmony_cinamespace skgpu::v1 { 30cb93a386Sopenharmony_ci 31cb93a386Sopenharmony_ciclass SurfaceFillContext : public skgpu::SurfaceFillContext { 32cb93a386Sopenharmony_cipublic: 33cb93a386Sopenharmony_ci SurfaceFillContext(GrRecordingContext*, 34cb93a386Sopenharmony_ci GrSurfaceProxyView readView, 35cb93a386Sopenharmony_ci GrSurfaceProxyView writeView, 36cb93a386Sopenharmony_ci const GrColorInfo&, 37cb93a386Sopenharmony_ci bool flushTimeOpsTask = false); 38cb93a386Sopenharmony_ci 39cb93a386Sopenharmony_ci void discard() override; 40cb93a386Sopenharmony_ci 41cb93a386Sopenharmony_ci void fillRectWithFP(const SkIRect& dstRect, std::unique_ptr<GrFragmentProcessor> fp) override; 42cb93a386Sopenharmony_ci 43cb93a386Sopenharmony_ci bool blitTexture(GrSurfaceProxyView view, 44cb93a386Sopenharmony_ci const SkIRect& srcRect, 45cb93a386Sopenharmony_ci const SkIPoint& dstPoint) override; 46cb93a386Sopenharmony_ci 47cb93a386Sopenharmony_ci OpsTask* getOpsTask(); 48cb93a386Sopenharmony_ci sk_sp<GrRenderTask> refRenderTask() override; 49cb93a386Sopenharmony_ci 50cb93a386Sopenharmony_ci int numSamples() const { return this->asRenderTargetProxy()->numSamples(); } 51cb93a386Sopenharmony_ci bool wrapsVkSecondaryCB() const { return this->asRenderTargetProxy()->wrapsVkSecondaryCB(); } 52cb93a386Sopenharmony_ci 53cb93a386Sopenharmony_ci SkArenaAlloc* arenaAlloc() { return this->arenas()->arenaAlloc(); } 54cb93a386Sopenharmony_ci GrSubRunAllocator* subRunAlloc() { return this->arenas()->subRunAlloc(); } 55cb93a386Sopenharmony_ci 56cb93a386Sopenharmony_ci#if GR_TEST_UTILS 57cb93a386Sopenharmony_ci OpsTask* testingOnly_PeekLastOpsTask() { return fOpsTask.get(); } 58cb93a386Sopenharmony_ci#endif 59cb93a386Sopenharmony_ci 60cb93a386Sopenharmony_ci const GrSurfaceProxyView& writeSurfaceView() const { return fWriteView; } 61cb93a386Sopenharmony_ci 62cb93a386Sopenharmony_ciprotected: 63cb93a386Sopenharmony_ci /** 64cb93a386Sopenharmony_ci * Creates a constant color paint for a clear, using src-over if possible to improve batching. 65cb93a386Sopenharmony_ci */ 66cb93a386Sopenharmony_ci static void ClearToGrPaint(std::array<float, 4> color, GrPaint* paint); 67cb93a386Sopenharmony_ci 68cb93a386Sopenharmony_ci void addOp(GrOp::Owner); 69cb93a386Sopenharmony_ci 70cb93a386Sopenharmony_ci OpsTask* replaceOpsTask(); 71cb93a386Sopenharmony_ci 72cb93a386Sopenharmony_ciprivate: 73cb93a386Sopenharmony_ci sk_sp<GrArenas> arenas() { return fWriteView.proxy()->asRenderTargetProxy()->arenas(); } 74cb93a386Sopenharmony_ci 75cb93a386Sopenharmony_ci /** Override to be notified in subclass before the current ops task is replaced. */ 76cb93a386Sopenharmony_ci virtual void willReplaceOpsTask(OpsTask* prevTask, OpsTask* nextTask) {} 77cb93a386Sopenharmony_ci 78cb93a386Sopenharmony_ci /** 79cb93a386Sopenharmony_ci * Override to be called to participate in the decision to discard all previous ops if a 80cb93a386Sopenharmony_ci * fullscreen clear occurs. 81cb93a386Sopenharmony_ci */ 82cb93a386Sopenharmony_ci virtual OpsTask::CanDiscardPreviousOps canDiscardPreviousOpsOnFullClear() const { 83cb93a386Sopenharmony_ci return OpsTask::CanDiscardPreviousOps::kYes; 84cb93a386Sopenharmony_ci } 85cb93a386Sopenharmony_ci 86cb93a386Sopenharmony_ci void internalClear(const SkIRect* scissor, 87cb93a386Sopenharmony_ci std::array<float, 4> color, 88cb93a386Sopenharmony_ci bool upgradePartialToFull = false) override; 89cb93a386Sopenharmony_ci 90cb93a386Sopenharmony_ci void addDrawOp(GrOp::Owner); 91cb93a386Sopenharmony_ci 92cb93a386Sopenharmony_ci SkDEBUGCODE(void onValidate() const override;) 93cb93a386Sopenharmony_ci 94cb93a386Sopenharmony_ci // The OpsTask can be closed by some other surface context that has picked it up. For this 95cb93a386Sopenharmony_ci // reason, the OpsTask should only ever be accessed via 'getOpsTask'. 96cb93a386Sopenharmony_ci sk_sp<OpsTask> fOpsTask; 97cb93a386Sopenharmony_ci 98cb93a386Sopenharmony_ci bool fFlushTimeOpsTask; 99cb93a386Sopenharmony_ci 100cb93a386Sopenharmony_ci using INHERITED = skgpu::SurfaceFillContext; 101cb93a386Sopenharmony_ci}; 102cb93a386Sopenharmony_ci 103cb93a386Sopenharmony_ci} // namespace skgpu::v1 104cb93a386Sopenharmony_ci 105cb93a386Sopenharmony_ci#endif // SurfaceFillContext_v1_DEFINED 106