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 // ContextWgpu.h: 7*8975f5c5SAndroid Build Coastguard Worker // Defines the class interface for ContextWgpu, implementing ContextImpl. 8*8975f5c5SAndroid Build Coastguard Worker // 9*8975f5c5SAndroid Build Coastguard Worker 10*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_RENDERER_WGPU_CONTEXTWGPU_H_ 11*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_RENDERER_WGPU_CONTEXTWGPU_H_ 12*8975f5c5SAndroid Build Coastguard Worker 13*8975f5c5SAndroid Build Coastguard Worker #include <dawn/webgpu_cpp.h> 14*8975f5c5SAndroid Build Coastguard Worker 15*8975f5c5SAndroid Build Coastguard Worker #include "image_util/loadimage.h" 16*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/ContextImpl.h" 17*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/wgpu/DisplayWgpu.h" 18*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/wgpu/wgpu_command_buffer.h" 19*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/wgpu/wgpu_format_utils.h" 20*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/wgpu/wgpu_helpers.h" 21*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/wgpu/wgpu_pipeline_state.h" 22*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/wgpu/wgpu_utils.h" 23*8975f5c5SAndroid Build Coastguard Worker 24*8975f5c5SAndroid Build Coastguard Worker namespace rx 25*8975f5c5SAndroid Build Coastguard Worker { 26*8975f5c5SAndroid Build Coastguard Worker 27*8975f5c5SAndroid Build Coastguard Worker class ContextWgpu : public ContextImpl 28*8975f5c5SAndroid Build Coastguard Worker { 29*8975f5c5SAndroid Build Coastguard Worker public: 30*8975f5c5SAndroid Build Coastguard Worker ContextWgpu(const gl::State &state, gl::ErrorSet *errorSet, DisplayWgpu *display); 31*8975f5c5SAndroid Build Coastguard Worker ~ContextWgpu() override; 32*8975f5c5SAndroid Build Coastguard Worker 33*8975f5c5SAndroid Build Coastguard Worker angle::Result initialize(const angle::ImageLoadContext &imageLoadContext) override; 34*8975f5c5SAndroid Build Coastguard Worker 35*8975f5c5SAndroid Build Coastguard Worker void onDestroy(const gl::Context *context) override; 36*8975f5c5SAndroid Build Coastguard Worker 37*8975f5c5SAndroid Build Coastguard Worker // Flush and finish. 38*8975f5c5SAndroid Build Coastguard Worker angle::Result flush(const gl::Context *context) override; 39*8975f5c5SAndroid Build Coastguard Worker angle::Result finish(const gl::Context *context) override; 40*8975f5c5SAndroid Build Coastguard Worker 41*8975f5c5SAndroid Build Coastguard Worker // Drawing methods. 42*8975f5c5SAndroid Build Coastguard Worker angle::Result drawArrays(const gl::Context *context, 43*8975f5c5SAndroid Build Coastguard Worker gl::PrimitiveMode mode, 44*8975f5c5SAndroid Build Coastguard Worker GLint first, 45*8975f5c5SAndroid Build Coastguard Worker GLsizei count) override; 46*8975f5c5SAndroid Build Coastguard Worker angle::Result drawArraysInstanced(const gl::Context *context, 47*8975f5c5SAndroid Build Coastguard Worker gl::PrimitiveMode mode, 48*8975f5c5SAndroid Build Coastguard Worker GLint first, 49*8975f5c5SAndroid Build Coastguard Worker GLsizei count, 50*8975f5c5SAndroid Build Coastguard Worker GLsizei instanceCount) override; 51*8975f5c5SAndroid Build Coastguard Worker angle::Result drawArraysInstancedBaseInstance(const gl::Context *context, 52*8975f5c5SAndroid Build Coastguard Worker gl::PrimitiveMode mode, 53*8975f5c5SAndroid Build Coastguard Worker GLint first, 54*8975f5c5SAndroid Build Coastguard Worker GLsizei count, 55*8975f5c5SAndroid Build Coastguard Worker GLsizei instanceCount, 56*8975f5c5SAndroid Build Coastguard Worker GLuint baseInstance) override; 57*8975f5c5SAndroid Build Coastguard Worker 58*8975f5c5SAndroid Build Coastguard Worker angle::Result drawElements(const gl::Context *context, 59*8975f5c5SAndroid Build Coastguard Worker gl::PrimitiveMode mode, 60*8975f5c5SAndroid Build Coastguard Worker GLsizei count, 61*8975f5c5SAndroid Build Coastguard Worker gl::DrawElementsType type, 62*8975f5c5SAndroid Build Coastguard Worker const void *indices) override; 63*8975f5c5SAndroid Build Coastguard Worker angle::Result drawElementsBaseVertex(const gl::Context *context, 64*8975f5c5SAndroid Build Coastguard Worker gl::PrimitiveMode mode, 65*8975f5c5SAndroid Build Coastguard Worker GLsizei count, 66*8975f5c5SAndroid Build Coastguard Worker gl::DrawElementsType type, 67*8975f5c5SAndroid Build Coastguard Worker const void *indices, 68*8975f5c5SAndroid Build Coastguard Worker GLint baseVertex) override; 69*8975f5c5SAndroid Build Coastguard Worker angle::Result drawElementsInstanced(const gl::Context *context, 70*8975f5c5SAndroid Build Coastguard Worker gl::PrimitiveMode mode, 71*8975f5c5SAndroid Build Coastguard Worker GLsizei count, 72*8975f5c5SAndroid Build Coastguard Worker gl::DrawElementsType type, 73*8975f5c5SAndroid Build Coastguard Worker const void *indices, 74*8975f5c5SAndroid Build Coastguard Worker GLsizei instances) override; 75*8975f5c5SAndroid Build Coastguard Worker angle::Result drawElementsInstancedBaseVertex(const gl::Context *context, 76*8975f5c5SAndroid Build Coastguard Worker gl::PrimitiveMode mode, 77*8975f5c5SAndroid Build Coastguard Worker GLsizei count, 78*8975f5c5SAndroid Build Coastguard Worker gl::DrawElementsType type, 79*8975f5c5SAndroid Build Coastguard Worker const void *indices, 80*8975f5c5SAndroid Build Coastguard Worker GLsizei instances, 81*8975f5c5SAndroid Build Coastguard Worker GLint baseVertex) override; 82*8975f5c5SAndroid Build Coastguard Worker angle::Result drawElementsInstancedBaseVertexBaseInstance(const gl::Context *context, 83*8975f5c5SAndroid Build Coastguard Worker gl::PrimitiveMode mode, 84*8975f5c5SAndroid Build Coastguard Worker GLsizei count, 85*8975f5c5SAndroid Build Coastguard Worker gl::DrawElementsType type, 86*8975f5c5SAndroid Build Coastguard Worker const void *indices, 87*8975f5c5SAndroid Build Coastguard Worker GLsizei instances, 88*8975f5c5SAndroid Build Coastguard Worker GLint baseVertex, 89*8975f5c5SAndroid Build Coastguard Worker GLuint baseInstance) override; 90*8975f5c5SAndroid Build Coastguard Worker angle::Result drawRangeElements(const gl::Context *context, 91*8975f5c5SAndroid Build Coastguard Worker gl::PrimitiveMode mode, 92*8975f5c5SAndroid Build Coastguard Worker GLuint start, 93*8975f5c5SAndroid Build Coastguard Worker GLuint end, 94*8975f5c5SAndroid Build Coastguard Worker GLsizei count, 95*8975f5c5SAndroid Build Coastguard Worker gl::DrawElementsType type, 96*8975f5c5SAndroid Build Coastguard Worker const void *indices) override; 97*8975f5c5SAndroid Build Coastguard Worker angle::Result drawRangeElementsBaseVertex(const gl::Context *context, 98*8975f5c5SAndroid Build Coastguard Worker gl::PrimitiveMode mode, 99*8975f5c5SAndroid Build Coastguard Worker GLuint start, 100*8975f5c5SAndroid Build Coastguard Worker GLuint end, 101*8975f5c5SAndroid Build Coastguard Worker GLsizei count, 102*8975f5c5SAndroid Build Coastguard Worker gl::DrawElementsType type, 103*8975f5c5SAndroid Build Coastguard Worker const void *indices, 104*8975f5c5SAndroid Build Coastguard Worker GLint baseVertex) override; 105*8975f5c5SAndroid Build Coastguard Worker angle::Result drawArraysIndirect(const gl::Context *context, 106*8975f5c5SAndroid Build Coastguard Worker gl::PrimitiveMode mode, 107*8975f5c5SAndroid Build Coastguard Worker const void *indirect) override; 108*8975f5c5SAndroid Build Coastguard Worker angle::Result drawElementsIndirect(const gl::Context *context, 109*8975f5c5SAndroid Build Coastguard Worker gl::PrimitiveMode mode, 110*8975f5c5SAndroid Build Coastguard Worker gl::DrawElementsType type, 111*8975f5c5SAndroid Build Coastguard Worker const void *indirect) override; 112*8975f5c5SAndroid Build Coastguard Worker 113*8975f5c5SAndroid Build Coastguard Worker angle::Result multiDrawArrays(const gl::Context *context, 114*8975f5c5SAndroid Build Coastguard Worker gl::PrimitiveMode mode, 115*8975f5c5SAndroid Build Coastguard Worker const GLint *firsts, 116*8975f5c5SAndroid Build Coastguard Worker const GLsizei *counts, 117*8975f5c5SAndroid Build Coastguard Worker GLsizei drawcount) override; 118*8975f5c5SAndroid Build Coastguard Worker angle::Result multiDrawArraysInstanced(const gl::Context *context, 119*8975f5c5SAndroid Build Coastguard Worker gl::PrimitiveMode mode, 120*8975f5c5SAndroid Build Coastguard Worker const GLint *firsts, 121*8975f5c5SAndroid Build Coastguard Worker const GLsizei *counts, 122*8975f5c5SAndroid Build Coastguard Worker const GLsizei *instanceCounts, 123*8975f5c5SAndroid Build Coastguard Worker GLsizei drawcount) override; 124*8975f5c5SAndroid Build Coastguard Worker angle::Result multiDrawArraysIndirect(const gl::Context *context, 125*8975f5c5SAndroid Build Coastguard Worker gl::PrimitiveMode mode, 126*8975f5c5SAndroid Build Coastguard Worker const void *indirect, 127*8975f5c5SAndroid Build Coastguard Worker GLsizei drawcount, 128*8975f5c5SAndroid Build Coastguard Worker GLsizei stride) override; 129*8975f5c5SAndroid Build Coastguard Worker angle::Result multiDrawElements(const gl::Context *context, 130*8975f5c5SAndroid Build Coastguard Worker gl::PrimitiveMode mode, 131*8975f5c5SAndroid Build Coastguard Worker const GLsizei *counts, 132*8975f5c5SAndroid Build Coastguard Worker gl::DrawElementsType type, 133*8975f5c5SAndroid Build Coastguard Worker const GLvoid *const *indices, 134*8975f5c5SAndroid Build Coastguard Worker GLsizei drawcount) override; 135*8975f5c5SAndroid Build Coastguard Worker angle::Result multiDrawElementsInstanced(const gl::Context *context, 136*8975f5c5SAndroid Build Coastguard Worker gl::PrimitiveMode mode, 137*8975f5c5SAndroid Build Coastguard Worker const GLsizei *counts, 138*8975f5c5SAndroid Build Coastguard Worker gl::DrawElementsType type, 139*8975f5c5SAndroid Build Coastguard Worker const GLvoid *const *indices, 140*8975f5c5SAndroid Build Coastguard Worker const GLsizei *instanceCounts, 141*8975f5c5SAndroid Build Coastguard Worker GLsizei drawcount) override; 142*8975f5c5SAndroid Build Coastguard Worker angle::Result multiDrawElementsIndirect(const gl::Context *context, 143*8975f5c5SAndroid Build Coastguard Worker gl::PrimitiveMode mode, 144*8975f5c5SAndroid Build Coastguard Worker gl::DrawElementsType type, 145*8975f5c5SAndroid Build Coastguard Worker const void *indirect, 146*8975f5c5SAndroid Build Coastguard Worker GLsizei drawcount, 147*8975f5c5SAndroid Build Coastguard Worker GLsizei stride) override; 148*8975f5c5SAndroid Build Coastguard Worker angle::Result multiDrawArraysInstancedBaseInstance(const gl::Context *context, 149*8975f5c5SAndroid Build Coastguard Worker gl::PrimitiveMode mode, 150*8975f5c5SAndroid Build Coastguard Worker const GLint *firsts, 151*8975f5c5SAndroid Build Coastguard Worker const GLsizei *counts, 152*8975f5c5SAndroid Build Coastguard Worker const GLsizei *instanceCounts, 153*8975f5c5SAndroid Build Coastguard Worker const GLuint *baseInstances, 154*8975f5c5SAndroid Build Coastguard Worker GLsizei drawcount) override; 155*8975f5c5SAndroid Build Coastguard Worker angle::Result multiDrawElementsInstancedBaseVertexBaseInstance(const gl::Context *context, 156*8975f5c5SAndroid Build Coastguard Worker gl::PrimitiveMode mode, 157*8975f5c5SAndroid Build Coastguard Worker const GLsizei *counts, 158*8975f5c5SAndroid Build Coastguard Worker gl::DrawElementsType type, 159*8975f5c5SAndroid Build Coastguard Worker const GLvoid *const *indices, 160*8975f5c5SAndroid Build Coastguard Worker const GLsizei *instanceCounts, 161*8975f5c5SAndroid Build Coastguard Worker const GLint *baseVertices, 162*8975f5c5SAndroid Build Coastguard Worker const GLuint *baseInstances, 163*8975f5c5SAndroid Build Coastguard Worker GLsizei drawcount) override; 164*8975f5c5SAndroid Build Coastguard Worker 165*8975f5c5SAndroid Build Coastguard Worker // Device loss 166*8975f5c5SAndroid Build Coastguard Worker gl::GraphicsResetStatus getResetStatus() override; 167*8975f5c5SAndroid Build Coastguard Worker 168*8975f5c5SAndroid Build Coastguard Worker // EXT_debug_marker 169*8975f5c5SAndroid Build Coastguard Worker angle::Result insertEventMarker(GLsizei length, const char *marker) override; 170*8975f5c5SAndroid Build Coastguard Worker angle::Result pushGroupMarker(GLsizei length, const char *marker) override; 171*8975f5c5SAndroid Build Coastguard Worker angle::Result popGroupMarker() override; 172*8975f5c5SAndroid Build Coastguard Worker 173*8975f5c5SAndroid Build Coastguard Worker // KHR_debug 174*8975f5c5SAndroid Build Coastguard Worker angle::Result pushDebugGroup(const gl::Context *context, 175*8975f5c5SAndroid Build Coastguard Worker GLenum source, 176*8975f5c5SAndroid Build Coastguard Worker GLuint id, 177*8975f5c5SAndroid Build Coastguard Worker const std::string &message) override; 178*8975f5c5SAndroid Build Coastguard Worker angle::Result popDebugGroup(const gl::Context *context) override; 179*8975f5c5SAndroid Build Coastguard Worker 180*8975f5c5SAndroid Build Coastguard Worker // State sync with dirty bits. 181*8975f5c5SAndroid Build Coastguard Worker angle::Result syncState(const gl::Context *context, 182*8975f5c5SAndroid Build Coastguard Worker const gl::state::DirtyBits dirtyBits, 183*8975f5c5SAndroid Build Coastguard Worker const gl::state::DirtyBits bitMask, 184*8975f5c5SAndroid Build Coastguard Worker const gl::state::ExtendedDirtyBits extendedDirtyBits, 185*8975f5c5SAndroid Build Coastguard Worker const gl::state::ExtendedDirtyBits extendedBitMask, 186*8975f5c5SAndroid Build Coastguard Worker gl::Command command) override; 187*8975f5c5SAndroid Build Coastguard Worker 188*8975f5c5SAndroid Build Coastguard Worker // Disjoint timer queries 189*8975f5c5SAndroid Build Coastguard Worker GLint getGPUDisjoint() override; 190*8975f5c5SAndroid Build Coastguard Worker GLint64 getTimestamp() override; 191*8975f5c5SAndroid Build Coastguard Worker 192*8975f5c5SAndroid Build Coastguard Worker // Context switching 193*8975f5c5SAndroid Build Coastguard Worker angle::Result onMakeCurrent(const gl::Context *context) override; 194*8975f5c5SAndroid Build Coastguard Worker 195*8975f5c5SAndroid Build Coastguard Worker // Native capabilities, unmodified by gl::Context. 196*8975f5c5SAndroid Build Coastguard Worker gl::Caps getNativeCaps() const override; 197*8975f5c5SAndroid Build Coastguard Worker const gl::TextureCapsMap &getNativeTextureCaps() const override; 198*8975f5c5SAndroid Build Coastguard Worker const gl::Extensions &getNativeExtensions() const override; 199*8975f5c5SAndroid Build Coastguard Worker const gl::Limitations &getNativeLimitations() const override; 200*8975f5c5SAndroid Build Coastguard Worker const ShPixelLocalStorageOptions &getNativePixelLocalStorageOptions() const override; 201*8975f5c5SAndroid Build Coastguard Worker 202*8975f5c5SAndroid Build Coastguard Worker // Shader creation 203*8975f5c5SAndroid Build Coastguard Worker CompilerImpl *createCompiler() override; 204*8975f5c5SAndroid Build Coastguard Worker ShaderImpl *createShader(const gl::ShaderState &data) override; 205*8975f5c5SAndroid Build Coastguard Worker ProgramImpl *createProgram(const gl::ProgramState &data) override; 206*8975f5c5SAndroid Build Coastguard Worker ProgramExecutableImpl *createProgramExecutable( 207*8975f5c5SAndroid Build Coastguard Worker const gl::ProgramExecutable *executable) override; 208*8975f5c5SAndroid Build Coastguard Worker 209*8975f5c5SAndroid Build Coastguard Worker // Framebuffer creation 210*8975f5c5SAndroid Build Coastguard Worker FramebufferImpl *createFramebuffer(const gl::FramebufferState &data) override; 211*8975f5c5SAndroid Build Coastguard Worker 212*8975f5c5SAndroid Build Coastguard Worker // Texture creation 213*8975f5c5SAndroid Build Coastguard Worker TextureImpl *createTexture(const gl::TextureState &state) override; 214*8975f5c5SAndroid Build Coastguard Worker 215*8975f5c5SAndroid Build Coastguard Worker // Renderbuffer creation 216*8975f5c5SAndroid Build Coastguard Worker RenderbufferImpl *createRenderbuffer(const gl::RenderbufferState &state) override; 217*8975f5c5SAndroid Build Coastguard Worker 218*8975f5c5SAndroid Build Coastguard Worker // Buffer creation 219*8975f5c5SAndroid Build Coastguard Worker BufferImpl *createBuffer(const gl::BufferState &state) override; 220*8975f5c5SAndroid Build Coastguard Worker 221*8975f5c5SAndroid Build Coastguard Worker // Vertex Array creation 222*8975f5c5SAndroid Build Coastguard Worker VertexArrayImpl *createVertexArray(const gl::VertexArrayState &data) override; 223*8975f5c5SAndroid Build Coastguard Worker 224*8975f5c5SAndroid Build Coastguard Worker // Query and Fence creation 225*8975f5c5SAndroid Build Coastguard Worker QueryImpl *createQuery(gl::QueryType type) override; 226*8975f5c5SAndroid Build Coastguard Worker FenceNVImpl *createFenceNV() override; 227*8975f5c5SAndroid Build Coastguard Worker SyncImpl *createSync() override; 228*8975f5c5SAndroid Build Coastguard Worker 229*8975f5c5SAndroid Build Coastguard Worker // Transform Feedback creation 230*8975f5c5SAndroid Build Coastguard Worker TransformFeedbackImpl *createTransformFeedback( 231*8975f5c5SAndroid Build Coastguard Worker const gl::TransformFeedbackState &state) override; 232*8975f5c5SAndroid Build Coastguard Worker 233*8975f5c5SAndroid Build Coastguard Worker // Sampler object creation 234*8975f5c5SAndroid Build Coastguard Worker SamplerImpl *createSampler(const gl::SamplerState &state) override; 235*8975f5c5SAndroid Build Coastguard Worker 236*8975f5c5SAndroid Build Coastguard Worker // Program Pipeline object creation 237*8975f5c5SAndroid Build Coastguard Worker ProgramPipelineImpl *createProgramPipeline(const gl::ProgramPipelineState &data) override; 238*8975f5c5SAndroid Build Coastguard Worker 239*8975f5c5SAndroid Build Coastguard Worker // Memory object creation. 240*8975f5c5SAndroid Build Coastguard Worker MemoryObjectImpl *createMemoryObject() override; 241*8975f5c5SAndroid Build Coastguard Worker 242*8975f5c5SAndroid Build Coastguard Worker // Semaphore creation. 243*8975f5c5SAndroid Build Coastguard Worker SemaphoreImpl *createSemaphore() override; 244*8975f5c5SAndroid Build Coastguard Worker 245*8975f5c5SAndroid Build Coastguard Worker // Overlay creation. 246*8975f5c5SAndroid Build Coastguard Worker OverlayImpl *createOverlay(const gl::OverlayState &state) override; 247*8975f5c5SAndroid Build Coastguard Worker 248*8975f5c5SAndroid Build Coastguard Worker angle::Result dispatchCompute(const gl::Context *context, 249*8975f5c5SAndroid Build Coastguard Worker GLuint numGroupsX, 250*8975f5c5SAndroid Build Coastguard Worker GLuint numGroupsY, 251*8975f5c5SAndroid Build Coastguard Worker GLuint numGroupsZ) override; 252*8975f5c5SAndroid Build Coastguard Worker angle::Result dispatchComputeIndirect(const gl::Context *context, GLintptr indirect) override; 253*8975f5c5SAndroid Build Coastguard Worker 254*8975f5c5SAndroid Build Coastguard Worker angle::Result memoryBarrier(const gl::Context *context, GLbitfield barriers) override; 255*8975f5c5SAndroid Build Coastguard Worker angle::Result memoryBarrierByRegion(const gl::Context *context, GLbitfield barriers) override; 256*8975f5c5SAndroid Build Coastguard Worker 257*8975f5c5SAndroid Build Coastguard Worker void handleError(GLenum errorCode, 258*8975f5c5SAndroid Build Coastguard Worker const char *message, 259*8975f5c5SAndroid Build Coastguard Worker const char *file, 260*8975f5c5SAndroid Build Coastguard Worker const char *function, 261*8975f5c5SAndroid Build Coastguard Worker unsigned int line); 262*8975f5c5SAndroid Build Coastguard Worker getImageLoadContext()263*8975f5c5SAndroid Build Coastguard Worker const angle::ImageLoadContext &getImageLoadContext() const { return mImageLoadContext; } 264*8975f5c5SAndroid Build Coastguard Worker getDisplay()265*8975f5c5SAndroid Build Coastguard Worker DisplayWgpu *getDisplay() { return mDisplay; } getDevice()266*8975f5c5SAndroid Build Coastguard Worker wgpu::Device &getDevice() { return mDisplay->getDevice(); } getQueue()267*8975f5c5SAndroid Build Coastguard Worker wgpu::Queue &getQueue() { return mDisplay->getQueue(); } getInstance()268*8975f5c5SAndroid Build Coastguard Worker wgpu::Instance &getInstance() { return mDisplay->getInstance(); } getImageLoadContext()269*8975f5c5SAndroid Build Coastguard Worker angle::ImageLoadContext &getImageLoadContext() { return mImageLoadContext; } getFormat(GLenum internalFormat)270*8975f5c5SAndroid Build Coastguard Worker const webgpu::Format &getFormat(GLenum internalFormat) const 271*8975f5c5SAndroid Build Coastguard Worker { 272*8975f5c5SAndroid Build Coastguard Worker return mDisplay->getFormat(internalFormat); 273*8975f5c5SAndroid Build Coastguard Worker } 274*8975f5c5SAndroid Build Coastguard Worker angle::Result startRenderPass(const wgpu::RenderPassDescriptor &desc); 275*8975f5c5SAndroid Build Coastguard Worker angle::Result endRenderPass(webgpu::RenderPassClosureReason closureReason); 276*8975f5c5SAndroid Build Coastguard Worker hasActiveRenderPass()277*8975f5c5SAndroid Build Coastguard Worker bool hasActiveRenderPass() { return mCurrentRenderPass != nullptr; } 278*8975f5c5SAndroid Build Coastguard Worker 279*8975f5c5SAndroid Build Coastguard Worker angle::Result onFramebufferChange(FramebufferWgpu *framebufferWgpu, gl::Command command); 280*8975f5c5SAndroid Build Coastguard Worker 281*8975f5c5SAndroid Build Coastguard Worker angle::Result flush(webgpu::RenderPassClosureReason); 282*8975f5c5SAndroid Build Coastguard Worker 283*8975f5c5SAndroid Build Coastguard Worker void setColorAttachmentFormat(size_t colorIndex, wgpu::TextureFormat format); 284*8975f5c5SAndroid Build Coastguard Worker void setColorAttachmentFormats(const gl::DrawBuffersArray<wgpu::TextureFormat> &formats); 285*8975f5c5SAndroid Build Coastguard Worker void setDepthStencilFormat(wgpu::TextureFormat format); 286*8975f5c5SAndroid Build Coastguard Worker void setVertexAttribute(size_t attribIndex, webgpu::PackedVertexAttribute newAttrib); 287*8975f5c5SAndroid Build Coastguard Worker 288*8975f5c5SAndroid Build Coastguard Worker void invalidateVertexBuffer(size_t slot); 289*8975f5c5SAndroid Build Coastguard Worker void invalidateVertexBuffers(); 290*8975f5c5SAndroid Build Coastguard Worker void invalidateIndexBuffer(); 291*8975f5c5SAndroid Build Coastguard Worker 292*8975f5c5SAndroid Build Coastguard Worker void ensureCommandEncoderCreated(); 293*8975f5c5SAndroid Build Coastguard Worker wgpu::CommandEncoder &getCurrentCommandEncoder(); 294*8975f5c5SAndroid Build Coastguard Worker 295*8975f5c5SAndroid Build Coastguard Worker private: 296*8975f5c5SAndroid Build Coastguard Worker // Dirty bits. 297*8975f5c5SAndroid Build Coastguard Worker enum DirtyBitType : size_t 298*8975f5c5SAndroid Build Coastguard Worker { 299*8975f5c5SAndroid Build Coastguard Worker // The pipeline has changed and needs to be recreated. 300*8975f5c5SAndroid Build Coastguard Worker DIRTY_BIT_RENDER_PIPELINE_DESC, 301*8975f5c5SAndroid Build Coastguard Worker 302*8975f5c5SAndroid Build Coastguard Worker DIRTY_BIT_RENDER_PASS, 303*8975f5c5SAndroid Build Coastguard Worker 304*8975f5c5SAndroid Build Coastguard Worker DIRTY_BIT_RENDER_PIPELINE_BINDING, 305*8975f5c5SAndroid Build Coastguard Worker DIRTY_BIT_VIEWPORT, 306*8975f5c5SAndroid Build Coastguard Worker DIRTY_BIT_SCISSOR, 307*8975f5c5SAndroid Build Coastguard Worker 308*8975f5c5SAndroid Build Coastguard Worker DIRTY_BIT_VERTEX_BUFFERS, 309*8975f5c5SAndroid Build Coastguard Worker DIRTY_BIT_INDEX_BUFFER, 310*8975f5c5SAndroid Build Coastguard Worker 311*8975f5c5SAndroid Build Coastguard Worker DIRTY_BIT_BIND_GROUPS, 312*8975f5c5SAndroid Build Coastguard Worker 313*8975f5c5SAndroid Build Coastguard Worker DIRTY_BIT_MAX, 314*8975f5c5SAndroid Build Coastguard Worker }; 315*8975f5c5SAndroid Build Coastguard Worker 316*8975f5c5SAndroid Build Coastguard Worker static_assert(DIRTY_BIT_RENDER_PIPELINE_BINDING > DIRTY_BIT_RENDER_PIPELINE_DESC, 317*8975f5c5SAndroid Build Coastguard Worker "Pipeline binding must be handled after the pipeline desc dirty bit"); 318*8975f5c5SAndroid Build Coastguard Worker 319*8975f5c5SAndroid Build Coastguard Worker // Dirty bit handlers that record commands or otherwise expect to manipulate the render pass 320*8975f5c5SAndroid Build Coastguard Worker // that will be used for the draw call must be specified after DIRTY_BIT_RENDER_PASS. 321*8975f5c5SAndroid Build Coastguard Worker static_assert(DIRTY_BIT_RENDER_PIPELINE_BINDING > DIRTY_BIT_RENDER_PASS, 322*8975f5c5SAndroid Build Coastguard Worker "Render pass using dirty bit must be handled after the render pass dirty bit"); 323*8975f5c5SAndroid Build Coastguard Worker 324*8975f5c5SAndroid Build Coastguard Worker using DirtyBits = angle::BitSet<DIRTY_BIT_MAX>; 325*8975f5c5SAndroid Build Coastguard Worker 326*8975f5c5SAndroid Build Coastguard Worker DirtyBits mDirtyBits; 327*8975f5c5SAndroid Build Coastguard Worker gl::AttributesMask mDirtyVertexBuffers; 328*8975f5c5SAndroid Build Coastguard Worker 329*8975f5c5SAndroid Build Coastguard Worker DirtyBits mNewRenderPassDirtyBits; 330*8975f5c5SAndroid Build Coastguard Worker invalidateCurrentRenderPipeline()331*8975f5c5SAndroid Build Coastguard Worker ANGLE_INLINE void invalidateCurrentRenderPipeline() 332*8975f5c5SAndroid Build Coastguard Worker { 333*8975f5c5SAndroid Build Coastguard Worker mDirtyBits.set(DIRTY_BIT_RENDER_PIPELINE_DESC); 334*8975f5c5SAndroid Build Coastguard Worker } 335*8975f5c5SAndroid Build Coastguard Worker 336*8975f5c5SAndroid Build Coastguard Worker angle::Result setupDraw(const gl::Context *context, 337*8975f5c5SAndroid Build Coastguard Worker gl::PrimitiveMode mode, 338*8975f5c5SAndroid Build Coastguard Worker GLint firstVertexOrInvalid, 339*8975f5c5SAndroid Build Coastguard Worker GLsizei vertexOrIndexCount, 340*8975f5c5SAndroid Build Coastguard Worker GLsizei instanceCount, 341*8975f5c5SAndroid Build Coastguard Worker gl::DrawElementsType indexTypeOrInvalid, 342*8975f5c5SAndroid Build Coastguard Worker const void *indices, 343*8975f5c5SAndroid Build Coastguard Worker GLint baseVertex, 344*8975f5c5SAndroid Build Coastguard Worker uint32_t *outFirstIndex); 345*8975f5c5SAndroid Build Coastguard Worker 346*8975f5c5SAndroid Build Coastguard Worker angle::Result handleDirtyRenderPipelineDesc(DirtyBits::Iterator *dirtyBitsIterator); 347*8975f5c5SAndroid Build Coastguard Worker angle::Result handleDirtyRenderPipelineBinding(DirtyBits::Iterator *dirtyBitsIterator); 348*8975f5c5SAndroid Build Coastguard Worker angle::Result handleDirtyViewport(DirtyBits::Iterator *dirtyBitsIterator); 349*8975f5c5SAndroid Build Coastguard Worker angle::Result handleDirtyScissor(DirtyBits::Iterator *dirtyBitsIterator); 350*8975f5c5SAndroid Build Coastguard Worker angle::Result handleDirtyVertexBuffers(const gl::AttributesMask &slots, 351*8975f5c5SAndroid Build Coastguard Worker DirtyBits::Iterator *dirtyBitsIterator); 352*8975f5c5SAndroid Build Coastguard Worker angle::Result handleDirtyIndexBuffer(gl::DrawElementsType indexType, 353*8975f5c5SAndroid Build Coastguard Worker DirtyBits::Iterator *dirtyBitsIterator); 354*8975f5c5SAndroid Build Coastguard Worker angle::Result handleDirtyBindGroups(DirtyBits::Iterator *dirtyBitsIterator); 355*8975f5c5SAndroid Build Coastguard Worker 356*8975f5c5SAndroid Build Coastguard Worker angle::Result handleDirtyRenderPass(DirtyBits::Iterator *dirtyBitsIterator); 357*8975f5c5SAndroid Build Coastguard Worker 358*8975f5c5SAndroid Build Coastguard Worker angle::ImageLoadContext mImageLoadContext; 359*8975f5c5SAndroid Build Coastguard Worker 360*8975f5c5SAndroid Build Coastguard Worker DisplayWgpu *mDisplay; 361*8975f5c5SAndroid Build Coastguard Worker 362*8975f5c5SAndroid Build Coastguard Worker wgpu::CommandEncoder mCurrentCommandEncoder; 363*8975f5c5SAndroid Build Coastguard Worker wgpu::RenderPassEncoder mCurrentRenderPass; 364*8975f5c5SAndroid Build Coastguard Worker 365*8975f5c5SAndroid Build Coastguard Worker webgpu::CommandBuffer mCommandBuffer; 366*8975f5c5SAndroid Build Coastguard Worker 367*8975f5c5SAndroid Build Coastguard Worker webgpu::RenderPipelineDesc mRenderPipelineDesc; 368*8975f5c5SAndroid Build Coastguard Worker wgpu::RenderPipeline mCurrentGraphicsPipeline; 369*8975f5c5SAndroid Build Coastguard Worker gl::AttributesMask mCurrentRenderPipelineAllAttributes; 370*8975f5c5SAndroid Build Coastguard Worker 371*8975f5c5SAndroid Build Coastguard Worker gl::DrawElementsType mCurrentIndexBufferType = gl::DrawElementsType::InvalidEnum; 372*8975f5c5SAndroid Build Coastguard Worker }; 373*8975f5c5SAndroid Build Coastguard Worker 374*8975f5c5SAndroid Build Coastguard Worker } // namespace rx 375*8975f5c5SAndroid Build Coastguard Worker 376*8975f5c5SAndroid Build Coastguard Worker #endif // LIBANGLE_RENDERER_WGPU_CONTEXTWGPU_H_ 377