1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/* 2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2012 Google Inc. 3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be 5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file. 6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#ifndef SkSurface_DEFINED 9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define SkSurface_DEFINED 10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkRefCnt.h" 12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkImage.h" 13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkSurfaceProps.h" 14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrTypes.h" 16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SkCanvas; 18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SkDeferredDisplayList; 19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SkPaint; 20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SkSurfaceCharacterization; 21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GrBackendRenderTarget; 22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GrBackendSemaphore; 23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GrContext; 24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GrRenderTarget; 25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/** 27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * SkSurface is responsible for managing the pixels that a canvas draws into. The pixels can be 28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * allocated either in CPU memory (a Raster surface) or on the GPU (a RenderTarget surface). 29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * SkSurface takes care of allocating a SkCanvas that will draw into the surface. Call 31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * surface->getCanvas() to use that canvas (but don't delete it, it is owned by the surface). 32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * SkSurface always has non-zero dimensions. If there is a request for a new surface, and either 34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * of the requested dimensions are zero, then NULL will be returned. 35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SK_API SkSurface : public SkRefCnt { 37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Create a new surface, using the specified pixels/rowbytes as its 40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * backend. 41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * If the requested surface cannot be created, or the request is not a 43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * supported configuration, NULL will be returned. 44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Callers are responsible for initialiazing the surface pixels. 46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static sk_sp<SkSurface> MakeRasterDirect(const SkImageInfo& imageInfo, void* pixels, 48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot size_t rowBytes, 49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkSurfaceProps* surfaceProps = nullptr); 50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * The same as NewRasterDirect, but also accepts a call-back routine, which is invoked 53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * when the surface is deleted, and is passed the pixel memory and the specified context. 54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static sk_sp<SkSurface> MakeRasterDirectReleaseProc(const SkImageInfo& imageInfo, void* pixels, 56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot size_t rowBytes, 57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void (*releaseProc)(void* pixels, void* context), 58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void* context, const SkSurfaceProps* surfaceProps = nullptr); 59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Return a new surface, with the memory for the pixels automatically allocated and 62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * zero-initialized, but respecting the specified rowBytes. If rowBytes==0, then a default 63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * value will be chosen. If a non-zero rowBytes is specified, then any images snapped off of 64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * this surface (via makeImageSnapshot()) are guaranteed to have the same rowBytes. 65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * If the requested surface cannot be created, or the request is not a 67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * supported configuration, NULL will be returned. 68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static sk_sp<SkSurface> MakeRaster(const SkImageInfo& imageInfo, size_t rowBytes, 70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkSurfaceProps* surfaceProps); 71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Allocate a new surface, automatically computing the rowBytes. 74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static sk_sp<SkSurface> MakeRaster(const SkImageInfo& imageInfo, 76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkSurfaceProps* props = nullptr) { 77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return MakeRaster(imageInfo, 0, props); 78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Helper version of NewRaster. It creates a SkImageInfo with the 82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * specified width and height, and populates the rest of info to match 83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * pixels in SkPMColor format. 84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static sk_sp<SkSurface> MakeRasterN32Premul(int width, int height, 86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkSurfaceProps* surfaceProps = nullptr) { 87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return MakeRaster(SkImageInfo::MakeN32Premul(width, height), surfaceProps); 88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Used to wrap a pre-existing backend 3D API texture as a SkSurface. Skia will not assume 92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * ownership of the texture and the client must ensure the texture is valid for the lifetime 93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * of the SkSurface. If sampleCnt > 1, then we will create an intermediate mssa surface which 94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * we will use for rendering. We then resolve into the passed in texture. 95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static sk_sp<SkSurface> MakeFromBackendTexture(GrContext* context, 97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const GrBackendTexture& backendTexture, 98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrSurfaceOrigin origin, int sampleCnt, 99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkColorSpace> colorSpace, 100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkSurfaceProps* surfaceProps); 101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Used to wrap a pre-existing backend 3D API texture as a SkSurface. Skia will not assume 104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * ownership of the texture and the client must ensure the texture is valid for the lifetime 105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * of the SkSurface. If sampleCnt > 1, then we will create an intermediate mssa surface which 106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * we will use for rendering. We then resolve into the passed in texture. 107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * The GrBackendTexture must have a valid backend format supplied (GrGLTextureInfo::fFormat, 109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * GrVkImageInfo::fFormat, etc.) in it. The passed in SkColorType informs skia how it should 110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * interpret the backend format supplied by the GrBackendTexture. If the format in the 111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * GrBackendTexture is not compatible with the sampleCnt, SkColorType, and SkColorSpace we 112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * will return nullptr. 113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static sk_sp<SkSurface> MakeFromBackendTexture(GrContext* context, 115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const GrBackendTexture& backendTexture, 116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrSurfaceOrigin origin, int sampleCnt, 117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkColorType colorType, 118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkColorSpace> colorSpace, 119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkSurfaceProps* surfaceProps); 120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static sk_sp<SkSurface> MakeFromBackendRenderTarget(GrContext* context, 122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const GrBackendRenderTarget& backendRenderTarget, 123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrSurfaceOrigin origin, 124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkColorSpace> colorSpace, 125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkSurfaceProps* surfaceProps); 126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * The GrBackendRenderTarget must have a valid backend format set (GrGLTextureInfo::fFormat, 129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * GrVkImageInfo::fFormat, etc.) in it. The passed in SkColorType informs skia how it should 130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * interpret the backend format supplied by the GrBackendRenderTarget. If the format in the 131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * GrBackendRenderTarget is not compatible with the sampleCnt, SkColorType, and SkColorSpace 132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * we will return nullptr. 133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static sk_sp<SkSurface> MakeFromBackendRenderTarget(GrContext* context, 135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const GrBackendRenderTarget& backendRenderTarget, 136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrSurfaceOrigin origin, 137fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkColorType colorType, 138fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkColorSpace> colorSpace, 139fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkSurfaceProps* surfaceProps); 140fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 141fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 142fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Used to wrap a pre-existing 3D API texture as a SkSurface. Skia will treat the texture as 143fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * a rendering target only, but unlike NewFromBackendRenderTarget, Skia will manage and own 144fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * the associated render target objects (but not the provided texture). Skia will not assume 145fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * ownership of the texture and the client must ensure the texture is valid for the lifetime 146fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * of the SkSurface. 147fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 148fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static sk_sp<SkSurface> MakeFromBackendTextureAsRenderTarget(GrContext* context, 149fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const GrBackendTexture& backendTexture, 150fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrSurfaceOrigin origin, 151fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int sampleCnt, 152fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkColorSpace> colorSpace, 153fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkSurfaceProps* surfaceProps); 154fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 155fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 156fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Used to wrap a pre-existing 3D API texture as a SkSurface. Skia will treat the texture as 157fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * a rendering target only, but unlike NewFromBackendRenderTarget, Skia will manage and own 158fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * the associated render target objects (but not the provided texture). Skia will not assume 159fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * ownership of the texture and the client must ensure the texture is valid for the lifetime 160fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * of the SkSurface. 161fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 162fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * The GrBackendTexture must have a valid backend format supplied (GrGLTextureInfo::fFormat, 163fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * GrVkImageInfo::fFormat, etc.) in it. The passed in SkColorType informs skia how it should 164fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * interpret the backend format supplied by the GrBackendTexture. If the format in the 165fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * GrBackendTexture is not compatible with the sampleCnt, SkColorType, and SkColorSpace we 166fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * will return nullptr. 167fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 168fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static sk_sp<SkSurface> MakeFromBackendTextureAsRenderTarget(GrContext* context, 169fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const GrBackendTexture& backendTexture, 170fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrSurfaceOrigin origin, 171fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int sampleCnt, 172fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkColorType colorType, 173fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkColorSpace> colorSpace, 174fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkSurfaceProps* surfaceProps); 175fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 176fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 177fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Return a new surface whose contents will be drawn to an offscreen 178fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * render target, allocated by the surface. The optional shouldCreateWithMips flag is a hint 179fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * that this surface may be snapped to an SkImage which will be used with mip maps so we should 180fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * create the backend gpu RenderTarget with mips to avoid a copy later on. 181fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 182fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static sk_sp<SkSurface> MakeRenderTarget(GrContext* context, SkBudgeted budgeted, 183fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkImageInfo& imageInfo, 184fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int sampleCount, GrSurfaceOrigin surfaceOrigin, 185fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkSurfaceProps* surfaceProps, 186fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool shouldCreateWithMips = false); 187fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 188fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static sk_sp<SkSurface> MakeRenderTarget(GrContext* context, SkBudgeted budgeted, 189fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkImageInfo& imageInfo, int sampleCount, 190fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkSurfaceProps* props) { 191fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return MakeRenderTarget(context, budgeted, imageInfo, sampleCount, 192fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kBottomLeft_GrSurfaceOrigin, props); 193fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 194fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 195fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static sk_sp<SkSurface> MakeRenderTarget(GrContext* context, SkBudgeted budgeted, 196fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkImageInfo& imageInfo) { 197fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (!imageInfo.width() || !imageInfo.height()) { 198fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return nullptr; 199fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 200fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return MakeRenderTarget(context, budgeted, imageInfo, 0, kBottomLeft_GrSurfaceOrigin, 201fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot nullptr); 202fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 203fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 204fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 205fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Returns a surface that stores no pixels. It can be drawn to via its canvas, but that 206fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * canvas does not draw anything. Calling makeImageSnapshot() will return nullptr. 207fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 208fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static sk_sp<SkSurface> MakeNull(int width, int height); 209fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 210fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int width() const { return fWidth; } 211fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int height() const { return fHeight; } 212fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 213fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 214fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Returns a unique non-zero, unique value identifying the content of this 215fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * surface. Each time the content is changed changed, either by drawing 216fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * into this surface, or explicitly calling notifyContentChanged()) this 217fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * method will return a new value. 218fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 219fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * If this surface is empty (i.e. has a zero-dimention), this will return 220fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 0. 221fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 222fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot uint32_t generationID(); 223fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 224fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 225fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Modes that can be passed to notifyContentWillChange 226fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 227fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot enum ContentChangeMode { 228fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 229fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use this mode if it is known that the upcoming content changes will 230fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * clear or overwrite prior contents, thus making them discardable. 231fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 232fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kDiscard_ContentChangeMode, 233fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 234fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use this mode if prior surface contents need to be preserved or 235fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * if in doubt. 236fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 237fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kRetain_ContentChangeMode, 238fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 239fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 240fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 241fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Call this if the contents are about to change. This will (lazily) force a new 242fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * value to be returned from generationID() when it is called next. 243fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 244fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * CAN WE DEPRECATE THIS? 245fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 246fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void notifyContentWillChange(ContentChangeMode mode); 247fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 248fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot enum BackendHandleAccess { 249fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kFlushRead_BackendHandleAccess, //!< caller may read from the backend object 250fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kFlushWrite_BackendHandleAccess, //!< caller may write to the backend object 251fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kDiscardWrite_BackendHandleAccess, //!< caller must over-write the entire backend object 252fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 253fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 254fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /* 255fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * These are legacy aliases which will be removed soon 256fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 257fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static const BackendHandleAccess kFlushRead_TextureHandleAccess = 258fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kFlushRead_BackendHandleAccess; 259fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static const BackendHandleAccess kFlushWrite_TextureHandleAccess = 260fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kFlushWrite_BackendHandleAccess; 261fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static const BackendHandleAccess kDiscardWrite_TextureHandleAccess = 262fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kDiscardWrite_BackendHandleAccess; 263fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 264fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 265fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 266fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Retrieves the backend API handle of the texture used by this surface, or 0 if the surface 267fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * is not backed by a GPU texture. 268fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 269fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * The returned texture-handle is only valid until the next draw-call into the surface, 270fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * or the surface is deleted. 271fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 272fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrBackendObject getTextureHandle(BackendHandleAccess backendHandleAccess); 273fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 274fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 275fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Retrieves the backend API handle of the RenderTarget backing this surface. Callers must 276fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * ensure this function returns 'true' or else the GrBackendObject will be invalid 277fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 278fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * In OpenGL this will return the FramebufferObject ID. 279fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 280fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool getRenderTargetHandle(GrBackendObject* backendObject, 281fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot BackendHandleAccess backendHandleAccess); 282fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 283fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 284fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Return a canvas that will draw into this surface. This will always 285fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * return the same canvas for a given surface, and is manged/owned by the 286fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * surface. It should not be used when its parent surface has gone out of 287fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * scope. 288fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 289fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkCanvas* getCanvas(); 290fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 291fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 292fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Return a new surface that is "compatible" with this one, in that it will 293fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * efficiently be able to be drawn into this surface. Typical calling 294fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * pattern: 295fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 296fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * SkSurface* A = SkSurface::New...(); 297fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * SkCanvas* canvasA = surfaceA->newCanvas(); 298fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * ... 299fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * SkSurface* surfaceB = surfaceA->newSurface(...); 300fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * SkCanvas* canvasB = surfaceB->newCanvas(); 301fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * ... // draw using canvasB 302fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * canvasA->drawSurface(surfaceB); // <--- this will always be optimal! 303fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 304fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkSurface> makeSurface(const SkImageInfo& imageInfo); 305fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 306fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 307fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Returns an image of the current state of the surface pixels up to this 308fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * point. Subsequent changes to the surface (by drawing into its canvas) 309fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * will not be reflected in this image. For the GPU-backend, the budgeting 310fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * decision for the snapped image will match that of the surface. 311fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 312fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkImage> makeImageSnapshot(); 313fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 314fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 315fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Though the caller could get a snapshot image explicitly, and draw that, 316fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * it seems that directly drawing a surface into another canvas might be 317fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * a common pattern, and that we could possibly be more efficient, since 318fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * we'd know that the "snapshot" need only live until we've handed it off 319fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * to the canvas. 320fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 321fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void draw(SkCanvas* canvas, SkScalar x, SkScalar y, const SkPaint* paint); 322fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 323fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 324fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * If the surface has direct access to its pixels (i.e. they are in local 325fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * RAM) return true, and if not null, set the pixmap parameter to point to the information 326fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * about the surface's pixels. The pixel address in the pixmap is only valid while 327fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * the surface object is in scope, and no API call is made on the surface 328fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * or its canvas. 329fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 330fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * On failure, returns false and the pixmap parameter is ignored. 331fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 332fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool peekPixels(SkPixmap* pixmap); 333fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 334fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 335fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copy the pixels from the surface into the specified pixmap, 336fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * converting them into the pixmap's format. The surface pixels are read 337fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * starting at the specified (srcX,srcY) location. 338fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 339fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * The pixmap and (srcX,srcY) offset specifies a source rectangle 340fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 341fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * srcR.setXYWH(srcX, srcY, pixmap.width(), pixmap.height()); 342fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 343fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * srcR is intersected with the bounds of the base-layer. If this intersection is not empty, 344fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * then we have two sets of pixels (of equal size). Replace the dst pixels with the 345fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * corresponding src pixels, performing any colortype/alphatype transformations needed 346fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * (in the case where the src and dst have different colortypes or alphatypes). 347fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 348fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * This call can fail, returning false, for several reasons: 349fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * - If srcR does not intersect the surface bounds. 350fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * - If the requested colortype/alphatype cannot be converted from the surface's types. 351fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 352fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool readPixels(const SkPixmap& dst, int srcX, int srcY); 353fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool readPixels(const SkImageInfo& dstInfo, void* dstPixels, size_t dstRowBytes, 354fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int srcX, int srcY); 355fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool readPixels(const SkBitmap& dst, int srcX, int srcY); 356fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 357fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkSurfaceProps& props() const { return fProps; } 358fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 359fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 360fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Issue any pending surface IO to the current backend 3D API and resolve any surface MSAA. 361fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 362fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * The flush calls below are the new preferred way to flush calls to a surface, and this call 363fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * will eventually be removed. 364fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 365fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void prepareForExternalIO(); 366fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 367fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 368fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Issue any pending surface IO to the current backend 3D API 369fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 370fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void flush(); 371fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 372fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 373fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Issue any pending surface IO to the current backend 3D API. After issuing all commands, 374fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * numSemaphore semaphores will be signaled by the gpu. The client passes in an array of 375fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * numSemaphores GrBackendSemaphores. In general these GrBackendSemaphore's can be either 376fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * initialized or not. If they are initialized, the backend uses the passed in semaphore. 377fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * If it is not initialized, a new semaphore is created and the GrBackendSemaphore object 378fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * is initialized with that semaphore. 379fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 380fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * The client will own and be responsible for deleting the underlying semaphores that are stored 381fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * and returned in initialized GrBackendSemaphore objects. The GrBackendSemaphore objects 382fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * themselves can be deleted as soon as this function returns. 383fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 384fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * If the backend API is OpenGL only uninitialized GrBackendSemaphores are supported. 385fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * If the backend API is Vulkan either initialized or unitialized semaphores are supported. 386fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * If unitialized, the semaphores which are created will be valid for use only with the VkDevice 387fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * with which they were created. 388fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 389fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * If this call returns GrSemaphoresSubmited::kNo, the GPU backend will not have created or 390fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * added any semaphores to signal on the GPU. Thus the client should not have the GPU wait on 391fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * any of the semaphores. However, any pending surface IO will still be flushed. 392fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 393fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrSemaphoresSubmitted flushAndSignalSemaphores(int numSemaphores, 394fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrBackendSemaphore signalSemaphores[]); 395fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 396fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 397fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Inserts a list of GPU semaphores that the current backend 3D API must wait on before 398fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * executing any more commands on the GPU for this surface. Skia will take ownership of the 399fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * underlying semaphores and delete them once they have been signaled and waited on. 400fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 401fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * If this call returns false, then the GPU backend will not wait on any passed in semaphores, 402fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * and the client will still own the semaphores. 403fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 404fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool wait(int numSemaphores, const GrBackendSemaphore* waitSemaphores); 405fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 406fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 407fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * This creates a characterization of this SkSurface's properties that can 408fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * be used to perform gpu-backend preprocessing in a separate thread (via 409fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * the SkDeferredDisplayListRecorder). 410fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * It will return false on failure (e.g., if the SkSurface is cpu-backed). 411fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 412fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool characterize(SkSurfaceCharacterization* characterization) const; 413fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 414fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 415fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Draw a deferred display list (created via SkDeferredDisplayListRecorder). 416fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * The draw will be skipped if the characterization stored in the display list 417fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * isn't compatible with this surface. 418fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 419fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool draw(SkDeferredDisplayList* deferredDisplayList); 420fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 421fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected: 422fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkSurface(int width, int height, const SkSurfaceProps* surfaceProps); 423fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkSurface(const SkImageInfo& imageInfo, const SkSurfaceProps* surfaceProps); 424fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 425fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // called by subclass if their contents have changed 426fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void dirtyGenerationID() { 427fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fGenerationID = 0; 428fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 429fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 430fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 431fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkSurfaceProps fProps; 432fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const int fWidth; 433fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const int fHeight; 434fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot uint32_t fGenerationID; 435fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 436fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef SkRefCnt INHERITED; 437fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 438fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 439fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif 440