/* * Copyright 2018 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef GrMtlPipelineState_DEFINED #define GrMtlPipelineState_DEFINED #include "include/private/GrTypesPriv.h" #include "src/gpu/GrStencilSettings.h" #include "src/gpu/glsl/GrGLSLProgramBuilder.h" #include "src/gpu/mtl/GrMtlBuffer.h" #include "src/gpu/mtl/GrMtlPipeline.h" #include "src/gpu/mtl/GrMtlPipelineStateDataManager.h" #import class GrMtlFramebuffer; class GrMtlGpu; class GrMtlPipelineStateDataManager; class GrMtlRenderCommandEncoder; class GrMtlRenderPipeline; class GrMtlSampler; class GrMtlTexture; class GrPipeline; /** * Wraps a MTLRenderPipelineState object and also contains more info about the pipeline as needed * by Ganesh */ class GrMtlPipelineState { public: using UniformInfoArray = GrMtlPipelineStateDataManager::UniformInfoArray; using UniformHandle = GrGLSLProgramDataManager::UniformHandle; GrMtlPipelineState(GrMtlGpu*, sk_sp pipeline, MTLPixelFormat, const GrGLSLBuiltinUniformHandles& builtinUniformHandles, const UniformInfoArray& uniforms, uint32_t uniformBufferSize, uint32_t numSamplers, std::unique_ptr, std::unique_ptr, std::vector> fpImpls); const sk_sp& pipeline() const { return fPipeline; } void setData(GrMtlFramebuffer*, const GrProgramInfo&); void setTextures(const GrGeometryProcessor&, const GrPipeline&, const GrSurfaceProxy* const geomProcTextures[]); void bindTextures(GrMtlRenderCommandEncoder* renderCmdEncoder); void setDrawState(GrMtlRenderCommandEncoder*, const GrSwizzle& writeSwizzle, const GrXferProcessor&); static void SetDynamicScissorRectState(GrMtlRenderCommandEncoder* renderCmdEncoder, SkISize colorAttachmentDimensions, GrSurfaceOrigin rtOrigin, SkIRect scissorRect); bool doesntSampleAttachment(const MTLRenderPassAttachmentDescriptor*) const; private: /** * We use the RT's size and origin to adjust from Skia device space to Metal normalized device * space and to make device space positions have the correct origin for processors that require * them. */ struct RenderTargetState { SkISize fRenderTargetSize; GrSurfaceOrigin fRenderTargetOrigin; RenderTargetState() { this->invalidate(); } void invalidate() { fRenderTargetSize.fWidth = -1; fRenderTargetSize.fHeight = -1; fRenderTargetOrigin = (GrSurfaceOrigin)-1; } }; void setRenderTargetState(SkISize colorAttachmentDimensions, GrSurfaceOrigin); void bindUniforms(GrMtlRenderCommandEncoder*); void setBlendConstants(GrMtlRenderCommandEncoder*, const GrSwizzle&, const GrXferProcessor&); void setDepthStencilState(GrMtlRenderCommandEncoder* renderCmdEncoder); struct SamplerBindings { GrMtlSampler* fSampler; id fTexture; SamplerBindings(GrSamplerState state, GrTexture* texture, GrMtlGpu*); }; GrMtlGpu* fGpu; sk_sp fPipeline; MTLPixelFormat fPixelFormat; RenderTargetState fRenderTargetState; GrGLSLBuiltinUniformHandles fBuiltinUniformHandles; GrStencilSettings fStencil; int fNumSamplers; SkTArray fSamplerBindings; std::unique_ptr fGPImpl; std::unique_ptr fXPImpl; std::vector> fFPImpls; GrMtlPipelineStateDataManager fDataManager; }; #endif