blob: 656ef51da22fb4a912e3e02d45edfa6115e5a17f [file] [log] [blame]
Stephen Whitebb6bed12019-08-02 09:57:55 -04001/*
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/dawn/GrDawnProgramDataManager.h"
12#include "src/gpu/dawn/GrDawnUniformHandler.h"
13#include "src/gpu/dawn/GrDawnVaryingHandler.h"
14#include "src/sksl/SkSLCompiler.h"
15#include "dawn/dawncpp.h"
16#include "src/gpu/glsl/GrGLSLProgramBuilder.h"
17
18class GrPipeline;
19
20struct GrDawnProgram : public SkRefCnt {
21 struct RenderTargetState {
22 SkISize fRenderTargetSize;
23 GrSurfaceOrigin fRenderTargetOrigin;
24
25 RenderTargetState() { this->invalidate(); }
26 void invalidate() {
27 fRenderTargetSize.fWidth = -1;
28 fRenderTargetSize.fHeight = -1;
29 fRenderTargetOrigin = (GrSurfaceOrigin) -1;
30 }
31
32 /**
33 * Gets a float4 that adjusts the position from Skia device coords to GL's normalized device
34 * coords. Assuming the transformed position, pos, is a homogeneous float3, the vec, v, is
35 * applied as such:
36 * pos.x = dot(v.xy, pos.xz)
37 * pos.y = dot(v.zw, pos.yz)
38 */
39 void getRTAdjustmentVec(float* destVec) {
40 destVec[0] = 2.f / fRenderTargetSize.fWidth;
41 destVec[1] = -1.f;
42 if (kBottomLeft_GrSurfaceOrigin == fRenderTargetOrigin) {
43 destVec[2] = -2.f / fRenderTargetSize.fHeight;
44 destVec[3] = 1.f;
45 } else {
46 destVec[2] = 2.f / fRenderTargetSize.fHeight;
47 destVec[3] = -1.f;
48 }
49 }
50 };
51 typedef GrGLSLBuiltinUniformHandles BuiltinUniformHandles;
52 GrDawnProgram(const GrDawnUniformHandler::UniformInfoArray& uniforms,
53 uint32_t geometryUniformSize,
54 uint32_t fragmentUniformSize)
55 : fDataManager(uniforms, geometryUniformSize, fragmentUniformSize) {
56 }
57 dawn::ShaderModule fVSModule;
58 dawn::ShaderModule fFSModule;
59 std::unique_ptr<GrGLSLPrimitiveProcessor> fGeometryProcessor;
60 std::unique_ptr<GrGLSLXferProcessor> fXferProcessor;
61 std::unique_ptr<std::unique_ptr<GrGLSLFragmentProcessor>[]> fFragmentProcessors;
62 int fFragmentProcessorCnt;
63 dawn::Buffer fGeometryUniformBuffer;
64 dawn::Buffer fFragmentUniformBuffer;
65 dawn::PipelineLayout fPipelineLayout;
66 dawn::BindGroup fUniformBindGroup;
67 dawn::ColorStateDescriptor fColorState;
68 GrDawnProgramDataManager fDataManager;
69 RenderTargetState fRenderTargetState;
70 BuiltinUniformHandles fBuiltinUniformHandles;
71
72 void setRenderTargetState(const GrRenderTarget*, GrSurfaceOrigin);
73 void setData(const GrPrimitiveProcessor&, const GrRenderTarget*, GrSurfaceOrigin,
74 const GrPipeline&);
75};
76
77class GrDawnProgramBuilder : public GrGLSLProgramBuilder {
78public:
79 static sk_sp<GrDawnProgram> Build(GrDawnGpu*,
80 GrRenderTarget* renderTarget,
81 GrSurfaceOrigin origin,
82 const GrPipeline&,
83 const GrPrimitiveProcessor&,
84 const GrTextureProxy* const primProcProxies[],
85 dawn::TextureFormat colorFormat,
86 GrProgramDesc* desc);
87 const GrCaps* caps() const override;
88 GrGLSLUniformHandler* uniformHandler() override { return &fUniformHandler; }
89 const GrGLSLUniformHandler* uniformHandler() const override { return &fUniformHandler; }
90 GrGLSLVaryingHandler* varyingHandler() override { return &fVaryingHandler; }
91
92 GrDawnGpu* gpu() const { return fGpu; }
93
94private:
95 GrDawnProgramBuilder(GrDawnGpu*,
96 GrRenderTarget*,
97 GrSurfaceOrigin,
98 const GrPrimitiveProcessor&,
99 const GrTextureProxy* const primProcProxies[],
100 const GrPipeline&,
101 GrProgramDesc*);
102 dawn::ShaderModule createShaderModule(const GrGLSLShaderBuilder&, SkSL::Program::Kind,
103 SkSL::Program::Inputs* inputs);
104 GrDawnGpu* fGpu;
105 GrDawnVaryingHandler fVaryingHandler;
106 GrDawnUniformHandler fUniformHandler;
107
108 typedef GrGLSLProgramBuilder INHERITED;
109};
110#endif