| Index: src/gpu/gl/GrGLGpu.cpp
|
| diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp
|
| index b095e66ea3272a98ce3060a64979ad84518119f5..8033ea60e5590de4efd3236c06048bb181435183 100644
|
| --- a/src/gpu/gl/GrGLGpu.cpp
|
| +++ b/src/gpu/gl/GrGLGpu.cpp
|
| @@ -1570,7 +1570,10 @@ bool GrGLGpu::flushGLState(const DrawArgs& args) {
|
| }
|
|
|
| if (blendInfo.fWriteColor) {
|
| - this->flushBlend(blendInfo);
|
| + // Swizzle the blend to match what the shader will output.
|
| + const GrSwizzle& swizzle = this->glCaps().glslCaps()->configOutputSwizzle(
|
| + args.fPipeline->getRenderTarget()->config());
|
| + this->flushBlend(blendInfo, swizzle);
|
| }
|
|
|
| SkSTArray<8, const GrTextureAccess*> textureAccesses;
|
| @@ -1650,7 +1653,7 @@ void GrGLGpu::setupGeometry(const GrPrimitiveProcessor& primProc,
|
| void GrGLGpu::buildProgramDesc(GrProgramDesc* desc,
|
| const GrPrimitiveProcessor& primProc,
|
| const GrPipeline& pipeline) const {
|
| - if (!GrGLProgramDescBuilder::Build(desc, primProc, pipeline, this)) {
|
| + if (!GrGLProgramDescBuilder::Build(desc, primProc, pipeline, *this->glCaps().glslCaps())) {
|
| SkDEBUGFAIL("Failed to generate GL program descriptor");
|
| }
|
| }
|
| @@ -2395,7 +2398,7 @@ void GrGLGpu::flushHWAAState(GrRenderTarget* rt, bool useHWAA) {
|
| }
|
| }
|
|
|
| -void GrGLGpu::flushBlend(const GrXferProcessor::BlendInfo& blendInfo) {
|
| +void GrGLGpu::flushBlend(const GrXferProcessor::BlendInfo& blendInfo, const GrSwizzle& swizzle) {
|
| // Any optimization to disable blending should have already been applied and
|
| // tweaked the equation to "add" or "subtract", and the coeffs to (1, 0).
|
|
|
| @@ -2448,15 +2451,16 @@ void GrGLGpu::flushBlend(const GrXferProcessor::BlendInfo& blendInfo) {
|
| fHWBlendState.fDstCoeff = dstCoeff;
|
| }
|
|
|
| - 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))) {
|
| + GrColor blendConst = blendInfo.fBlendConstant;
|
| + blendConst = swizzle.applyTo(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;
|
| + }
|
| }
|
| }
|
|
|
| @@ -2840,6 +2844,12 @@ bool GrGLGpu::onCopySurface(GrSurface* dst,
|
| GrSurface* src,
|
| const SkIRect& srcRect,
|
| const SkIPoint& dstPoint) {
|
| + // None of our copy methods can handle a swizzle. TODO: Make copySurfaceAsDraw handle the
|
| + // swizzle.
|
| + if (this->glCaps().glslCaps()->configOutputSwizzle(src->config()) !=
|
| + this->glCaps().glslCaps()->configOutputSwizzle(dst->config())) {
|
| + return false;
|
| + }
|
| if (src->asTexture() && dst->asRenderTarget()) {
|
| this->copySurfaceAsDraw(dst, src, srcRect, dstPoint);
|
| return true;
|
| @@ -3064,6 +3074,9 @@ void GrGLGpu::createWireRectProgram() {
|
| }
|
|
|
| void GrGLGpu::drawDebugWireRect(GrRenderTarget* rt, const SkIRect& rect, GrColor color) {
|
| + // TODO: This should swizzle the output to match dst's config, though it is a debugging
|
| + // visualization.
|
| +
|
| this->handleDirtyContext();
|
| if (!fWireRectProgram.fProgram) {
|
| this->createWireRectProgram();
|
| @@ -3114,7 +3127,7 @@ void GrGLGpu::drawDebugWireRect(GrRenderTarget* rt, const SkIRect& rect, GrColor
|
|
|
| GrXferProcessor::BlendInfo blendInfo;
|
| blendInfo.reset();
|
| - this->flushBlend(blendInfo);
|
| + this->flushBlend(blendInfo, GrSwizzle::RGBA());
|
| this->flushColorWrite(true);
|
| this->flushDrawFace(GrPipelineBuilder::kBoth_DrawFace);
|
| this->flushHWAAState(glRT, false);
|
| @@ -3185,7 +3198,7 @@ void GrGLGpu::copySurfaceAsDraw(GrSurface* dst,
|
|
|
| GrXferProcessor::BlendInfo blendInfo;
|
| blendInfo.reset();
|
| - this->flushBlend(blendInfo);
|
| + this->flushBlend(blendInfo, GrSwizzle::RGBA());
|
| this->flushColorWrite(true);
|
| this->flushDrawFace(GrPipelineBuilder::kBoth_DrawFace);
|
| this->flushHWAAState(dstRT, false);
|
|
|