blob: 95fbbf044d308a66c177ab2438b7c1964fd8c080 [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
26class GrMtlPipelineStateBuilder : public GrGLSLProgramBuilder {
27public:
Jim Van Verth1223e7f2019-02-28 17:38:35 -050028 /** Generates a pipeline state.
29 *
30 * The GrMtlPipelineState implements what is specified in the GrPipeline and
31 * GrPrimitiveProcessor as input. After successful generation, the builder result objects are
Stephen Whiteb1857852020-02-07 15:33:23 +000032 * available to be used.
33 * @return the created pipeline if generation was successful; nullptr otherwise
Jim Van Verth1223e7f2019-02-28 17:38:35 -050034 */
35 static GrMtlPipelineState* CreatePipelineState(GrMtlGpu*,
Stephen Whiteb1857852020-02-07 15:33:23 +000036 const GrProgramDesc&,
37 const GrProgramInfo&);
Timothy Liang7ac582e2018-08-06 09:47:23 -040038
Jim Van Verth07c84012021-02-26 14:42:11 -050039 static bool PrecompileShaders(GrMtlGpu*, const SkData&);
40
Timothy Liang7ac582e2018-08-06 09:47:23 -040041private:
Jim Van Verth84ded4d2021-03-03 13:29:38 -050042 GrMtlPipelineStateBuilder(GrMtlGpu*, const GrProgramDesc&, const GrProgramInfo&);
Jim Van Verth1223e7f2019-02-28 17:38:35 -050043
Jim Van Verth84ded4d2021-03-03 13:29:38 -050044 GrMtlPipelineState* finalize(const GrProgramDesc&, const GrProgramInfo&);
Timothy Liang7ac582e2018-08-06 09:47:23 -040045
46 const GrCaps* caps() const override;
47
Ethan Nicholasee9cb6a2021-02-02 11:59:09 -050048 SkSL::Compiler* shaderCompiler() const override;
49
Timothy Liang7ac582e2018-08-06 09:47:23 -040050 void finalizeFragmentOutputColor(GrShaderVar& outputColor) override;
51
52 void finalizeFragmentSecondaryColor(GrShaderVar& outputColor) override;
53
Jim Van Verth36b86af2020-08-24 17:16:46 +000054 id<MTLLibrary> compileMtlShaderLibrary(const SkSL::String& shader,
Robert Phillips797831c2020-11-20 22:35:55 +000055 SkSL::Program::Inputs inputs,
56 GrContextOptions::ShaderErrorHandler* errorHandler);
Jim Van Verth9b2c06f2019-12-09 11:12:50 -050057 void storeShadersInCache(const SkSL::String shaders[], const SkSL::Program::Inputs inputs[],
Jim Van Verth07c84012021-02-26 14:42:11 -050058 SkSL::Program::Settings*, bool isSkSL);
Timothy Liang7ac582e2018-08-06 09:47:23 -040059
Jim Van Verth1223e7f2019-02-28 17:38:35 -050060 GrGLSLUniformHandler* uniformHandler() override { return &fUniformHandler; }
61 const GrGLSLUniformHandler* uniformHandler() const override { return &fUniformHandler; }
62 GrGLSLVaryingHandler* varyingHandler() override { return &fVaryingHandler; }
Timothy Liang7ac582e2018-08-06 09:47:23 -040063
64 GrMtlGpu* fGpu;
Timothy Liang057c3902018-08-08 10:48:45 -040065 GrMtlUniformHandler fUniformHandler;
66 GrMtlVaryingHandler fVaryingHandler;
Timothy Liang7ac582e2018-08-06 09:47:23 -040067
John Stiles7571f9e2020-09-02 22:42:33 -040068 using INHERITED = GrGLSLProgramBuilder;
Timothy Liang7ac582e2018-08-06 09:47:23 -040069};
70#endif