• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright 2014 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 
7 // VertexArray11.h: Defines the rx::VertexArray11 class which implements rx::VertexArrayImpl.
8 
9 #ifndef LIBANGLE_RENDERER_D3D_D3D11_VERTEXARRAY11_H_
10 #define LIBANGLE_RENDERER_D3D_D3D11_VERTEXARRAY11_H_
11 
12 #include "libANGLE/Framebuffer.h"
13 #include "libANGLE/renderer/VertexArrayImpl.h"
14 #include "libANGLE/renderer/d3d/d3d11/Renderer11.h"
15 #include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h"
16 
17 namespace rx
18 {
19 class Renderer11;
20 
21 class VertexArray11 : public VertexArrayImpl
22 {
23   public:
24     VertexArray11(const gl::VertexArrayState &data);
25     ~VertexArray11() override;
26     void destroy(const gl::Context *context) override;
27 
28     // Does not apply any state updates - these are done in syncStateForDraw which as access to
29     // the draw call parameters.
30     angle::Result syncState(const gl::Context *context,
31                             const gl::VertexArray::DirtyBits &dirtyBits,
32                             gl::VertexArray::DirtyAttribBitsArray *attribBits,
33                             gl::VertexArray::DirtyBindingBitsArray *bindingBits) override;
34 
35     // Applied buffer pointers are updated here.
36     angle::Result syncStateForDraw(const gl::Context *context,
37                                    GLint firstVertex,
38                                    GLsizei vertexOrIndexCount,
39                                    gl::DrawElementsType indexTypeOrInvalid,
40                                    const void *indices,
41                                    GLsizei instances,
42                                    GLint baseVertex,
43                                    GLuint baseInstance,
44                                    bool promoteDynamic);
45 
46     // This will check the dynamic attribs mask.
47     bool hasActiveDynamicAttrib(const gl::Context *context);
48 
49     const std::vector<TranslatedAttribute> &getTranslatedAttribs() const;
50 
getCurrentStateSerial()51     Serial getCurrentStateSerial() const { return mCurrentStateSerial; }
52 
53     // In case of a multi-view program change, we have to update all attributes so that the divisor
54     // is adjusted.
55     void markAllAttributeDivisorsForAdjustment(int numViews);
56 
57     const TranslatedIndexData &getCachedIndexInfo() const;
58     void updateCachedIndexInfo(const TranslatedIndexData &indexInfo);
59     bool isCachedIndexInfoValid() const;
60 
61     gl::DrawElementsType getCachedDestinationIndexType() const;
62 
63   private:
64     void updateVertexAttribStorage(const gl::Context *context,
65                                    StateManager11 *stateManager,
66                                    size_t attribIndex);
67     angle::Result updateDirtyAttribs(const gl::Context *context,
68                                      const gl::AttributesMask &activeDirtyAttribs);
69     angle::Result updateDynamicAttribs(const gl::Context *context,
70                                        VertexDataManager *vertexDataManager,
71                                        GLint firstVertex,
72                                        GLsizei vertexOrIndexCount,
73                                        gl::DrawElementsType indexTypeOrInvalid,
74                                        const void *indices,
75                                        GLsizei instances,
76                                        GLint baseVertex,
77                                        GLuint baseInstance,
78                                        bool promoteDynamic,
79                                        const gl::AttributesMask &activeDynamicAttribs);
80 
81     angle::Result updateElementArrayStorage(const gl::Context *context,
82                                             GLsizei indexCount,
83                                             gl::DrawElementsType indexType,
84                                             const void *indices,
85                                             bool restartEnabled);
86 
87     std::vector<VertexStorageType> mAttributeStorageTypes;
88     std::vector<TranslatedAttribute> mTranslatedAttribs;
89 
90     // The mask of attributes marked as dynamic.
91     gl::AttributesMask mDynamicAttribsMask;
92 
93     // A set of attributes we know are dirty, and need to be re-translated.
94     gl::AttributesMask mAttribsToTranslate;
95 
96     Serial mCurrentStateSerial;
97 
98     // The numViews value used to adjust the divisor.
99     int mAppliedNumViewsToDivisor;
100 
101     // If the index buffer needs re-streaming.
102     Optional<gl::DrawElementsType> mLastDrawElementsType;
103     Optional<const void *> mLastDrawElementsIndices;
104     Optional<bool> mLastPrimitiveRestartEnabled;
105     IndexStorageType mCurrentElementArrayStorage;
106     Optional<TranslatedIndexData> mCachedIndexInfo;
107     gl::DrawElementsType mCachedDestinationIndexType;
108 };
109 
110 }  // namespace rx
111 
112 #endif  // LIBANGLE_RENDERER_D3D_D3D11_VERTEXARRAY11_H_
113