1*8975f5c5SAndroid Build Coastguard Worker // 2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2019 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 // VertexArrayMtl.h: 7*8975f5c5SAndroid Build Coastguard Worker // Defines the class interface for VertexArrayMtl, implementing VertexArrayImpl. 8*8975f5c5SAndroid Build Coastguard Worker // 9*8975f5c5SAndroid Build Coastguard Worker 10*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_RENDERER_METAL_VERTEXARRAYMTL_H_ 11*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_RENDERER_METAL_VERTEXARRAYMTL_H_ 12*8975f5c5SAndroid Build Coastguard Worker 13*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/VertexArrayImpl.h" 14*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/metal/BufferMtl.h" 15*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/metal/mtl_buffer_pool.h" 16*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/metal/mtl_command_buffer.h" 17*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/metal/mtl_context_device.h" 18*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/metal/mtl_format_utils.h" 19*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/metal/mtl_resources.h" 20*8975f5c5SAndroid Build Coastguard Worker 21*8975f5c5SAndroid Build Coastguard Worker namespace rx 22*8975f5c5SAndroid Build Coastguard Worker { 23*8975f5c5SAndroid Build Coastguard Worker class ContextMtl; 24*8975f5c5SAndroid Build Coastguard Worker 25*8975f5c5SAndroid Build Coastguard Worker class VertexArrayMtl : public VertexArrayImpl 26*8975f5c5SAndroid Build Coastguard Worker { 27*8975f5c5SAndroid Build Coastguard Worker public: 28*8975f5c5SAndroid Build Coastguard Worker VertexArrayMtl(const gl::VertexArrayState &state, ContextMtl *context); 29*8975f5c5SAndroid Build Coastguard Worker ~VertexArrayMtl() override; 30*8975f5c5SAndroid Build Coastguard Worker 31*8975f5c5SAndroid Build Coastguard Worker void destroy(const gl::Context *context) override; 32*8975f5c5SAndroid Build Coastguard Worker 33*8975f5c5SAndroid Build Coastguard Worker angle::Result syncState(const gl::Context *context, 34*8975f5c5SAndroid Build Coastguard Worker const gl::VertexArray::DirtyBits &dirtyBits, 35*8975f5c5SAndroid Build Coastguard Worker gl::VertexArray::DirtyAttribBitsArray *attribBits, 36*8975f5c5SAndroid Build Coastguard Worker gl::VertexArray::DirtyBindingBitsArray *bindingBits) override; 37*8975f5c5SAndroid Build Coastguard Worker 38*8975f5c5SAndroid Build Coastguard Worker // Feed client side's vertex/index data 39*8975f5c5SAndroid Build Coastguard Worker angle::Result updateClientAttribs(const gl::Context *context, 40*8975f5c5SAndroid Build Coastguard Worker GLint firstVertex, 41*8975f5c5SAndroid Build Coastguard Worker GLsizei vertexOrIndexCount, 42*8975f5c5SAndroid Build Coastguard Worker GLsizei instanceCount, 43*8975f5c5SAndroid Build Coastguard Worker gl::DrawElementsType indexTypeOrInvalid, 44*8975f5c5SAndroid Build Coastguard Worker const void *indices); 45*8975f5c5SAndroid Build Coastguard Worker 46*8975f5c5SAndroid Build Coastguard Worker // vertexDescChanged is both input and output, the input value if is true, will force new 47*8975f5c5SAndroid Build Coastguard Worker // mtl::VertexDesc to be returned via vertexDescOut. This typically happens when active shader 48*8975f5c5SAndroid Build Coastguard Worker // program is changed. 49*8975f5c5SAndroid Build Coastguard Worker // Otherwise, it is only returned when the vertex array is dirty. 50*8975f5c5SAndroid Build Coastguard Worker angle::Result setupDraw(const gl::Context *glContext, 51*8975f5c5SAndroid Build Coastguard Worker mtl::RenderCommandEncoder *cmdEncoder, 52*8975f5c5SAndroid Build Coastguard Worker bool *vertexDescChanged, 53*8975f5c5SAndroid Build Coastguard Worker mtl::VertexDesc *vertexDescOut); 54*8975f5c5SAndroid Build Coastguard Worker 55*8975f5c5SAndroid Build Coastguard Worker angle::Result getIndexBuffer(const gl::Context *glContext, 56*8975f5c5SAndroid Build Coastguard Worker gl::DrawElementsType indexType, 57*8975f5c5SAndroid Build Coastguard Worker size_t indexCount, 58*8975f5c5SAndroid Build Coastguard Worker const void *sourcePointer, 59*8975f5c5SAndroid Build Coastguard Worker mtl::BufferRef *idxBufferOut, 60*8975f5c5SAndroid Build Coastguard Worker size_t *idxBufferOffsetOut, 61*8975f5c5SAndroid Build Coastguard Worker gl::DrawElementsType *indexTypeOut); 62*8975f5c5SAndroid Build Coastguard Worker 63*8975f5c5SAndroid Build Coastguard Worker std::vector<DrawCommandRange> getDrawIndices(const gl::Context *glContext, 64*8975f5c5SAndroid Build Coastguard Worker gl::DrawElementsType originalIndexType, 65*8975f5c5SAndroid Build Coastguard Worker gl::DrawElementsType indexType, 66*8975f5c5SAndroid Build Coastguard Worker gl::PrimitiveMode primitiveMode, 67*8975f5c5SAndroid Build Coastguard Worker mtl::BufferRef idxBuffer, 68*8975f5c5SAndroid Build Coastguard Worker uint32_t indexCount, 69*8975f5c5SAndroid Build Coastguard Worker size_t offset); 70*8975f5c5SAndroid Build Coastguard Worker 71*8975f5c5SAndroid Build Coastguard Worker private: 72*8975f5c5SAndroid Build Coastguard Worker void reset(ContextMtl *context); 73*8975f5c5SAndroid Build Coastguard Worker 74*8975f5c5SAndroid Build Coastguard Worker angle::Result syncDirtyAttrib(const gl::Context *glContext, 75*8975f5c5SAndroid Build Coastguard Worker const gl::VertexAttribute &attrib, 76*8975f5c5SAndroid Build Coastguard Worker const gl::VertexBinding &binding, 77*8975f5c5SAndroid Build Coastguard Worker size_t attribIndex); 78*8975f5c5SAndroid Build Coastguard Worker 79*8975f5c5SAndroid Build Coastguard Worker angle::Result convertIndexBuffer(const gl::Context *glContext, 80*8975f5c5SAndroid Build Coastguard Worker gl::DrawElementsType indexType, 81*8975f5c5SAndroid Build Coastguard Worker size_t offset, 82*8975f5c5SAndroid Build Coastguard Worker mtl::BufferRef *idxBufferOut, 83*8975f5c5SAndroid Build Coastguard Worker size_t *idxBufferOffsetOut); 84*8975f5c5SAndroid Build Coastguard Worker angle::Result streamIndexBufferFromClient(const gl::Context *glContext, 85*8975f5c5SAndroid Build Coastguard Worker gl::DrawElementsType indexType, 86*8975f5c5SAndroid Build Coastguard Worker size_t indexCount, 87*8975f5c5SAndroid Build Coastguard Worker const void *sourcePointer, 88*8975f5c5SAndroid Build Coastguard Worker mtl::BufferRef *idxBufferOut, 89*8975f5c5SAndroid Build Coastguard Worker size_t *idxBufferOffsetOut); 90*8975f5c5SAndroid Build Coastguard Worker 91*8975f5c5SAndroid Build Coastguard Worker angle::Result convertIndexBufferGPU(const gl::Context *glContext, 92*8975f5c5SAndroid Build Coastguard Worker gl::DrawElementsType indexType, 93*8975f5c5SAndroid Build Coastguard Worker BufferMtl *idxBuffer, 94*8975f5c5SAndroid Build Coastguard Worker size_t offset, 95*8975f5c5SAndroid Build Coastguard Worker size_t indexCount, 96*8975f5c5SAndroid Build Coastguard Worker IndexConversionBufferMtl *conversion); 97*8975f5c5SAndroid Build Coastguard Worker 98*8975f5c5SAndroid Build Coastguard Worker angle::Result convertVertexBuffer(const gl::Context *glContext, 99*8975f5c5SAndroid Build Coastguard Worker BufferMtl *srcBuffer, 100*8975f5c5SAndroid Build Coastguard Worker const gl::VertexBinding &binding, 101*8975f5c5SAndroid Build Coastguard Worker size_t attribIndex, 102*8975f5c5SAndroid Build Coastguard Worker const mtl::VertexFormat &vertexFormat); 103*8975f5c5SAndroid Build Coastguard Worker 104*8975f5c5SAndroid Build Coastguard Worker angle::Result convertVertexBufferCPU(ContextMtl *contextMtl, 105*8975f5c5SAndroid Build Coastguard Worker BufferMtl *srcBuffer, 106*8975f5c5SAndroid Build Coastguard Worker const gl::VertexBinding &binding, 107*8975f5c5SAndroid Build Coastguard Worker size_t attribIndex, 108*8975f5c5SAndroid Build Coastguard Worker const mtl::VertexFormat &convertedFormat, 109*8975f5c5SAndroid Build Coastguard Worker GLuint targetStride, 110*8975f5c5SAndroid Build Coastguard Worker size_t vertexCount, 111*8975f5c5SAndroid Build Coastguard Worker ConversionBufferMtl *conversion); 112*8975f5c5SAndroid Build Coastguard Worker angle::Result convertVertexBufferGPU(const gl::Context *glContext, 113*8975f5c5SAndroid Build Coastguard Worker BufferMtl *srcBuffer, 114*8975f5c5SAndroid Build Coastguard Worker const gl::VertexBinding &binding, 115*8975f5c5SAndroid Build Coastguard Worker size_t attribIndex, 116*8975f5c5SAndroid Build Coastguard Worker const mtl::VertexFormat &convertedFormat, 117*8975f5c5SAndroid Build Coastguard Worker GLuint targetStride, 118*8975f5c5SAndroid Build Coastguard Worker size_t vertexCount, 119*8975f5c5SAndroid Build Coastguard Worker bool isExpandingComponents, 120*8975f5c5SAndroid Build Coastguard Worker ConversionBufferMtl *conversion); 121*8975f5c5SAndroid Build Coastguard Worker 122*8975f5c5SAndroid Build Coastguard Worker // These can point to real BufferMtl or converted buffer in mConvertedArrayBufferHolders 123*8975f5c5SAndroid Build Coastguard Worker gl::AttribArray<BufferHolderMtl *> mCurrentArrayBuffers; 124*8975f5c5SAndroid Build Coastguard Worker gl::AttribArray<SimpleWeakBufferHolderMtl> mConvertedArrayBufferHolders; 125*8975f5c5SAndroid Build Coastguard Worker gl::AttribArray<size_t> mCurrentArrayBufferOffsets; 126*8975f5c5SAndroid Build Coastguard Worker 127*8975f5c5SAndroid Build Coastguard Worker // Size to be uploaded as inline constant data. Used for client vertex attribute's data that 128*8975f5c5SAndroid Build Coastguard Worker // is small enough that we can send directly as inline constant data instead of streaming 129*8975f5c5SAndroid Build Coastguard Worker // through a buffer. 130*8975f5c5SAndroid Build Coastguard Worker gl::AttribArray<size_t> mCurrentArrayInlineDataSizes; 131*8975f5c5SAndroid Build Coastguard Worker // Array of host buffers storing converted data for client attributes that are small enough. 132*8975f5c5SAndroid Build Coastguard Worker gl::AttribArray<angle::MemoryBuffer> mConvertedClientSmallArrays; 133*8975f5c5SAndroid Build Coastguard Worker gl::AttribArray<const uint8_t *> mCurrentArrayInlineDataPointers; 134*8975f5c5SAndroid Build Coastguard Worker // Max size of inline constant data that can be used for client vertex attribute. 135*8975f5c5SAndroid Build Coastguard Worker size_t mInlineDataMaxSize; 136*8975f5c5SAndroid Build Coastguard Worker 137*8975f5c5SAndroid Build Coastguard Worker // Stride per vertex attribute 138*8975f5c5SAndroid Build Coastguard Worker gl::AttribArray<GLuint> mCurrentArrayBufferStrides; 139*8975f5c5SAndroid Build Coastguard Worker // Format per vertex attribute 140*8975f5c5SAndroid Build Coastguard Worker gl::AttribArray<const mtl::VertexFormat *> mCurrentArrayBufferFormats; 141*8975f5c5SAndroid Build Coastguard Worker 142*8975f5c5SAndroid Build Coastguard Worker const mtl::VertexFormat &mDefaultFloatVertexFormat; 143*8975f5c5SAndroid Build Coastguard Worker 144*8975f5c5SAndroid Build Coastguard Worker mtl::BufferPool mDynamicVertexData; 145*8975f5c5SAndroid Build Coastguard Worker mtl::BufferPool mDynamicIndexData; 146*8975f5c5SAndroid Build Coastguard Worker 147*8975f5c5SAndroid Build Coastguard Worker std::vector<uint32_t> mEmulatedInstanceAttribs; 148*8975f5c5SAndroid Build Coastguard Worker 149*8975f5c5SAndroid Build Coastguard Worker bool mVertexArrayDirty = true; 150*8975f5c5SAndroid Build Coastguard Worker bool mVertexDataDirty = true; 151*8975f5c5SAndroid Build Coastguard Worker }; 152*8975f5c5SAndroid Build Coastguard Worker } // namespace rx 153*8975f5c5SAndroid Build Coastguard Worker 154*8975f5c5SAndroid Build Coastguard Worker #endif /* LIBANGLE_RENDERER_METAL_VERTEXARRAYMTL_H_ */ 155