xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/wgpu/ContextWgpu.cpp (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 // ContextWgpu.cpp:
7*8975f5c5SAndroid Build Coastguard Worker //    Implements the class methods for ContextWgpu.
8*8975f5c5SAndroid Build Coastguard Worker //
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/wgpu/ContextWgpu.h"
11*8975f5c5SAndroid Build Coastguard Worker 
12*8975f5c5SAndroid Build Coastguard Worker #include "common/debug.h"
13*8975f5c5SAndroid Build Coastguard Worker 
14*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/wgsl/OutputUniformBlocks.h"
15*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Context.h"
16*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/OverlayImpl.h"
17*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/wgpu/BufferWgpu.h"
18*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/wgpu/CompilerWgpu.h"
19*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/wgpu/DisplayWgpu.h"
20*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/wgpu/FenceNVWgpu.h"
21*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/wgpu/FramebufferWgpu.h"
22*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/wgpu/ImageWgpu.h"
23*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/wgpu/ProgramExecutableWgpu.h"
24*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/wgpu/ProgramPipelineWgpu.h"
25*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/wgpu/ProgramWgpu.h"
26*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/wgpu/QueryWgpu.h"
27*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/wgpu/RenderbufferWgpu.h"
28*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/wgpu/SamplerWgpu.h"
29*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/wgpu/ShaderWgpu.h"
30*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/wgpu/SyncWgpu.h"
31*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/wgpu/TextureWgpu.h"
32*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/wgpu/TransformFeedbackWgpu.h"
33*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/wgpu/VertexArrayWgpu.h"
34*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/wgpu/wgpu_pipeline_state.h"
35*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/wgpu/wgpu_utils.h"
36*8975f5c5SAndroid Build Coastguard Worker 
37*8975f5c5SAndroid Build Coastguard Worker namespace rx
38*8975f5c5SAndroid Build Coastguard Worker {
39*8975f5c5SAndroid Build Coastguard Worker 
40*8975f5c5SAndroid Build Coastguard Worker namespace
41*8975f5c5SAndroid Build Coastguard Worker {
42*8975f5c5SAndroid Build Coastguard Worker 
43*8975f5c5SAndroid Build Coastguard Worker constexpr angle::PackedEnumMap<webgpu::RenderPassClosureReason, const char *>
44*8975f5c5SAndroid Build Coastguard Worker     kRenderPassClosureReason = {{
45*8975f5c5SAndroid Build Coastguard Worker         {webgpu::RenderPassClosureReason::NewRenderPass,
46*8975f5c5SAndroid Build Coastguard Worker          "Render pass closed due to starting a new render pass"},
47*8975f5c5SAndroid Build Coastguard Worker         {webgpu::RenderPassClosureReason::FramebufferBindingChange,
48*8975f5c5SAndroid Build Coastguard Worker          "Render pass closed due to framebuffer binding change"},
49*8975f5c5SAndroid Build Coastguard Worker         {webgpu::RenderPassClosureReason::FramebufferInternalChange,
50*8975f5c5SAndroid Build Coastguard Worker          "Render pass closed due to framebuffer internal change"},
51*8975f5c5SAndroid Build Coastguard Worker         {webgpu::RenderPassClosureReason::GLFlush, "Render pass closed due to glFlush"},
52*8975f5c5SAndroid Build Coastguard Worker         {webgpu::RenderPassClosureReason::GLFinish, "Render pass closed due to glFinish"},
53*8975f5c5SAndroid Build Coastguard Worker         {webgpu::RenderPassClosureReason::EGLSwapBuffers,
54*8975f5c5SAndroid Build Coastguard Worker          "Render pass closed due to eglSwapBuffers"},
55*8975f5c5SAndroid Build Coastguard Worker         {webgpu::RenderPassClosureReason::GLReadPixels, "Render pass closed due to glReadPixels"},
56*8975f5c5SAndroid Build Coastguard Worker         {webgpu::RenderPassClosureReason::IndexRangeReadback,
57*8975f5c5SAndroid Build Coastguard Worker          "Render pass closed due to index buffer read back for streamed client data"},
58*8975f5c5SAndroid Build Coastguard Worker         {webgpu::RenderPassClosureReason::VertexArrayStreaming,
59*8975f5c5SAndroid Build Coastguard Worker          "Render pass closed for uploading streamed client data"},
60*8975f5c5SAndroid Build Coastguard Worker     }};
61*8975f5c5SAndroid Build Coastguard Worker 
62*8975f5c5SAndroid Build Coastguard Worker }  // namespace
63*8975f5c5SAndroid Build Coastguard Worker 
ContextWgpu(const gl::State & state,gl::ErrorSet * errorSet,DisplayWgpu * display)64*8975f5c5SAndroid Build Coastguard Worker ContextWgpu::ContextWgpu(const gl::State &state, gl::ErrorSet *errorSet, DisplayWgpu *display)
65*8975f5c5SAndroid Build Coastguard Worker     : ContextImpl(state, errorSet), mDisplay(display)
66*8975f5c5SAndroid Build Coastguard Worker {
67*8975f5c5SAndroid Build Coastguard Worker     mNewRenderPassDirtyBits = DirtyBits{
68*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_RENDER_PIPELINE_BINDING,  // The pipeline needs to be bound for each renderpass
69*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_VIEWPORT,
70*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_SCISSOR,
71*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_VERTEX_BUFFERS,
72*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_INDEX_BUFFER,
73*8975f5c5SAndroid Build Coastguard Worker         DIRTY_BIT_BIND_GROUPS,
74*8975f5c5SAndroid Build Coastguard Worker     };
75*8975f5c5SAndroid Build Coastguard Worker }
76*8975f5c5SAndroid Build Coastguard Worker 
~ContextWgpu()77*8975f5c5SAndroid Build Coastguard Worker ContextWgpu::~ContextWgpu() {}
78*8975f5c5SAndroid Build Coastguard Worker 
onDestroy(const gl::Context * context)79*8975f5c5SAndroid Build Coastguard Worker void ContextWgpu::onDestroy(const gl::Context *context)
80*8975f5c5SAndroid Build Coastguard Worker {
81*8975f5c5SAndroid Build Coastguard Worker     mImageLoadContext = {};
82*8975f5c5SAndroid Build Coastguard Worker }
83*8975f5c5SAndroid Build Coastguard Worker 
initialize(const angle::ImageLoadContext & imageLoadContext)84*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextWgpu::initialize(const angle::ImageLoadContext &imageLoadContext)
85*8975f5c5SAndroid Build Coastguard Worker {
86*8975f5c5SAndroid Build Coastguard Worker     mImageLoadContext = imageLoadContext;
87*8975f5c5SAndroid Build Coastguard Worker 
88*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
89*8975f5c5SAndroid Build Coastguard Worker }
90*8975f5c5SAndroid Build Coastguard Worker 
onFramebufferChange(FramebufferWgpu * framebufferWgpu,gl::Command command)91*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextWgpu::onFramebufferChange(FramebufferWgpu *framebufferWgpu,
92*8975f5c5SAndroid Build Coastguard Worker                                                gl::Command command)
93*8975f5c5SAndroid Build Coastguard Worker {
94*8975f5c5SAndroid Build Coastguard Worker     // If internal framebuffer state changes, always end the render pass
95*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(endRenderPass(webgpu::RenderPassClosureReason::FramebufferInternalChange));
96*8975f5c5SAndroid Build Coastguard Worker 
97*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
98*8975f5c5SAndroid Build Coastguard Worker }
99*8975f5c5SAndroid Build Coastguard Worker 
flush(const gl::Context * context)100*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextWgpu::flush(const gl::Context *context)
101*8975f5c5SAndroid Build Coastguard Worker {
102*8975f5c5SAndroid Build Coastguard Worker     return flush(webgpu::RenderPassClosureReason::GLFlush);
103*8975f5c5SAndroid Build Coastguard Worker }
104*8975f5c5SAndroid Build Coastguard Worker 
flush(webgpu::RenderPassClosureReason closureReason)105*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextWgpu::flush(webgpu::RenderPassClosureReason closureReason)
106*8975f5c5SAndroid Build Coastguard Worker {
107*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(endRenderPass(closureReason));
108*8975f5c5SAndroid Build Coastguard Worker 
109*8975f5c5SAndroid Build Coastguard Worker     if (mCurrentCommandEncoder)
110*8975f5c5SAndroid Build Coastguard Worker     {
111*8975f5c5SAndroid Build Coastguard Worker         wgpu::CommandBuffer commandBuffer = mCurrentCommandEncoder.Finish();
112*8975f5c5SAndroid Build Coastguard Worker         mCurrentCommandEncoder            = nullptr;
113*8975f5c5SAndroid Build Coastguard Worker 
114*8975f5c5SAndroid Build Coastguard Worker         getQueue().Submit(1, &commandBuffer);
115*8975f5c5SAndroid Build Coastguard Worker     }
116*8975f5c5SAndroid Build Coastguard Worker 
117*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
118*8975f5c5SAndroid Build Coastguard Worker }
119*8975f5c5SAndroid Build Coastguard Worker 
setColorAttachmentFormat(size_t colorIndex,wgpu::TextureFormat format)120*8975f5c5SAndroid Build Coastguard Worker void ContextWgpu::setColorAttachmentFormat(size_t colorIndex, wgpu::TextureFormat format)
121*8975f5c5SAndroid Build Coastguard Worker {
122*8975f5c5SAndroid Build Coastguard Worker     if (mRenderPipelineDesc.setColorAttachmentFormat(colorIndex, format))
123*8975f5c5SAndroid Build Coastguard Worker     {
124*8975f5c5SAndroid Build Coastguard Worker         invalidateCurrentRenderPipeline();
125*8975f5c5SAndroid Build Coastguard Worker     }
126*8975f5c5SAndroid Build Coastguard Worker }
127*8975f5c5SAndroid Build Coastguard Worker 
setColorAttachmentFormats(const gl::DrawBuffersArray<wgpu::TextureFormat> & formats)128*8975f5c5SAndroid Build Coastguard Worker void ContextWgpu::setColorAttachmentFormats(
129*8975f5c5SAndroid Build Coastguard Worker     const gl::DrawBuffersArray<wgpu::TextureFormat> &formats)
130*8975f5c5SAndroid Build Coastguard Worker {
131*8975f5c5SAndroid Build Coastguard Worker     for (size_t i = 0; i < formats.size(); i++)
132*8975f5c5SAndroid Build Coastguard Worker     {
133*8975f5c5SAndroid Build Coastguard Worker         setColorAttachmentFormat(i, formats[i]);
134*8975f5c5SAndroid Build Coastguard Worker     }
135*8975f5c5SAndroid Build Coastguard Worker }
136*8975f5c5SAndroid Build Coastguard Worker 
setDepthStencilFormat(wgpu::TextureFormat format)137*8975f5c5SAndroid Build Coastguard Worker void ContextWgpu::setDepthStencilFormat(wgpu::TextureFormat format)
138*8975f5c5SAndroid Build Coastguard Worker {
139*8975f5c5SAndroid Build Coastguard Worker     if (mRenderPipelineDesc.setDepthStencilAttachmentFormat(format))
140*8975f5c5SAndroid Build Coastguard Worker     {
141*8975f5c5SAndroid Build Coastguard Worker         invalidateCurrentRenderPipeline();
142*8975f5c5SAndroid Build Coastguard Worker     }
143*8975f5c5SAndroid Build Coastguard Worker }
144*8975f5c5SAndroid Build Coastguard Worker 
setVertexAttribute(size_t attribIndex,webgpu::PackedVertexAttribute newAttrib)145*8975f5c5SAndroid Build Coastguard Worker void ContextWgpu::setVertexAttribute(size_t attribIndex, webgpu::PackedVertexAttribute newAttrib)
146*8975f5c5SAndroid Build Coastguard Worker {
147*8975f5c5SAndroid Build Coastguard Worker     if (mRenderPipelineDesc.setVertexAttribute(attribIndex, newAttrib))
148*8975f5c5SAndroid Build Coastguard Worker     {
149*8975f5c5SAndroid Build Coastguard Worker         invalidateCurrentRenderPipeline();
150*8975f5c5SAndroid Build Coastguard Worker     }
151*8975f5c5SAndroid Build Coastguard Worker }
152*8975f5c5SAndroid Build Coastguard Worker 
invalidateVertexBuffer(size_t slot)153*8975f5c5SAndroid Build Coastguard Worker void ContextWgpu::invalidateVertexBuffer(size_t slot)
154*8975f5c5SAndroid Build Coastguard Worker {
155*8975f5c5SAndroid Build Coastguard Worker     if (mCurrentRenderPipelineAllAttributes[slot])
156*8975f5c5SAndroid Build Coastguard Worker     {
157*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set(DIRTY_BIT_VERTEX_BUFFERS);
158*8975f5c5SAndroid Build Coastguard Worker         mDirtyVertexBuffers.set(slot);
159*8975f5c5SAndroid Build Coastguard Worker     }
160*8975f5c5SAndroid Build Coastguard Worker }
161*8975f5c5SAndroid Build Coastguard Worker 
invalidateVertexBuffers()162*8975f5c5SAndroid Build Coastguard Worker void ContextWgpu::invalidateVertexBuffers()
163*8975f5c5SAndroid Build Coastguard Worker {
164*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(DIRTY_BIT_VERTEX_BUFFERS);
165*8975f5c5SAndroid Build Coastguard Worker     mDirtyVertexBuffers = mCurrentRenderPipelineAllAttributes;
166*8975f5c5SAndroid Build Coastguard Worker }
167*8975f5c5SAndroid Build Coastguard Worker 
invalidateIndexBuffer()168*8975f5c5SAndroid Build Coastguard Worker void ContextWgpu::invalidateIndexBuffer()
169*8975f5c5SAndroid Build Coastguard Worker {
170*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(DIRTY_BIT_INDEX_BUFFER);
171*8975f5c5SAndroid Build Coastguard Worker }
172*8975f5c5SAndroid Build Coastguard Worker 
ensureCommandEncoderCreated()173*8975f5c5SAndroid Build Coastguard Worker void ContextWgpu::ensureCommandEncoderCreated()
174*8975f5c5SAndroid Build Coastguard Worker {
175*8975f5c5SAndroid Build Coastguard Worker     if (!mCurrentCommandEncoder)
176*8975f5c5SAndroid Build Coastguard Worker     {
177*8975f5c5SAndroid Build Coastguard Worker         mCurrentCommandEncoder = getDevice().CreateCommandEncoder(nullptr);
178*8975f5c5SAndroid Build Coastguard Worker     }
179*8975f5c5SAndroid Build Coastguard Worker }
180*8975f5c5SAndroid Build Coastguard Worker 
getCurrentCommandEncoder()181*8975f5c5SAndroid Build Coastguard Worker wgpu::CommandEncoder &ContextWgpu::getCurrentCommandEncoder()
182*8975f5c5SAndroid Build Coastguard Worker {
183*8975f5c5SAndroid Build Coastguard Worker     return mCurrentCommandEncoder;
184*8975f5c5SAndroid Build Coastguard Worker }
185*8975f5c5SAndroid Build Coastguard Worker 
finish(const gl::Context * context)186*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextWgpu::finish(const gl::Context *context)
187*8975f5c5SAndroid Build Coastguard Worker {
188*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(flush(webgpu::RenderPassClosureReason::GLFinish));
189*8975f5c5SAndroid Build Coastguard Worker 
190*8975f5c5SAndroid Build Coastguard Worker     wgpu::Future onWorkSubmittedFuture = getQueue().OnSubmittedWorkDone(
191*8975f5c5SAndroid Build Coastguard Worker         wgpu::CallbackMode::WaitAnyOnly, [](wgpu::QueueWorkDoneStatus status) {});
192*8975f5c5SAndroid Build Coastguard Worker     wgpu::WaitStatus status = getInstance().WaitAny(onWorkSubmittedFuture, -1);
193*8975f5c5SAndroid Build Coastguard Worker     ASSERT(!webgpu::IsWgpuError(status));
194*8975f5c5SAndroid Build Coastguard Worker 
195*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
196*8975f5c5SAndroid Build Coastguard Worker }
197*8975f5c5SAndroid Build Coastguard Worker 
drawArrays(const gl::Context * context,gl::PrimitiveMode mode,GLint first,GLsizei count)198*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextWgpu::drawArrays(const gl::Context *context,
199*8975f5c5SAndroid Build Coastguard Worker                                       gl::PrimitiveMode mode,
200*8975f5c5SAndroid Build Coastguard Worker                                       GLint first,
201*8975f5c5SAndroid Build Coastguard Worker                                       GLsizei count)
202*8975f5c5SAndroid Build Coastguard Worker {
203*8975f5c5SAndroid Build Coastguard Worker     if (mode == gl::PrimitiveMode::LineLoop)
204*8975f5c5SAndroid Build Coastguard Worker     {
205*8975f5c5SAndroid Build Coastguard Worker         UNIMPLEMENTED();
206*8975f5c5SAndroid Build Coastguard Worker         return angle::Result::Continue;
207*8975f5c5SAndroid Build Coastguard Worker     }
208*8975f5c5SAndroid Build Coastguard Worker     else if (mode == gl::PrimitiveMode::TriangleFan)
209*8975f5c5SAndroid Build Coastguard Worker     {
210*8975f5c5SAndroid Build Coastguard Worker         UNIMPLEMENTED();
211*8975f5c5SAndroid Build Coastguard Worker         return angle::Result::Continue;
212*8975f5c5SAndroid Build Coastguard Worker     }
213*8975f5c5SAndroid Build Coastguard Worker 
214*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(setupDraw(context, mode, first, count, 1, gl::DrawElementsType::InvalidEnum, nullptr,
215*8975f5c5SAndroid Build Coastguard Worker                         0, nullptr));
216*8975f5c5SAndroid Build Coastguard Worker     mCommandBuffer.draw(static_cast<uint32_t>(count), 1, static_cast<uint32_t>(first), 0);
217*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
218*8975f5c5SAndroid Build Coastguard Worker }
219*8975f5c5SAndroid Build Coastguard Worker 
drawArraysInstanced(const gl::Context * context,gl::PrimitiveMode mode,GLint first,GLsizei count,GLsizei instanceCount)220*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextWgpu::drawArraysInstanced(const gl::Context *context,
221*8975f5c5SAndroid Build Coastguard Worker                                                gl::PrimitiveMode mode,
222*8975f5c5SAndroid Build Coastguard Worker                                                GLint first,
223*8975f5c5SAndroid Build Coastguard Worker                                                GLsizei count,
224*8975f5c5SAndroid Build Coastguard Worker                                                GLsizei instanceCount)
225*8975f5c5SAndroid Build Coastguard Worker {
226*8975f5c5SAndroid Build Coastguard Worker     if (mode == gl::PrimitiveMode::LineLoop)
227*8975f5c5SAndroid Build Coastguard Worker     {
228*8975f5c5SAndroid Build Coastguard Worker         UNIMPLEMENTED();
229*8975f5c5SAndroid Build Coastguard Worker         return angle::Result::Continue;
230*8975f5c5SAndroid Build Coastguard Worker     }
231*8975f5c5SAndroid Build Coastguard Worker     else if (mode == gl::PrimitiveMode::TriangleFan)
232*8975f5c5SAndroid Build Coastguard Worker     {
233*8975f5c5SAndroid Build Coastguard Worker         UNIMPLEMENTED();
234*8975f5c5SAndroid Build Coastguard Worker         return angle::Result::Continue;
235*8975f5c5SAndroid Build Coastguard Worker     }
236*8975f5c5SAndroid Build Coastguard Worker 
237*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(setupDraw(context, mode, first, count, instanceCount,
238*8975f5c5SAndroid Build Coastguard Worker                         gl::DrawElementsType::InvalidEnum, nullptr, 0, nullptr));
239*8975f5c5SAndroid Build Coastguard Worker     mCommandBuffer.draw(static_cast<uint32_t>(count), static_cast<uint32_t>(instanceCount),
240*8975f5c5SAndroid Build Coastguard Worker                         static_cast<uint32_t>(first), 0);
241*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
242*8975f5c5SAndroid Build Coastguard Worker }
243*8975f5c5SAndroid Build Coastguard Worker 
drawArraysInstancedBaseInstance(const gl::Context * context,gl::PrimitiveMode mode,GLint first,GLsizei count,GLsizei instanceCount,GLuint baseInstance)244*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextWgpu::drawArraysInstancedBaseInstance(const gl::Context *context,
245*8975f5c5SAndroid Build Coastguard Worker                                                            gl::PrimitiveMode mode,
246*8975f5c5SAndroid Build Coastguard Worker                                                            GLint first,
247*8975f5c5SAndroid Build Coastguard Worker                                                            GLsizei count,
248*8975f5c5SAndroid Build Coastguard Worker                                                            GLsizei instanceCount,
249*8975f5c5SAndroid Build Coastguard Worker                                                            GLuint baseInstance)
250*8975f5c5SAndroid Build Coastguard Worker {
251*8975f5c5SAndroid Build Coastguard Worker     if (mode == gl::PrimitiveMode::LineLoop)
252*8975f5c5SAndroid Build Coastguard Worker     {
253*8975f5c5SAndroid Build Coastguard Worker         UNIMPLEMENTED();
254*8975f5c5SAndroid Build Coastguard Worker         return angle::Result::Continue;
255*8975f5c5SAndroid Build Coastguard Worker     }
256*8975f5c5SAndroid Build Coastguard Worker     else if (mode == gl::PrimitiveMode::TriangleFan)
257*8975f5c5SAndroid Build Coastguard Worker     {
258*8975f5c5SAndroid Build Coastguard Worker         UNIMPLEMENTED();
259*8975f5c5SAndroid Build Coastguard Worker         return angle::Result::Continue;
260*8975f5c5SAndroid Build Coastguard Worker     }
261*8975f5c5SAndroid Build Coastguard Worker 
262*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(setupDraw(context, mode, first, count, instanceCount,
263*8975f5c5SAndroid Build Coastguard Worker                         gl::DrawElementsType::InvalidEnum, nullptr, 0, nullptr));
264*8975f5c5SAndroid Build Coastguard Worker     mCommandBuffer.draw(static_cast<uint32_t>(count), static_cast<uint32_t>(instanceCount),
265*8975f5c5SAndroid Build Coastguard Worker                         static_cast<uint32_t>(first), baseInstance);
266*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
267*8975f5c5SAndroid Build Coastguard Worker }
268*8975f5c5SAndroid Build Coastguard Worker 
drawElements(const gl::Context * context,gl::PrimitiveMode mode,GLsizei count,gl::DrawElementsType type,const void * indices)269*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextWgpu::drawElements(const gl::Context *context,
270*8975f5c5SAndroid Build Coastguard Worker                                         gl::PrimitiveMode mode,
271*8975f5c5SAndroid Build Coastguard Worker                                         GLsizei count,
272*8975f5c5SAndroid Build Coastguard Worker                                         gl::DrawElementsType type,
273*8975f5c5SAndroid Build Coastguard Worker                                         const void *indices)
274*8975f5c5SAndroid Build Coastguard Worker {
275*8975f5c5SAndroid Build Coastguard Worker     if (mode == gl::PrimitiveMode::LineLoop)
276*8975f5c5SAndroid Build Coastguard Worker     {
277*8975f5c5SAndroid Build Coastguard Worker         UNIMPLEMENTED();
278*8975f5c5SAndroid Build Coastguard Worker         return angle::Result::Continue;
279*8975f5c5SAndroid Build Coastguard Worker     }
280*8975f5c5SAndroid Build Coastguard Worker     else if (mode == gl::PrimitiveMode::TriangleFan)
281*8975f5c5SAndroid Build Coastguard Worker     {
282*8975f5c5SAndroid Build Coastguard Worker         UNIMPLEMENTED();
283*8975f5c5SAndroid Build Coastguard Worker         return angle::Result::Continue;
284*8975f5c5SAndroid Build Coastguard Worker     }
285*8975f5c5SAndroid Build Coastguard Worker 
286*8975f5c5SAndroid Build Coastguard Worker     uint32_t firstVertex = 0;
287*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(setupDraw(context, mode, 0, count, 1, type, indices, 0, &firstVertex));
288*8975f5c5SAndroid Build Coastguard Worker     mCommandBuffer.drawIndexed(static_cast<uint32_t>(count), 1, firstVertex, 0, 0);
289*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
290*8975f5c5SAndroid Build Coastguard Worker }
291*8975f5c5SAndroid Build Coastguard Worker 
drawElementsBaseVertex(const gl::Context * context,gl::PrimitiveMode mode,GLsizei count,gl::DrawElementsType type,const void * indices,GLint baseVertex)292*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextWgpu::drawElementsBaseVertex(const gl::Context *context,
293*8975f5c5SAndroid Build Coastguard Worker                                                   gl::PrimitiveMode mode,
294*8975f5c5SAndroid Build Coastguard Worker                                                   GLsizei count,
295*8975f5c5SAndroid Build Coastguard Worker                                                   gl::DrawElementsType type,
296*8975f5c5SAndroid Build Coastguard Worker                                                   const void *indices,
297*8975f5c5SAndroid Build Coastguard Worker                                                   GLint baseVertex)
298*8975f5c5SAndroid Build Coastguard Worker {
299*8975f5c5SAndroid Build Coastguard Worker     if (mode == gl::PrimitiveMode::LineLoop)
300*8975f5c5SAndroid Build Coastguard Worker     {
301*8975f5c5SAndroid Build Coastguard Worker         UNIMPLEMENTED();
302*8975f5c5SAndroid Build Coastguard Worker         return angle::Result::Continue;
303*8975f5c5SAndroid Build Coastguard Worker     }
304*8975f5c5SAndroid Build Coastguard Worker     else if (mode == gl::PrimitiveMode::TriangleFan)
305*8975f5c5SAndroid Build Coastguard Worker     {
306*8975f5c5SAndroid Build Coastguard Worker         UNIMPLEMENTED();
307*8975f5c5SAndroid Build Coastguard Worker         return angle::Result::Continue;
308*8975f5c5SAndroid Build Coastguard Worker     }
309*8975f5c5SAndroid Build Coastguard Worker 
310*8975f5c5SAndroid Build Coastguard Worker     uint32_t firstVertex = 0;
311*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(setupDraw(context, mode, 0, count, 1, type, indices, baseVertex, &firstVertex));
312*8975f5c5SAndroid Build Coastguard Worker     mCommandBuffer.drawIndexed(static_cast<uint32_t>(count), 1, firstVertex,
313*8975f5c5SAndroid Build Coastguard Worker                                static_cast<uint32_t>(baseVertex), 0);
314*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
315*8975f5c5SAndroid Build Coastguard Worker }
316*8975f5c5SAndroid Build Coastguard Worker 
drawElementsInstanced(const gl::Context * context,gl::PrimitiveMode mode,GLsizei count,gl::DrawElementsType type,const void * indices,GLsizei instances)317*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextWgpu::drawElementsInstanced(const gl::Context *context,
318*8975f5c5SAndroid Build Coastguard Worker                                                  gl::PrimitiveMode mode,
319*8975f5c5SAndroid Build Coastguard Worker                                                  GLsizei count,
320*8975f5c5SAndroid Build Coastguard Worker                                                  gl::DrawElementsType type,
321*8975f5c5SAndroid Build Coastguard Worker                                                  const void *indices,
322*8975f5c5SAndroid Build Coastguard Worker                                                  GLsizei instances)
323*8975f5c5SAndroid Build Coastguard Worker {
324*8975f5c5SAndroid Build Coastguard Worker     if (mode == gl::PrimitiveMode::LineLoop)
325*8975f5c5SAndroid Build Coastguard Worker     {
326*8975f5c5SAndroid Build Coastguard Worker         UNIMPLEMENTED();
327*8975f5c5SAndroid Build Coastguard Worker         return angle::Result::Continue;
328*8975f5c5SAndroid Build Coastguard Worker     }
329*8975f5c5SAndroid Build Coastguard Worker     else if (mode == gl::PrimitiveMode::TriangleFan)
330*8975f5c5SAndroid Build Coastguard Worker     {
331*8975f5c5SAndroid Build Coastguard Worker         UNIMPLEMENTED();
332*8975f5c5SAndroid Build Coastguard Worker         return angle::Result::Continue;
333*8975f5c5SAndroid Build Coastguard Worker     }
334*8975f5c5SAndroid Build Coastguard Worker 
335*8975f5c5SAndroid Build Coastguard Worker     uint32_t firstVertex = 0;
336*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(setupDraw(context, mode, 0, count, instances, type, indices, 0, &firstVertex));
337*8975f5c5SAndroid Build Coastguard Worker     mCommandBuffer.drawIndexed(static_cast<uint32_t>(count), static_cast<uint32_t>(instances),
338*8975f5c5SAndroid Build Coastguard Worker                                firstVertex, 0, 0);
339*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
340*8975f5c5SAndroid Build Coastguard Worker }
341*8975f5c5SAndroid Build Coastguard Worker 
drawElementsInstancedBaseVertex(const gl::Context * context,gl::PrimitiveMode mode,GLsizei count,gl::DrawElementsType type,const void * indices,GLsizei instances,GLint baseVertex)342*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextWgpu::drawElementsInstancedBaseVertex(const gl::Context *context,
343*8975f5c5SAndroid Build Coastguard Worker                                                            gl::PrimitiveMode mode,
344*8975f5c5SAndroid Build Coastguard Worker                                                            GLsizei count,
345*8975f5c5SAndroid Build Coastguard Worker                                                            gl::DrawElementsType type,
346*8975f5c5SAndroid Build Coastguard Worker                                                            const void *indices,
347*8975f5c5SAndroid Build Coastguard Worker                                                            GLsizei instances,
348*8975f5c5SAndroid Build Coastguard Worker                                                            GLint baseVertex)
349*8975f5c5SAndroid Build Coastguard Worker {
350*8975f5c5SAndroid Build Coastguard Worker     if (mode == gl::PrimitiveMode::LineLoop)
351*8975f5c5SAndroid Build Coastguard Worker     {
352*8975f5c5SAndroid Build Coastguard Worker         UNIMPLEMENTED();
353*8975f5c5SAndroid Build Coastguard Worker         return angle::Result::Continue;
354*8975f5c5SAndroid Build Coastguard Worker     }
355*8975f5c5SAndroid Build Coastguard Worker     else if (mode == gl::PrimitiveMode::TriangleFan)
356*8975f5c5SAndroid Build Coastguard Worker     {
357*8975f5c5SAndroid Build Coastguard Worker         UNIMPLEMENTED();
358*8975f5c5SAndroid Build Coastguard Worker         return angle::Result::Continue;
359*8975f5c5SAndroid Build Coastguard Worker     }
360*8975f5c5SAndroid Build Coastguard Worker 
361*8975f5c5SAndroid Build Coastguard Worker     uint32_t firstVertex = 0;
362*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(
363*8975f5c5SAndroid Build Coastguard Worker         setupDraw(context, mode, 0, count, instances, type, indices, baseVertex, &firstVertex));
364*8975f5c5SAndroid Build Coastguard Worker     mCommandBuffer.drawIndexed(static_cast<uint32_t>(count), static_cast<uint32_t>(instances),
365*8975f5c5SAndroid Build Coastguard Worker                                firstVertex, static_cast<uint32_t>(baseVertex), 0);
366*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
367*8975f5c5SAndroid Build Coastguard Worker }
368*8975f5c5SAndroid Build Coastguard Worker 
drawElementsInstancedBaseVertexBaseInstance(const gl::Context * context,gl::PrimitiveMode mode,GLsizei count,gl::DrawElementsType type,const void * indices,GLsizei instances,GLint baseVertex,GLuint baseInstance)369*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextWgpu::drawElementsInstancedBaseVertexBaseInstance(const gl::Context *context,
370*8975f5c5SAndroid Build Coastguard Worker                                                                        gl::PrimitiveMode mode,
371*8975f5c5SAndroid Build Coastguard Worker                                                                        GLsizei count,
372*8975f5c5SAndroid Build Coastguard Worker                                                                        gl::DrawElementsType type,
373*8975f5c5SAndroid Build Coastguard Worker                                                                        const void *indices,
374*8975f5c5SAndroid Build Coastguard Worker                                                                        GLsizei instances,
375*8975f5c5SAndroid Build Coastguard Worker                                                                        GLint baseVertex,
376*8975f5c5SAndroid Build Coastguard Worker                                                                        GLuint baseInstance)
377*8975f5c5SAndroid Build Coastguard Worker {
378*8975f5c5SAndroid Build Coastguard Worker     if (mode == gl::PrimitiveMode::LineLoop)
379*8975f5c5SAndroid Build Coastguard Worker     {
380*8975f5c5SAndroid Build Coastguard Worker         UNIMPLEMENTED();
381*8975f5c5SAndroid Build Coastguard Worker         return angle::Result::Continue;
382*8975f5c5SAndroid Build Coastguard Worker     }
383*8975f5c5SAndroid Build Coastguard Worker     else if (mode == gl::PrimitiveMode::TriangleFan)
384*8975f5c5SAndroid Build Coastguard Worker     {
385*8975f5c5SAndroid Build Coastguard Worker         UNIMPLEMENTED();
386*8975f5c5SAndroid Build Coastguard Worker         return angle::Result::Continue;
387*8975f5c5SAndroid Build Coastguard Worker     }
388*8975f5c5SAndroid Build Coastguard Worker 
389*8975f5c5SAndroid Build Coastguard Worker     uint32_t firstVertex = 0;
390*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(
391*8975f5c5SAndroid Build Coastguard Worker         setupDraw(context, mode, 0, count, instances, type, indices, baseVertex, &firstVertex));
392*8975f5c5SAndroid Build Coastguard Worker     mCommandBuffer.drawIndexed(static_cast<uint32_t>(count), static_cast<uint32_t>(instances),
393*8975f5c5SAndroid Build Coastguard Worker                                firstVertex, static_cast<uint32_t>(baseVertex),
394*8975f5c5SAndroid Build Coastguard Worker                                static_cast<uint32_t>(baseInstance));
395*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
396*8975f5c5SAndroid Build Coastguard Worker }
397*8975f5c5SAndroid Build Coastguard Worker 
drawRangeElements(const gl::Context * context,gl::PrimitiveMode mode,GLuint start,GLuint end,GLsizei count,gl::DrawElementsType type,const void * indices)398*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextWgpu::drawRangeElements(const gl::Context *context,
399*8975f5c5SAndroid Build Coastguard Worker                                              gl::PrimitiveMode mode,
400*8975f5c5SAndroid Build Coastguard Worker                                              GLuint start,
401*8975f5c5SAndroid Build Coastguard Worker                                              GLuint end,
402*8975f5c5SAndroid Build Coastguard Worker                                              GLsizei count,
403*8975f5c5SAndroid Build Coastguard Worker                                              gl::DrawElementsType type,
404*8975f5c5SAndroid Build Coastguard Worker                                              const void *indices)
405*8975f5c5SAndroid Build Coastguard Worker {
406*8975f5c5SAndroid Build Coastguard Worker     return drawElements(context, mode, count, type, indices);
407*8975f5c5SAndroid Build Coastguard Worker }
408*8975f5c5SAndroid Build Coastguard Worker 
drawRangeElementsBaseVertex(const gl::Context * context,gl::PrimitiveMode mode,GLuint start,GLuint end,GLsizei count,gl::DrawElementsType type,const void * indices,GLint baseVertex)409*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextWgpu::drawRangeElementsBaseVertex(const gl::Context *context,
410*8975f5c5SAndroid Build Coastguard Worker                                                        gl::PrimitiveMode mode,
411*8975f5c5SAndroid Build Coastguard Worker                                                        GLuint start,
412*8975f5c5SAndroid Build Coastguard Worker                                                        GLuint end,
413*8975f5c5SAndroid Build Coastguard Worker                                                        GLsizei count,
414*8975f5c5SAndroid Build Coastguard Worker                                                        gl::DrawElementsType type,
415*8975f5c5SAndroid Build Coastguard Worker                                                        const void *indices,
416*8975f5c5SAndroid Build Coastguard Worker                                                        GLint baseVertex)
417*8975f5c5SAndroid Build Coastguard Worker {
418*8975f5c5SAndroid Build Coastguard Worker     return drawElementsBaseVertex(context, mode, count, type, indices, baseVertex);
419*8975f5c5SAndroid Build Coastguard Worker }
420*8975f5c5SAndroid Build Coastguard Worker 
drawArraysIndirect(const gl::Context * context,gl::PrimitiveMode mode,const void * indirect)421*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextWgpu::drawArraysIndirect(const gl::Context *context,
422*8975f5c5SAndroid Build Coastguard Worker                                               gl::PrimitiveMode mode,
423*8975f5c5SAndroid Build Coastguard Worker                                               const void *indirect)
424*8975f5c5SAndroid Build Coastguard Worker {
425*8975f5c5SAndroid Build Coastguard Worker     UNIMPLEMENTED();
426*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
427*8975f5c5SAndroid Build Coastguard Worker }
428*8975f5c5SAndroid Build Coastguard Worker 
drawElementsIndirect(const gl::Context * context,gl::PrimitiveMode mode,gl::DrawElementsType type,const void * indirect)429*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextWgpu::drawElementsIndirect(const gl::Context *context,
430*8975f5c5SAndroid Build Coastguard Worker                                                 gl::PrimitiveMode mode,
431*8975f5c5SAndroid Build Coastguard Worker                                                 gl::DrawElementsType type,
432*8975f5c5SAndroid Build Coastguard Worker                                                 const void *indirect)
433*8975f5c5SAndroid Build Coastguard Worker {
434*8975f5c5SAndroid Build Coastguard Worker     UNIMPLEMENTED();
435*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
436*8975f5c5SAndroid Build Coastguard Worker }
437*8975f5c5SAndroid Build Coastguard Worker 
multiDrawArrays(const gl::Context * context,gl::PrimitiveMode mode,const GLint * firsts,const GLsizei * counts,GLsizei drawcount)438*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextWgpu::multiDrawArrays(const gl::Context *context,
439*8975f5c5SAndroid Build Coastguard Worker                                            gl::PrimitiveMode mode,
440*8975f5c5SAndroid Build Coastguard Worker                                            const GLint *firsts,
441*8975f5c5SAndroid Build Coastguard Worker                                            const GLsizei *counts,
442*8975f5c5SAndroid Build Coastguard Worker                                            GLsizei drawcount)
443*8975f5c5SAndroid Build Coastguard Worker {
444*8975f5c5SAndroid Build Coastguard Worker     UNIMPLEMENTED();
445*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
446*8975f5c5SAndroid Build Coastguard Worker }
447*8975f5c5SAndroid Build Coastguard Worker 
multiDrawArraysInstanced(const gl::Context * context,gl::PrimitiveMode mode,const GLint * firsts,const GLsizei * counts,const GLsizei * instanceCounts,GLsizei drawcount)448*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextWgpu::multiDrawArraysInstanced(const gl::Context *context,
449*8975f5c5SAndroid Build Coastguard Worker                                                     gl::PrimitiveMode mode,
450*8975f5c5SAndroid Build Coastguard Worker                                                     const GLint *firsts,
451*8975f5c5SAndroid Build Coastguard Worker                                                     const GLsizei *counts,
452*8975f5c5SAndroid Build Coastguard Worker                                                     const GLsizei *instanceCounts,
453*8975f5c5SAndroid Build Coastguard Worker                                                     GLsizei drawcount)
454*8975f5c5SAndroid Build Coastguard Worker {
455*8975f5c5SAndroid Build Coastguard Worker     UNIMPLEMENTED();
456*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
457*8975f5c5SAndroid Build Coastguard Worker }
458*8975f5c5SAndroid Build Coastguard Worker 
multiDrawArraysIndirect(const gl::Context * context,gl::PrimitiveMode mode,const void * indirect,GLsizei drawcount,GLsizei stride)459*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextWgpu::multiDrawArraysIndirect(const gl::Context *context,
460*8975f5c5SAndroid Build Coastguard Worker                                                    gl::PrimitiveMode mode,
461*8975f5c5SAndroid Build Coastguard Worker                                                    const void *indirect,
462*8975f5c5SAndroid Build Coastguard Worker                                                    GLsizei drawcount,
463*8975f5c5SAndroid Build Coastguard Worker                                                    GLsizei stride)
464*8975f5c5SAndroid Build Coastguard Worker {
465*8975f5c5SAndroid Build Coastguard Worker     UNIMPLEMENTED();
466*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
467*8975f5c5SAndroid Build Coastguard Worker }
468*8975f5c5SAndroid Build Coastguard Worker 
multiDrawElements(const gl::Context * context,gl::PrimitiveMode mode,const GLsizei * counts,gl::DrawElementsType type,const GLvoid * const * indices,GLsizei drawcount)469*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextWgpu::multiDrawElements(const gl::Context *context,
470*8975f5c5SAndroid Build Coastguard Worker                                              gl::PrimitiveMode mode,
471*8975f5c5SAndroid Build Coastguard Worker                                              const GLsizei *counts,
472*8975f5c5SAndroid Build Coastguard Worker                                              gl::DrawElementsType type,
473*8975f5c5SAndroid Build Coastguard Worker                                              const GLvoid *const *indices,
474*8975f5c5SAndroid Build Coastguard Worker                                              GLsizei drawcount)
475*8975f5c5SAndroid Build Coastguard Worker {
476*8975f5c5SAndroid Build Coastguard Worker     UNIMPLEMENTED();
477*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
478*8975f5c5SAndroid Build Coastguard Worker }
479*8975f5c5SAndroid Build Coastguard Worker 
multiDrawElementsInstanced(const gl::Context * context,gl::PrimitiveMode mode,const GLsizei * counts,gl::DrawElementsType type,const GLvoid * const * indices,const GLsizei * instanceCounts,GLsizei drawcount)480*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextWgpu::multiDrawElementsInstanced(const gl::Context *context,
481*8975f5c5SAndroid Build Coastguard Worker                                                       gl::PrimitiveMode mode,
482*8975f5c5SAndroid Build Coastguard Worker                                                       const GLsizei *counts,
483*8975f5c5SAndroid Build Coastguard Worker                                                       gl::DrawElementsType type,
484*8975f5c5SAndroid Build Coastguard Worker                                                       const GLvoid *const *indices,
485*8975f5c5SAndroid Build Coastguard Worker                                                       const GLsizei *instanceCounts,
486*8975f5c5SAndroid Build Coastguard Worker                                                       GLsizei drawcount)
487*8975f5c5SAndroid Build Coastguard Worker {
488*8975f5c5SAndroid Build Coastguard Worker     UNIMPLEMENTED();
489*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
490*8975f5c5SAndroid Build Coastguard Worker }
491*8975f5c5SAndroid Build Coastguard Worker 
multiDrawElementsIndirect(const gl::Context * context,gl::PrimitiveMode mode,gl::DrawElementsType type,const void * indirect,GLsizei drawcount,GLsizei stride)492*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextWgpu::multiDrawElementsIndirect(const gl::Context *context,
493*8975f5c5SAndroid Build Coastguard Worker                                                      gl::PrimitiveMode mode,
494*8975f5c5SAndroid Build Coastguard Worker                                                      gl::DrawElementsType type,
495*8975f5c5SAndroid Build Coastguard Worker                                                      const void *indirect,
496*8975f5c5SAndroid Build Coastguard Worker                                                      GLsizei drawcount,
497*8975f5c5SAndroid Build Coastguard Worker                                                      GLsizei stride)
498*8975f5c5SAndroid Build Coastguard Worker {
499*8975f5c5SAndroid Build Coastguard Worker     UNIMPLEMENTED();
500*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
501*8975f5c5SAndroid Build Coastguard Worker }
502*8975f5c5SAndroid Build Coastguard Worker 
multiDrawArraysInstancedBaseInstance(const gl::Context * context,gl::PrimitiveMode mode,const GLint * firsts,const GLsizei * counts,const GLsizei * instanceCounts,const GLuint * baseInstances,GLsizei drawcount)503*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextWgpu::multiDrawArraysInstancedBaseInstance(const gl::Context *context,
504*8975f5c5SAndroid Build Coastguard Worker                                                                 gl::PrimitiveMode mode,
505*8975f5c5SAndroid Build Coastguard Worker                                                                 const GLint *firsts,
506*8975f5c5SAndroid Build Coastguard Worker                                                                 const GLsizei *counts,
507*8975f5c5SAndroid Build Coastguard Worker                                                                 const GLsizei *instanceCounts,
508*8975f5c5SAndroid Build Coastguard Worker                                                                 const GLuint *baseInstances,
509*8975f5c5SAndroid Build Coastguard Worker                                                                 GLsizei drawcount)
510*8975f5c5SAndroid Build Coastguard Worker {
511*8975f5c5SAndroid Build Coastguard Worker     UNIMPLEMENTED();
512*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
513*8975f5c5SAndroid Build Coastguard Worker }
514*8975f5c5SAndroid Build Coastguard Worker 
multiDrawElementsInstancedBaseVertexBaseInstance(const gl::Context * context,gl::PrimitiveMode mode,const GLsizei * counts,gl::DrawElementsType type,const GLvoid * const * indices,const GLsizei * instanceCounts,const GLint * baseVertices,const GLuint * baseInstances,GLsizei drawcount)515*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextWgpu::multiDrawElementsInstancedBaseVertexBaseInstance(
516*8975f5c5SAndroid Build Coastguard Worker     const gl::Context *context,
517*8975f5c5SAndroid Build Coastguard Worker     gl::PrimitiveMode mode,
518*8975f5c5SAndroid Build Coastguard Worker     const GLsizei *counts,
519*8975f5c5SAndroid Build Coastguard Worker     gl::DrawElementsType type,
520*8975f5c5SAndroid Build Coastguard Worker     const GLvoid *const *indices,
521*8975f5c5SAndroid Build Coastguard Worker     const GLsizei *instanceCounts,
522*8975f5c5SAndroid Build Coastguard Worker     const GLint *baseVertices,
523*8975f5c5SAndroid Build Coastguard Worker     const GLuint *baseInstances,
524*8975f5c5SAndroid Build Coastguard Worker     GLsizei drawcount)
525*8975f5c5SAndroid Build Coastguard Worker {
526*8975f5c5SAndroid Build Coastguard Worker     UNIMPLEMENTED();
527*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
528*8975f5c5SAndroid Build Coastguard Worker }
529*8975f5c5SAndroid Build Coastguard Worker 
getResetStatus()530*8975f5c5SAndroid Build Coastguard Worker gl::GraphicsResetStatus ContextWgpu::getResetStatus()
531*8975f5c5SAndroid Build Coastguard Worker {
532*8975f5c5SAndroid Build Coastguard Worker     return gl::GraphicsResetStatus::NoError;
533*8975f5c5SAndroid Build Coastguard Worker }
534*8975f5c5SAndroid Build Coastguard Worker 
insertEventMarker(GLsizei length,const char * marker)535*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextWgpu::insertEventMarker(GLsizei length, const char *marker)
536*8975f5c5SAndroid Build Coastguard Worker {
537*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
538*8975f5c5SAndroid Build Coastguard Worker }
539*8975f5c5SAndroid Build Coastguard Worker 
pushGroupMarker(GLsizei length,const char * marker)540*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextWgpu::pushGroupMarker(GLsizei length, const char *marker)
541*8975f5c5SAndroid Build Coastguard Worker {
542*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
543*8975f5c5SAndroid Build Coastguard Worker }
544*8975f5c5SAndroid Build Coastguard Worker 
popGroupMarker()545*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextWgpu::popGroupMarker()
546*8975f5c5SAndroid Build Coastguard Worker {
547*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
548*8975f5c5SAndroid Build Coastguard Worker }
549*8975f5c5SAndroid Build Coastguard Worker 
pushDebugGroup(const gl::Context * context,GLenum source,GLuint id,const std::string & message)550*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextWgpu::pushDebugGroup(const gl::Context *context,
551*8975f5c5SAndroid Build Coastguard Worker                                           GLenum source,
552*8975f5c5SAndroid Build Coastguard Worker                                           GLuint id,
553*8975f5c5SAndroid Build Coastguard Worker                                           const std::string &message)
554*8975f5c5SAndroid Build Coastguard Worker {
555*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
556*8975f5c5SAndroid Build Coastguard Worker }
557*8975f5c5SAndroid Build Coastguard Worker 
popDebugGroup(const gl::Context * context)558*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextWgpu::popDebugGroup(const gl::Context *context)
559*8975f5c5SAndroid Build Coastguard Worker {
560*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
561*8975f5c5SAndroid Build Coastguard Worker }
562*8975f5c5SAndroid Build Coastguard Worker 
syncState(const gl::Context * context,const gl::state::DirtyBits dirtyBits,const gl::state::DirtyBits bitMask,const gl::state::ExtendedDirtyBits extendedDirtyBits,const gl::state::ExtendedDirtyBits extendedBitMask,gl::Command command)563*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextWgpu::syncState(const gl::Context *context,
564*8975f5c5SAndroid Build Coastguard Worker                                      const gl::state::DirtyBits dirtyBits,
565*8975f5c5SAndroid Build Coastguard Worker                                      const gl::state::DirtyBits bitMask,
566*8975f5c5SAndroid Build Coastguard Worker                                      const gl::state::ExtendedDirtyBits extendedDirtyBits,
567*8975f5c5SAndroid Build Coastguard Worker                                      const gl::state::ExtendedDirtyBits extendedBitMask,
568*8975f5c5SAndroid Build Coastguard Worker                                      gl::Command command)
569*8975f5c5SAndroid Build Coastguard Worker {
570*8975f5c5SAndroid Build Coastguard Worker     const gl::State &glState = context->getState();
571*8975f5c5SAndroid Build Coastguard Worker 
572*8975f5c5SAndroid Build Coastguard Worker     for (auto iter = dirtyBits.begin(), endIter = dirtyBits.end(); iter != endIter; ++iter)
573*8975f5c5SAndroid Build Coastguard Worker     {
574*8975f5c5SAndroid Build Coastguard Worker         size_t dirtyBit = *iter;
575*8975f5c5SAndroid Build Coastguard Worker         switch (dirtyBit)
576*8975f5c5SAndroid Build Coastguard Worker         {
577*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING:
578*8975f5c5SAndroid Build Coastguard Worker             {
579*8975f5c5SAndroid Build Coastguard Worker                 const FramebufferWgpu *framebufferWgpu =
580*8975f5c5SAndroid Build Coastguard Worker                     webgpu::GetImpl(context->getState().getDrawFramebuffer());
581*8975f5c5SAndroid Build Coastguard Worker                 setColorAttachmentFormats(framebufferWgpu->getCurrentColorAttachmentFormats());
582*8975f5c5SAndroid Build Coastguard Worker                 setDepthStencilFormat(framebufferWgpu->getCurrentDepthStencilAttachmentFormat());
583*8975f5c5SAndroid Build Coastguard Worker 
584*8975f5c5SAndroid Build Coastguard Worker                 ANGLE_TRY(endRenderPass(webgpu::RenderPassClosureReason::FramebufferBindingChange));
585*8975f5c5SAndroid Build Coastguard Worker             }
586*8975f5c5SAndroid Build Coastguard Worker             break;
587*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_READ_FRAMEBUFFER_BINDING:
588*8975f5c5SAndroid Build Coastguard Worker                 break;
589*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_SCISSOR_TEST_ENABLED:
590*8975f5c5SAndroid Build Coastguard Worker                 mDirtyBits.set(DIRTY_BIT_SCISSOR);
591*8975f5c5SAndroid Build Coastguard Worker                 break;
592*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_SCISSOR:
593*8975f5c5SAndroid Build Coastguard Worker                 mDirtyBits.set(DIRTY_BIT_SCISSOR);
594*8975f5c5SAndroid Build Coastguard Worker                 break;
595*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_VIEWPORT:
596*8975f5c5SAndroid Build Coastguard Worker                 mDirtyBits.set(DIRTY_BIT_VIEWPORT);
597*8975f5c5SAndroid Build Coastguard Worker                 break;
598*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_DEPTH_RANGE:
599*8975f5c5SAndroid Build Coastguard Worker                 mDirtyBits.set(DIRTY_BIT_VIEWPORT);
600*8975f5c5SAndroid Build Coastguard Worker                 break;
601*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_BLEND_ENABLED:
602*8975f5c5SAndroid Build Coastguard Worker                 break;
603*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_BLEND_COLOR:
604*8975f5c5SAndroid Build Coastguard Worker                 break;
605*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_BLEND_FUNCS:
606*8975f5c5SAndroid Build Coastguard Worker                 break;
607*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_BLEND_EQUATIONS:
608*8975f5c5SAndroid Build Coastguard Worker                 break;
609*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_COLOR_MASK:
610*8975f5c5SAndroid Build Coastguard Worker             {
611*8975f5c5SAndroid Build Coastguard Worker                 const gl::BlendStateExt &blendStateExt = mState.getBlendStateExt();
612*8975f5c5SAndroid Build Coastguard Worker                 for (size_t i = 0; i < blendStateExt.getDrawBufferCount(); i++)
613*8975f5c5SAndroid Build Coastguard Worker                 {
614*8975f5c5SAndroid Build Coastguard Worker                     bool r, g, b, a;
615*8975f5c5SAndroid Build Coastguard Worker                     blendStateExt.getColorMaskIndexed(i, &r, &g, &b, &a);
616*8975f5c5SAndroid Build Coastguard Worker                     mRenderPipelineDesc.setColorWriteMask(i, r, g, b, a);
617*8975f5c5SAndroid Build Coastguard Worker                 }
618*8975f5c5SAndroid Build Coastguard Worker                 invalidateCurrentRenderPipeline();
619*8975f5c5SAndroid Build Coastguard Worker             }
620*8975f5c5SAndroid Build Coastguard Worker             break;
621*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_SAMPLE_ALPHA_TO_COVERAGE_ENABLED:
622*8975f5c5SAndroid Build Coastguard Worker                 break;
623*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_SAMPLE_COVERAGE_ENABLED:
624*8975f5c5SAndroid Build Coastguard Worker                 break;
625*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_SAMPLE_COVERAGE:
626*8975f5c5SAndroid Build Coastguard Worker                 break;
627*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_SAMPLE_MASK_ENABLED:
628*8975f5c5SAndroid Build Coastguard Worker                 break;
629*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_SAMPLE_MASK:
630*8975f5c5SAndroid Build Coastguard Worker                 break;
631*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_DEPTH_TEST_ENABLED:
632*8975f5c5SAndroid Build Coastguard Worker                 break;
633*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_DEPTH_FUNC:
634*8975f5c5SAndroid Build Coastguard Worker                 if (mRenderPipelineDesc.setDepthFunc(
635*8975f5c5SAndroid Build Coastguard Worker                         gl_wgpu::getCompareFunc(glState.getDepthStencilState().depthFunc)))
636*8975f5c5SAndroid Build Coastguard Worker                 {
637*8975f5c5SAndroid Build Coastguard Worker                     invalidateCurrentRenderPipeline();
638*8975f5c5SAndroid Build Coastguard Worker                 }
639*8975f5c5SAndroid Build Coastguard Worker                 break;
640*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_DEPTH_MASK:
641*8975f5c5SAndroid Build Coastguard Worker                 break;
642*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_STENCIL_TEST_ENABLED:
643*8975f5c5SAndroid Build Coastguard Worker                 break;
644*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_STENCIL_FUNCS_FRONT:
645*8975f5c5SAndroid Build Coastguard Worker                 if (mRenderPipelineDesc.setStencilFrontFunc(
646*8975f5c5SAndroid Build Coastguard Worker                         gl_wgpu::getCompareFunc(glState.getDepthStencilState().stencilFunc)))
647*8975f5c5SAndroid Build Coastguard Worker                 {
648*8975f5c5SAndroid Build Coastguard Worker                     invalidateCurrentRenderPipeline();
649*8975f5c5SAndroid Build Coastguard Worker                 }
650*8975f5c5SAndroid Build Coastguard Worker                 break;
651*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_STENCIL_FUNCS_BACK:
652*8975f5c5SAndroid Build Coastguard Worker                 if (mRenderPipelineDesc.setStencilBackFunc(
653*8975f5c5SAndroid Build Coastguard Worker                         gl_wgpu::getCompareFunc(glState.getDepthStencilState().stencilBackFunc)))
654*8975f5c5SAndroid Build Coastguard Worker                 {
655*8975f5c5SAndroid Build Coastguard Worker                     invalidateCurrentRenderPipeline();
656*8975f5c5SAndroid Build Coastguard Worker                 }
657*8975f5c5SAndroid Build Coastguard Worker                 break;
658*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_STENCIL_OPS_FRONT:
659*8975f5c5SAndroid Build Coastguard Worker             {
660*8975f5c5SAndroid Build Coastguard Worker                 wgpu::StencilOperation failOp =
661*8975f5c5SAndroid Build Coastguard Worker                     gl_wgpu::getStencilOp(glState.getDepthStencilState().stencilFail);
662*8975f5c5SAndroid Build Coastguard Worker                 wgpu::StencilOperation depthFailOp =
663*8975f5c5SAndroid Build Coastguard Worker                     gl_wgpu::getStencilOp(glState.getDepthStencilState().stencilPassDepthFail);
664*8975f5c5SAndroid Build Coastguard Worker                 wgpu::StencilOperation passOp =
665*8975f5c5SAndroid Build Coastguard Worker                     gl_wgpu::getStencilOp(glState.getDepthStencilState().stencilPassDepthPass);
666*8975f5c5SAndroid Build Coastguard Worker                 if (mRenderPipelineDesc.setStencilFrontOps(failOp, depthFailOp, passOp))
667*8975f5c5SAndroid Build Coastguard Worker                 {
668*8975f5c5SAndroid Build Coastguard Worker                     invalidateCurrentRenderPipeline();
669*8975f5c5SAndroid Build Coastguard Worker                 }
670*8975f5c5SAndroid Build Coastguard Worker             }
671*8975f5c5SAndroid Build Coastguard Worker             break;
672*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_STENCIL_OPS_BACK:
673*8975f5c5SAndroid Build Coastguard Worker             {
674*8975f5c5SAndroid Build Coastguard Worker                 wgpu::StencilOperation failOp =
675*8975f5c5SAndroid Build Coastguard Worker                     gl_wgpu::getStencilOp(glState.getDepthStencilState().stencilBackFail);
676*8975f5c5SAndroid Build Coastguard Worker                 wgpu::StencilOperation depthFailOp =
677*8975f5c5SAndroid Build Coastguard Worker                     gl_wgpu::getStencilOp(glState.getDepthStencilState().stencilBackPassDepthFail);
678*8975f5c5SAndroid Build Coastguard Worker                 wgpu::StencilOperation passOp =
679*8975f5c5SAndroid Build Coastguard Worker                     gl_wgpu::getStencilOp(glState.getDepthStencilState().stencilBackPassDepthPass);
680*8975f5c5SAndroid Build Coastguard Worker                 if (mRenderPipelineDesc.setStencilBackOps(failOp, depthFailOp, passOp))
681*8975f5c5SAndroid Build Coastguard Worker                 {
682*8975f5c5SAndroid Build Coastguard Worker                     invalidateCurrentRenderPipeline();
683*8975f5c5SAndroid Build Coastguard Worker                 }
684*8975f5c5SAndroid Build Coastguard Worker             }
685*8975f5c5SAndroid Build Coastguard Worker             break;
686*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_STENCIL_WRITEMASK_FRONT:
687*8975f5c5SAndroid Build Coastguard Worker                 if (mRenderPipelineDesc.setStencilWriteMask(
688*8975f5c5SAndroid Build Coastguard Worker                         glState.getDepthStencilState().stencilWritemask))
689*8975f5c5SAndroid Build Coastguard Worker                 {
690*8975f5c5SAndroid Build Coastguard Worker                     invalidateCurrentRenderPipeline();
691*8975f5c5SAndroid Build Coastguard Worker                 }
692*8975f5c5SAndroid Build Coastguard Worker                 break;
693*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_STENCIL_WRITEMASK_BACK:
694*8975f5c5SAndroid Build Coastguard Worker                 break;
695*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_CULL_FACE_ENABLED:
696*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_CULL_FACE:
697*8975f5c5SAndroid Build Coastguard Worker                 mRenderPipelineDesc.setCullMode(glState.getRasterizerState().cullMode,
698*8975f5c5SAndroid Build Coastguard Worker                                                 glState.getRasterizerState().cullFace);
699*8975f5c5SAndroid Build Coastguard Worker                 invalidateCurrentRenderPipeline();
700*8975f5c5SAndroid Build Coastguard Worker                 break;
701*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_FRONT_FACE:
702*8975f5c5SAndroid Build Coastguard Worker                 mRenderPipelineDesc.setFrontFace(glState.getRasterizerState().frontFace);
703*8975f5c5SAndroid Build Coastguard Worker                 invalidateCurrentRenderPipeline();
704*8975f5c5SAndroid Build Coastguard Worker                 break;
705*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_POLYGON_OFFSET_FILL_ENABLED:
706*8975f5c5SAndroid Build Coastguard Worker                 break;
707*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_POLYGON_OFFSET:
708*8975f5c5SAndroid Build Coastguard Worker                 break;
709*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED:
710*8975f5c5SAndroid Build Coastguard Worker                 break;
711*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_LINE_WIDTH:
712*8975f5c5SAndroid Build Coastguard Worker                 break;
713*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_PRIMITIVE_RESTART_ENABLED:
714*8975f5c5SAndroid Build Coastguard Worker                 break;
715*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_CLEAR_COLOR:
716*8975f5c5SAndroid Build Coastguard Worker                 break;
717*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_CLEAR_DEPTH:
718*8975f5c5SAndroid Build Coastguard Worker                 break;
719*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_CLEAR_STENCIL:
720*8975f5c5SAndroid Build Coastguard Worker                 break;
721*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_UNPACK_STATE:
722*8975f5c5SAndroid Build Coastguard Worker                 break;
723*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_UNPACK_BUFFER_BINDING:
724*8975f5c5SAndroid Build Coastguard Worker                 break;
725*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_PACK_STATE:
726*8975f5c5SAndroid Build Coastguard Worker                 break;
727*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_PACK_BUFFER_BINDING:
728*8975f5c5SAndroid Build Coastguard Worker                 break;
729*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_DITHER_ENABLED:
730*8975f5c5SAndroid Build Coastguard Worker                 break;
731*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_RENDERBUFFER_BINDING:
732*8975f5c5SAndroid Build Coastguard Worker                 break;
733*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_VERTEX_ARRAY_BINDING:
734*8975f5c5SAndroid Build Coastguard Worker                 invalidateCurrentRenderPipeline();
735*8975f5c5SAndroid Build Coastguard Worker                 break;
736*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_DRAW_INDIRECT_BUFFER_BINDING:
737*8975f5c5SAndroid Build Coastguard Worker                 break;
738*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING:
739*8975f5c5SAndroid Build Coastguard Worker                 break;
740*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_PROGRAM_BINDING:
741*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_PROGRAM_EXECUTABLE:
742*8975f5c5SAndroid Build Coastguard Worker                 invalidateCurrentRenderPipeline();
743*8975f5c5SAndroid Build Coastguard Worker                 break;
744*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_SAMPLER_BINDINGS:
745*8975f5c5SAndroid Build Coastguard Worker                 break;
746*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_TEXTURE_BINDINGS:
747*8975f5c5SAndroid Build Coastguard Worker                 break;
748*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_IMAGE_BINDINGS:
749*8975f5c5SAndroid Build Coastguard Worker                 break;
750*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_TRANSFORM_FEEDBACK_BINDING:
751*8975f5c5SAndroid Build Coastguard Worker                 break;
752*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_UNIFORM_BUFFER_BINDINGS:
753*8975f5c5SAndroid Build Coastguard Worker                 break;
754*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING:
755*8975f5c5SAndroid Build Coastguard Worker                 break;
756*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_ATOMIC_COUNTER_BUFFER_BINDING:
757*8975f5c5SAndroid Build Coastguard Worker                 break;
758*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_MULTISAMPLING:
759*8975f5c5SAndroid Build Coastguard Worker                 break;
760*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_SAMPLE_ALPHA_TO_ONE:
761*8975f5c5SAndroid Build Coastguard Worker                 break;
762*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_COVERAGE_MODULATION:
763*8975f5c5SAndroid Build Coastguard Worker                 break;
764*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_FRAMEBUFFER_SRGB_WRITE_CONTROL_MODE:
765*8975f5c5SAndroid Build Coastguard Worker                 break;
766*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_CURRENT_VALUES:
767*8975f5c5SAndroid Build Coastguard Worker                 break;
768*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_PROVOKING_VERTEX:
769*8975f5c5SAndroid Build Coastguard Worker                 break;
770*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_SAMPLE_SHADING:
771*8975f5c5SAndroid Build Coastguard Worker                 break;
772*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_PATCH_VERTICES:
773*8975f5c5SAndroid Build Coastguard Worker                 break;
774*8975f5c5SAndroid Build Coastguard Worker             case gl::state::DIRTY_BIT_EXTENDED:
775*8975f5c5SAndroid Build Coastguard Worker             {
776*8975f5c5SAndroid Build Coastguard Worker                 for (auto extendedIter    = extendedDirtyBits.begin(),
777*8975f5c5SAndroid Build Coastguard Worker                           extendedEndIter = extendedDirtyBits.end();
778*8975f5c5SAndroid Build Coastguard Worker                      extendedIter != extendedEndIter; ++extendedIter)
779*8975f5c5SAndroid Build Coastguard Worker                 {
780*8975f5c5SAndroid Build Coastguard Worker                     const size_t extendedDirtyBit = *extendedIter;
781*8975f5c5SAndroid Build Coastguard Worker                     switch (extendedDirtyBit)
782*8975f5c5SAndroid Build Coastguard Worker                     {
783*8975f5c5SAndroid Build Coastguard Worker                         case gl::state::EXTENDED_DIRTY_BIT_CLIP_CONTROL:
784*8975f5c5SAndroid Build Coastguard Worker                             break;
785*8975f5c5SAndroid Build Coastguard Worker                         case gl::state::EXTENDED_DIRTY_BIT_CLIP_DISTANCES:
786*8975f5c5SAndroid Build Coastguard Worker                             break;
787*8975f5c5SAndroid Build Coastguard Worker                         case gl::state::EXTENDED_DIRTY_BIT_DEPTH_CLAMP_ENABLED:
788*8975f5c5SAndroid Build Coastguard Worker                             break;
789*8975f5c5SAndroid Build Coastguard Worker                         case gl::state::EXTENDED_DIRTY_BIT_MIPMAP_GENERATION_HINT:
790*8975f5c5SAndroid Build Coastguard Worker                             break;
791*8975f5c5SAndroid Build Coastguard Worker                         case gl::state::EXTENDED_DIRTY_BIT_POLYGON_MODE:
792*8975f5c5SAndroid Build Coastguard Worker                             break;
793*8975f5c5SAndroid Build Coastguard Worker                         case gl::state::EXTENDED_DIRTY_BIT_POLYGON_OFFSET_POINT_ENABLED:
794*8975f5c5SAndroid Build Coastguard Worker                             break;
795*8975f5c5SAndroid Build Coastguard Worker                         case gl::state::EXTENDED_DIRTY_BIT_POLYGON_OFFSET_LINE_ENABLED:
796*8975f5c5SAndroid Build Coastguard Worker                             break;
797*8975f5c5SAndroid Build Coastguard Worker                         case gl::state::EXTENDED_DIRTY_BIT_SHADER_DERIVATIVE_HINT:
798*8975f5c5SAndroid Build Coastguard Worker                             break;
799*8975f5c5SAndroid Build Coastguard Worker                         case gl::state::EXTENDED_DIRTY_BIT_SHADING_RATE:
800*8975f5c5SAndroid Build Coastguard Worker                             break;
801*8975f5c5SAndroid Build Coastguard Worker                         case gl::state::EXTENDED_DIRTY_BIT_LOGIC_OP_ENABLED:
802*8975f5c5SAndroid Build Coastguard Worker                             break;
803*8975f5c5SAndroid Build Coastguard Worker                         case gl::state::EXTENDED_DIRTY_BIT_LOGIC_OP:
804*8975f5c5SAndroid Build Coastguard Worker                             break;
805*8975f5c5SAndroid Build Coastguard Worker                         case gl::state::EXTENDED_DIRTY_BIT_BLEND_ADVANCED_COHERENT:
806*8975f5c5SAndroid Build Coastguard Worker                             break;
807*8975f5c5SAndroid Build Coastguard Worker                         default:
808*8975f5c5SAndroid Build Coastguard Worker                             UNREACHABLE();
809*8975f5c5SAndroid Build Coastguard Worker                     }
810*8975f5c5SAndroid Build Coastguard Worker                 }
811*8975f5c5SAndroid Build Coastguard Worker             }
812*8975f5c5SAndroid Build Coastguard Worker             break;
813*8975f5c5SAndroid Build Coastguard Worker 
814*8975f5c5SAndroid Build Coastguard Worker             default:
815*8975f5c5SAndroid Build Coastguard Worker                 UNREACHABLE();
816*8975f5c5SAndroid Build Coastguard Worker                 break;
817*8975f5c5SAndroid Build Coastguard Worker         }
818*8975f5c5SAndroid Build Coastguard Worker     }
819*8975f5c5SAndroid Build Coastguard Worker 
820*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
821*8975f5c5SAndroid Build Coastguard Worker }
822*8975f5c5SAndroid Build Coastguard Worker 
getGPUDisjoint()823*8975f5c5SAndroid Build Coastguard Worker GLint ContextWgpu::getGPUDisjoint()
824*8975f5c5SAndroid Build Coastguard Worker {
825*8975f5c5SAndroid Build Coastguard Worker     return 0;
826*8975f5c5SAndroid Build Coastguard Worker }
827*8975f5c5SAndroid Build Coastguard Worker 
getTimestamp()828*8975f5c5SAndroid Build Coastguard Worker GLint64 ContextWgpu::getTimestamp()
829*8975f5c5SAndroid Build Coastguard Worker {
830*8975f5c5SAndroid Build Coastguard Worker     return 0;
831*8975f5c5SAndroid Build Coastguard Worker }
832*8975f5c5SAndroid Build Coastguard Worker 
onMakeCurrent(const gl::Context * context)833*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextWgpu::onMakeCurrent(const gl::Context *context)
834*8975f5c5SAndroid Build Coastguard Worker {
835*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
836*8975f5c5SAndroid Build Coastguard Worker }
837*8975f5c5SAndroid Build Coastguard Worker 
getNativeCaps() const838*8975f5c5SAndroid Build Coastguard Worker gl::Caps ContextWgpu::getNativeCaps() const
839*8975f5c5SAndroid Build Coastguard Worker {
840*8975f5c5SAndroid Build Coastguard Worker     return mDisplay->getGLCaps();
841*8975f5c5SAndroid Build Coastguard Worker }
842*8975f5c5SAndroid Build Coastguard Worker 
getNativeTextureCaps() const843*8975f5c5SAndroid Build Coastguard Worker const gl::TextureCapsMap &ContextWgpu::getNativeTextureCaps() const
844*8975f5c5SAndroid Build Coastguard Worker {
845*8975f5c5SAndroid Build Coastguard Worker     return mDisplay->getGLTextureCaps();
846*8975f5c5SAndroid Build Coastguard Worker }
847*8975f5c5SAndroid Build Coastguard Worker 
getNativeExtensions() const848*8975f5c5SAndroid Build Coastguard Worker const gl::Extensions &ContextWgpu::getNativeExtensions() const
849*8975f5c5SAndroid Build Coastguard Worker {
850*8975f5c5SAndroid Build Coastguard Worker     return mDisplay->getGLExtensions();
851*8975f5c5SAndroid Build Coastguard Worker }
852*8975f5c5SAndroid Build Coastguard Worker 
getNativeLimitations() const853*8975f5c5SAndroid Build Coastguard Worker const gl::Limitations &ContextWgpu::getNativeLimitations() const
854*8975f5c5SAndroid Build Coastguard Worker {
855*8975f5c5SAndroid Build Coastguard Worker     return mDisplay->getGLLimitations();
856*8975f5c5SAndroid Build Coastguard Worker }
857*8975f5c5SAndroid Build Coastguard Worker 
getNativePixelLocalStorageOptions() const858*8975f5c5SAndroid Build Coastguard Worker const ShPixelLocalStorageOptions &ContextWgpu::getNativePixelLocalStorageOptions() const
859*8975f5c5SAndroid Build Coastguard Worker {
860*8975f5c5SAndroid Build Coastguard Worker     return mDisplay->getPLSOptions();
861*8975f5c5SAndroid Build Coastguard Worker }
862*8975f5c5SAndroid Build Coastguard Worker 
createCompiler()863*8975f5c5SAndroid Build Coastguard Worker CompilerImpl *ContextWgpu::createCompiler()
864*8975f5c5SAndroid Build Coastguard Worker {
865*8975f5c5SAndroid Build Coastguard Worker     return new CompilerWgpu();
866*8975f5c5SAndroid Build Coastguard Worker }
867*8975f5c5SAndroid Build Coastguard Worker 
createShader(const gl::ShaderState & data)868*8975f5c5SAndroid Build Coastguard Worker ShaderImpl *ContextWgpu::createShader(const gl::ShaderState &data)
869*8975f5c5SAndroid Build Coastguard Worker {
870*8975f5c5SAndroid Build Coastguard Worker     return new ShaderWgpu(data);
871*8975f5c5SAndroid Build Coastguard Worker }
872*8975f5c5SAndroid Build Coastguard Worker 
createProgram(const gl::ProgramState & data)873*8975f5c5SAndroid Build Coastguard Worker ProgramImpl *ContextWgpu::createProgram(const gl::ProgramState &data)
874*8975f5c5SAndroid Build Coastguard Worker {
875*8975f5c5SAndroid Build Coastguard Worker     return new ProgramWgpu(data);
876*8975f5c5SAndroid Build Coastguard Worker }
877*8975f5c5SAndroid Build Coastguard Worker 
createProgramExecutable(const gl::ProgramExecutable * executable)878*8975f5c5SAndroid Build Coastguard Worker ProgramExecutableImpl *ContextWgpu::createProgramExecutable(const gl::ProgramExecutable *executable)
879*8975f5c5SAndroid Build Coastguard Worker {
880*8975f5c5SAndroid Build Coastguard Worker     return new ProgramExecutableWgpu(executable);
881*8975f5c5SAndroid Build Coastguard Worker }
882*8975f5c5SAndroid Build Coastguard Worker 
createFramebuffer(const gl::FramebufferState & data)883*8975f5c5SAndroid Build Coastguard Worker FramebufferImpl *ContextWgpu::createFramebuffer(const gl::FramebufferState &data)
884*8975f5c5SAndroid Build Coastguard Worker {
885*8975f5c5SAndroid Build Coastguard Worker     return new FramebufferWgpu(data);
886*8975f5c5SAndroid Build Coastguard Worker }
887*8975f5c5SAndroid Build Coastguard Worker 
createTexture(const gl::TextureState & state)888*8975f5c5SAndroid Build Coastguard Worker TextureImpl *ContextWgpu::createTexture(const gl::TextureState &state)
889*8975f5c5SAndroid Build Coastguard Worker {
890*8975f5c5SAndroid Build Coastguard Worker     return new TextureWgpu(state);
891*8975f5c5SAndroid Build Coastguard Worker }
892*8975f5c5SAndroid Build Coastguard Worker 
createRenderbuffer(const gl::RenderbufferState & state)893*8975f5c5SAndroid Build Coastguard Worker RenderbufferImpl *ContextWgpu::createRenderbuffer(const gl::RenderbufferState &state)
894*8975f5c5SAndroid Build Coastguard Worker {
895*8975f5c5SAndroid Build Coastguard Worker     return new RenderbufferWgpu(state);
896*8975f5c5SAndroid Build Coastguard Worker }
897*8975f5c5SAndroid Build Coastguard Worker 
createBuffer(const gl::BufferState & state)898*8975f5c5SAndroid Build Coastguard Worker BufferImpl *ContextWgpu::createBuffer(const gl::BufferState &state)
899*8975f5c5SAndroid Build Coastguard Worker {
900*8975f5c5SAndroid Build Coastguard Worker     return new BufferWgpu(state);
901*8975f5c5SAndroid Build Coastguard Worker }
902*8975f5c5SAndroid Build Coastguard Worker 
createVertexArray(const gl::VertexArrayState & data)903*8975f5c5SAndroid Build Coastguard Worker VertexArrayImpl *ContextWgpu::createVertexArray(const gl::VertexArrayState &data)
904*8975f5c5SAndroid Build Coastguard Worker {
905*8975f5c5SAndroid Build Coastguard Worker     return new VertexArrayWgpu(data);
906*8975f5c5SAndroid Build Coastguard Worker }
907*8975f5c5SAndroid Build Coastguard Worker 
createQuery(gl::QueryType type)908*8975f5c5SAndroid Build Coastguard Worker QueryImpl *ContextWgpu::createQuery(gl::QueryType type)
909*8975f5c5SAndroid Build Coastguard Worker {
910*8975f5c5SAndroid Build Coastguard Worker     return new QueryWgpu(type);
911*8975f5c5SAndroid Build Coastguard Worker }
912*8975f5c5SAndroid Build Coastguard Worker 
createFenceNV()913*8975f5c5SAndroid Build Coastguard Worker FenceNVImpl *ContextWgpu::createFenceNV()
914*8975f5c5SAndroid Build Coastguard Worker {
915*8975f5c5SAndroid Build Coastguard Worker     return new FenceNVWgpu();
916*8975f5c5SAndroid Build Coastguard Worker }
917*8975f5c5SAndroid Build Coastguard Worker 
createSync()918*8975f5c5SAndroid Build Coastguard Worker SyncImpl *ContextWgpu::createSync()
919*8975f5c5SAndroid Build Coastguard Worker {
920*8975f5c5SAndroid Build Coastguard Worker     return new SyncWgpu();
921*8975f5c5SAndroid Build Coastguard Worker }
922*8975f5c5SAndroid Build Coastguard Worker 
createTransformFeedback(const gl::TransformFeedbackState & state)923*8975f5c5SAndroid Build Coastguard Worker TransformFeedbackImpl *ContextWgpu::createTransformFeedback(const gl::TransformFeedbackState &state)
924*8975f5c5SAndroid Build Coastguard Worker {
925*8975f5c5SAndroid Build Coastguard Worker     return new TransformFeedbackWgpu(state);
926*8975f5c5SAndroid Build Coastguard Worker }
927*8975f5c5SAndroid Build Coastguard Worker 
createSampler(const gl::SamplerState & state)928*8975f5c5SAndroid Build Coastguard Worker SamplerImpl *ContextWgpu::createSampler(const gl::SamplerState &state)
929*8975f5c5SAndroid Build Coastguard Worker {
930*8975f5c5SAndroid Build Coastguard Worker     return new SamplerWgpu(state);
931*8975f5c5SAndroid Build Coastguard Worker }
932*8975f5c5SAndroid Build Coastguard Worker 
createProgramPipeline(const gl::ProgramPipelineState & state)933*8975f5c5SAndroid Build Coastguard Worker ProgramPipelineImpl *ContextWgpu::createProgramPipeline(const gl::ProgramPipelineState &state)
934*8975f5c5SAndroid Build Coastguard Worker {
935*8975f5c5SAndroid Build Coastguard Worker     return new ProgramPipelineWgpu(state);
936*8975f5c5SAndroid Build Coastguard Worker }
937*8975f5c5SAndroid Build Coastguard Worker 
createMemoryObject()938*8975f5c5SAndroid Build Coastguard Worker MemoryObjectImpl *ContextWgpu::createMemoryObject()
939*8975f5c5SAndroid Build Coastguard Worker {
940*8975f5c5SAndroid Build Coastguard Worker     UNREACHABLE();
941*8975f5c5SAndroid Build Coastguard Worker     return nullptr;
942*8975f5c5SAndroid Build Coastguard Worker }
943*8975f5c5SAndroid Build Coastguard Worker 
createSemaphore()944*8975f5c5SAndroid Build Coastguard Worker SemaphoreImpl *ContextWgpu::createSemaphore()
945*8975f5c5SAndroid Build Coastguard Worker {
946*8975f5c5SAndroid Build Coastguard Worker     UNREACHABLE();
947*8975f5c5SAndroid Build Coastguard Worker     return nullptr;
948*8975f5c5SAndroid Build Coastguard Worker }
949*8975f5c5SAndroid Build Coastguard Worker 
createOverlay(const gl::OverlayState & state)950*8975f5c5SAndroid Build Coastguard Worker OverlayImpl *ContextWgpu::createOverlay(const gl::OverlayState &state)
951*8975f5c5SAndroid Build Coastguard Worker {
952*8975f5c5SAndroid Build Coastguard Worker     return new OverlayImpl(state);
953*8975f5c5SAndroid Build Coastguard Worker }
954*8975f5c5SAndroid Build Coastguard Worker 
dispatchCompute(const gl::Context * context,GLuint numGroupsX,GLuint numGroupsY,GLuint numGroupsZ)955*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextWgpu::dispatchCompute(const gl::Context *context,
956*8975f5c5SAndroid Build Coastguard Worker                                            GLuint numGroupsX,
957*8975f5c5SAndroid Build Coastguard Worker                                            GLuint numGroupsY,
958*8975f5c5SAndroid Build Coastguard Worker                                            GLuint numGroupsZ)
959*8975f5c5SAndroid Build Coastguard Worker {
960*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
961*8975f5c5SAndroid Build Coastguard Worker }
962*8975f5c5SAndroid Build Coastguard Worker 
dispatchComputeIndirect(const gl::Context * context,GLintptr indirect)963*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextWgpu::dispatchComputeIndirect(const gl::Context *context, GLintptr indirect)
964*8975f5c5SAndroid Build Coastguard Worker {
965*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
966*8975f5c5SAndroid Build Coastguard Worker }
967*8975f5c5SAndroid Build Coastguard Worker 
memoryBarrier(const gl::Context * context,GLbitfield barriers)968*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextWgpu::memoryBarrier(const gl::Context *context, GLbitfield barriers)
969*8975f5c5SAndroid Build Coastguard Worker {
970*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
971*8975f5c5SAndroid Build Coastguard Worker }
972*8975f5c5SAndroid Build Coastguard Worker 
memoryBarrierByRegion(const gl::Context * context,GLbitfield barriers)973*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextWgpu::memoryBarrierByRegion(const gl::Context *context, GLbitfield barriers)
974*8975f5c5SAndroid Build Coastguard Worker {
975*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
976*8975f5c5SAndroid Build Coastguard Worker }
977*8975f5c5SAndroid Build Coastguard Worker 
handleError(GLenum errorCode,const char * message,const char * file,const char * function,unsigned int line)978*8975f5c5SAndroid Build Coastguard Worker void ContextWgpu::handleError(GLenum errorCode,
979*8975f5c5SAndroid Build Coastguard Worker                               const char *message,
980*8975f5c5SAndroid Build Coastguard Worker                               const char *file,
981*8975f5c5SAndroid Build Coastguard Worker                               const char *function,
982*8975f5c5SAndroid Build Coastguard Worker                               unsigned int line)
983*8975f5c5SAndroid Build Coastguard Worker {
984*8975f5c5SAndroid Build Coastguard Worker     std::stringstream errorStream;
985*8975f5c5SAndroid Build Coastguard Worker     errorStream << "Internal Wgpu back-end error: " << message << ".";
986*8975f5c5SAndroid Build Coastguard Worker     mErrors->handleError(errorCode, errorStream.str().c_str(), file, function, line);
987*8975f5c5SAndroid Build Coastguard Worker }
988*8975f5c5SAndroid Build Coastguard Worker 
startRenderPass(const wgpu::RenderPassDescriptor & desc)989*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextWgpu::startRenderPass(const wgpu::RenderPassDescriptor &desc)
990*8975f5c5SAndroid Build Coastguard Worker {
991*8975f5c5SAndroid Build Coastguard Worker     ensureCommandEncoderCreated();
992*8975f5c5SAndroid Build Coastguard Worker 
993*8975f5c5SAndroid Build Coastguard Worker     mCurrentRenderPass = mCurrentCommandEncoder.BeginRenderPass(&desc);
994*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits |= mNewRenderPassDirtyBits;
995*8975f5c5SAndroid Build Coastguard Worker 
996*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
997*8975f5c5SAndroid Build Coastguard Worker }
998*8975f5c5SAndroid Build Coastguard Worker 
endRenderPass(webgpu::RenderPassClosureReason closureReason)999*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextWgpu::endRenderPass(webgpu::RenderPassClosureReason closureReason)
1000*8975f5c5SAndroid Build Coastguard Worker {
1001*8975f5c5SAndroid Build Coastguard Worker     if (mCurrentRenderPass)
1002*8975f5c5SAndroid Build Coastguard Worker     {
1003*8975f5c5SAndroid Build Coastguard Worker         const char *reasonText = kRenderPassClosureReason[closureReason];
1004*8975f5c5SAndroid Build Coastguard Worker         ASSERT(reasonText);
1005*8975f5c5SAndroid Build Coastguard Worker 
1006*8975f5c5SAndroid Build Coastguard Worker         if (mCommandBuffer.hasCommands())
1007*8975f5c5SAndroid Build Coastguard Worker         {
1008*8975f5c5SAndroid Build Coastguard Worker             ANGLE_WGPU_SCOPED_DEBUG_TRY(this, mCommandBuffer.recordCommands(mCurrentRenderPass));
1009*8975f5c5SAndroid Build Coastguard Worker             mCommandBuffer.clear();
1010*8975f5c5SAndroid Build Coastguard Worker         }
1011*8975f5c5SAndroid Build Coastguard Worker 
1012*8975f5c5SAndroid Build Coastguard Worker         mCurrentRenderPass.End();
1013*8975f5c5SAndroid Build Coastguard Worker         mCurrentRenderPass = nullptr;
1014*8975f5c5SAndroid Build Coastguard Worker     }
1015*8975f5c5SAndroid Build Coastguard Worker 
1016*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(DIRTY_BIT_RENDER_PASS);
1017*8975f5c5SAndroid Build Coastguard Worker 
1018*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
1019*8975f5c5SAndroid Build Coastguard Worker }
1020*8975f5c5SAndroid Build Coastguard Worker 
setupDraw(const gl::Context * context,gl::PrimitiveMode mode,GLint firstVertexOrInvalid,GLsizei vertexOrIndexCount,GLsizei instanceCount,gl::DrawElementsType indexTypeOrInvalid,const void * indices,GLint baseVertex,uint32_t * outFirstIndex)1021*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextWgpu::setupDraw(const gl::Context *context,
1022*8975f5c5SAndroid Build Coastguard Worker                                      gl::PrimitiveMode mode,
1023*8975f5c5SAndroid Build Coastguard Worker                                      GLint firstVertexOrInvalid,
1024*8975f5c5SAndroid Build Coastguard Worker                                      GLsizei vertexOrIndexCount,
1025*8975f5c5SAndroid Build Coastguard Worker                                      GLsizei instanceCount,
1026*8975f5c5SAndroid Build Coastguard Worker                                      gl::DrawElementsType indexTypeOrInvalid,
1027*8975f5c5SAndroid Build Coastguard Worker                                      const void *indices,
1028*8975f5c5SAndroid Build Coastguard Worker                                      GLint baseVertex,
1029*8975f5c5SAndroid Build Coastguard Worker                                      uint32_t *outFirstIndex)
1030*8975f5c5SAndroid Build Coastguard Worker {
1031*8975f5c5SAndroid Build Coastguard Worker     if (mRenderPipelineDesc.setPrimitiveMode(mode, indexTypeOrInvalid))
1032*8975f5c5SAndroid Build Coastguard Worker     {
1033*8975f5c5SAndroid Build Coastguard Worker         invalidateCurrentRenderPipeline();
1034*8975f5c5SAndroid Build Coastguard Worker     }
1035*8975f5c5SAndroid Build Coastguard Worker 
1036*8975f5c5SAndroid Build Coastguard Worker     ProgramExecutableWgpu *executableWgpu = webgpu::GetImpl(mState.getProgramExecutable());
1037*8975f5c5SAndroid Build Coastguard Worker     if (executableWgpu->checkDirtyUniforms())
1038*8975f5c5SAndroid Build Coastguard Worker     {
1039*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set(DIRTY_BIT_BIND_GROUPS);
1040*8975f5c5SAndroid Build Coastguard Worker     }
1041*8975f5c5SAndroid Build Coastguard Worker 
1042*8975f5c5SAndroid Build Coastguard Worker     const void *adjustedIndicesPtr = indices;
1043*8975f5c5SAndroid Build Coastguard Worker     if (mState.areClientArraysEnabled())
1044*8975f5c5SAndroid Build Coastguard Worker     {
1045*8975f5c5SAndroid Build Coastguard Worker         VertexArrayWgpu *vertexArrayWgpu = GetImplAs<VertexArrayWgpu>(mState.getVertexArray());
1046*8975f5c5SAndroid Build Coastguard Worker         ANGLE_TRY(vertexArrayWgpu->syncClientArrays(
1047*8975f5c5SAndroid Build Coastguard Worker             context, mState.getProgramExecutable()->getActiveAttribLocationsMask(),
1048*8975f5c5SAndroid Build Coastguard Worker             firstVertexOrInvalid, vertexOrIndexCount, instanceCount, indexTypeOrInvalid, indices,
1049*8975f5c5SAndroid Build Coastguard Worker             baseVertex, mState.isPrimitiveRestartEnabled(), &adjustedIndicesPtr));
1050*8975f5c5SAndroid Build Coastguard Worker     }
1051*8975f5c5SAndroid Build Coastguard Worker 
1052*8975f5c5SAndroid Build Coastguard Worker     bool reAddDirtyIndexBufferBit = false;
1053*8975f5c5SAndroid Build Coastguard Worker     if (indexTypeOrInvalid != gl::DrawElementsType::InvalidEnum)
1054*8975f5c5SAndroid Build Coastguard Worker     {
1055*8975f5c5SAndroid Build Coastguard Worker         *outFirstIndex = gl_wgpu::GetFirstIndexForDrawCall(indexTypeOrInvalid, adjustedIndicesPtr);
1056*8975f5c5SAndroid Build Coastguard Worker         if (mCurrentIndexBufferType != indexTypeOrInvalid)
1057*8975f5c5SAndroid Build Coastguard Worker         {
1058*8975f5c5SAndroid Build Coastguard Worker             invalidateIndexBuffer();
1059*8975f5c5SAndroid Build Coastguard Worker         }
1060*8975f5c5SAndroid Build Coastguard Worker     }
1061*8975f5c5SAndroid Build Coastguard Worker     else
1062*8975f5c5SAndroid Build Coastguard Worker     {
1063*8975f5c5SAndroid Build Coastguard Worker         ASSERT(outFirstIndex == nullptr);
1064*8975f5c5SAndroid Build Coastguard Worker     }
1065*8975f5c5SAndroid Build Coastguard Worker 
1066*8975f5c5SAndroid Build Coastguard Worker     if (mDirtyBits.any())
1067*8975f5c5SAndroid Build Coastguard Worker     {
1068*8975f5c5SAndroid Build Coastguard Worker         for (DirtyBits::Iterator dirtyBitIter = mDirtyBits.begin();
1069*8975f5c5SAndroid Build Coastguard Worker              dirtyBitIter != mDirtyBits.end(); ++dirtyBitIter)
1070*8975f5c5SAndroid Build Coastguard Worker         {
1071*8975f5c5SAndroid Build Coastguard Worker             size_t dirtyBit = *dirtyBitIter;
1072*8975f5c5SAndroid Build Coastguard Worker             switch (dirtyBit)
1073*8975f5c5SAndroid Build Coastguard Worker             {
1074*8975f5c5SAndroid Build Coastguard Worker                 case DIRTY_BIT_RENDER_PIPELINE_DESC:
1075*8975f5c5SAndroid Build Coastguard Worker                     ANGLE_TRY(handleDirtyRenderPipelineDesc(&dirtyBitIter));
1076*8975f5c5SAndroid Build Coastguard Worker                     break;
1077*8975f5c5SAndroid Build Coastguard Worker 
1078*8975f5c5SAndroid Build Coastguard Worker                 case DIRTY_BIT_RENDER_PASS:
1079*8975f5c5SAndroid Build Coastguard Worker                     ANGLE_TRY(handleDirtyRenderPass(&dirtyBitIter));
1080*8975f5c5SAndroid Build Coastguard Worker                     break;
1081*8975f5c5SAndroid Build Coastguard Worker 
1082*8975f5c5SAndroid Build Coastguard Worker                 case DIRTY_BIT_RENDER_PIPELINE_BINDING:
1083*8975f5c5SAndroid Build Coastguard Worker                     ANGLE_TRY(handleDirtyRenderPipelineBinding(&dirtyBitIter));
1084*8975f5c5SAndroid Build Coastguard Worker                     break;
1085*8975f5c5SAndroid Build Coastguard Worker 
1086*8975f5c5SAndroid Build Coastguard Worker                 case DIRTY_BIT_VIEWPORT:
1087*8975f5c5SAndroid Build Coastguard Worker                     ANGLE_TRY(handleDirtyViewport(&dirtyBitIter));
1088*8975f5c5SAndroid Build Coastguard Worker                     break;
1089*8975f5c5SAndroid Build Coastguard Worker 
1090*8975f5c5SAndroid Build Coastguard Worker                 case DIRTY_BIT_SCISSOR:
1091*8975f5c5SAndroid Build Coastguard Worker                     ANGLE_TRY(handleDirtyScissor(&dirtyBitIter));
1092*8975f5c5SAndroid Build Coastguard Worker                     break;
1093*8975f5c5SAndroid Build Coastguard Worker 
1094*8975f5c5SAndroid Build Coastguard Worker                 case DIRTY_BIT_VERTEX_BUFFERS:
1095*8975f5c5SAndroid Build Coastguard Worker                     ANGLE_TRY(handleDirtyVertexBuffers(mDirtyVertexBuffers, &dirtyBitIter));
1096*8975f5c5SAndroid Build Coastguard Worker                     mDirtyVertexBuffers.reset();
1097*8975f5c5SAndroid Build Coastguard Worker                     break;
1098*8975f5c5SAndroid Build Coastguard Worker 
1099*8975f5c5SAndroid Build Coastguard Worker                 case DIRTY_BIT_INDEX_BUFFER:
1100*8975f5c5SAndroid Build Coastguard Worker                     if (indexTypeOrInvalid != gl::DrawElementsType::InvalidEnum)
1101*8975f5c5SAndroid Build Coastguard Worker                     {
1102*8975f5c5SAndroid Build Coastguard Worker                         ANGLE_TRY(handleDirtyIndexBuffer(indexTypeOrInvalid, &dirtyBitIter));
1103*8975f5c5SAndroid Build Coastguard Worker                     }
1104*8975f5c5SAndroid Build Coastguard Worker                     else
1105*8975f5c5SAndroid Build Coastguard Worker                     {
1106*8975f5c5SAndroid Build Coastguard Worker                         // If this is not an indexed draw call, don't sync the index buffer. Save it
1107*8975f5c5SAndroid Build Coastguard Worker                         // for a future indexed draw call when we know what index type to use
1108*8975f5c5SAndroid Build Coastguard Worker                         reAddDirtyIndexBufferBit = true;
1109*8975f5c5SAndroid Build Coastguard Worker                     }
1110*8975f5c5SAndroid Build Coastguard Worker                     break;
1111*8975f5c5SAndroid Build Coastguard Worker                 case DIRTY_BIT_BIND_GROUPS:
1112*8975f5c5SAndroid Build Coastguard Worker                     ANGLE_TRY(handleDirtyBindGroups(&dirtyBitIter));
1113*8975f5c5SAndroid Build Coastguard Worker                     break;
1114*8975f5c5SAndroid Build Coastguard Worker                 default:
1115*8975f5c5SAndroid Build Coastguard Worker                     UNREACHABLE();
1116*8975f5c5SAndroid Build Coastguard Worker                     break;
1117*8975f5c5SAndroid Build Coastguard Worker             }
1118*8975f5c5SAndroid Build Coastguard Worker         }
1119*8975f5c5SAndroid Build Coastguard Worker 
1120*8975f5c5SAndroid Build Coastguard Worker         if (reAddDirtyIndexBufferBit)
1121*8975f5c5SAndroid Build Coastguard Worker         {
1122*8975f5c5SAndroid Build Coastguard Worker             // Re-add the index buffer dirty bit for a future indexed draw call.
1123*8975f5c5SAndroid Build Coastguard Worker             mDirtyBits.reset(DIRTY_BIT_INDEX_BUFFER);
1124*8975f5c5SAndroid Build Coastguard Worker         }
1125*8975f5c5SAndroid Build Coastguard Worker 
1126*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.reset();
1127*8975f5c5SAndroid Build Coastguard Worker     }
1128*8975f5c5SAndroid Build Coastguard Worker 
1129*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
1130*8975f5c5SAndroid Build Coastguard Worker }
1131*8975f5c5SAndroid Build Coastguard Worker 
handleDirtyRenderPipelineDesc(DirtyBits::Iterator * dirtyBitsIterator)1132*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextWgpu::handleDirtyRenderPipelineDesc(DirtyBits::Iterator *dirtyBitsIterator)
1133*8975f5c5SAndroid Build Coastguard Worker {
1134*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mState.getProgramExecutable() != nullptr);
1135*8975f5c5SAndroid Build Coastguard Worker     ProgramExecutableWgpu *executable = webgpu::GetImpl(mState.getProgramExecutable());
1136*8975f5c5SAndroid Build Coastguard Worker     ASSERT(executable);
1137*8975f5c5SAndroid Build Coastguard Worker 
1138*8975f5c5SAndroid Build Coastguard Worker     wgpu::RenderPipeline previousPipeline = std::move(mCurrentGraphicsPipeline);
1139*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(executable->getRenderPipeline(this, mRenderPipelineDesc, &mCurrentGraphicsPipeline));
1140*8975f5c5SAndroid Build Coastguard Worker     if (mCurrentGraphicsPipeline != previousPipeline)
1141*8975f5c5SAndroid Build Coastguard Worker     {
1142*8975f5c5SAndroid Build Coastguard Worker         dirtyBitsIterator->setLaterBit(DIRTY_BIT_RENDER_PIPELINE_BINDING);
1143*8975f5c5SAndroid Build Coastguard Worker     }
1144*8975f5c5SAndroid Build Coastguard Worker     mCurrentRenderPipelineAllAttributes =
1145*8975f5c5SAndroid Build Coastguard Worker         executable->getExecutable()->getActiveAttribLocationsMask();
1146*8975f5c5SAndroid Build Coastguard Worker 
1147*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
1148*8975f5c5SAndroid Build Coastguard Worker }
1149*8975f5c5SAndroid Build Coastguard Worker 
handleDirtyRenderPipelineBinding(DirtyBits::Iterator * dirtyBitsIterator)1150*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextWgpu::handleDirtyRenderPipelineBinding(DirtyBits::Iterator *dirtyBitsIterator)
1151*8975f5c5SAndroid Build Coastguard Worker {
1152*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mCurrentGraphicsPipeline);
1153*8975f5c5SAndroid Build Coastguard Worker     mCommandBuffer.setPipeline(mCurrentGraphicsPipeline);
1154*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
1155*8975f5c5SAndroid Build Coastguard Worker }
1156*8975f5c5SAndroid Build Coastguard Worker 
handleDirtyViewport(DirtyBits::Iterator * dirtyBitsIterator)1157*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextWgpu::handleDirtyViewport(DirtyBits::Iterator *dirtyBitsIterator)
1158*8975f5c5SAndroid Build Coastguard Worker {
1159*8975f5c5SAndroid Build Coastguard Worker     const gl::Framebuffer *framebuffer = mState.getDrawFramebuffer();
1160*8975f5c5SAndroid Build Coastguard Worker     const gl::Extents &framebufferSize = framebuffer->getExtents();
1161*8975f5c5SAndroid Build Coastguard Worker     const gl::Rectangle framebufferRect(0, 0, framebufferSize.width, framebufferSize.height);
1162*8975f5c5SAndroid Build Coastguard Worker 
1163*8975f5c5SAndroid Build Coastguard Worker     gl::Rectangle clampedViewport;
1164*8975f5c5SAndroid Build Coastguard Worker     if (!ClipRectangle(mState.getViewport(), framebufferRect, &clampedViewport))
1165*8975f5c5SAndroid Build Coastguard Worker     {
1166*8975f5c5SAndroid Build Coastguard Worker         clampedViewport = gl::Rectangle(0, 0, 1, 1);
1167*8975f5c5SAndroid Build Coastguard Worker     }
1168*8975f5c5SAndroid Build Coastguard Worker 
1169*8975f5c5SAndroid Build Coastguard Worker     float depthMin = mState.getNearPlane();
1170*8975f5c5SAndroid Build Coastguard Worker     float depthMax = mState.getFarPlane();
1171*8975f5c5SAndroid Build Coastguard Worker 
1172*8975f5c5SAndroid Build Coastguard Worker     // This clamping should be done by the front end. WebGPU requires values in this range.
1173*8975f5c5SAndroid Build Coastguard Worker     ASSERT(depthMin >= 0 && depthMin <= 1);
1174*8975f5c5SAndroid Build Coastguard Worker     ASSERT(depthMin >= 0 && depthMin <= 1);
1175*8975f5c5SAndroid Build Coastguard Worker 
1176*8975f5c5SAndroid Build Coastguard Worker     // WebGPU requires that the maxDepth is at least minDepth. WebGL requires the same but core GL
1177*8975f5c5SAndroid Build Coastguard Worker     // ES does not.
1178*8975f5c5SAndroid Build Coastguard Worker     if (depthMin > depthMax)
1179*8975f5c5SAndroid Build Coastguard Worker     {
1180*8975f5c5SAndroid Build Coastguard Worker         UNIMPLEMENTED();
1181*8975f5c5SAndroid Build Coastguard Worker     }
1182*8975f5c5SAndroid Build Coastguard Worker 
1183*8975f5c5SAndroid Build Coastguard Worker     bool isDefaultViewport = (clampedViewport == framebufferRect) && depthMin == 0 && depthMax == 1;
1184*8975f5c5SAndroid Build Coastguard Worker     if (isDefaultViewport && !mCommandBuffer.hasSetViewportCommand())
1185*8975f5c5SAndroid Build Coastguard Worker     {
1186*8975f5c5SAndroid Build Coastguard Worker         // Each render pass has a default viewport set equal to the size of the render targets. We
1187*8975f5c5SAndroid Build Coastguard Worker         // can skip setting the viewport.
1188*8975f5c5SAndroid Build Coastguard Worker         return angle::Result::Continue;
1189*8975f5c5SAndroid Build Coastguard Worker     }
1190*8975f5c5SAndroid Build Coastguard Worker 
1191*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mCurrentGraphicsPipeline);
1192*8975f5c5SAndroid Build Coastguard Worker     mCommandBuffer.setViewport(clampedViewport.x, clampedViewport.y, clampedViewport.width,
1193*8975f5c5SAndroid Build Coastguard Worker                                clampedViewport.height, depthMin, depthMax);
1194*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
1195*8975f5c5SAndroid Build Coastguard Worker }
1196*8975f5c5SAndroid Build Coastguard Worker 
handleDirtyScissor(DirtyBits::Iterator * dirtyBitsIterator)1197*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextWgpu::handleDirtyScissor(DirtyBits::Iterator *dirtyBitsIterator)
1198*8975f5c5SAndroid Build Coastguard Worker {
1199*8975f5c5SAndroid Build Coastguard Worker     const gl::Framebuffer *framebuffer = mState.getDrawFramebuffer();
1200*8975f5c5SAndroid Build Coastguard Worker     const gl::Extents &framebufferSize = framebuffer->getExtents();
1201*8975f5c5SAndroid Build Coastguard Worker     const gl::Rectangle framebufferRect(0, 0, framebufferSize.width, framebufferSize.height);
1202*8975f5c5SAndroid Build Coastguard Worker 
1203*8975f5c5SAndroid Build Coastguard Worker     gl::Rectangle clampedScissor = framebufferRect;
1204*8975f5c5SAndroid Build Coastguard Worker 
1205*8975f5c5SAndroid Build Coastguard Worker     // When the GL scissor test is disabled, set the scissor to the entire size of the framebuffer
1206*8975f5c5SAndroid Build Coastguard Worker     if (mState.isScissorTestEnabled())
1207*8975f5c5SAndroid Build Coastguard Worker     {
1208*8975f5c5SAndroid Build Coastguard Worker         if (!ClipRectangle(mState.getScissor(), framebufferRect, &clampedScissor))
1209*8975f5c5SAndroid Build Coastguard Worker         {
1210*8975f5c5SAndroid Build Coastguard Worker             clampedScissor = gl::Rectangle(0, 0, 0, 0);
1211*8975f5c5SAndroid Build Coastguard Worker         }
1212*8975f5c5SAndroid Build Coastguard Worker     }
1213*8975f5c5SAndroid Build Coastguard Worker 
1214*8975f5c5SAndroid Build Coastguard Worker     bool isDefaultScissor = clampedScissor == framebufferRect;
1215*8975f5c5SAndroid Build Coastguard Worker     if (isDefaultScissor && !mCommandBuffer.hasSetScissorCommand())
1216*8975f5c5SAndroid Build Coastguard Worker     {
1217*8975f5c5SAndroid Build Coastguard Worker         // Each render pass has a default scissor set equal to the size of the render targets. We
1218*8975f5c5SAndroid Build Coastguard Worker         // can skip setting the scissor.
1219*8975f5c5SAndroid Build Coastguard Worker         return angle::Result::Continue;
1220*8975f5c5SAndroid Build Coastguard Worker     }
1221*8975f5c5SAndroid Build Coastguard Worker 
1222*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mCurrentGraphicsPipeline);
1223*8975f5c5SAndroid Build Coastguard Worker     mCommandBuffer.setScissorRect(clampedScissor.x, clampedScissor.y, clampedScissor.width,
1224*8975f5c5SAndroid Build Coastguard Worker                                   clampedScissor.height);
1225*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
1226*8975f5c5SAndroid Build Coastguard Worker }
1227*8975f5c5SAndroid Build Coastguard Worker 
handleDirtyRenderPass(DirtyBits::Iterator * dirtyBitsIterator)1228*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextWgpu::handleDirtyRenderPass(DirtyBits::Iterator *dirtyBitsIterator)
1229*8975f5c5SAndroid Build Coastguard Worker {
1230*8975f5c5SAndroid Build Coastguard Worker     FramebufferWgpu *drawFramebufferWgpu = webgpu::GetImpl(mState.getDrawFramebuffer());
1231*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(drawFramebufferWgpu->startNewRenderPass(this));
1232*8975f5c5SAndroid Build Coastguard Worker     dirtyBitsIterator->setLaterBits(mNewRenderPassDirtyBits);
1233*8975f5c5SAndroid Build Coastguard Worker     mDirtyVertexBuffers = mCurrentRenderPipelineAllAttributes;
1234*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
1235*8975f5c5SAndroid Build Coastguard Worker }
1236*8975f5c5SAndroid Build Coastguard Worker 
handleDirtyVertexBuffers(const gl::AttributesMask & slots,DirtyBits::Iterator * dirtyBitsIterator)1237*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextWgpu::handleDirtyVertexBuffers(const gl::AttributesMask &slots,
1238*8975f5c5SAndroid Build Coastguard Worker                                                     DirtyBits::Iterator *dirtyBitsIterator)
1239*8975f5c5SAndroid Build Coastguard Worker {
1240*8975f5c5SAndroid Build Coastguard Worker     VertexArrayWgpu *vertexArrayWgpu = GetImplAs<VertexArrayWgpu>(mState.getVertexArray());
1241*8975f5c5SAndroid Build Coastguard Worker     for (size_t slot : slots)
1242*8975f5c5SAndroid Build Coastguard Worker     {
1243*8975f5c5SAndroid Build Coastguard Worker         webgpu::BufferHelper *buffer = vertexArrayWgpu->getVertexBuffer(slot);
1244*8975f5c5SAndroid Build Coastguard Worker         if (!buffer)
1245*8975f5c5SAndroid Build Coastguard Worker         {
1246*8975f5c5SAndroid Build Coastguard Worker             // Missing default attribute support
1247*8975f5c5SAndroid Build Coastguard Worker             ASSERT(!mState.getVertexArray()->getVertexAttribute(slot).enabled);
1248*8975f5c5SAndroid Build Coastguard Worker             UNIMPLEMENTED();
1249*8975f5c5SAndroid Build Coastguard Worker             continue;
1250*8975f5c5SAndroid Build Coastguard Worker         }
1251*8975f5c5SAndroid Build Coastguard Worker         if (buffer->getMappedState())
1252*8975f5c5SAndroid Build Coastguard Worker         {
1253*8975f5c5SAndroid Build Coastguard Worker             ANGLE_TRY(buffer->unmap());
1254*8975f5c5SAndroid Build Coastguard Worker         }
1255*8975f5c5SAndroid Build Coastguard Worker         mCommandBuffer.setVertexBuffer(static_cast<uint32_t>(slot), buffer->getBuffer());
1256*8975f5c5SAndroid Build Coastguard Worker     }
1257*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
1258*8975f5c5SAndroid Build Coastguard Worker }
1259*8975f5c5SAndroid Build Coastguard Worker 
handleDirtyIndexBuffer(gl::DrawElementsType indexType,DirtyBits::Iterator * dirtyBitsIterator)1260*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextWgpu::handleDirtyIndexBuffer(gl::DrawElementsType indexType,
1261*8975f5c5SAndroid Build Coastguard Worker                                                   DirtyBits::Iterator *dirtyBitsIterator)
1262*8975f5c5SAndroid Build Coastguard Worker {
1263*8975f5c5SAndroid Build Coastguard Worker     VertexArrayWgpu *vertexArrayWgpu = GetImplAs<VertexArrayWgpu>(mState.getVertexArray());
1264*8975f5c5SAndroid Build Coastguard Worker     webgpu::BufferHelper *buffer     = vertexArrayWgpu->getIndexBuffer();
1265*8975f5c5SAndroid Build Coastguard Worker     ASSERT(buffer);
1266*8975f5c5SAndroid Build Coastguard Worker     if (buffer->getMappedState())
1267*8975f5c5SAndroid Build Coastguard Worker     {
1268*8975f5c5SAndroid Build Coastguard Worker         ANGLE_TRY(buffer->unmap());
1269*8975f5c5SAndroid Build Coastguard Worker     }
1270*8975f5c5SAndroid Build Coastguard Worker     mCommandBuffer.setIndexBuffer(buffer->getBuffer(), gl_wgpu::GetIndexFormat(indexType), 0, -1);
1271*8975f5c5SAndroid Build Coastguard Worker     mCurrentIndexBufferType = indexType;
1272*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
1273*8975f5c5SAndroid Build Coastguard Worker }
1274*8975f5c5SAndroid Build Coastguard Worker 
handleDirtyBindGroups(DirtyBits::Iterator * dirtyBitsIterator)1275*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextWgpu::handleDirtyBindGroups(DirtyBits::Iterator *dirtyBitsIterator)
1276*8975f5c5SAndroid Build Coastguard Worker {
1277*8975f5c5SAndroid Build Coastguard Worker     ProgramExecutableWgpu *executableWgpu = webgpu::GetImpl(mState.getProgramExecutable());
1278*8975f5c5SAndroid Build Coastguard Worker     wgpu::BindGroup bindGroup;
1279*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(executableWgpu->updateUniformsAndGetBindGroup(this, &bindGroup));
1280*8975f5c5SAndroid Build Coastguard Worker     // TODO(anglebug.com/376553328): need to set up every bind group here.
1281*8975f5c5SAndroid Build Coastguard Worker     mCommandBuffer.setBindGroup(sh::kDefaultUniformBlockBindGroup, bindGroup);
1282*8975f5c5SAndroid Build Coastguard Worker 
1283*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
1284*8975f5c5SAndroid Build Coastguard Worker }
1285*8975f5c5SAndroid Build Coastguard Worker 
1286*8975f5c5SAndroid Build Coastguard Worker }  // namespace rx
1287