/* * Copyright 2019 Google LLC * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef GrProgramInfo_DEFINED #define GrProgramInfo_DEFINED #include "include/gpu/GrTypes.h" #include "src/gpu/GrGeometryProcessor.h" #include "src/gpu/GrPipeline.h" class GrStencilSettings; class GrProgramInfo { public: GrProgramInfo(const GrCaps& caps, const GrSurfaceProxyView& targetView, bool usesMSAASurface, const GrPipeline* pipeline, const GrUserStencilSettings* userStencilSettings, const GrGeometryProcessor* geomProc, GrPrimitiveType primitiveType, uint8_t tessellationPatchVertexCount, GrXferBarrierFlags renderPassXferBarriers, GrLoadOp colorLoadOp) : fNeedsStencil(targetView.asRenderTargetProxy()->needsStencil()) , fBackendFormat(targetView.proxy()->backendFormat()) , fOrigin(targetView.origin()) , fTargetHasVkResolveAttachmentWithInput( targetView.asRenderTargetProxy()->supportsVkInputAttachment() && ((targetView.asRenderTargetProxy()->numSamples() > 1 && targetView.asTextureProxy()) || targetView.asRenderTargetProxy()->numSamples() == 1)) , fTargetsNumSamples(targetView.asRenderTargetProxy()->numSamples()) , fPipeline(pipeline) , fUserStencilSettings(userStencilSettings) , fGeomProc(geomProc) , fPrimitiveType(primitiveType) , fTessellationPatchVertexCount(tessellationPatchVertexCount) , fRenderPassXferBarriers(renderPassXferBarriers) , fColorLoadOp(colorLoadOp) { SkASSERT(fTargetsNumSamples > 0); fNumSamples = fTargetsNumSamples; if (fNumSamples == 1 && usesMSAASurface) { fNumSamples = caps.internalMultisampleCount(this->backendFormat()); } SkASSERT((GrPrimitiveType::kPatches == fPrimitiveType) == (fTessellationPatchVertexCount > 0)); SkDEBUGCODE(this->validate(false);) } int numSamples() const { return fNumSamples; } int needsStencil() const { return fNeedsStencil; } bool isStencilEnabled() const { return fUserStencilSettings != &GrUserStencilSettings::kUnused || fPipeline->hasStencilClip(); } const GrUserStencilSettings* userStencilSettings() const { return fUserStencilSettings; } // The backend format of the destination render target [proxy] const GrBackendFormat& backendFormat() const { return fBackendFormat; } GrSurfaceOrigin origin() const { return fOrigin; } const GrPipeline& pipeline() const { return *fPipeline; } const GrGeometryProcessor& geomProc() const { return *fGeomProc; } GrPrimitiveType primitiveType() const { return fPrimitiveType; } uint8_t tessellationPatchVertexCount() const { SkASSERT(GrPrimitiveType::kPatches == fPrimitiveType); return fTessellationPatchVertexCount; } bool targetHasVkResolveAttachmentWithInput() const { return fTargetHasVkResolveAttachmentWithInput; } int targetsNumSamples() const { return fTargetsNumSamples; } GrXferBarrierFlags renderPassBarriers() const { return fRenderPassXferBarriers; } GrLoadOp colorLoadOp() const { return fColorLoadOp; } uint16_t primitiveTypeKey() const { return ((uint16_t)fPrimitiveType << 8) | fTessellationPatchVertexCount; } // For Dawn, Metal and Vulkan the number of stencil bits is known a priori so we can // create the stencil settings here. GrStencilSettings nonGLStencilSettings() const; // Invokes the visitor function on all FP proxies in the pipeline. The caller is responsible // to call the visitor on its own primProc proxies. void visitFPProxies(const GrVisitProxyFunc& func) const { fPipeline->visitProxies(func); } #ifdef SK_DEBUG void validate(bool flushTime) const; void checkAllInstantiated() const; void checkMSAAAndMIPSAreResolved() const; #endif private: int fNumSamples; bool fNeedsStencil; GrBackendFormat fBackendFormat; GrSurfaceOrigin fOrigin; bool fTargetHasVkResolveAttachmentWithInput; int fTargetsNumSamples; const GrPipeline* fPipeline; const GrUserStencilSettings* fUserStencilSettings; const GrGeometryProcessor* fGeomProc; GrPrimitiveType fPrimitiveType; uint8_t fTessellationPatchVertexCount; // GrPrimType::kPatches. GrXferBarrierFlags fRenderPassXferBarriers; GrLoadOp fColorLoadOp; }; #endif