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