1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2018 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef GrMtlPipelineState_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define GrMtlPipelineState_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/ganesh/GrTypesPriv.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrStencilSettings.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/glsl/GrGLSLProgramBuilder.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/mtl/GrMtlBuffer.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/mtl/GrMtlPipeline.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/mtl/GrMtlPipelineStateDataManager.h" 17*c8dee2aaSAndroid Build Coastguard Worker 18*c8dee2aaSAndroid Build Coastguard Worker #import <Metal/Metal.h> 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Worker class GrMtlFramebuffer; 21*c8dee2aaSAndroid Build Coastguard Worker class GrMtlGpu; 22*c8dee2aaSAndroid Build Coastguard Worker class GrMtlPipelineStateDataManager; 23*c8dee2aaSAndroid Build Coastguard Worker class GrMtlRenderCommandEncoder; 24*c8dee2aaSAndroid Build Coastguard Worker class GrMtlRenderPipeline; 25*c8dee2aaSAndroid Build Coastguard Worker class GrMtlSampler; 26*c8dee2aaSAndroid Build Coastguard Worker class GrMtlTexture; 27*c8dee2aaSAndroid Build Coastguard Worker class GrPipeline; 28*c8dee2aaSAndroid Build Coastguard Worker 29*c8dee2aaSAndroid Build Coastguard Worker /** 30*c8dee2aaSAndroid Build Coastguard Worker * Wraps a MTLRenderPipelineState object and also contains more info about the pipeline as needed 31*c8dee2aaSAndroid Build Coastguard Worker * by Ganesh 32*c8dee2aaSAndroid Build Coastguard Worker */ 33*c8dee2aaSAndroid Build Coastguard Worker class GrMtlPipelineState { 34*c8dee2aaSAndroid Build Coastguard Worker public: 35*c8dee2aaSAndroid Build Coastguard Worker using UniformInfoArray = GrMtlPipelineStateDataManager::UniformInfoArray; 36*c8dee2aaSAndroid Build Coastguard Worker using UniformHandle = GrGLSLProgramDataManager::UniformHandle; 37*c8dee2aaSAndroid Build Coastguard Worker 38*c8dee2aaSAndroid Build Coastguard Worker GrMtlPipelineState(GrMtlGpu*, 39*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrMtlRenderPipeline> pipeline, 40*c8dee2aaSAndroid Build Coastguard Worker MTLPixelFormat, 41*c8dee2aaSAndroid Build Coastguard Worker const GrGLSLBuiltinUniformHandles& builtinUniformHandles, 42*c8dee2aaSAndroid Build Coastguard Worker const UniformInfoArray& uniforms, 43*c8dee2aaSAndroid Build Coastguard Worker uint32_t uniformBufferSize, 44*c8dee2aaSAndroid Build Coastguard Worker uint32_t numSamplers, 45*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<GrGeometryProcessor::ProgramImpl>, 46*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<GrXferProcessor::ProgramImpl>, 47*c8dee2aaSAndroid Build Coastguard Worker std::vector<std::unique_ptr<GrFragmentProcessor::ProgramImpl>> fpImpls); 48*c8dee2aaSAndroid Build Coastguard Worker pipeline()49*c8dee2aaSAndroid Build Coastguard Worker const sk_sp<GrMtlRenderPipeline>& pipeline() const { return fPipeline; } 50*c8dee2aaSAndroid Build Coastguard Worker 51*c8dee2aaSAndroid Build Coastguard Worker void setData(GrMtlFramebuffer*, const GrProgramInfo&); 52*c8dee2aaSAndroid Build Coastguard Worker 53*c8dee2aaSAndroid Build Coastguard Worker void setTextures(const GrGeometryProcessor&, 54*c8dee2aaSAndroid Build Coastguard Worker const GrPipeline&, 55*c8dee2aaSAndroid Build Coastguard Worker const GrSurfaceProxy* const geomProcTextures[]); 56*c8dee2aaSAndroid Build Coastguard Worker void bindTextures(GrMtlRenderCommandEncoder* renderCmdEncoder); 57*c8dee2aaSAndroid Build Coastguard Worker 58*c8dee2aaSAndroid Build Coastguard Worker void setDrawState(GrMtlRenderCommandEncoder*, 59*c8dee2aaSAndroid Build Coastguard Worker const skgpu::Swizzle& writeSwizzle, 60*c8dee2aaSAndroid Build Coastguard Worker const GrXferProcessor&); 61*c8dee2aaSAndroid Build Coastguard Worker 62*c8dee2aaSAndroid Build Coastguard Worker static void SetDynamicScissorRectState(GrMtlRenderCommandEncoder* renderCmdEncoder, 63*c8dee2aaSAndroid Build Coastguard Worker SkISize colorAttachmentDimensions, 64*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceOrigin rtOrigin, 65*c8dee2aaSAndroid Build Coastguard Worker SkIRect scissorRect); 66*c8dee2aaSAndroid Build Coastguard Worker 67*c8dee2aaSAndroid Build Coastguard Worker bool doesntSampleAttachment(const MTLRenderPassAttachmentDescriptor*) const; 68*c8dee2aaSAndroid Build Coastguard Worker 69*c8dee2aaSAndroid Build Coastguard Worker private: 70*c8dee2aaSAndroid Build Coastguard Worker /** 71*c8dee2aaSAndroid Build Coastguard Worker * We use the RT's size and origin to adjust from Skia device space to Metal normalized device 72*c8dee2aaSAndroid Build Coastguard Worker * space and to make device space positions have the correct origin for processors that require 73*c8dee2aaSAndroid Build Coastguard Worker * them. 74*c8dee2aaSAndroid Build Coastguard Worker */ 75*c8dee2aaSAndroid Build Coastguard Worker struct RenderTargetState { 76*c8dee2aaSAndroid Build Coastguard Worker SkISize fRenderTargetSize; 77*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceOrigin fRenderTargetOrigin; 78*c8dee2aaSAndroid Build Coastguard Worker RenderTargetStateRenderTargetState79*c8dee2aaSAndroid Build Coastguard Worker RenderTargetState() { this->invalidate(); } invalidateRenderTargetState80*c8dee2aaSAndroid Build Coastguard Worker void invalidate() { 81*c8dee2aaSAndroid Build Coastguard Worker fRenderTargetSize.fWidth = -1; 82*c8dee2aaSAndroid Build Coastguard Worker fRenderTargetSize.fHeight = -1; 83*c8dee2aaSAndroid Build Coastguard Worker fRenderTargetOrigin = (GrSurfaceOrigin)-1; 84*c8dee2aaSAndroid Build Coastguard Worker } 85*c8dee2aaSAndroid Build Coastguard Worker }; 86*c8dee2aaSAndroid Build Coastguard Worker 87*c8dee2aaSAndroid Build Coastguard Worker void setRenderTargetState(SkISize colorAttachmentDimensions, GrSurfaceOrigin); 88*c8dee2aaSAndroid Build Coastguard Worker 89*c8dee2aaSAndroid Build Coastguard Worker void bindUniforms(GrMtlRenderCommandEncoder*); 90*c8dee2aaSAndroid Build Coastguard Worker 91*c8dee2aaSAndroid Build Coastguard Worker void setBlendConstants(GrMtlRenderCommandEncoder*, 92*c8dee2aaSAndroid Build Coastguard Worker const skgpu::Swizzle&, 93*c8dee2aaSAndroid Build Coastguard Worker const GrXferProcessor&); 94*c8dee2aaSAndroid Build Coastguard Worker 95*c8dee2aaSAndroid Build Coastguard Worker void setDepthStencilState(GrMtlRenderCommandEncoder* renderCmdEncoder); 96*c8dee2aaSAndroid Build Coastguard Worker 97*c8dee2aaSAndroid Build Coastguard Worker struct SamplerBindings { 98*c8dee2aaSAndroid Build Coastguard Worker GrMtlSampler* fSampler; 99*c8dee2aaSAndroid Build Coastguard Worker id<MTLTexture> fTexture; 100*c8dee2aaSAndroid Build Coastguard Worker 101*c8dee2aaSAndroid Build Coastguard Worker SamplerBindings(GrSamplerState state, GrTexture* texture, GrMtlGpu*); 102*c8dee2aaSAndroid Build Coastguard Worker }; 103*c8dee2aaSAndroid Build Coastguard Worker 104*c8dee2aaSAndroid Build Coastguard Worker GrMtlGpu* fGpu; 105*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrMtlRenderPipeline> fPipeline; 106*c8dee2aaSAndroid Build Coastguard Worker MTLPixelFormat fPixelFormat; 107*c8dee2aaSAndroid Build Coastguard Worker 108*c8dee2aaSAndroid Build Coastguard Worker RenderTargetState fRenderTargetState; 109*c8dee2aaSAndroid Build Coastguard Worker GrGLSLBuiltinUniformHandles fBuiltinUniformHandles; 110*c8dee2aaSAndroid Build Coastguard Worker 111*c8dee2aaSAndroid Build Coastguard Worker GrStencilSettings fStencil; 112*c8dee2aaSAndroid Build Coastguard Worker 113*c8dee2aaSAndroid Build Coastguard Worker int fNumSamplers; 114*c8dee2aaSAndroid Build Coastguard Worker skia_private::TArray<SamplerBindings> fSamplerBindings; 115*c8dee2aaSAndroid Build Coastguard Worker 116*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<GrGeometryProcessor::ProgramImpl> fGPImpl; 117*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<GrXferProcessor::ProgramImpl> fXPImpl; 118*c8dee2aaSAndroid Build Coastguard Worker std::vector<std::unique_ptr<GrFragmentProcessor::ProgramImpl>> fFPImpls; 119*c8dee2aaSAndroid Build Coastguard Worker 120*c8dee2aaSAndroid Build Coastguard Worker GrMtlPipelineStateDataManager fDataManager; 121*c8dee2aaSAndroid Build Coastguard Worker }; 122*c8dee2aaSAndroid Build Coastguard Worker 123*c8dee2aaSAndroid Build Coastguard Worker #endif 124