blob: d21d0dab2e0af95c75f32cf6840469f14a0e8532 [file] [log] [blame]
Timothy Liang7ac582e2018-08-06 09:47:23 -04001/*
2 * Copyright 2018 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#ifndef GrMtlPipelineStateBuilder_DEFINED
9#define GrMtlPipelineStateBuilder_DEFINED
10
Mike Kleinc0bd9f92019-04-23 12:05:21 -050011#include "src/gpu/GrPipeline.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050012#include "src/gpu/glsl/GrGLSLProgramBuilder.h"
13#include "src/gpu/mtl/GrMtlUniformHandler.h"
14#include "src/gpu/mtl/GrMtlVaryingHandler.h"
15#include "src/sksl/SkSLCompiler.h"
Timothy Liang7ac582e2018-08-06 09:47:23 -040016
Aaron O'Mullan829b6a02019-07-08 01:31:14 +020017#import <Metal/Metal.h>
Timothy Liang7ac582e2018-08-06 09:47:23 -040018
Robert Phillips03e4c952019-11-26 16:20:22 -050019class GrProgramDesc;
Robert Phillips901aff02019-10-08 12:32:56 -040020class GrProgramInfo;
Robert Phillips323471e2019-11-11 11:33:37 -050021class GrMtlCaps;
Timothy Liang7ac582e2018-08-06 09:47:23 -040022class GrMtlGpu;
23class GrMtlPipelineState;
Brian Osman9e4e4c72020-06-10 07:19:34 -040024class SkReadBuffer;
Timothy Liang7ac582e2018-08-06 09:47:23 -040025
Jim Van Verth7d195ff2021-03-09 14:59:58 -050026struct GrMtlPrecompiledLibraries {
Jim Van Verth36a814b2021-03-12 16:02:29 -050027 // TODO: wrap this in sk_cfp<> or unique_ptr<> when we remove ARC
28 id<MTLRenderPipelineState> fPipelineState;
Jim Van Verth7d195ff2021-03-09 14:59:58 -050029 bool fRTHeight = false;
30};
31
Timothy Liang7ac582e2018-08-06 09:47:23 -040032class GrMtlPipelineStateBuilder : public GrGLSLProgramBuilder {
33public:
Jim Van Verth1223e7f2019-02-28 17:38:35 -050034 /** Generates a pipeline state.
35 *
36 * The GrMtlPipelineState implements what is specified in the GrPipeline and
37 * GrPrimitiveProcessor as input. After successful generation, the builder result objects are
Stephen Whiteb1857852020-02-07 15:33:23 +000038 * available to be used.
39 * @return the created pipeline if generation was successful; nullptr otherwise
Jim Van Verth1223e7f2019-02-28 17:38:35 -050040 */
Jim Van Verth7d195ff2021-03-09 14:59:58 -050041 static GrMtlPipelineState* CreatePipelineState(
42 GrMtlGpu*,
43 const GrProgramDesc&,
44 const GrProgramInfo&,
45 const GrMtlPrecompiledLibraries* precompiledLibs = nullptr);
Timothy Liang7ac582e2018-08-06 09:47:23 -040046
Jim Van Verth7d195ff2021-03-09 14:59:58 -050047 static bool PrecompileShaders(GrMtlGpu*, const SkData&,
48 GrMtlPrecompiledLibraries* precompiledLibs);
Jim Van Verth07c84012021-02-26 14:42:11 -050049
Timothy Liang7ac582e2018-08-06 09:47:23 -040050private:
Jim Van Verth84ded4d2021-03-03 13:29:38 -050051 GrMtlPipelineStateBuilder(GrMtlGpu*, const GrProgramDesc&, const GrProgramInfo&);
Jim Van Verth1223e7f2019-02-28 17:38:35 -050052
Jim Van Verth7d195ff2021-03-09 14:59:58 -050053 GrMtlPipelineState* finalize(const GrProgramDesc&, const GrProgramInfo&,
54 const GrMtlPrecompiledLibraries* precompiledLibraries);
Timothy Liang7ac582e2018-08-06 09:47:23 -040055
56 const GrCaps* caps() const override;
57
Ethan Nicholasee9cb6a2021-02-02 11:59:09 -050058 SkSL::Compiler* shaderCompiler() const override;
59
Timothy Liang7ac582e2018-08-06 09:47:23 -040060 void finalizeFragmentOutputColor(GrShaderVar& outputColor) override;
61
62 void finalizeFragmentSecondaryColor(GrShaderVar& outputColor) override;
63
Jim Van Verth36b86af2020-08-24 17:16:46 +000064 id<MTLLibrary> compileMtlShaderLibrary(const SkSL::String& shader,
Robert Phillips797831c2020-11-20 22:35:55 +000065 SkSL::Program::Inputs inputs,
66 GrContextOptions::ShaderErrorHandler* errorHandler);
Jim Van Verth9b2c06f2019-12-09 11:12:50 -050067 void storeShadersInCache(const SkSL::String shaders[], const SkSL::Program::Inputs inputs[],
Jim Van Verth36a814b2021-03-12 16:02:29 -050068 SkSL::Program::Settings*, sk_sp<SkData>, bool isSkSL);
Timothy Liang7ac582e2018-08-06 09:47:23 -040069
Jim Van Verth1223e7f2019-02-28 17:38:35 -050070 GrGLSLUniformHandler* uniformHandler() override { return &fUniformHandler; }
71 const GrGLSLUniformHandler* uniformHandler() const override { return &fUniformHandler; }
72 GrGLSLVaryingHandler* varyingHandler() override { return &fVaryingHandler; }
Timothy Liang7ac582e2018-08-06 09:47:23 -040073
74 GrMtlGpu* fGpu;
Timothy Liang057c3902018-08-08 10:48:45 -040075 GrMtlUniformHandler fUniformHandler;
76 GrMtlVaryingHandler fVaryingHandler;
Timothy Liang7ac582e2018-08-06 09:47:23 -040077
John Stiles7571f9e2020-09-02 22:42:33 -040078 using INHERITED = GrGLSLProgramBuilder;
Timothy Liang7ac582e2018-08-06 09:47:23 -040079};
80#endif