xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/wgpu/ProgramExecutableWgpu.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2024 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker 
7*8975f5c5SAndroid Build Coastguard Worker // ProgramExecutableWgpu.h: Implementation of ProgramExecutableImpl.
8*8975f5c5SAndroid Build Coastguard Worker 
9*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_RENDERER_WGPU_PROGRAMEXECUTABLEWGPU_H_
10*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_RENDERER_WGPU_PROGRAMEXECUTABLEWGPU_H_
11*8975f5c5SAndroid Build Coastguard Worker 
12*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/ProgramExecutable.h"
13*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/ProgramExecutableImpl.h"
14*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/renderer_utils.h"
15*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/wgpu/wgpu_pipeline_state.h"
16*8975f5c5SAndroid Build Coastguard Worker 
17*8975f5c5SAndroid Build Coastguard Worker #include <dawn/webgpu_cpp.h>
18*8975f5c5SAndroid Build Coastguard Worker 
19*8975f5c5SAndroid Build Coastguard Worker namespace rx
20*8975f5c5SAndroid Build Coastguard Worker {
21*8975f5c5SAndroid Build Coastguard Worker struct TranslatedWGPUShaderModule
22*8975f5c5SAndroid Build Coastguard Worker {
23*8975f5c5SAndroid Build Coastguard Worker     wgpu::ShaderModule module;
24*8975f5c5SAndroid Build Coastguard Worker };
25*8975f5c5SAndroid Build Coastguard Worker 
26*8975f5c5SAndroid Build Coastguard Worker class ProgramExecutableWgpu : public ProgramExecutableImpl
27*8975f5c5SAndroid Build Coastguard Worker {
28*8975f5c5SAndroid Build Coastguard Worker   public:
29*8975f5c5SAndroid Build Coastguard Worker     ProgramExecutableWgpu(const gl::ProgramExecutable *executable);
30*8975f5c5SAndroid Build Coastguard Worker     ~ProgramExecutableWgpu() override;
31*8975f5c5SAndroid Build Coastguard Worker 
32*8975f5c5SAndroid Build Coastguard Worker     void destroy(const gl::Context *context) override;
33*8975f5c5SAndroid Build Coastguard Worker 
34*8975f5c5SAndroid Build Coastguard Worker     angle::Result updateUniformsAndGetBindGroup(ContextWgpu *context,
35*8975f5c5SAndroid Build Coastguard Worker                                                 wgpu::BindGroup *outBindGroup);
36*8975f5c5SAndroid Build Coastguard Worker 
37*8975f5c5SAndroid Build Coastguard Worker     angle::Result resizeUniformBlockMemory(const gl::ShaderMap<size_t> &requiredBufferSize);
38*8975f5c5SAndroid Build Coastguard Worker 
getSharedDefaultUniformBlock(gl::ShaderType shaderType)39*8975f5c5SAndroid Build Coastguard Worker     std::shared_ptr<BufferAndLayout> &getSharedDefaultUniformBlock(gl::ShaderType shaderType)
40*8975f5c5SAndroid Build Coastguard Worker     {
41*8975f5c5SAndroid Build Coastguard Worker         return mDefaultUniformBlocks[shaderType];
42*8975f5c5SAndroid Build Coastguard Worker     }
43*8975f5c5SAndroid Build Coastguard Worker 
44*8975f5c5SAndroid Build Coastguard Worker     void markDefaultUniformsDirty();
checkDirtyUniforms()45*8975f5c5SAndroid Build Coastguard Worker     bool checkDirtyUniforms() { return mDefaultUniformBlocksDirty.any(); }
46*8975f5c5SAndroid Build Coastguard Worker 
47*8975f5c5SAndroid Build Coastguard Worker     void setUniform1fv(GLint location, GLsizei count, const GLfloat *v) override;
48*8975f5c5SAndroid Build Coastguard Worker     void setUniform2fv(GLint location, GLsizei count, const GLfloat *v) override;
49*8975f5c5SAndroid Build Coastguard Worker     void setUniform3fv(GLint location, GLsizei count, const GLfloat *v) override;
50*8975f5c5SAndroid Build Coastguard Worker     void setUniform4fv(GLint location, GLsizei count, const GLfloat *v) override;
51*8975f5c5SAndroid Build Coastguard Worker     void setUniform1iv(GLint location, GLsizei count, const GLint *v) override;
52*8975f5c5SAndroid Build Coastguard Worker     void setUniform2iv(GLint location, GLsizei count, const GLint *v) override;
53*8975f5c5SAndroid Build Coastguard Worker     void setUniform3iv(GLint location, GLsizei count, const GLint *v) override;
54*8975f5c5SAndroid Build Coastguard Worker     void setUniform4iv(GLint location, GLsizei count, const GLint *v) override;
55*8975f5c5SAndroid Build Coastguard Worker     void setUniform1uiv(GLint location, GLsizei count, const GLuint *v) override;
56*8975f5c5SAndroid Build Coastguard Worker     void setUniform2uiv(GLint location, GLsizei count, const GLuint *v) override;
57*8975f5c5SAndroid Build Coastguard Worker     void setUniform3uiv(GLint location, GLsizei count, const GLuint *v) override;
58*8975f5c5SAndroid Build Coastguard Worker     void setUniform4uiv(GLint location, GLsizei count, const GLuint *v) override;
59*8975f5c5SAndroid Build Coastguard Worker     void setUniformMatrix2fv(GLint location,
60*8975f5c5SAndroid Build Coastguard Worker                              GLsizei count,
61*8975f5c5SAndroid Build Coastguard Worker                              GLboolean transpose,
62*8975f5c5SAndroid Build Coastguard Worker                              const GLfloat *value) override;
63*8975f5c5SAndroid Build Coastguard Worker     void setUniformMatrix3fv(GLint location,
64*8975f5c5SAndroid Build Coastguard Worker                              GLsizei count,
65*8975f5c5SAndroid Build Coastguard Worker                              GLboolean transpose,
66*8975f5c5SAndroid Build Coastguard Worker                              const GLfloat *value) override;
67*8975f5c5SAndroid Build Coastguard Worker     void setUniformMatrix4fv(GLint location,
68*8975f5c5SAndroid Build Coastguard Worker                              GLsizei count,
69*8975f5c5SAndroid Build Coastguard Worker                              GLboolean transpose,
70*8975f5c5SAndroid Build Coastguard Worker                              const GLfloat *value) override;
71*8975f5c5SAndroid Build Coastguard Worker     void setUniformMatrix2x3fv(GLint location,
72*8975f5c5SAndroid Build Coastguard Worker                                GLsizei count,
73*8975f5c5SAndroid Build Coastguard Worker                                GLboolean transpose,
74*8975f5c5SAndroid Build Coastguard Worker                                const GLfloat *value) override;
75*8975f5c5SAndroid Build Coastguard Worker     void setUniformMatrix3x2fv(GLint location,
76*8975f5c5SAndroid Build Coastguard Worker                                GLsizei count,
77*8975f5c5SAndroid Build Coastguard Worker                                GLboolean transpose,
78*8975f5c5SAndroid Build Coastguard Worker                                const GLfloat *value) override;
79*8975f5c5SAndroid Build Coastguard Worker     void setUniformMatrix2x4fv(GLint location,
80*8975f5c5SAndroid Build Coastguard Worker                                GLsizei count,
81*8975f5c5SAndroid Build Coastguard Worker                                GLboolean transpose,
82*8975f5c5SAndroid Build Coastguard Worker                                const GLfloat *value) override;
83*8975f5c5SAndroid Build Coastguard Worker     void setUniformMatrix4x2fv(GLint location,
84*8975f5c5SAndroid Build Coastguard Worker                                GLsizei count,
85*8975f5c5SAndroid Build Coastguard Worker                                GLboolean transpose,
86*8975f5c5SAndroid Build Coastguard Worker                                const GLfloat *value) override;
87*8975f5c5SAndroid Build Coastguard Worker     void setUniformMatrix3x4fv(GLint location,
88*8975f5c5SAndroid Build Coastguard Worker                                GLsizei count,
89*8975f5c5SAndroid Build Coastguard Worker                                GLboolean transpose,
90*8975f5c5SAndroid Build Coastguard Worker                                const GLfloat *value) override;
91*8975f5c5SAndroid Build Coastguard Worker     void setUniformMatrix4x3fv(GLint location,
92*8975f5c5SAndroid Build Coastguard Worker                                GLsizei count,
93*8975f5c5SAndroid Build Coastguard Worker                                GLboolean transpose,
94*8975f5c5SAndroid Build Coastguard Worker                                const GLfloat *value) override;
95*8975f5c5SAndroid Build Coastguard Worker 
96*8975f5c5SAndroid Build Coastguard Worker     void getUniformfv(const gl::Context *context, GLint location, GLfloat *params) const override;
97*8975f5c5SAndroid Build Coastguard Worker     void getUniformiv(const gl::Context *context, GLint location, GLint *params) const override;
98*8975f5c5SAndroid Build Coastguard Worker     void getUniformuiv(const gl::Context *context, GLint location, GLuint *params) const override;
99*8975f5c5SAndroid Build Coastguard Worker 
100*8975f5c5SAndroid Build Coastguard Worker     TranslatedWGPUShaderModule &getShaderModule(gl::ShaderType type);
101*8975f5c5SAndroid Build Coastguard Worker 
102*8975f5c5SAndroid Build Coastguard Worker     angle::Result getRenderPipeline(ContextWgpu *context,
103*8975f5c5SAndroid Build Coastguard Worker                                     const webgpu::RenderPipelineDesc &desc,
104*8975f5c5SAndroid Build Coastguard Worker                                     wgpu::RenderPipeline *pipelineOut);
105*8975f5c5SAndroid Build Coastguard Worker 
106*8975f5c5SAndroid Build Coastguard Worker   private:
107*8975f5c5SAndroid Build Coastguard Worker     angle::CheckedNumeric<size_t> getDefaultUniformAlignedSize(ContextWgpu *context,
108*8975f5c5SAndroid Build Coastguard Worker                                                                gl::ShaderType shaderType) const;
109*8975f5c5SAndroid Build Coastguard Worker     angle::CheckedNumeric<size_t> calcUniformUpdateRequiredSpace(
110*8975f5c5SAndroid Build Coastguard Worker         ContextWgpu *context,
111*8975f5c5SAndroid Build Coastguard Worker         gl::ShaderMap<uint64_t> *uniformOffsets) const;
112*8975f5c5SAndroid Build Coastguard Worker     // The layout of the resource bind groups (numbering for buffers, textures, samplers) can be
113*8975f5c5SAndroid Build Coastguard Worker     // determined once the program is linked, and should be passed in pipeline creation. Fills in
114*8975f5c5SAndroid Build Coastguard Worker     // `mPipelineLayout` and `mDefaultBindGroupLayout` if they haven't been already.
115*8975f5c5SAndroid Build Coastguard Worker     void genBindingLayoutIfNecessary(ContextWgpu *context);
116*8975f5c5SAndroid Build Coastguard Worker 
117*8975f5c5SAndroid Build Coastguard Worker     gl::ShaderMap<TranslatedWGPUShaderModule> mShaderModules;
118*8975f5c5SAndroid Build Coastguard Worker     webgpu::PipelineCache mPipelineCache;
119*8975f5c5SAndroid Build Coastguard Worker     // Holds the binding layout of resources (buffers, textures, samplers) required by the linked
120*8975f5c5SAndroid Build Coastguard Worker     // shaders.
121*8975f5c5SAndroid Build Coastguard Worker     wgpu::PipelineLayout mPipelineLayout;
122*8975f5c5SAndroid Build Coastguard Worker     // Holds the binding group layout for the default bind group.
123*8975f5c5SAndroid Build Coastguard Worker     wgpu::BindGroupLayout mDefaultBindGroupLayout;
124*8975f5c5SAndroid Build Coastguard Worker     // Holds the most recent BindGroup. Note there may be others in the command buffer.
125*8975f5c5SAndroid Build Coastguard Worker     wgpu::BindGroup mDefaultBindGroup;
126*8975f5c5SAndroid Build Coastguard Worker 
127*8975f5c5SAndroid Build Coastguard Worker     // Holds layout info for basic GL uniforms, which needs to be laid out in a buffer for WGSL
128*8975f5c5SAndroid Build Coastguard Worker     // similarly to a UBO.
129*8975f5c5SAndroid Build Coastguard Worker     DefaultUniformBlockMap mDefaultUniformBlocks;
130*8975f5c5SAndroid Build Coastguard Worker     gl::ShaderBitSet mDefaultUniformBlocksDirty;
131*8975f5c5SAndroid Build Coastguard Worker };
132*8975f5c5SAndroid Build Coastguard Worker 
133*8975f5c5SAndroid Build Coastguard Worker }  // namespace rx
134*8975f5c5SAndroid Build Coastguard Worker 
135*8975f5c5SAndroid Build Coastguard Worker #endif  // LIBANGLE_RENDERER_WGPU_PROGRAMEXECUTABLEWGPU_H_
136