WebGLParent.h (5427B)
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* This Source Code Form is subject to the terms of the Mozilla Public 3 * License, v. 2.0. If a copy of the MPL was not distributed with this 4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 5 6 #ifndef WEBGLPARENT_H_ 7 #define WEBGLPARENT_H_ 8 9 #include "mozilla/GfxMessageUtils.h" 10 #include "mozilla/WeakPtr.h" 11 #include "mozilla/dom/PWebGLParent.h" 12 #include "mozilla/dom/ipc/IdType.h" 13 14 namespace mozilla { 15 16 class HostWebGLContext; 17 class WebGLChild; 18 19 namespace layers { 20 class SharedSurfacesHolder; 21 class SharedSurfaceTextureClient; 22 class SurfaceDescriptor; 23 } // namespace layers 24 25 namespace dom { 26 27 class WebGLParent : public PWebGLParent, public SupportsWeakPtr { 28 friend PWebGLParent; 29 30 public: 31 NS_INLINE_DECL_THREADSAFE_REFCOUNTING(WebGLParent, override); 32 33 mozilla::ipc::IPCResult RecvInitialize(const webgl::InitContextDesc&, 34 webgl::InitContextResult* out); 35 36 WebGLParent(layers::SharedSurfacesHolder* aSharedSurfacesHolder, 37 const dom::ContentParentId& aContentId); // For IPDL 38 39 using IPCResult = mozilla::ipc::IPCResult; 40 41 template <class ResolveT> 42 IPCResult RecvPing(const ResolveT& Resolve) { 43 Resolve(void_t{}); 44 return IPC_OK(); 45 } 46 47 IPCResult RecvSyncPing() { return IPC_OK(); } 48 49 IPCResult RecvDispatchCommands(mozilla::ipc::BigBuffer&&, uint64_t); 50 IPCResult RecvTexImage(uint32_t level, uint32_t respecFormat, 51 const uvec3& offset, const webgl::PackingInfo&, 52 webgl::TexUnpackBlobDesc&&); 53 54 IPCResult RecvGetBufferSubData(GLenum target, uint64_t srcByteOffset, 55 uint64_t byteSize, mozilla::ipc::Shmem* ret); 56 IPCResult GetFrontBufferSnapshot(webgl::FrontBufferSnapshotIpc* ret, 57 IProtocol* aProtocol); 58 IPCResult RecvGetFrontBufferSnapshot(webgl::FrontBufferSnapshotIpc* ret); 59 IPCResult RecvReadPixels(const webgl::ReadPixelsDesc&, 60 ReadPixelsBuffer&& buffer, 61 webgl::ReadPixelsResultIpc* ret); 62 63 // - 64 65 using ObjectId = webgl::ObjectId; 66 67 IPCResult RecvCheckFramebufferStatus(GLenum target, GLenum* ret); 68 IPCResult RecvClientWaitSync(ObjectId id, GLbitfield flags, GLuint64 timeout, 69 GLenum* ret); 70 IPCResult RecvCreateOpaqueFramebuffer(ObjectId id, 71 const OpaqueFramebufferOptions&, 72 bool* ret); 73 IPCResult RecvDrawingBufferSize(uvec2* ret); 74 IPCResult RecvFinish(); 75 IPCResult RecvGetBufferParameter(GLenum target, GLenum pname, 76 Maybe<double>* ret); 77 IPCResult RecvGetCompileResult(ObjectId id, webgl::CompileResult* ret); 78 IPCResult RecvGetError(GLenum* ret); 79 IPCResult RecvGetFragDataLocation(ObjectId id, const std::string& name, 80 GLint* ret); 81 IPCResult RecvGetFramebufferAttachmentParameter(ObjectId id, 82 GLenum attachment, 83 GLenum pname, 84 Maybe<double>* ret); 85 IPCResult RecvGetFrontBuffer(ObjectId fb, bool vr, 86 Maybe<layers::SurfaceDescriptor>* ret); 87 IPCResult RecvGetIndexedParameter(GLenum target, GLuint index, 88 Maybe<double>* ret); 89 IPCResult RecvGetInternalformatParameter(GLenum target, GLuint format, 90 GLuint pname, 91 Maybe<std::vector<int32_t>>* ret); 92 IPCResult RecvGetLinkResult(ObjectId id, webgl::LinkResult* ret); 93 IPCResult RecvGetNumber(GLenum pname, Maybe<double>* ret); 94 IPCResult RecvGetQueryParameter(ObjectId id, GLenum pname, 95 Maybe<double>* ret); 96 IPCResult RecvGetRenderbufferParameter(ObjectId id, GLenum pname, 97 Maybe<double>* ret); 98 IPCResult RecvGetSamplerParameter(ObjectId id, GLenum pname, 99 Maybe<double>* ret); 100 IPCResult RecvGetString(GLenum pname, Maybe<std::string>* ret); 101 IPCResult RecvGetTexParameter(ObjectId id, GLenum pname, Maybe<double>* ret); 102 IPCResult RecvGetUniform(ObjectId id, uint32_t loc, 103 webgl::GetUniformData* ret); 104 IPCResult RecvGetVertexAttrib(GLuint index, GLenum pname, Maybe<double>* ret); 105 IPCResult RecvOnMemoryPressure(); 106 IPCResult RecvValidateProgram(ObjectId id, bool* ret); 107 108 // - 109 110 const RefPtr<layers::SharedSurfacesHolder> mSharedSurfacesHolder; 111 const dom::ContentParentId mContentId; 112 113 HostWebGLContext* GetHostWebGLContext() const { return mHost.get(); } 114 115 private: 116 ~WebGLParent(); 117 118 mozilla::ipc::IPCResult Recv__delete__() override; 119 120 void ActorDestroy(ActorDestroyReason aWhy) override; 121 122 mozilla::ipc::IPCResult RecvWaitForTxn(layers::RemoteTextureOwnerId aOwnerId, 123 layers::RemoteTextureTxnType aTxnType, 124 layers::RemoteTextureTxnId aTxnId); 125 126 std::unique_ptr<HostWebGLContext> mHost; 127 128 // Runnable that repeatedly processes our WebGL command queue 129 RefPtr<Runnable> mRunCommandsRunnable; 130 }; 131 132 } // namespace dom 133 } // namespace mozilla 134 135 #endif // WEBGLPARENT_H_