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

Unified Diff: src/gpu/gl/GrGLGpu.cpp

Issue 1530713002: make alpha read back of bgra/rgba work (Closed) Base URL: https://skia.googlesource.com/skia.git@align
Patch Set: cleanup Created 5 years 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/gl/GrGLGpu.h ('k') | src/gpu/gl/GrGLProgramDesc.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/gpu/gl/GrGLGpu.cpp
diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp
index fdf7eece7efb6f38b4d28e00a9cd4958bc00c887..d07203e376baba7dd0da29dddf0247ca0c1d5add 100644
--- a/src/gpu/gl/GrGLGpu.cpp
+++ b/src/gpu/gl/GrGLGpu.cpp
@@ -1594,7 +1594,7 @@ bool GrGLGpu::flushGLState(const DrawArgs& args) {
}
if (blendInfo.fWriteColor) {
- this->flushBlend(blendInfo);
+ this->flushBlend(blendInfo, SkToBool(args.fDesc->header().fSwapDstRedAndAlpha));
}
SkSTArray<8, const GrTextureAccess*> textureAccesses;
@@ -2073,6 +2073,30 @@ bool GrGLGpu::onReadPixels(GrSurface* surface,
SkFAIL("Unknown resolve type");
}
+ // This must be called after the RT is bound as the FBO above.
+ if (!this->glCaps().readPixelsSupported(this->glInterface(), format, type, tgt->config())) {
+ // We fail except the special case of reading back just the alpha channel of a RGBA/BGRA
+ // target.
+ if ((tgt->config() == kRGBA_8888_GrPixelConfig ||
+ tgt->config() == kBGRA_8888_GrPixelConfig) &&
+ kAlpha_8_GrPixelConfig == config) {
+ SkDebugf("");
+ SkAutoTDeleteArray<uint32_t> temp(new uint32_t[width * height * 4]);
+ if (this->onReadPixels(surface, left, top, width, height, tgt->config(), temp.get(),
+ width*4)) {
+ uint8_t* dst = reinterpret_cast<uint8_t*>(buffer);
+ for (int j = 0; j < height; ++j) {
+ for (int i = 0; i < width; ++i) {
+ dst[j*rowBytes + i] = (0xFF000000U & temp[j*width+i]) >> 24;
+ }
+ }
+ SkDebugf("rowBytes: %d\n", rowBytes);
+ return true;
+ }
+ }
+ return false;
+ }
+
const GrGLIRect& glvp = tgt->getViewport();
// the read rect is viewport-relative
@@ -2422,7 +2446,7 @@ void GrGLGpu::flushHWAAState(GrRenderTarget* rt, bool useHWAA) {
}
}
-void GrGLGpu::flushBlend(const GrXferProcessor::BlendInfo& blendInfo) {
+void GrGLGpu::flushBlend(const GrXferProcessor::BlendInfo& blendInfo, bool swapConstRedAndAlpha) {
// Any optimization to disable blending should have already been applied and
// tweaked the equation to "add" or "subtract", and the coeffs to (1, 0).
@@ -2476,15 +2500,18 @@ void GrGLGpu::flushBlend(const GrXferProcessor::BlendInfo& blendInfo) {
}
GrColor blendConst = blendInfo.fBlendConstant;
- if ((BlendCoeffReferencesConstant(srcCoeff) ||
- BlendCoeffReferencesConstant(dstCoeff)) &&
- (!fHWBlendState.fConstColorValid ||
- fHWBlendState.fConstColor != blendConst)) {
- GrGLfloat c[4];
- GrColorToRGBAFloat(blendConst, c);
- GL_CALL(BlendColor(c[0], c[1], c[2], c[3]));
- fHWBlendState.fConstColor = blendConst;
- fHWBlendState.fConstColorValid = true;
+ if ((BlendCoeffReferencesConstant(srcCoeff) || BlendCoeffReferencesConstant(dstCoeff))) {
+ if (swapConstRedAndAlpha) {
+ blendConst = GrColorPackRGBA(GrColorUnpackA(blendConst), GrColorUnpackG(blendConst),
+ GrColorUnpackB(blendConst), GrColorUnpackR(blendConst));
+ }
+ if (!fHWBlendState.fConstColorValid || fHWBlendState.fConstColor != blendConst) {
+ GrGLfloat c[4];
+ GrColorToRGBAFloat(blendConst, c);
+ GL_CALL(BlendColor(c[0], c[1], c[2], c[3]));
+ fHWBlendState.fConstColor = blendConst;
+ fHWBlendState.fConstColorValid = true;
+ }
}
}
@@ -3330,7 +3357,7 @@ void GrGLGpu::drawDebugWireRect(GrRenderTarget* rt, const SkIRect& rect, GrColor
GrXferProcessor::BlendInfo blendInfo;
blendInfo.reset();
- this->flushBlend(blendInfo);
+ this->flushBlend(blendInfo, false);
this->flushColorWrite(true);
this->flushDrawFace(GrPipelineBuilder::kBoth_DrawFace);
this->flushHWAAState(glRT, false);
@@ -3401,7 +3428,7 @@ void GrGLGpu::copySurfaceAsDraw(GrSurface* dst,
GrXferProcessor::BlendInfo blendInfo;
blendInfo.reset();
- this->flushBlend(blendInfo);
+ this->flushBlend(blendInfo, false);
this->flushColorWrite(true);
this->flushDrawFace(GrPipelineBuilder::kBoth_DrawFace);
this->flushHWAAState(dstRT, false);
« no previous file with comments | « src/gpu/gl/GrGLGpu.h ('k') | src/gpu/gl/GrGLProgramDesc.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698