/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef WEBGL2CONTEXT_H_ #define WEBGL2CONTEXT_H_ #include "WebGLContext.h" namespace mozilla { class ErrorResult; class HostWebGLContext; class WebGLSampler; class WebGLSync; class WebGLTransformFeedback; class WebGLVertexArrayObject; namespace dom { class OwningUnsignedLongOrUint32ArrayOrBoolean; class OwningWebGLBufferOrLongLong; } // namespace dom class WebGL2Context final : public WebGLContext { friend class WebGLContext; public: WebGL2Context(HostWebGLContext& host, const webgl::InitContextDesc& desc) : WebGLContext(host, desc) {} virtual bool IsWebGL2() const override { return true; } // ------------------------------------------------------------------------- // Buffer objects - WebGL2ContextBuffers.cpp void CopyBufferSubData(GLenum readTarget, GLenum writeTarget, uint64_t readOffset, uint64_t writeOffset, uint64_t size) const; bool GetBufferSubData(GLenum target, uint64_t srcByteOffset, const Range& dest) const; // ------------------------------------------------------------------------- // Framebuffer objects - WebGL2ContextFramebuffers.cpp void BlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); void InvalidateFramebuffer(GLenum target, const Range& attachments); void InvalidateSubFramebuffer(GLenum target, const Range& attachments, GLint x, GLint y, GLsizei width, GLsizei height); void ReadBuffer(GLenum mode); // ------------------------------------------------------------------------- // Renderbuffer objects - WebGL2ContextRenderbuffers.cpp Maybe> GetInternalformatParameter(GLenum target, GLenum internalformat, GLenum pname) const; // ------------------------------------------------------------------------- // Texture objects - WebGL2ContextTextures.cpp // GL 3.0 & ES 3.0 void VertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w); void VertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); // ------------------------------------------------------------------------- // Writing to the drawing buffer /* Implemented in WebGLContext void VertexAttribDivisor(GLuint index, GLuint divisor); void DrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount); void DrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, WebGLintptr offset, GLsizei instanceCount); */ // ------------------------------------------------------------------------ // Multiple Render Targets - WebGL2ContextMRTs.cpp private: bool ValidateClearBuffer(GLenum buffer, GLint drawBuffer, webgl::AttribBaseType funcType); public: void ClearBufferfi(GLenum buffer, GLint drawBuffer, GLfloat depth, GLint stencil); void ClearBufferTv(GLenum buffer, GLint drawBuffer, const webgl::TypedQuad& data); // ------------------------------------------------------------------------- // Sampler Objects - WebGL2ContextSamplers.cpp RefPtr CreateSampler(); void BindSampler(GLuint unit, WebGLSampler* sampler); void SamplerParameteri(WebGLSampler& sampler, GLenum pname, GLint param); void SamplerParameterf(WebGLSampler& sampler, GLenum pname, GLfloat param); Maybe GetSamplerParameter(const WebGLSampler& sampler, GLenum pname) const; // ------------------------------------------------------------------------- // Sync objects - WebGL2ContextSync.cpp const GLuint64 kMaxClientWaitSyncTimeoutNS = 1000 * 1000 * 1000; // 1000ms in ns. RefPtr FenceSync(GLenum condition, GLbitfield flags); GLenum ClientWaitSync(const WebGLSync& sync, GLbitfield flags, GLuint64 timeout); // ------------------------------------------------------------------------- // Transform Feedback - WebGL2ContextTransformFeedback.cpp RefPtr CreateTransformFeedback(); void BindTransformFeedback(WebGLTransformFeedback* tf); void BeginTransformFeedback(GLenum primitiveMode); void EndTransformFeedback(); void PauseTransformFeedback(); void ResumeTransformFeedback(); void TransformFeedbackVaryings(WebGLProgram& program, const std::vector& varyings, GLenum bufferMode) const; // ------------------------------------------------------------------------- // Uniform Buffer Objects and Transform Feedback Buffers - // WebGL2ContextUniforms.cpp // TODO(djg): Implemented in WebGLContext /* void BindBufferBase(GLenum target, GLuint index, WebGLBuffer* buffer); void BindBufferRange(GLenum target, GLuint index, WebGLBuffer* buffer, WebGLintptr offset, WebGLsizeiptr size); */ Maybe GetParameter(GLenum pname) override; Maybe GetIndexedParameter(GLenum pname, uint32_t index) const; // Make the inline version from the superclass visible here. using WebGLContext::GetParameter; void UniformBlockBinding(WebGLProgram& program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); private: virtual UniquePtr CreateFormatUsage( gl::GLContext* gl) const override; virtual bool IsTexParamValid(GLenum pname) const override; void UpdateBoundQuery(GLenum target, WebGLQuery* query); }; } // namespace mozilla #endif