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