1 /* 2 * Copyright 2016 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 GrContextPriv_DEFINED 9 #define GrContextPriv_DEFINED 10 11 #include "GrContext.h" 12 #include "GrSurfaceContext.h" 13 14 class GrBackendRenderTarget; 15 class GrSemaphore; 16 class GrSurfaceProxy; 17 class GrOnFlushCallbackObject; 18 19 /** Class that adds methods to GrContext that are only intended for use internal to Skia. 20 This class is purely a privileged window into GrContext. It should never have additional 21 data members or virtual methods. */ 22 class GrContextPriv { 23 public: 24 GrDrawingManager* drawingManager() { return fContext->fDrawingManager.get(); } 25 26 sk_sp<GrSurfaceContext> makeWrappedSurfaceContext(sk_sp<GrSurfaceProxy>, sk_sp<SkColorSpace>); 27 28 sk_sp<GrSurfaceContext> makeDeferredSurfaceContext(const GrSurfaceDesc&, 29 SkBackingFit, 30 SkBudgeted); 31 32 // TODO: Maybe add a 'surfaceProps' param (that is ignored for non-RTs) and remove 33 // makeBackendTextureRenderTargetContext & makeBackendTextureAsRenderTargetRenderTargetContext 34 sk_sp<GrSurfaceContext> makeBackendSurfaceContext(const GrBackendTexture& tex, 35 GrSurfaceOrigin origin, 36 GrBackendTextureFlags flags, 37 int sampleCnt, 38 sk_sp<SkColorSpace> colorSpace); 39 40 sk_sp<GrRenderTargetContext> makeBackendTextureRenderTargetContext( 41 const GrBackendTexture& tex, 42 GrSurfaceOrigin origin, 43 int sampleCnt, 44 sk_sp<SkColorSpace> colorSpace, 45 const SkSurfaceProps* = nullptr); 46 47 sk_sp<GrRenderTargetContext> makeBackendRenderTargetRenderTargetContext( 48 const GrBackendRenderTarget&, 49 GrSurfaceOrigin origin, 50 sk_sp<SkColorSpace> colorSpace, 51 const SkSurfaceProps* = nullptr); 52 53 sk_sp<GrRenderTargetContext> makeBackendTextureAsRenderTargetRenderTargetContext( 54 const GrBackendTexture& tex, 55 GrSurfaceOrigin origin, 56 int sampleCnt, 57 sk_sp<SkColorSpace> colorSpace, 58 const SkSurfaceProps* = nullptr); 59 60 bool disableGpuYUVConversion() const { return fContext->fDisableGpuYUVConversion; } 61 62 /** 63 * Call to ensure all drawing to the context has been issued to the 64 * underlying 3D API. 65 * The 'proxy' parameter is a hint. If it is supplied the context will guarantee that 66 * the draws required for that proxy are flushed but it could do more. If no 'proxy' is 67 * provided then all current work will be flushed. 68 */ 69 void flush(GrSurfaceProxy*); 70 71 /** 72 * Registers an object for flush-related callbacks. (See GrOnFlushCallbackObject.) 73 * 74 * NOTE: the drawing manager tracks this object as a raw pointer; it is up to the caller to 75 * ensure its lifetime is tied to that of the context. 76 */ 77 void addOnFlushCallbackObject(GrOnFlushCallbackObject*); 78 79 void testingOnly_flushAndRemoveOnFlushCallbackObject(GrOnFlushCallbackObject*); 80 81 /** 82 * After this returns any pending writes to the surface will have been issued to the 83 * backend 3D API. 84 */ 85 void flushSurfaceWrites(GrSurfaceProxy*); 86 87 /** 88 * After this returns any pending reads or writes to the surface will have been issued to the 89 * backend 3D API. 90 */ 91 void flushSurfaceIO(GrSurfaceProxy*); 92 93 /** 94 * Finalizes all pending reads and writes to the surface and also performs an MSAA resolve 95 * if necessary. 96 * 97 * It is not necessary to call this before reading the render target via Skia/GrContext. 98 * GrContext will detect when it must perform a resolve before reading pixels back from the 99 * surface or using it as a texture. 100 */ 101 void prepareSurfaceForExternalIO(GrSurfaceProxy*); 102 103 /** 104 * These flags can be used with the read/write pixels functions below. 105 */ 106 enum PixelOpsFlags { 107 /** The GrContext will not be flushed before the surface read or write. This means that 108 the read or write may occur before previous draws have executed. */ 109 kDontFlush_PixelOpsFlag = 0x1, 110 /** Any surface writes should be flushed to the backend 3D API after the surface operation 111 is complete */ 112 kFlushWrites_PixelOp = 0x2, 113 /** The src for write or dst read is unpremultiplied. This is only respected if both the 114 config src and dst configs are an RGBA/BGRA 8888 format. */ 115 kUnpremul_PixelOpsFlag = 0x4, 116 }; 117 118 /** 119 * Reads a rectangle of pixels from a surface. 120 * @param src the surface context to read from. 121 * @param left left edge of the rectangle to read (inclusive) 122 * @param top top edge of the rectangle to read (inclusive) 123 * @param width width of rectangle to read in pixels. 124 * @param height height of rectangle to read in pixels. 125 * @param dstConfig the pixel config of the destination buffer 126 * @param dstColorSpace color space of the destination buffer 127 * @param buffer memory to read the rectangle into. 128 * @param rowBytes number of bytes bewtween consecutive rows. Zero means rows are tightly 129 * packed. 130 * @param pixelOpsFlags see PixelOpsFlags enum above. 131 * 132 * @return true if the read succeeded, false if not. The read can fail because of an unsupported 133 * pixel configs 134 */ 135 bool readSurfacePixels(GrSurfaceContext* src, 136 int left, int top, int width, int height, 137 GrPixelConfig dstConfig, SkColorSpace* dstColorSpace, void* buffer, 138 size_t rowBytes = 0, 139 uint32_t pixelOpsFlags = 0); 140 141 /** 142 * Writes a rectangle of pixels to a surface. 143 * @param dst the surface context to write to. 144 * @param left left edge of the rectangle to write (inclusive) 145 * @param top top edge of the rectangle to write (inclusive) 146 * @param width width of rectangle to write in pixels. 147 * @param height height of rectangle to write in pixels. 148 * @param srcConfig the pixel config of the source buffer 149 * @param srcColorSpace color space of the source buffer 150 * @param buffer memory to read pixels from 151 * @param rowBytes number of bytes between consecutive rows. Zero 152 * means rows are tightly packed. 153 * @param pixelOpsFlags see PixelOpsFlags enum above. 154 * @return true if the write succeeded, false if not. The write can fail because of an 155 * unsupported combination of surface and src configs. 156 */ 157 bool writeSurfacePixels(GrSurfaceContext* dst, 158 int left, int top, int width, int height, 159 GrPixelConfig srcConfig, SkColorSpace* srcColorSpace, const void* buffer, 160 size_t rowBytes, 161 uint32_t pixelOpsFlags = 0); 162 163 GrBackend getBackend() const { return fContext->fBackend; } 164 165 private: 166 explicit GrContextPriv(GrContext* context) : fContext(context) {} 167 GrContextPriv(const GrContextPriv&); // unimpl 168 GrContextPriv& operator=(const GrContextPriv&); // unimpl 169 170 // No taking addresses of this type. 171 const GrContextPriv* operator&() const; 172 GrContextPriv* operator&(); 173 174 GrContext* fContext; 175 176 friend class GrContext; // to construct/copy this type. 177 }; 178 179 inline GrContextPriv GrContext::contextPriv() { return GrContextPriv(this); } 180 181 inline const GrContextPriv GrContext::contextPriv () const { 182 return GrContextPriv(const_cast<GrContext*>(this)); 183 } 184 185 #endif 186