1/*
2 * Copyright 2019 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 GrDawnProgramBuilder_DEFINED
9#define GrDawnProgramBuilder_DEFINED
10
11#include "src/gpu/GrSPIRVUniformHandler.h"
12#include "src/gpu/GrSPIRVVaryingHandler.h"
13#include "src/gpu/dawn/GrDawnProgramDataManager.h"
14#include "src/sksl/SkSLCompiler.h"
15#include "dawn/webgpu_cpp.h"
16#include "src/gpu/glsl/GrGLSLProgramBuilder.h"
17
18#include <vector>
19
20class GrPipeline;
21
22struct GrDawnProgram : public SkRefCnt {
23    struct RenderTargetState {
24        SkISize         fRenderTargetSize;
25        GrSurfaceOrigin fRenderTargetOrigin;
26
27        RenderTargetState() { this->invalidate(); }
28        void invalidate() {
29            fRenderTargetSize.fWidth = -1;
30            fRenderTargetSize.fHeight = -1;
31            fRenderTargetOrigin = (GrSurfaceOrigin) -1;
32        }
33    };
34    typedef GrGLSLBuiltinUniformHandles BuiltinUniformHandles;
35    GrDawnProgram(const GrSPIRVUniformHandler::UniformInfoArray& uniforms,
36                  uint32_t uniformBufferSize)
37      : fDataManager(uniforms, uniformBufferSize) {
38    }
39    std::unique_ptr<GrGeometryProcessor::ProgramImpl> fGPImpl;
40    std::unique_ptr<GrXferProcessor::ProgramImpl> fXPImpl;
41    std::vector<std::unique_ptr<GrFragmentProcessor::ProgramImpl>> fFPImpls;
42    std::vector<wgpu::BindGroupLayout> fBindGroupLayouts;
43    wgpu::RenderPipeline fRenderPipeline;
44    GrDawnProgramDataManager fDataManager;
45    RenderTargetState fRenderTargetState;
46    BuiltinUniformHandles fBuiltinUniformHandles;
47
48    void setRenderTargetState(const GrRenderTarget*, GrSurfaceOrigin);
49    wgpu::BindGroup setUniformData(GrDawnGpu*, const GrRenderTarget*, const GrProgramInfo&);
50    wgpu::BindGroup setTextures(GrDawnGpu*,
51                                const GrGeometryProcessor&,
52                                const GrPipeline&,
53                                const GrSurfaceProxy* const geomProcTextures[]);
54};
55
56class GrDawnProgramBuilder : public GrGLSLProgramBuilder {
57public:
58    static sk_sp<GrDawnProgram> Build(GrDawnGpu*,
59                                      GrRenderTarget*,
60                                      const GrProgramInfo&,
61                                      wgpu::TextureFormat colorFormat,
62                                      bool hasDepthStencil,
63                                      wgpu::TextureFormat depthStencilFormat,
64                                      GrProgramDesc*);
65    const GrCaps* caps() const override;
66    GrGLSLUniformHandler* uniformHandler() override { return &fUniformHandler; }
67    const GrGLSLUniformHandler* uniformHandler() const override { return &fUniformHandler; }
68    GrGLSLVaryingHandler* varyingHandler() override { return &fVaryingHandler; }
69
70    GrDawnGpu* gpu() const { return fGpu; }
71
72    SkSL::Compiler* shaderCompiler() const override;
73
74private:
75    GrDawnProgramBuilder(GrDawnGpu*,
76                         const GrProgramInfo&,
77                         GrProgramDesc*);
78    wgpu::ShaderModule createShaderModule(const GrGLSLShaderBuilder&, SkSL::ProgramKind,
79                                          bool flipY, SkSL::Program::Inputs* inputs);
80    GrDawnGpu*             fGpu;
81    GrSPIRVVaryingHandler   fVaryingHandler;
82    GrSPIRVUniformHandler   fUniformHandler;
83
84    using INHERITED = GrGLSLProgramBuilder;
85};
86#endif
87