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 skgpu_graphite_Surface_Graphite_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define skgpu_graphite_Surface_Graphite_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "src/image/SkSurface_Base.h" 12*c8dee2aaSAndroid Build Coastguard Worker 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/GpuTypes.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/SkBackingFit.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/ResourceTypes.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/TextureProxyView.h" 17*c8dee2aaSAndroid Build Coastguard Worker 18*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::graphite { 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Worker class Context; 21*c8dee2aaSAndroid Build Coastguard Worker class Device; 22*c8dee2aaSAndroid Build Coastguard Worker class Image; 23*c8dee2aaSAndroid Build Coastguard Worker class Recorder; 24*c8dee2aaSAndroid Build Coastguard Worker class TextureProxy; 25*c8dee2aaSAndroid Build Coastguard Worker 26*c8dee2aaSAndroid Build Coastguard Worker class Surface final : public SkSurface_Base { 27*c8dee2aaSAndroid Build Coastguard Worker public: 28*c8dee2aaSAndroid Build Coastguard Worker // Convenience factory to create a Device, instantiate its target proxy and return as a Surface. 29*c8dee2aaSAndroid Build Coastguard Worker static sk_sp<Surface> Make(Recorder* recorder, 30*c8dee2aaSAndroid Build Coastguard Worker const SkImageInfo& info, 31*c8dee2aaSAndroid Build Coastguard Worker std::string_view label, 32*c8dee2aaSAndroid Build Coastguard Worker Budgeted budgeted, 33*c8dee2aaSAndroid Build Coastguard Worker Mipmapped mipmapped = Mipmapped::kNo, 34*c8dee2aaSAndroid Build Coastguard Worker SkBackingFit backingFit = SkBackingFit::kExact, 35*c8dee2aaSAndroid Build Coastguard Worker const SkSurfaceProps* props = nullptr) { 36*c8dee2aaSAndroid Build Coastguard Worker return Make(recorder, info, std::move(label), budgeted, mipmapped, backingFit, props, 37*c8dee2aaSAndroid Build Coastguard Worker LoadOp::kClear, /*registerWithRecorder=*/true); 38*c8dee2aaSAndroid Build Coastguard Worker } 39*c8dee2aaSAndroid Build Coastguard Worker // Make a surface that is not registered with the provided recorder. This surface should be 40*c8dee2aaSAndroid Build Coastguard Worker // short-lived and it must be flushed manually for its draw commands to be recorded. Most 41*c8dee2aaSAndroid Build Coastguard Worker // scratch surfaces will be budgeted, but if the underlying texture is being returned as a 42*c8dee2aaSAndroid Build Coastguard Worker // client-owned image, that may not be the case. 43*c8dee2aaSAndroid Build Coastguard Worker static sk_sp<Surface> MakeScratch(Recorder* recorder, 44*c8dee2aaSAndroid Build Coastguard Worker const SkImageInfo& info, 45*c8dee2aaSAndroid Build Coastguard Worker std::string_view label, 46*c8dee2aaSAndroid Build Coastguard Worker Budgeted budgeted = Budgeted::kYes, 47*c8dee2aaSAndroid Build Coastguard Worker Mipmapped mipmapped = Mipmapped::kNo, 48*c8dee2aaSAndroid Build Coastguard Worker SkBackingFit backingFit = SkBackingFit::kApprox) { 49*c8dee2aaSAndroid Build Coastguard Worker return Make(recorder, info, std::move(label), budgeted, mipmapped, backingFit, 50*c8dee2aaSAndroid Build Coastguard Worker /*props=*/nullptr, LoadOp::kDiscard, /*registerWithRecorder=*/false); 51*c8dee2aaSAndroid Build Coastguard Worker } 52*c8dee2aaSAndroid Build Coastguard Worker 53*c8dee2aaSAndroid Build Coastguard Worker Surface(sk_sp<Device>); 54*c8dee2aaSAndroid Build Coastguard Worker ~Surface() override; 55*c8dee2aaSAndroid Build Coastguard Worker 56*c8dee2aaSAndroid Build Coastguard Worker // From SkSurface.h 57*c8dee2aaSAndroid Build Coastguard Worker SkImageInfo imageInfo() const override; 58*c8dee2aaSAndroid Build Coastguard Worker 59*c8dee2aaSAndroid Build Coastguard Worker // From SkSurface_Base.h type()60*c8dee2aaSAndroid Build Coastguard Worker SkSurface_Base::Type type() const override { return SkSurface_Base::Type::kGraphite; } 61*c8dee2aaSAndroid Build Coastguard Worker 62*c8dee2aaSAndroid Build Coastguard Worker Recorder* onGetRecorder() const override; 63*c8dee2aaSAndroid Build Coastguard Worker SkCanvas* onNewCanvas() override; 64*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkSurface> onNewSurface(const SkImageInfo&) override; 65*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkImage> onNewImageSnapshot(const SkIRect* subset) override; 66*c8dee2aaSAndroid Build Coastguard Worker void onWritePixels(const SkPixmap&, int x, int y) override; 67*c8dee2aaSAndroid Build Coastguard Worker void onAsyncRescaleAndReadPixels(const SkImageInfo& info, 68*c8dee2aaSAndroid Build Coastguard Worker SkIRect srcRect, 69*c8dee2aaSAndroid Build Coastguard Worker RescaleGamma rescaleGamma, 70*c8dee2aaSAndroid Build Coastguard Worker RescaleMode rescaleMode, 71*c8dee2aaSAndroid Build Coastguard Worker ReadPixelsCallback callback, 72*c8dee2aaSAndroid Build Coastguard Worker ReadPixelsContext context) override; 73*c8dee2aaSAndroid Build Coastguard Worker void onAsyncRescaleAndReadPixelsYUV420(SkYUVColorSpace yuvColorSpace, 74*c8dee2aaSAndroid Build Coastguard Worker bool readAlpha, 75*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkColorSpace> dstColorSpace, 76*c8dee2aaSAndroid Build Coastguard Worker SkIRect srcRect, 77*c8dee2aaSAndroid Build Coastguard Worker SkISize dstSize, 78*c8dee2aaSAndroid Build Coastguard Worker RescaleGamma rescaleGamma, 79*c8dee2aaSAndroid Build Coastguard Worker RescaleMode, 80*c8dee2aaSAndroid Build Coastguard Worker ReadPixelsCallback callback, 81*c8dee2aaSAndroid Build Coastguard Worker ReadPixelsContext context) override; 82*c8dee2aaSAndroid Build Coastguard Worker bool onCopyOnWrite(ContentChangeMode) override; 83*c8dee2aaSAndroid Build Coastguard Worker sk_sp<const SkCapabilities> onCapabilities() override; 84*c8dee2aaSAndroid Build Coastguard Worker 85*c8dee2aaSAndroid Build Coastguard Worker TextureProxyView readSurfaceView() const; 86*c8dee2aaSAndroid Build Coastguard Worker sk_sp<Image> asImage() const; 87*c8dee2aaSAndroid Build Coastguard Worker sk_sp<Image> makeImageCopy(const SkIRect* subset, Mipmapped) const; 88*c8dee2aaSAndroid Build Coastguard Worker TextureProxy* backingTextureProxy() const; 89*c8dee2aaSAndroid Build Coastguard Worker 90*c8dee2aaSAndroid Build Coastguard Worker private: 91*c8dee2aaSAndroid Build Coastguard Worker // Regular and scratch surfaces differ by initial clear and if they are registered or not, 92*c8dee2aaSAndroid Build Coastguard Worker // otherwise are constructed the same. 93*c8dee2aaSAndroid Build Coastguard Worker static sk_sp<Surface> Make(Recorder* recorder, 94*c8dee2aaSAndroid Build Coastguard Worker const SkImageInfo&, 95*c8dee2aaSAndroid Build Coastguard Worker std::string_view label, 96*c8dee2aaSAndroid Build Coastguard Worker Budgeted, 97*c8dee2aaSAndroid Build Coastguard Worker Mipmapped, 98*c8dee2aaSAndroid Build Coastguard Worker SkBackingFit, 99*c8dee2aaSAndroid Build Coastguard Worker const SkSurfaceProps* props, 100*c8dee2aaSAndroid Build Coastguard Worker LoadOp initialLoadOp, 101*c8dee2aaSAndroid Build Coastguard Worker bool registerWithRecorder); 102*c8dee2aaSAndroid Build Coastguard Worker 103*c8dee2aaSAndroid Build Coastguard Worker sk_sp<Device> fDevice; 104*c8dee2aaSAndroid Build Coastguard Worker sk_sp<Image> fImageView; // the image object returned by asImage() 105*c8dee2aaSAndroid Build Coastguard Worker 106*c8dee2aaSAndroid Build Coastguard Worker friend void Flush(SkSurface*); 107*c8dee2aaSAndroid Build Coastguard Worker }; 108*c8dee2aaSAndroid Build Coastguard Worker 109*c8dee2aaSAndroid Build Coastguard Worker // TODO: The long-term for the public API around surfaces and flushing/submitting will likely 110*c8dee2aaSAndroid Build Coastguard Worker // be replaced with explicit control over Recorders and submitting Recordings to the Context 111*c8dee2aaSAndroid Build Coastguard Worker // directly. For now, internal tools often rely on surface/canvas flushing to control what's 112*c8dee2aaSAndroid Build Coastguard Worker // being timed (nanobench or viewer's stats layer), so we flush any pending draws to a DrawPass. 113*c8dee2aaSAndroid Build Coastguard Worker // While this won't measure actual conversion of the task list to backend command buffers, that 114*c8dee2aaSAndroid Build Coastguard Worker // should be fairly negligible since most of the work is handled in DrawPass::Make(). 115*c8dee2aaSAndroid Build Coastguard Worker // Additionally flushing pending work here ensures we don't batch across or clear prior recorded 116*c8dee2aaSAndroid Build Coastguard Worker // work when looping in a benchmark, as the controlling code expects. 117*c8dee2aaSAndroid Build Coastguard Worker void Flush(sk_sp<SkSurface> surface); 118*c8dee2aaSAndroid Build Coastguard Worker void Flush(SkSurface* surface); 119*c8dee2aaSAndroid Build Coastguard Worker 120*c8dee2aaSAndroid Build Coastguard Worker } // namespace skgpu::graphite 121*c8dee2aaSAndroid Build Coastguard Worker 122*c8dee2aaSAndroid Build Coastguard Worker #endif // skgpu_graphite_Surface_Graphite_DEFINED 123