void setData(const GrGLProgramDataManager& pdman, const GrProcessor& proc) override { const LightingFP& lightingFP = proc.cast<LightingFP>(); SkVector3 lightDir = lightingFP.lightDir(); if (lightDir != fLightDir) { pdman.set3fv(fLightDirUni, 1, &lightDir.fX); fLightDir = lightDir; } GrColor lightColor = lightingFP.lightColor(); if (lightColor != fLightColor) { GrGLfloat c[4]; GrColorToRGBAFloat(lightColor, c); pdman.set4fv(fLightColorUni, 1, c); fLightColor = lightColor; } GrColor ambientColor = lightingFP.ambientColor(); if (ambientColor != fAmbientColor) { GrGLfloat c[4]; GrColorToRGBAFloat(ambientColor, c); pdman.set4fv(fAmbientColorUni, 1, c); fAmbientColor = ambientColor; } }
void GrGLProgram::setColor(const GrDrawState& drawState, GrColor color, SharedGLState* sharedState) { const GrGLProgramDesc::KeyHeader& header = fDesc.getHeader(); if (!drawState.hasColorVertexAttribute() || drawState.canIgnoreColorAttribute()) { switch (header.fColorInput) { case GrGLProgramDesc::kAttribute_ColorInput: SkASSERT(-1 != header.fColorAttributeIndex); if (sharedState->fConstAttribColor != color || sharedState->fConstAttribColorIndex != header.fColorAttributeIndex) { // OpenGL ES only supports the float varieties of glVertexAttrib GrGLfloat c[4]; GrColorToRGBAFloat(color, c); GL_CALL(VertexAttrib4fv(header.fColorAttributeIndex, c)); sharedState->fConstAttribColor = color; sharedState->fConstAttribColorIndex = header.fColorAttributeIndex; } break; case GrGLProgramDesc::kUniform_ColorInput: if (fColor != color && fBuilderOutput.fUniformHandles.fColorUni.isValid()) { // OpenGL ES doesn't support unsigned byte varieties of glUniform GrGLfloat c[4]; GrColorToRGBAFloat(color, c); fUniformManager->set4fv(fBuilderOutput.fUniformHandles.fColorUni, 1, c); fColor = color; } sharedState->fConstAttribColorIndex = -1; break; default: SkFAIL("Unexpected color type."); } } else { sharedState->fConstAttribColorIndex = -1; } }
void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcessor& primProc, FPCoordTransformIter&& transformIter) override { const GrCubicEffect& ce = primProc.cast<GrCubicEffect>(); if (!ce.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(ce.viewMatrix())) { fViewMatrix = ce.viewMatrix(); float viewMatrix[3 * 3]; GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix); pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); } if (!fDevKLMMatrix.cheapEqualTo(ce.devKLMMatrix())) { fDevKLMMatrix = ce.devKLMMatrix(); float devKLMMatrix[3 * 3]; GrGLSLGetMatrix<3>(devKLMMatrix, fDevKLMMatrix); pdman.setMatrix3f(fDevKLMUniform, devKLMMatrix); } if (ce.color() != fColor) { float c[4]; GrColorToRGBAFloat(ce.color(), c); pdman.set4fv(fColorUniform, 1, c); fColor = ce.color(); } this->setTransformDataHelper(SkMatrix::I(), pdman, &transformIter); }
virtual void setData(const GrGLProgramDataManager& pdman, const GrPrimitiveProcessor& processor, const GrBatchTracker& bt) override { SkASSERT(fDistanceAdjustUni.isValid()); const GrDistanceFieldLCDTextureEffect& dfTexEffect = processor.cast<GrDistanceFieldLCDTextureEffect>(); GrDistanceFieldLCDTextureEffect::DistanceAdjust wa = dfTexEffect.getDistanceAdjust(); if (wa != fDistanceAdjust) { pdman.set3f(fDistanceAdjustUni, wa.fR, wa.fG, wa.fB); fDistanceAdjust = wa; } this->setUniformViewMatrix(pdman, processor.viewMatrix()); const DistanceFieldLCDBatchTracker& local = bt.cast<DistanceFieldLCDBatchTracker>(); if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) { GrGLfloat c[4]; GrColorToRGBAFloat(local.fColor, c); pdman.set4fv(fColorUniform, 1, c); fColor = local.fColor; } }
virtual void setData(const GrGLProgramDataManager& pdman, const GrPrimitiveProcessor& processor, const GrBatchTracker& bt) override { SkASSERT(fDistanceAdjustUni.isValid()); const GrDistanceFieldLCDTextGeoProc& dflcd = processor.cast<GrDistanceFieldLCDTextGeoProc>(); GrDistanceFieldLCDTextGeoProc::DistanceAdjust wa = dflcd.getDistanceAdjust(); if (wa != fDistanceAdjust) { pdman.set3f(fDistanceAdjustUni, wa.fR, wa.fG, wa.fB); fDistanceAdjust = wa; } if (!dflcd.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dflcd.viewMatrix())) { fViewMatrix = dflcd.viewMatrix(); GrGLfloat viewMatrix[3 * 3]; GrGLGetMatrix<3>(viewMatrix, fViewMatrix); pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); } if (dflcd.color() != fColor) { GrGLfloat c[4]; GrColorToRGBAFloat(dflcd.color(), c); pdman.set4fv(fColorUniform, 1, c); fColor = dflcd.color(); } }
void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcessor& gp, FPCoordTransformIter&& transformIter) override { const DefaultGeoProc& dgp = gp.cast<DefaultGeoProc>(); if (!dgp.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dgp.viewMatrix())) { fViewMatrix = dgp.viewMatrix(); float viewMatrix[3 * 3]; GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix); pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); } if (dgp.color() != fColor && !dgp.hasVertexColor()) { float c[4]; GrColorToRGBAFloat(dgp.color(), c); pdman.set4fv(fColorUniform, 1, c); fColor = dgp.color(); } if (dgp.coverage() != fCoverage && !dgp.hasVertexCoverage()) { pdman.set1f(fCoverageUniform, GrNormalizeByteToFloat(dgp.coverage())); fCoverage = dgp.coverage(); } this->setTransformDataHelper(dgp.fLocalMatrix, pdman, &transformIter); if (dgp.linearizeColor() && dgp.fColorSpaceXform) { fColorSpaceHelper.setData(pdman, dgp.fColorSpaceXform.get()); } }
virtual void setData(const GrGLProgramDataManager& pdman, const GrPrimitiveProcessor& gp, const GrBatchTracker& bt) override { const DefaultGeoProc& dgp = gp.cast<DefaultGeoProc>(); if (!dgp.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dgp.viewMatrix())) { fViewMatrix = dgp.viewMatrix(); GrGLfloat viewMatrix[3 * 3]; GrGLGetMatrix<3>(viewMatrix, fViewMatrix); pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); } if (dgp.color() != fColor && !dgp.hasVertexColor()) { GrGLfloat c[4]; GrColorToRGBAFloat(dgp.color(), c); pdman.set4fv(fColorUniform, 1, c); fColor = dgp.color(); } if (!dgp.coverageWillBeIgnored() && dgp.coverage() != fCoverage && !dgp.hasVertexCoverage()) { pdman.set1f(fCoverageUniform, GrNormalizeByteToFloat(dgp.coverage())); fCoverage = dgp.coverage(); } }
virtual void setData(const GrGLProgramDataManager& pdman, const GrPrimitiveProcessor& proc, const GrBatchTracker& bt) override { #ifdef SK_GAMMA_APPLY_TO_A8 const GrDistanceFieldA8TextGeoProc& dfTexEffect = proc.cast<GrDistanceFieldA8TextGeoProc>(); float distanceAdjust = dfTexEffect.getDistanceAdjust(); if (distanceAdjust != fDistanceAdjust) { pdman.set1f(fDistanceAdjustUni, distanceAdjust); fDistanceAdjust = distanceAdjust; } #endif const GrDistanceFieldA8TextGeoProc& dfa8gp = proc.cast<GrDistanceFieldA8TextGeoProc>(); if (!dfa8gp.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dfa8gp.viewMatrix())) { fViewMatrix = dfa8gp.viewMatrix(); GrGLfloat viewMatrix[3 * 3]; GrGLGetMatrix<3>(viewMatrix, fViewMatrix); pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); } if (dfa8gp.color() != fColor && !dfa8gp.hasVertexColor()) { GrGLfloat c[4]; GrColorToRGBAFloat(dfa8gp.color(), c); pdman.set4fv(fColorUniform, 1, c); fColor = dfa8gp.color(); } }
virtual void setData(const GrGLProgramDataManager& pdman, const GrPrimitiveProcessor& proc, const GrBatchTracker& bt) override { SkASSERT(fTextureSizeUni.isValid()); GrTexture* texture = proc.texture(0); if (texture->width() != fTextureSize.width() || texture->height() != fTextureSize.height()) { fTextureSize = SkISize::Make(texture->width(), texture->height()); pdman.set2f(fTextureSizeUni, SkIntToScalar(fTextureSize.width()), SkIntToScalar(fTextureSize.height())); } const GrDistanceFieldPathGeoProc& dfpgp = proc.cast<GrDistanceFieldPathGeoProc>(); if (!dfpgp.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dfpgp.viewMatrix())) { fViewMatrix = dfpgp.viewMatrix(); GrGLfloat viewMatrix[3 * 3]; GrGLGetMatrix<3>(viewMatrix, fViewMatrix); pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); } if (dfpgp.color() != fColor) { GrGLfloat c[4]; GrColorToRGBAFloat(dfpgp.color(), c); pdman.set4fv(fColorUniform, 1, c); fColor = dfpgp.color(); } }
GrVkGpuCommandBuffer::GrVkGpuCommandBuffer(GrVkGpu* gpu, GrVkRenderTarget* target, const LoadAndStoreInfo& colorInfo, const LoadAndStoreInfo& stencilInfo) : fGpu(gpu) , fRenderTarget(target) , fIsEmpty(true) , fStartsWithClear(false) { VkAttachmentLoadOp vkLoadOp; VkAttachmentStoreOp vkStoreOp; get_vk_load_store_ops(colorInfo, &vkLoadOp, &vkStoreOp); GrVkRenderPass::LoadStoreOps vkColorOps(vkLoadOp, vkStoreOp); get_vk_load_store_ops(stencilInfo, &vkLoadOp, &vkStoreOp); GrVkRenderPass::LoadStoreOps vkStencilOps(vkLoadOp, vkStoreOp); const GrVkResourceProvider::CompatibleRPHandle& rpHandle = target->compatibleRenderPassHandle(); if (rpHandle.isValid()) { fRenderPass = fGpu->resourceProvider().findRenderPass(rpHandle, vkColorOps, vkStencilOps); } else { fRenderPass = fGpu->resourceProvider().findRenderPass(*target, vkColorOps, vkStencilOps); } GrColorToRGBAFloat(colorInfo.fClearColor, fColorClearValue.color.float32); fCommandBuffer = gpu->resourceProvider().findOrCreateSecondaryCommandBuffer(); fCommandBuffer->begin(gpu, target->framebuffer(), fRenderPass); }
void GrGpuGL::flushColor(GrColor color) { const ProgramDesc& desc = fCurrentProgram->getDesc(); const GrDrawState& drawState = this->getDrawState(); if (this->getVertexLayout() & GrDrawState::kColor_VertexLayoutBit) { // color will be specified per-vertex as an attribute // invalidate the const vertex attrib color fHWConstAttribColor = GrColor_ILLEGAL; } else { switch (desc.fColorInput) { case ProgramDesc::kAttribute_ColorInput: if (fHWConstAttribColor != color) { // OpenGL ES only supports the float varieties of glVertexAttrib GrGLfloat c[4]; GrColorToRGBAFloat(color, c); GL_CALL(VertexAttrib4fv(GrGLProgram::ColorAttributeIdx(), c)); fHWConstAttribColor = color; } break; case ProgramDesc::kUniform_ColorInput: if (fCurrentProgram->fColor != color) { // OpenGL ES doesn't support unsigned byte varieties of glUniform GrGLfloat c[4]; GrColorToRGBAFloat(color, c); GrAssert(kInvalidUniformHandle != fCurrentProgram->fUniformHandles.fColorUni); fCurrentProgram->fUniformManager.set4fv( fCurrentProgram->fUniformHandles.fColorUni, 0, 1, c); fCurrentProgram->fColor = color; } break; case ProgramDesc::kSolidWhite_ColorInput: case ProgramDesc::kTransBlack_ColorInput: break; default: GrCrash("Unknown color type."); } } UniformHandle filterColorUni = fCurrentProgram->fUniformHandles.fColorFilterUni; if (kInvalidUniformHandle != filterColorUni && fCurrentProgram->fColorFilterColor != drawState.getColorFilterColor()) { GrGLfloat c[4]; GrColorToRGBAFloat(drawState.getColorFilterColor(), c); fCurrentProgram->fUniformManager.set4fv(filterColorUni, 0, 1, c); fCurrentProgram->fColorFilterColor = drawState.getColorFilterColor(); } }
void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcessor& gp) override { const GrBitmapTextGeoProc& btgp = gp.cast<GrBitmapTextGeoProc>(); if (btgp.color() != fColor && !btgp.hasVertexColor()) { float c[4]; GrColorToRGBAFloat(btgp.color(), c); pdman.set4fv(fColorUniform, 1, c); fColor = btgp.color(); } }
virtual void setData(const GrGLProgramDataManager& pdman, const GrProcessor& fp) override { if (fFilterColorUni.isValid()) { const ModeColorFilterEffect& colorModeFilter = fp.cast<ModeColorFilterEffect>(); GrGLfloat c[4]; GrColorToRGBAFloat(colorModeFilter.color(), c); pdman.set4fv(fFilterColorUni, 1, c); } }
void setData(const GrGLSLProgramDataManager& pd, const GrPrimitiveProcessor& primProc) override { const GrPathProcessor& pathProc = primProc.cast<GrPathProcessor>(); if (pathProc.overrides().readsColor() && pathProc.color() != fColor) { float c[4]; GrColorToRGBAFloat(pathProc.color(), c); pd.set4fv(fColorUniform, 1, c); fColor = pathProc.color(); } }
virtual void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcessor& gp) override { const PLSFinishEffect& fe = gp.cast<PLSFinishEffect>(); pdman.set1f(fUseEvenOdd, fe.fUseEvenOdd); if (fe.color() != fColor && !fe.colorIgnored()) { GrGLfloat c[4]; GrColorToRGBAFloat(fe.color(), c); pdman.set4fv(fColorUniform, 1, c); fColor = fe.color(); } }
void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcessor& gp, FPCoordTransformIter&& transformIter) override { const GrBitmapTextGeoProc& btgp = gp.cast<GrBitmapTextGeoProc>(); if (btgp.color() != fColor && !btgp.hasVertexColor()) { float c[4]; GrColorToRGBAFloat(btgp.color(), c); pdman.set4fv(fColorUniform, 1, c); fColor = btgp.color(); } this->setTransformDataHelper(btgp.localMatrix(), pdman, &transformIter); }
void GrGLPathProcessor::setData(const GrGLProgramDataManager& pdman, const GrPrimitiveProcessor& primProc, const GrBatchTracker& bt) { const PathBatchTracker& local = bt.cast<PathBatchTracker>(); if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) { GrGLfloat c[4]; GrColorToRGBAFloat(local.fColor, c); pdman.set4fv(fColorUniform, 1, c); fColor = local.fColor; } }
virtual void setData(const GrGLProgramDataManager& pdman, const GrPrimitiveProcessor& gp, const GrBatchTracker& bt) override { this->setUniformViewMatrix(pdman, gp.viewMatrix()); const BitmapTextBatchTracker& local = bt.cast<BitmapTextBatchTracker>(); if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) { GrGLfloat c[4]; GrColorToRGBAFloat(local.fColor, c); pdman.set4fv(fColorUniform, 1, c); fColor = local.fColor; } }
void ModeColorFilterEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const { float inputColor[4]; GrColorToRGBAFloat(inout->color(), inputColor); float filterColor[4]; GrColorToRGBAFloat(fColor, filterColor); MaskedColorExpr result = color_filter_expression(fMode, MaskedColorExpr(filterColor, kRGBA_GrColorComponentFlags), MaskedColorExpr(inputColor, inout->validFlags())); // Check if we will use the input color SkXfermode::Coeff dstCoeff; SkXfermode::Coeff srcCoeff; SkAssertResult(SkXfermode::ModeAsCoeff(fMode, &srcCoeff, &dstCoeff)); GrInvariantOutput::ReadInput readInput = GrInvariantOutput::kWill_ReadInput; // These could be calculated from the blend equation with template trickery.. if (SkXfermode::kZero_Coeff == dstCoeff && !GrBlendCoeffRefsDst(sk_blend_to_grblend(srcCoeff))) { readInput = GrInvariantOutput::kWillNot_ReadInput; } inout->setToOther(result.getValidComponents(), result.getColor(), readInput); }
void GrGLProgram::setCoverage(const GrDrawState& drawState, GrColor coverage, SharedGLState* sharedState) { const GrGLProgramDesc::KeyHeader& header = fDesc.getHeader(); if (!drawState.hasCoverageVertexAttribute()) { switch (header.fCoverageInput) { case GrGLProgramDesc::kAttribute_ColorInput: if (sharedState->fConstAttribCoverage != coverage || sharedState->fConstAttribCoverageIndex != header.fCoverageAttributeIndex) { // OpenGL ES only supports the float varieties of glVertexAttrib GrGLfloat c[4]; GrColorToRGBAFloat(coverage, c); GL_CALL(VertexAttrib4fv(header.fCoverageAttributeIndex, c)); sharedState->fConstAttribCoverage = coverage; sharedState->fConstAttribCoverageIndex = header.fCoverageAttributeIndex; } break; case GrGLProgramDesc::kUniform_ColorInput: if (fCoverage != coverage) { // OpenGL ES doesn't support unsigned byte varieties of glUniform GrGLfloat c[4]; GrColorToRGBAFloat(coverage, c); fUniformManager.set4fv(fUniformHandles.fCoverageUni, 1, c); fCoverage = coverage; } sharedState->fConstAttribCoverageIndex = -1; break; case GrGLProgramDesc::kSolidWhite_ColorInput: case GrGLProgramDesc::kTransBlack_ColorInput: sharedState->fConstAttribCoverageIndex = -1; break; default: GrCrash("Unknown coverage type."); } } else { sharedState->fConstAttribCoverageIndex = -1; } }
virtual void setData(const GrGLProgramDataManager& pdman, const GrPrimitiveProcessor& primProc, const GrBatchTracker& bt) override { const GrCubicEffect& ce = primProc.cast<GrCubicEffect>(); this->setUniformViewMatrix(pdman, ce.viewMatrix()); const CubicBatchTracker& local = bt.cast<CubicBatchTracker>(); if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) { GrGLfloat c[4]; GrColorToRGBAFloat(local.fColor, c); pdman.set4fv(fColorUniform, 1, c); fColor = local.fColor; } }
void set_dynamic_blend_constant_state(GrVkGpu* gpu, GrVkCommandBuffer* cmdBuffer, const GrPipeline& pipeline) { GrXferProcessor::BlendInfo blendInfo; pipeline.getXferProcessor().getBlendInfo(&blendInfo); GrBlendCoeff srcCoeff = blendInfo.fSrcBlend; GrBlendCoeff dstCoeff = blendInfo.fDstBlend; float floatColors[4]; if (blend_coeff_refs_constant(srcCoeff) || blend_coeff_refs_constant(dstCoeff)) { GrColorToRGBAFloat(blendInfo.fBlendConstant, floatColors); } else { memset(floatColors, 0, 4 * sizeof(float)); } cmdBuffer->setBlendConstants(gpu, floatColors); }
void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcessor& primProc) override { const GrCubicEffect& ce = primProc.cast<GrCubicEffect>(); if (!ce.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(ce.viewMatrix())) { fViewMatrix = ce.viewMatrix(); float viewMatrix[3 * 3]; GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix); pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); } if (ce.color() != fColor) { float c[4]; GrColorToRGBAFloat(ce.color(), c); pdman.set4fv(fColorUniform, 1, c); fColor = ce.color(); } }
virtual void setData(const GrGLProgramDataManager& pdman, const GrPrimitiveProcessor& primProc, const GrBatchTracker& bt) override { const GrQuadEffect& qe = primProc.cast<GrQuadEffect>(); this->setUniformViewMatrix(pdman, qe.viewMatrix()); const QuadBatchTracker& local = bt.cast<QuadBatchTracker>(); if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) { GrGLfloat c[4]; GrColorToRGBAFloat(local.fColor, c); pdman.set4fv(fColorUniform, 1, c); fColor = local.fColor; } if (0xff != local.fCoverageScale && local.fCoverageScale != fCoverageScale) { pdman.set1f(fCoverageScaleUniform, GrNormalizeByteToFloat(local.fCoverageScale)); fCoverageScale = local.fCoverageScale; } }
void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcessor& gp, FPCoordTransformIter&& transformIter) override { const GrBitmapTextGeoProc& btgp = gp.cast<GrBitmapTextGeoProc>(); if (btgp.color() != fColor && !btgp.hasVertexColor()) { float c[4]; GrColorToRGBAFloat(btgp.color(), c); pdman.set4fv(fColorUniform, 1, c); fColor = btgp.color(); } const SkISize& atlasSize = btgp.atlasSize(); SkASSERT(SkIsPow2(atlasSize.fWidth) && SkIsPow2(atlasSize.fHeight)); if (fAtlasSize != atlasSize) { pdman.set2f(fAtlasSizeInvUniform, 1.0f / atlasSize.fWidth, 1.0f / atlasSize.fHeight); fAtlasSize = atlasSize; } this->setTransformDataHelper(btgp.localMatrix(), pdman, &transformIter); }
void GrGLProgram::setColor(const GrOptDrawState& optState, GrColor color) { const GrProgramDesc::KeyHeader& header = fDesc.header(); switch (header.fColorInput) { case GrProgramDesc::kAttribute_ColorInput: // Attribute case is handled in GrGpuGL::setupGeometry break; case GrProgramDesc::kUniform_ColorInput: if (fColor != color && fBuiltinUniformHandles.fColorUni.isValid()) { // OpenGL ES doesn't support unsigned byte varieties of glUniform GrGLfloat c[4]; GrColorToRGBAFloat(color, c); fProgramDataManager.set4fv(fBuiltinUniformHandles.fColorUni, 1, c); fColor = color; } break; case GrProgramDesc::kAllOnes_ColorInput: // Handled by shader creation break; default: SkFAIL("Unexpected color type."); } }
void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcessor& primProc) override { const GrQuadEffect& qe = primProc.cast<GrQuadEffect>(); if (!qe.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(qe.viewMatrix())) { fViewMatrix = qe.viewMatrix(); float viewMatrix[3 * 3]; GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix); pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); } if (qe.color() != fColor) { float c[4]; GrColorToRGBAFloat(qe.color(), c); pdman.set4fv(fColorUniform, 1, c); fColor = qe.color(); } if (qe.coverageScale() != 0xff && qe.coverageScale() != fCoverageScale) { pdman.set1f(fCoverageScaleUniform, GrNormalizeByteToFloat(qe.coverageScale())); fCoverageScale = qe.coverageScale(); } }
virtual void setData(const GrGLProgramDataManager& pdman, const GrPrimitiveProcessor& proc, const GrBatchTracker& bt) override { #ifdef SK_GAMMA_APPLY_TO_A8 const GrDistanceFieldTextureEffect& dfTexEffect = proc.cast<GrDistanceFieldTextureEffect>(); float distanceAdjust = dfTexEffect.getDistanceAdjust(); if (distanceAdjust != fDistanceAdjust) { pdman.set1f(fDistanceAdjustUni, distanceAdjust); fDistanceAdjust = distanceAdjust; } #endif this->setUniformViewMatrix(pdman, proc.viewMatrix()); const DistanceFieldBatchTracker& local = bt.cast<DistanceFieldBatchTracker>(); if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) { GrGLfloat c[4]; GrColorToRGBAFloat(local.fColor, c); pdman.set4fv(fColorUniform, 1, c); fColor = local.fColor; } }
void setup_color_blend_state(const GrVkGpu* gpu, const GrPipeline& pipeline, VkPipelineColorBlendStateCreateInfo* colorBlendInfo, VkPipelineColorBlendAttachmentState* attachmentState) { GrXferProcessor::BlendInfo blendInfo; pipeline.getXferProcessor().getBlendInfo(&blendInfo); GrBlendEquation equation = blendInfo.fEquation; GrBlendCoeff srcCoeff = blendInfo.fSrcBlend; GrBlendCoeff dstCoeff = blendInfo.fDstBlend; bool blendOff = (kAdd_GrBlendEquation == equation || kSubtract_GrBlendEquation == equation) && kOne_GrBlendCoeff == srcCoeff && kZero_GrBlendCoeff == dstCoeff; memset(attachmentState, 0, sizeof(VkPipelineColorBlendAttachmentState)); attachmentState->blendEnable = !blendOff; if (!blendOff) { attachmentState->srcColorBlendFactor = blend_coeff_to_vk_blend(srcCoeff); attachmentState->dstColorBlendFactor = blend_coeff_to_vk_blend(dstCoeff); attachmentState->colorBlendOp = blend_equation_to_vk_blend_op(equation); attachmentState->srcAlphaBlendFactor = blend_coeff_to_vk_blend(srcCoeff); attachmentState->dstAlphaBlendFactor = blend_coeff_to_vk_blend(dstCoeff); attachmentState->alphaBlendOp = blend_equation_to_vk_blend_op(equation); } attachmentState->colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT; memset(colorBlendInfo, 0, sizeof(VkPipelineColorBlendStateCreateInfo)); colorBlendInfo->sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO; colorBlendInfo->pNext = nullptr; colorBlendInfo->flags = 0; colorBlendInfo->logicOpEnable = VK_FALSE; colorBlendInfo->attachmentCount = 1; colorBlendInfo->pAttachments = attachmentState; if (blend_coeff_refs_constant(srcCoeff) || blend_coeff_refs_constant(dstCoeff)) { GrColorToRGBAFloat(blendInfo.fBlendConstant, colorBlendInfo->blendConstants); } }
void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcessor& primProc, FPCoordTransformIter&& transformIter) override { const GrConicEffect& ce = primProc.cast<GrConicEffect>(); if (!ce.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(ce.viewMatrix())) { fViewMatrix = ce.viewMatrix(); float viewMatrix[3 * 3]; GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix); pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); } if (ce.color() != fColor) { float c[4]; GrColorToRGBAFloat(ce.color(), c); pdman.set4fv(fColorUniform, 1, c); fColor = ce.color(); } if (ce.coverageScale() != 0xff && ce.coverageScale() != fCoverageScale) { pdman.set1f(fCoverageScaleUniform, GrNormalizeByteToFloat(ce.coverageScale())); fCoverageScale = ce.coverageScale(); } this->setTransformDataHelper(ce.localMatrix(), pdman, &transformIter); }