Home | History | Annotate | Download | only in image
      1 /*
      2  * Copyright 2018 Google Inc.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 #ifndef SkImage_GpuYUVA_DEFINED
      9 #define SkImage_GpuYUVA_DEFINED
     10 
     11 #include "GrBackendSurface.h"
     12 #include "GrContext.h"
     13 #include "SkCachedData.h"
     14 #include "SkImage_GpuBase.h"
     15 
     16 class GrTexture;
     17 struct SkYUVASizeInfo;
     18 
     19 // Wraps the 3 or 4 planes of a YUVA image for consumption by the GPU.
     20 // Initially any direct rendering will be done by passing the individual planes to a shader.
     21 // Once any method requests a flattened image (e.g., onReadPixels), the flattened RGB
     22 // proxy will be stored and used for any future rendering.
     23 class SkImage_GpuYUVA : public SkImage_GpuBase {
     24 public:
     25     friend class GrYUVAImageTextureMaker;
     26 
     27     SkImage_GpuYUVA(sk_sp<GrContext>, int width, int height, uint32_t uniqueID, SkYUVColorSpace,
     28                     sk_sp<GrTextureProxy> proxies[], int numProxies, const SkYUVAIndex[4],
     29                     GrSurfaceOrigin, sk_sp<SkColorSpace>);
     30     ~SkImage_GpuYUVA() override;
     31 
     32     SkImageInfo onImageInfo() const override;
     33 
     34     GrTextureProxy* peekProxy() const override { return this->asTextureProxyRef().get(); }
     35     sk_sp<GrTextureProxy> asTextureProxyRef() const override;
     36 
     37     virtual bool onIsTextureBacked() const override { return SkToBool(fProxies[0].get()); }
     38 
     39     sk_sp<SkImage> onMakeColorTypeAndColorSpace(SkColorType, sk_sp<SkColorSpace>) const final;
     40 
     41     virtual bool isYUVA() const override { return true; }
     42     virtual bool asYUVATextureProxiesRef(sk_sp<GrTextureProxy> proxies[4],
     43                                          SkYUVAIndex yuvaIndices[4],
     44                                          SkYUVColorSpace* yuvColorSpace) const override {
     45         for (int i = 0; i < 4; ++i) {
     46             proxies[i] = fProxies[i];
     47             yuvaIndices[i] = fYUVAIndices[i];
     48         }
     49         *yuvColorSpace = fYUVColorSpace;
     50         return true;
     51     }
     52 
     53     bool setupMipmapsForPlanes() const;
     54 
     55     // Returns a ref-ed texture proxy with miplevels
     56     sk_sp<GrTextureProxy> asMippedTextureProxyRef() const;
     57 
     58     SkColorSpace* targetColorSpace() const { return fTargetColorSpace.get(); }
     59 
     60     /**
     61      * This is the implementation of SkDeferredDisplayListRecorder::makeYUVAPromiseTexture.
     62      */
     63     static sk_sp<SkImage> MakePromiseYUVATexture(GrContext* context,
     64                                                  SkYUVColorSpace yuvColorSpace,
     65                                                  const GrBackendFormat yuvaFormats[],
     66                                                  const SkISize yuvaSizes[],
     67                                                  const SkYUVAIndex yuvaIndices[4],
     68                                                  int width,
     69                                                  int height,
     70                                                  GrSurfaceOrigin imageOrigin,
     71                                                  sk_sp<SkColorSpace> imageColorSpace,
     72                                                  PromiseImageTextureFulfillProc textureFulfillProc,
     73                                                  PromiseImageTextureReleaseProc textureReleaseProc,
     74                                                  PromiseImageTextureDoneProc textureDoneProc,
     75                                                  PromiseImageTextureContext textureContexts[],
     76                                                  DelayReleaseCallback delayReleaseCallback);
     77 
     78 private:
     79     SkImage_GpuYUVA(const SkImage_GpuYUVA* image, sk_sp<SkColorSpace>);
     80 
     81     // This array will usually only be sparsely populated.
     82     // The actual non-null fields are dictated by the 'fYUVAIndices' indices
     83     mutable sk_sp<GrTextureProxy>    fProxies[4];
     84     int                              fNumProxies;
     85     SkYUVAIndex                      fYUVAIndices[4];
     86     const SkYUVColorSpace            fYUVColorSpace;
     87     GrSurfaceOrigin                  fOrigin;
     88     const sk_sp<SkColorSpace>        fTargetColorSpace;
     89 
     90     // Repeated calls to onMakeColorSpace will result in a proliferation of unique IDs and
     91     // SkImage_GpuYUVA instances. Cache the result of the last successful onMakeColorSpace call.
     92     mutable sk_sp<SkColorSpace>      fOnMakeColorSpaceTarget;
     93     mutable sk_sp<SkImage>           fOnMakeColorSpaceResult;
     94 
     95     // This is only allocated when the image needs to be flattened rather than
     96     // using the separate YUVA planes. From thence forth we will only use the
     97     // the RGBProxy.
     98     mutable sk_sp<GrTextureProxy>    fRGBProxy;
     99     typedef SkImage_GpuBase INHERITED;
    100 };
    101 
    102 #endif
    103