Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(237)

Unified Diff: src/gpu/GrGpu.h

Issue 1255483005: Attempt to somewhat simplify GrContext::readSurfacePixels interaction with GrGpu. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Address comments Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/gpu/GrContext.cpp ('k') | src/gpu/GrTest.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/gpu/GrGpu.h
diff --git a/src/gpu/GrGpu.h b/src/gpu/GrGpu.h
index 9365d8927f650d4da1e75635c6359207b99974a0..857efd0d65623d8d3dabdaa98521df62d07d115a 100644
--- a/src/gpu/GrGpu.h
+++ b/src/gpu/GrGpu.h
@@ -133,15 +133,58 @@ public:
*/
void resolveRenderTarget(GrRenderTarget* target);
+ /** Info struct returned by getReadPixelsInfo about performing intermediate draws before
+ reading pixels for performance or correctness. */
+ struct ReadPixelTempDrawInfo {
+ /** If the GrGpu is requesting that the caller do a draw to an intermediate surface then
+ this is descriptor for the temp surface. The draw should always be a rect with
+ dst 0,0,w,h. */
+ GrSurfaceDesc fTempSurfaceDesc;
+ /** Indicates whether there is a performance advantage to using an exact match texture
+ (in terms of width and height) for the intermediate texture instead of approximate. */
+ bool fUseExactScratch;
+ /** The caller should swap the R and B channel in the temp draw and then instead of reading
+ the desired config back it should read GrPixelConfigSwapRAndB(readConfig). The swap
+ during the draw and the swap at readback time cancel and the client gets the correct
+ data. The swapped read back is either faster for or required by the underlying backend
+ 3D API. */
+ bool fSwapRAndB;
+ };
+ /** Describes why an intermediate draw must/should be performed before readPixels. */
+ enum DrawPreference {
+ /** On input means that the caller would proceed without draw if the GrGpu doesn't request
+ one.
+ On output means that the GrGpu is not requesting a draw. */
+ kNoDraw_DrawPreference,
+ /** Means that the client would prefer a draw for performance of the readback but
+ can satisfy a straight readPixels call on the inputs without an intermediate draw.
+ getReadPixelsInfo will never set the draw preference to this value but may leave
+ it set. */
+ kCallerPrefersDraw_DrawPreference,
+ /** On output means that GrGpu would prefer a draw for performance of the readback but
+ can satisfy a straight readPixels call on the inputs without an intermediate draw. The
+ caller of getReadPixelsInfo should never specify this on intput. */
+ kGpuPrefersDraw_DrawPreference,
+ /** On input means that the caller requires a draw to do a transformation and there is no
+ CPU fallback.
+ On output means that GrGpu can only satisfy the readPixels request if the intermediate
+ draw is performed.
+ */
+ kRequireDraw_DrawPreference
+ };
+
+ /** Used to negotiates whether and how an intermediate draw should or must be performed before
+ a readPixels call. If this returns false then GrGpu could not deduce an intermediate draw
+ that would allow a successful readPixels call. */
+ virtual bool getReadPixelsInfo(GrSurface* srcSurface, int readWidth, int readHeight,
+ size_t rowBytes, GrPixelConfig readConfig, DrawPreference*,
+ ReadPixelTempDrawInfo *) = 0;
+
/**
- * Gets a preferred 8888 config to use for writing/reading pixel data to/from a surface with
+ * Gets a preferred 8888 config to use for writing pixel data to a surface with
* config surfaceConfig. The returned config must have at least as many bits per channel as the
- * readConfig or writeConfig param.
+ * writeConfig param.
*/
- virtual GrPixelConfig preferredReadPixelsConfig(GrPixelConfig readConfig,
- GrPixelConfig surfaceConfig) const {
- return readConfig;
- }
virtual GrPixelConfig preferredWritePixelsConfig(GrPixelConfig writeConfig,
GrPixelConfig surfaceConfig) const {
return writeConfig;
@@ -154,35 +197,6 @@ public:
virtual bool canWriteTexturePixels(const GrTexture*, GrPixelConfig srcConfig) const = 0;
/**
- * OpenGL's readPixels returns the result bottom-to-top while the skia
- * API is top-to-bottom. Thus we have to do a y-axis flip. The obvious
- * solution is to have the subclass do the flip using either the CPU or GPU.
- * However, the caller (GrContext) may have transformations to apply and can
- * simply fold in the y-flip for free. On the other hand, the subclass may
- * be able to do it for free itself. For example, the subclass may have to
- * do memcpys to handle rowBytes that aren't tight. It could do the y-flip
- * concurrently.
- *
- * This function returns true if a y-flip is required to put the pixels in
- * top-to-bottom order and the subclass cannot do it for free.
- *
- * See read pixels for the params
- * @return true if calling readPixels with the same set of params will
- * produce bottom-to-top data
- */
- virtual bool readPixelsWillPayForYFlip(GrRenderTarget* renderTarget,
- int left, int top,
- int width, int height,
- GrPixelConfig config,
- size_t rowBytes) const = 0;
- /**
- * This should return true if reading a NxM rectangle of pixels from a
- * render target is faster if the target has dimensons N and M and the read
- * rectangle has its top-left at 0,0.
- */
- virtual bool fullReadPixelsIsFasterThanPartial() const { return false; };
-
- /**
* Reads a rectangle of pixels from a render target.
*
* @param renderTarget the render target to read from. NULL means the
« no previous file with comments | « src/gpu/GrContext.cpp ('k') | src/gpu/GrTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698