1 // 2 // Copyright 2024 The ANGLE Project Authors. All rights reserved. 3 // Use of this source code is governed by a BSD-style license that can be 4 // found in the LICENSE file. 5 // 6 // ContextWgpu.h: 7 // Defines the class interface for ContextWgpu, implementing ContextImpl. 8 // 9 10 #ifndef LIBANGLE_RENDERER_WGPU_CONTEXTWGPU_H_ 11 #define LIBANGLE_RENDERER_WGPU_CONTEXTWGPU_H_ 12 13 #include <dawn/webgpu_cpp.h> 14 15 #include "image_util/loadimage.h" 16 #include "libANGLE/renderer/ContextImpl.h" 17 #include "libANGLE/renderer/wgpu/DisplayWgpu.h" 18 #include "libANGLE/renderer/wgpu/wgpu_utils.h" 19 20 namespace rx 21 { 22 23 class ContextWgpu : public ContextImpl 24 { 25 public: 26 ContextWgpu(const gl::State &state, gl::ErrorSet *errorSet, DisplayWgpu *display); 27 ~ContextWgpu() override; 28 29 angle::Result initialize(const angle::ImageLoadContext &imageLoadContext) override; 30 31 void onDestroy(const gl::Context *context) override; 32 33 // Flush and finish. 34 angle::Result flush(const gl::Context *context) override; 35 angle::Result finish(const gl::Context *context) override; 36 37 // Drawing methods. 38 angle::Result drawArrays(const gl::Context *context, 39 gl::PrimitiveMode mode, 40 GLint first, 41 GLsizei count) override; 42 angle::Result drawArraysInstanced(const gl::Context *context, 43 gl::PrimitiveMode mode, 44 GLint first, 45 GLsizei count, 46 GLsizei instanceCount) override; 47 angle::Result drawArraysInstancedBaseInstance(const gl::Context *context, 48 gl::PrimitiveMode mode, 49 GLint first, 50 GLsizei count, 51 GLsizei instanceCount, 52 GLuint baseInstance) override; 53 54 angle::Result drawElements(const gl::Context *context, 55 gl::PrimitiveMode mode, 56 GLsizei count, 57 gl::DrawElementsType type, 58 const void *indices) override; 59 angle::Result drawElementsBaseVertex(const gl::Context *context, 60 gl::PrimitiveMode mode, 61 GLsizei count, 62 gl::DrawElementsType type, 63 const void *indices, 64 GLint baseVertex) override; 65 angle::Result drawElementsInstanced(const gl::Context *context, 66 gl::PrimitiveMode mode, 67 GLsizei count, 68 gl::DrawElementsType type, 69 const void *indices, 70 GLsizei instances) override; 71 angle::Result drawElementsInstancedBaseVertex(const gl::Context *context, 72 gl::PrimitiveMode mode, 73 GLsizei count, 74 gl::DrawElementsType type, 75 const void *indices, 76 GLsizei instances, 77 GLint baseVertex) override; 78 angle::Result drawElementsInstancedBaseVertexBaseInstance(const gl::Context *context, 79 gl::PrimitiveMode mode, 80 GLsizei count, 81 gl::DrawElementsType type, 82 const void *indices, 83 GLsizei instances, 84 GLint baseVertex, 85 GLuint baseInstance) override; 86 angle::Result drawRangeElements(const gl::Context *context, 87 gl::PrimitiveMode mode, 88 GLuint start, 89 GLuint end, 90 GLsizei count, 91 gl::DrawElementsType type, 92 const void *indices) override; 93 angle::Result drawRangeElementsBaseVertex(const gl::Context *context, 94 gl::PrimitiveMode mode, 95 GLuint start, 96 GLuint end, 97 GLsizei count, 98 gl::DrawElementsType type, 99 const void *indices, 100 GLint baseVertex) override; 101 angle::Result drawArraysIndirect(const gl::Context *context, 102 gl::PrimitiveMode mode, 103 const void *indirect) override; 104 angle::Result drawElementsIndirect(const gl::Context *context, 105 gl::PrimitiveMode mode, 106 gl::DrawElementsType type, 107 const void *indirect) override; 108 109 angle::Result multiDrawArrays(const gl::Context *context, 110 gl::PrimitiveMode mode, 111 const GLint *firsts, 112 const GLsizei *counts, 113 GLsizei drawcount) override; 114 angle::Result multiDrawArraysInstanced(const gl::Context *context, 115 gl::PrimitiveMode mode, 116 const GLint *firsts, 117 const GLsizei *counts, 118 const GLsizei *instanceCounts, 119 GLsizei drawcount) override; 120 angle::Result multiDrawArraysIndirect(const gl::Context *context, 121 gl::PrimitiveMode mode, 122 const void *indirect, 123 GLsizei drawcount, 124 GLsizei stride) override; 125 angle::Result multiDrawElements(const gl::Context *context, 126 gl::PrimitiveMode mode, 127 const GLsizei *counts, 128 gl::DrawElementsType type, 129 const GLvoid *const *indices, 130 GLsizei drawcount) override; 131 angle::Result multiDrawElementsInstanced(const gl::Context *context, 132 gl::PrimitiveMode mode, 133 const GLsizei *counts, 134 gl::DrawElementsType type, 135 const GLvoid *const *indices, 136 const GLsizei *instanceCounts, 137 GLsizei drawcount) override; 138 angle::Result multiDrawElementsIndirect(const gl::Context *context, 139 gl::PrimitiveMode mode, 140 gl::DrawElementsType type, 141 const void *indirect, 142 GLsizei drawcount, 143 GLsizei stride) override; 144 angle::Result multiDrawArraysInstancedBaseInstance(const gl::Context *context, 145 gl::PrimitiveMode mode, 146 const GLint *firsts, 147 const GLsizei *counts, 148 const GLsizei *instanceCounts, 149 const GLuint *baseInstances, 150 GLsizei drawcount) override; 151 angle::Result multiDrawElementsInstancedBaseVertexBaseInstance(const gl::Context *context, 152 gl::PrimitiveMode mode, 153 const GLsizei *counts, 154 gl::DrawElementsType type, 155 const GLvoid *const *indices, 156 const GLsizei *instanceCounts, 157 const GLint *baseVertices, 158 const GLuint *baseInstances, 159 GLsizei drawcount) override; 160 161 // Device loss 162 gl::GraphicsResetStatus getResetStatus() override; 163 164 // EXT_debug_marker 165 angle::Result insertEventMarker(GLsizei length, const char *marker) override; 166 angle::Result pushGroupMarker(GLsizei length, const char *marker) override; 167 angle::Result popGroupMarker() override; 168 169 // KHR_debug 170 angle::Result pushDebugGroup(const gl::Context *context, 171 GLenum source, 172 GLuint id, 173 const std::string &message) override; 174 angle::Result popDebugGroup(const gl::Context *context) override; 175 176 // State sync with dirty bits. 177 angle::Result syncState(const gl::Context *context, 178 const gl::state::DirtyBits dirtyBits, 179 const gl::state::DirtyBits bitMask, 180 const gl::state::ExtendedDirtyBits extendedDirtyBits, 181 const gl::state::ExtendedDirtyBits extendedBitMask, 182 gl::Command command) override; 183 184 // Disjoint timer queries 185 GLint getGPUDisjoint() override; 186 GLint64 getTimestamp() override; 187 188 // Context switching 189 angle::Result onMakeCurrent(const gl::Context *context) override; 190 191 // Native capabilities, unmodified by gl::Context. 192 gl::Caps getNativeCaps() const override; 193 const gl::TextureCapsMap &getNativeTextureCaps() const override; 194 const gl::Extensions &getNativeExtensions() const override; 195 const gl::Limitations &getNativeLimitations() const override; 196 const ShPixelLocalStorageOptions &getNativePixelLocalStorageOptions() const override; 197 198 // Shader creation 199 CompilerImpl *createCompiler() override; 200 ShaderImpl *createShader(const gl::ShaderState &data) override; 201 ProgramImpl *createProgram(const gl::ProgramState &data) override; 202 ProgramExecutableImpl *createProgramExecutable( 203 const gl::ProgramExecutable *executable) override; 204 205 // Framebuffer creation 206 FramebufferImpl *createFramebuffer(const gl::FramebufferState &data) override; 207 208 // Texture creation 209 TextureImpl *createTexture(const gl::TextureState &state) override; 210 211 // Renderbuffer creation 212 RenderbufferImpl *createRenderbuffer(const gl::RenderbufferState &state) override; 213 214 // Buffer creation 215 BufferImpl *createBuffer(const gl::BufferState &state) override; 216 217 // Vertex Array creation 218 VertexArrayImpl *createVertexArray(const gl::VertexArrayState &data) override; 219 220 // Query and Fence creation 221 QueryImpl *createQuery(gl::QueryType type) override; 222 FenceNVImpl *createFenceNV() override; 223 SyncImpl *createSync() override; 224 225 // Transform Feedback creation 226 TransformFeedbackImpl *createTransformFeedback( 227 const gl::TransformFeedbackState &state) override; 228 229 // Sampler object creation 230 SamplerImpl *createSampler(const gl::SamplerState &state) override; 231 232 // Program Pipeline object creation 233 ProgramPipelineImpl *createProgramPipeline(const gl::ProgramPipelineState &data) override; 234 235 // Memory object creation. 236 MemoryObjectImpl *createMemoryObject() override; 237 238 // Semaphore creation. 239 SemaphoreImpl *createSemaphore() override; 240 241 // Overlay creation. 242 OverlayImpl *createOverlay(const gl::OverlayState &state) override; 243 244 angle::Result dispatchCompute(const gl::Context *context, 245 GLuint numGroupsX, 246 GLuint numGroupsY, 247 GLuint numGroupsZ) override; 248 angle::Result dispatchComputeIndirect(const gl::Context *context, GLintptr indirect) override; 249 250 angle::Result memoryBarrier(const gl::Context *context, GLbitfield barriers) override; 251 angle::Result memoryBarrierByRegion(const gl::Context *context, GLbitfield barriers) override; 252 253 void handleError(GLenum errorCode, 254 const char *message, 255 const char *file, 256 const char *function, 257 unsigned int line); 258 getImageLoadContext()259 const angle::ImageLoadContext &getImageLoadContext() const { return mImageLoadContext; } 260 getDisplay()261 DisplayWgpu *getDisplay() { return mDisplay; } getDevice()262 wgpu::Device &getDevice() { return mDisplay->getDevice(); } getQueue()263 wgpu::Queue &getQueue() { return mDisplay->getQueue(); } getImageLoadContext()264 angle::ImageLoadContext &getImageLoadContext() { return mImageLoadContext; } 265 angle::Result startRenderPass(const wgpu::RenderPassDescriptor &desc); 266 angle::Result endRenderPass(webgpu::RenderPassClosureReason closure_reason); 267 hasActiveRenderPass()268 bool hasActiveRenderPass() { return mCurrentRenderPass != nullptr; } 269 270 angle::Result flush(); 271 272 private: 273 gl::Caps mCaps; 274 gl::TextureCapsMap mTextureCaps; 275 gl::Extensions mExtensions; 276 gl::Limitations mLimitations; 277 ShPixelLocalStorageOptions mPLSOptions; 278 279 angle::ImageLoadContext mImageLoadContext; 280 281 DisplayWgpu *mDisplay; 282 283 wgpu::CommandEncoder mCurrentCommandEncoder; 284 wgpu::RenderPassEncoder mCurrentRenderPass; 285 }; 286 287 } // namespace rx 288 289 #endif // LIBANGLE_RENDERER_WGPU_CONTEXTWGPU_H_ 290