// // Copyright 2015 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // VertexArrayGL.h: Defines the class interface for VertexArrayGL. #ifndef LIBANGLE_RENDERER_GL_VERTEXARRAYGL_H_ #define LIBANGLE_RENDERER_GL_VERTEXARRAYGL_H_ #include "libANGLE/renderer/VertexArrayImpl.h" #include "common/mathutil.h" #include "libANGLE/Context.h" #include "libANGLE/renderer/gl/ContextGL.h" namespace rx { class FunctionsGL; class StateManagerGL; class VertexArrayGL : public VertexArrayImpl { public: VertexArrayGL(const gl::VertexArrayState &data, const FunctionsGL *functions, StateManagerGL *stateManager); ~VertexArrayGL() override; void destroy(const gl::Context *context) override; angle::Result syncClientSideData(const gl::Context *context, const gl::AttributesMask &activeAttributesMask, GLint first, GLsizei count, GLsizei instanceCount) const; angle::Result syncDrawElementsState(const gl::Context *context, const gl::AttributesMask &activeAttributesMask, GLsizei count, gl::DrawElementsType type, const void *indices, GLsizei instanceCount, bool primitiveRestartEnabled, const void **outIndices) const; GLuint getVertexArrayID() const; GLuint getAppliedElementArrayBufferID() const; angle::Result syncState(const gl::Context *context, const gl::VertexArray::DirtyBits &dirtyBits, gl::VertexArray::DirtyAttribBitsArray *attribBits, gl::VertexArray::DirtyBindingBitsArray *bindingBits) override; void applyNumViewsToDivisor(int numViews); void applyActiveAttribLocationsMask(const gl::AttributesMask &activeMask); void validateState() const; private: angle::Result syncDrawState(const gl::Context *context, const gl::AttributesMask &activeAttributesMask, GLint first, GLsizei count, gl::DrawElementsType type, const void *indices, GLsizei instanceCount, bool primitiveRestartEnabled, const void **outIndices) const; // Apply index data, only sets outIndexRange if attributesNeedStreaming is true angle::Result syncIndexData(const gl::Context *context, GLsizei count, gl::DrawElementsType type, const void *indices, bool primitiveRestartEnabled, bool attributesNeedStreaming, gl::IndexRange *outIndexRange, const void **outIndices) const; // Returns the amount of space needed to stream all attributes that need streaming // and the data size of the largest attribute void computeStreamingAttributeSizes(const gl::AttributesMask &attribsToStream, GLsizei instanceCount, const gl::IndexRange &indexRange, size_t *outStreamingDataSize, size_t *outMaxAttributeDataSize) const; // Stream attributes that have client data angle::Result streamAttributes(const gl::Context *context, const gl::AttributesMask &attribsToStream, GLsizei instanceCount, const gl::IndexRange &indexRange) const; void syncDirtyAttrib(const gl::Context *context, size_t attribIndex, const gl::VertexArray::DirtyAttribBits &dirtyAttribBits); void syncDirtyBinding(const gl::Context *context, size_t bindingIndex, const gl::VertexArray::DirtyBindingBits &dirtyBindingBits); void updateAttribEnabled(size_t attribIndex); void updateAttribPointer(const gl::Context *context, size_t attribIndex); bool supportVertexAttribBinding() const; void updateAttribFormat(size_t attribIndex); void updateAttribBinding(size_t attribIndex); void updateBindingBuffer(const gl::Context *context, size_t bindingIndex); void updateBindingDivisor(size_t bindingIndex); void updateElementArrayBufferBinding(const gl::Context *context) const; void callVertexAttribPointer(GLuint attribIndex, const gl::VertexAttribute &attrib, GLsizei stride, GLintptr offset) const; const FunctionsGL *mFunctions; StateManagerGL *mStateManager; GLuint mVertexArrayID; int mAppliedNumViews; // Remember the program's active attrib location mask so that attributes can be enabled/disabled // based on whether they are active in the program gl::AttributesMask mProgramActiveAttribLocationsMask; mutable gl::BindingPointer mAppliedElementArrayBuffer; mutable std::vector mAppliedAttributes; mutable std::vector mAppliedBindings; mutable size_t mStreamingElementArrayBufferSize; mutable GLuint mStreamingElementArrayBuffer; mutable size_t mStreamingArrayBufferSize; mutable GLuint mStreamingArrayBuffer; }; ANGLE_INLINE angle::Result VertexArrayGL::syncDrawElementsState( const gl::Context *context, const gl::AttributesMask &activeAttributesMask, GLsizei count, gl::DrawElementsType type, const void *indices, GLsizei instanceCount, bool primitiveRestartEnabled, const void **outIndices) const { return syncDrawState(context, activeAttributesMask, 0, count, type, indices, instanceCount, primitiveRestartEnabled, outIndices); } } // namespace rx #endif // LIBANGLE_RENDERER_GL_VERTEXARRAYGL_H_