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