xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/vulkan/BufferVk.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2016 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 // BufferVk.h:
7*8975f5c5SAndroid Build Coastguard Worker //    Defines the class interface for BufferVk, implementing BufferImpl.
8*8975f5c5SAndroid Build Coastguard Worker //
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_RENDERER_VULKAN_BUFFERVK_H_
11*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_RENDERER_VULKAN_BUFFERVK_H_
12*8975f5c5SAndroid Build Coastguard Worker 
13*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Buffer.h"
14*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Observer.h"
15*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/BufferImpl.h"
16*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/vk_helpers.h"
17*8975f5c5SAndroid Build Coastguard Worker 
18*8975f5c5SAndroid Build Coastguard Worker namespace rx
19*8975f5c5SAndroid Build Coastguard Worker {
20*8975f5c5SAndroid Build Coastguard Worker typedef gl::Range<VkDeviceSize> RangeDeviceSize;
21*8975f5c5SAndroid Build Coastguard Worker 
22*8975f5c5SAndroid Build Coastguard Worker // Conversion buffers hold translated index and vertex data.
23*8975f5c5SAndroid Build Coastguard Worker class ConversionBuffer
24*8975f5c5SAndroid Build Coastguard Worker {
25*8975f5c5SAndroid Build Coastguard Worker   public:
ConversionBuffer()26*8975f5c5SAndroid Build Coastguard Worker     ConversionBuffer() : mEntireBufferDirty(true)
27*8975f5c5SAndroid Build Coastguard Worker     {
28*8975f5c5SAndroid Build Coastguard Worker         mData = std::make_unique<vk::BufferHelper>();
29*8975f5c5SAndroid Build Coastguard Worker         mDirtyRanges.reserve(32);
30*8975f5c5SAndroid Build Coastguard Worker     }
31*8975f5c5SAndroid Build Coastguard Worker     ConversionBuffer(vk::Renderer *renderer,
32*8975f5c5SAndroid Build Coastguard Worker                      VkBufferUsageFlags usageFlags,
33*8975f5c5SAndroid Build Coastguard Worker                      size_t initialSize,
34*8975f5c5SAndroid Build Coastguard Worker                      size_t alignment,
35*8975f5c5SAndroid Build Coastguard Worker                      bool hostVisible);
36*8975f5c5SAndroid Build Coastguard Worker     ~ConversionBuffer();
37*8975f5c5SAndroid Build Coastguard Worker 
38*8975f5c5SAndroid Build Coastguard Worker     ConversionBuffer(ConversionBuffer &&other);
39*8975f5c5SAndroid Build Coastguard Worker 
dirty()40*8975f5c5SAndroid Build Coastguard Worker     bool dirty() const { return mEntireBufferDirty || !mDirtyRanges.empty(); }
isEntireBufferDirty()41*8975f5c5SAndroid Build Coastguard Worker     bool isEntireBufferDirty() const { return mEntireBufferDirty; }
setEntireBufferDirty()42*8975f5c5SAndroid Build Coastguard Worker     void setEntireBufferDirty() { mEntireBufferDirty = true; }
addDirtyBufferRange(const RangeDeviceSize & range)43*8975f5c5SAndroid Build Coastguard Worker     void addDirtyBufferRange(const RangeDeviceSize &range) { mDirtyRanges.emplace_back(range); }
44*8975f5c5SAndroid Build Coastguard Worker     void consolidateDirtyRanges();
getDirtyBufferRanges()45*8975f5c5SAndroid Build Coastguard Worker     const std::vector<RangeDeviceSize> &getDirtyBufferRanges() const { return mDirtyRanges; }
clearDirty()46*8975f5c5SAndroid Build Coastguard Worker     void clearDirty()
47*8975f5c5SAndroid Build Coastguard Worker     {
48*8975f5c5SAndroid Build Coastguard Worker         mEntireBufferDirty = false;
49*8975f5c5SAndroid Build Coastguard Worker         mDirtyRanges.clear();
50*8975f5c5SAndroid Build Coastguard Worker     }
51*8975f5c5SAndroid Build Coastguard Worker 
valid()52*8975f5c5SAndroid Build Coastguard Worker     bool valid() const { return mData && mData->valid(); }
getBuffer()53*8975f5c5SAndroid Build Coastguard Worker     vk::BufferHelper *getBuffer() const { return mData.get(); }
release(vk::Renderer * renderer)54*8975f5c5SAndroid Build Coastguard Worker     void release(vk::Renderer *renderer) { mData->release(renderer); }
destroy(vk::Renderer * renderer)55*8975f5c5SAndroid Build Coastguard Worker     void destroy(vk::Renderer *renderer) { mData->destroy(renderer); }
56*8975f5c5SAndroid Build Coastguard Worker 
57*8975f5c5SAndroid Build Coastguard Worker   private:
58*8975f5c5SAndroid Build Coastguard Worker     // state value determines if we need to re-stream vertex data. mEntireBufferDirty indicates
59*8975f5c5SAndroid Build Coastguard Worker     // entire buffer data has changed. mDirtyRange should be ignored when mEntireBufferDirty is
60*8975f5c5SAndroid Build Coastguard Worker     // true. If mEntireBufferDirty is false, mDirtyRange is the ranges of data that has been
61*8975f5c5SAndroid Build Coastguard Worker     // modified. Note that there is no guarantee that ranges will not overlap.
62*8975f5c5SAndroid Build Coastguard Worker     bool mEntireBufferDirty;
63*8975f5c5SAndroid Build Coastguard Worker     std::vector<RangeDeviceSize> mDirtyRanges;
64*8975f5c5SAndroid Build Coastguard Worker 
65*8975f5c5SAndroid Build Coastguard Worker     // Where the conversion data is stored.
66*8975f5c5SAndroid Build Coastguard Worker     std::unique_ptr<vk::BufferHelper> mData;
67*8975f5c5SAndroid Build Coastguard Worker };
68*8975f5c5SAndroid Build Coastguard Worker 
69*8975f5c5SAndroid Build Coastguard Worker class VertexConversionBuffer : public ConversionBuffer
70*8975f5c5SAndroid Build Coastguard Worker {
71*8975f5c5SAndroid Build Coastguard Worker   public:
72*8975f5c5SAndroid Build Coastguard Worker     struct CacheKey final
73*8975f5c5SAndroid Build Coastguard Worker     {
74*8975f5c5SAndroid Build Coastguard Worker         angle::FormatID formatID;
75*8975f5c5SAndroid Build Coastguard Worker         GLuint stride;
76*8975f5c5SAndroid Build Coastguard Worker         size_t offset;
77*8975f5c5SAndroid Build Coastguard Worker         bool hostVisible;
78*8975f5c5SAndroid Build Coastguard Worker         bool offsetMustMatchExactly;
79*8975f5c5SAndroid Build Coastguard Worker     };
80*8975f5c5SAndroid Build Coastguard Worker 
81*8975f5c5SAndroid Build Coastguard Worker     VertexConversionBuffer(vk::Renderer *renderer, const CacheKey &cacheKey);
82*8975f5c5SAndroid Build Coastguard Worker     ~VertexConversionBuffer();
83*8975f5c5SAndroid Build Coastguard Worker 
84*8975f5c5SAndroid Build Coastguard Worker     VertexConversionBuffer(VertexConversionBuffer &&other);
85*8975f5c5SAndroid Build Coastguard Worker 
match(const CacheKey & cacheKey)86*8975f5c5SAndroid Build Coastguard Worker     bool match(const CacheKey &cacheKey)
87*8975f5c5SAndroid Build Coastguard Worker     {
88*8975f5c5SAndroid Build Coastguard Worker         // If anything other than offset mismatch, it can't reuse.
89*8975f5c5SAndroid Build Coastguard Worker         if (mCacheKey.formatID != cacheKey.formatID || mCacheKey.stride != cacheKey.stride ||
90*8975f5c5SAndroid Build Coastguard Worker             mCacheKey.offsetMustMatchExactly != cacheKey.offsetMustMatchExactly ||
91*8975f5c5SAndroid Build Coastguard Worker             mCacheKey.hostVisible != cacheKey.hostVisible)
92*8975f5c5SAndroid Build Coastguard Worker         {
93*8975f5c5SAndroid Build Coastguard Worker             return false;
94*8975f5c5SAndroid Build Coastguard Worker         }
95*8975f5c5SAndroid Build Coastguard Worker 
96*8975f5c5SAndroid Build Coastguard Worker         // If offset matches, for sure we can reuse.
97*8975f5c5SAndroid Build Coastguard Worker         if (mCacheKey.offset == cacheKey.offset)
98*8975f5c5SAndroid Build Coastguard Worker         {
99*8975f5c5SAndroid Build Coastguard Worker             return true;
100*8975f5c5SAndroid Build Coastguard Worker         }
101*8975f5c5SAndroid Build Coastguard Worker 
102*8975f5c5SAndroid Build Coastguard Worker         // If offset exact match is not required and offsets are multiple strides apart, then we
103*8975f5c5SAndroid Build Coastguard Worker         // adjust the offset to reuse the buffer. The benefit of reused the buffer is that the
104*8975f5c5SAndroid Build Coastguard Worker         // previous conversion result is still valid. We only need to convert the modified data.
105*8975f5c5SAndroid Build Coastguard Worker         if (!cacheKey.offsetMustMatchExactly)
106*8975f5c5SAndroid Build Coastguard Worker         {
107*8975f5c5SAndroid Build Coastguard Worker             int64_t offsetGap = cacheKey.offset - mCacheKey.offset;
108*8975f5c5SAndroid Build Coastguard Worker             if ((offsetGap % cacheKey.stride) == 0)
109*8975f5c5SAndroid Build Coastguard Worker             {
110*8975f5c5SAndroid Build Coastguard Worker                 if (cacheKey.offset < mCacheKey.offset)
111*8975f5c5SAndroid Build Coastguard Worker                 {
112*8975f5c5SAndroid Build Coastguard Worker                     addDirtyBufferRange(RangeDeviceSize(cacheKey.offset, mCacheKey.offset));
113*8975f5c5SAndroid Build Coastguard Worker                     mCacheKey.offset = cacheKey.offset;
114*8975f5c5SAndroid Build Coastguard Worker                 }
115*8975f5c5SAndroid Build Coastguard Worker                 return true;
116*8975f5c5SAndroid Build Coastguard Worker             }
117*8975f5c5SAndroid Build Coastguard Worker         }
118*8975f5c5SAndroid Build Coastguard Worker         return false;
119*8975f5c5SAndroid Build Coastguard Worker     }
120*8975f5c5SAndroid Build Coastguard Worker 
getCacheKey()121*8975f5c5SAndroid Build Coastguard Worker     const CacheKey &getCacheKey() const { return mCacheKey; }
122*8975f5c5SAndroid Build Coastguard Worker 
123*8975f5c5SAndroid Build Coastguard Worker   private:
124*8975f5c5SAndroid Build Coastguard Worker     // The conversion is identified by the triple of {format, stride, offset}.
125*8975f5c5SAndroid Build Coastguard Worker     CacheKey mCacheKey;
126*8975f5c5SAndroid Build Coastguard Worker };
127*8975f5c5SAndroid Build Coastguard Worker 
128*8975f5c5SAndroid Build Coastguard Worker enum class BufferUpdateType
129*8975f5c5SAndroid Build Coastguard Worker {
130*8975f5c5SAndroid Build Coastguard Worker     StorageRedefined,
131*8975f5c5SAndroid Build Coastguard Worker     ContentsUpdate,
132*8975f5c5SAndroid Build Coastguard Worker };
133*8975f5c5SAndroid Build Coastguard Worker 
134*8975f5c5SAndroid Build Coastguard Worker struct BufferDataSource
135*8975f5c5SAndroid Build Coastguard Worker {
136*8975f5c5SAndroid Build Coastguard Worker     // Buffer data can come from two sources:
137*8975f5c5SAndroid Build Coastguard Worker     // glBufferData and glBufferSubData upload through a CPU pointer
138*8975f5c5SAndroid Build Coastguard Worker     const void *data = nullptr;
139*8975f5c5SAndroid Build Coastguard Worker     // glCopyBufferSubData copies data from another buffer
140*8975f5c5SAndroid Build Coastguard Worker     vk::BufferHelper *buffer  = nullptr;
141*8975f5c5SAndroid Build Coastguard Worker     VkDeviceSize bufferOffset = 0;
142*8975f5c5SAndroid Build Coastguard Worker };
143*8975f5c5SAndroid Build Coastguard Worker 
144*8975f5c5SAndroid Build Coastguard Worker VkBufferUsageFlags GetDefaultBufferUsageFlags(vk::Renderer *renderer);
145*8975f5c5SAndroid Build Coastguard Worker 
146*8975f5c5SAndroid Build Coastguard Worker class BufferVk : public BufferImpl
147*8975f5c5SAndroid Build Coastguard Worker {
148*8975f5c5SAndroid Build Coastguard Worker   public:
149*8975f5c5SAndroid Build Coastguard Worker     BufferVk(const gl::BufferState &state);
150*8975f5c5SAndroid Build Coastguard Worker     ~BufferVk() override;
151*8975f5c5SAndroid Build Coastguard Worker     void destroy(const gl::Context *context) override;
152*8975f5c5SAndroid Build Coastguard Worker 
153*8975f5c5SAndroid Build Coastguard Worker     angle::Result setExternalBufferData(const gl::Context *context,
154*8975f5c5SAndroid Build Coastguard Worker                                         gl::BufferBinding target,
155*8975f5c5SAndroid Build Coastguard Worker                                         GLeglClientBufferEXT clientBuffer,
156*8975f5c5SAndroid Build Coastguard Worker                                         size_t size,
157*8975f5c5SAndroid Build Coastguard Worker                                         VkMemoryPropertyFlags memoryPropertyFlags);
158*8975f5c5SAndroid Build Coastguard Worker     angle::Result setDataWithUsageFlags(const gl::Context *context,
159*8975f5c5SAndroid Build Coastguard Worker                                         gl::BufferBinding target,
160*8975f5c5SAndroid Build Coastguard Worker                                         GLeglClientBufferEXT clientBuffer,
161*8975f5c5SAndroid Build Coastguard Worker                                         const void *data,
162*8975f5c5SAndroid Build Coastguard Worker                                         size_t size,
163*8975f5c5SAndroid Build Coastguard Worker                                         gl::BufferUsage usage,
164*8975f5c5SAndroid Build Coastguard Worker                                         GLbitfield flags) override;
165*8975f5c5SAndroid Build Coastguard Worker     angle::Result setData(const gl::Context *context,
166*8975f5c5SAndroid Build Coastguard Worker                           gl::BufferBinding target,
167*8975f5c5SAndroid Build Coastguard Worker                           const void *data,
168*8975f5c5SAndroid Build Coastguard Worker                           size_t size,
169*8975f5c5SAndroid Build Coastguard Worker                           gl::BufferUsage usage) override;
170*8975f5c5SAndroid Build Coastguard Worker     angle::Result setSubData(const gl::Context *context,
171*8975f5c5SAndroid Build Coastguard Worker                              gl::BufferBinding target,
172*8975f5c5SAndroid Build Coastguard Worker                              const void *data,
173*8975f5c5SAndroid Build Coastguard Worker                              size_t size,
174*8975f5c5SAndroid Build Coastguard Worker                              size_t offset) override;
175*8975f5c5SAndroid Build Coastguard Worker     angle::Result copySubData(const gl::Context *context,
176*8975f5c5SAndroid Build Coastguard Worker                               BufferImpl *source,
177*8975f5c5SAndroid Build Coastguard Worker                               GLintptr sourceOffset,
178*8975f5c5SAndroid Build Coastguard Worker                               GLintptr destOffset,
179*8975f5c5SAndroid Build Coastguard Worker                               GLsizeiptr size) override;
180*8975f5c5SAndroid Build Coastguard Worker     angle::Result map(const gl::Context *context, GLenum access, void **mapPtr) override;
181*8975f5c5SAndroid Build Coastguard Worker     angle::Result mapRange(const gl::Context *context,
182*8975f5c5SAndroid Build Coastguard Worker                            size_t offset,
183*8975f5c5SAndroid Build Coastguard Worker                            size_t length,
184*8975f5c5SAndroid Build Coastguard Worker                            GLbitfield access,
185*8975f5c5SAndroid Build Coastguard Worker                            void **mapPtr) override;
186*8975f5c5SAndroid Build Coastguard Worker     angle::Result unmap(const gl::Context *context, GLboolean *result) override;
187*8975f5c5SAndroid Build Coastguard Worker     angle::Result getSubData(const gl::Context *context,
188*8975f5c5SAndroid Build Coastguard Worker                              GLintptr offset,
189*8975f5c5SAndroid Build Coastguard Worker                              GLsizeiptr size,
190*8975f5c5SAndroid Build Coastguard Worker                              void *outData) override;
191*8975f5c5SAndroid Build Coastguard Worker 
192*8975f5c5SAndroid Build Coastguard Worker     angle::Result getIndexRange(const gl::Context *context,
193*8975f5c5SAndroid Build Coastguard Worker                                 gl::DrawElementsType type,
194*8975f5c5SAndroid Build Coastguard Worker                                 size_t offset,
195*8975f5c5SAndroid Build Coastguard Worker                                 size_t count,
196*8975f5c5SAndroid Build Coastguard Worker                                 bool primitiveRestartEnabled,
197*8975f5c5SAndroid Build Coastguard Worker                                 gl::IndexRange *outRange) override;
198*8975f5c5SAndroid Build Coastguard Worker 
getSize()199*8975f5c5SAndroid Build Coastguard Worker     GLint64 getSize() const { return mState.getSize(); }
200*8975f5c5SAndroid Build Coastguard Worker 
201*8975f5c5SAndroid Build Coastguard Worker     void onDataChanged() override;
202*8975f5c5SAndroid Build Coastguard Worker 
getBuffer()203*8975f5c5SAndroid Build Coastguard Worker     vk::BufferHelper &getBuffer()
204*8975f5c5SAndroid Build Coastguard Worker     {
205*8975f5c5SAndroid Build Coastguard Worker         ASSERT(isBufferValid());
206*8975f5c5SAndroid Build Coastguard Worker         return mBuffer;
207*8975f5c5SAndroid Build Coastguard Worker     }
208*8975f5c5SAndroid Build Coastguard Worker 
getBufferSerial()209*8975f5c5SAndroid Build Coastguard Worker     vk::BufferSerial getBufferSerial() { return mBuffer.getBufferSerial(); }
210*8975f5c5SAndroid Build Coastguard Worker 
isBufferValid()211*8975f5c5SAndroid Build Coastguard Worker     bool isBufferValid() const { return mBuffer.valid(); }
212*8975f5c5SAndroid Build Coastguard Worker     bool isCurrentlyInUse(vk::Renderer *renderer) const;
213*8975f5c5SAndroid Build Coastguard Worker 
214*8975f5c5SAndroid Build Coastguard Worker     angle::Result mapImpl(ContextVk *contextVk, GLbitfield access, void **mapPtr);
215*8975f5c5SAndroid Build Coastguard Worker     angle::Result mapRangeImpl(ContextVk *contextVk,
216*8975f5c5SAndroid Build Coastguard Worker                                VkDeviceSize offset,
217*8975f5c5SAndroid Build Coastguard Worker                                VkDeviceSize length,
218*8975f5c5SAndroid Build Coastguard Worker                                GLbitfield access,
219*8975f5c5SAndroid Build Coastguard Worker                                void **mapPtr);
220*8975f5c5SAndroid Build Coastguard Worker     angle::Result unmapImpl(ContextVk *contextVk);
221*8975f5c5SAndroid Build Coastguard Worker     angle::Result ghostMappedBuffer(ContextVk *contextVk,
222*8975f5c5SAndroid Build Coastguard Worker                                     VkDeviceSize offset,
223*8975f5c5SAndroid Build Coastguard Worker                                     VkDeviceSize length,
224*8975f5c5SAndroid Build Coastguard Worker                                     GLbitfield access,
225*8975f5c5SAndroid Build Coastguard Worker                                     void **mapPtr);
226*8975f5c5SAndroid Build Coastguard Worker 
227*8975f5c5SAndroid Build Coastguard Worker     VertexConversionBuffer *getVertexConversionBuffer(
228*8975f5c5SAndroid Build Coastguard Worker         vk::Renderer *renderer,
229*8975f5c5SAndroid Build Coastguard Worker         const VertexConversionBuffer::CacheKey &cacheKey);
230*8975f5c5SAndroid Build Coastguard Worker 
231*8975f5c5SAndroid Build Coastguard Worker   private:
232*8975f5c5SAndroid Build Coastguard Worker     angle::Result updateBuffer(ContextVk *contextVk,
233*8975f5c5SAndroid Build Coastguard Worker                                size_t bufferSize,
234*8975f5c5SAndroid Build Coastguard Worker                                const BufferDataSource &dataSource,
235*8975f5c5SAndroid Build Coastguard Worker                                size_t size,
236*8975f5c5SAndroid Build Coastguard Worker                                size_t offset);
237*8975f5c5SAndroid Build Coastguard Worker     angle::Result directUpdate(ContextVk *contextVk,
238*8975f5c5SAndroid Build Coastguard Worker                                const BufferDataSource &dataSource,
239*8975f5c5SAndroid Build Coastguard Worker                                size_t size,
240*8975f5c5SAndroid Build Coastguard Worker                                size_t offset);
241*8975f5c5SAndroid Build Coastguard Worker     angle::Result stagedUpdate(ContextVk *contextVk,
242*8975f5c5SAndroid Build Coastguard Worker                                const BufferDataSource &dataSource,
243*8975f5c5SAndroid Build Coastguard Worker                                size_t size,
244*8975f5c5SAndroid Build Coastguard Worker                                size_t offset);
245*8975f5c5SAndroid Build Coastguard Worker     angle::Result allocStagingBuffer(ContextVk *contextVk,
246*8975f5c5SAndroid Build Coastguard Worker                                      vk::MemoryCoherency coherency,
247*8975f5c5SAndroid Build Coastguard Worker                                      VkDeviceSize size,
248*8975f5c5SAndroid Build Coastguard Worker                                      uint8_t **mapPtr);
249*8975f5c5SAndroid Build Coastguard Worker     angle::Result flushStagingBuffer(ContextVk *contextVk, VkDeviceSize offset, VkDeviceSize size);
250*8975f5c5SAndroid Build Coastguard Worker     angle::Result acquireAndUpdate(ContextVk *contextVk,
251*8975f5c5SAndroid Build Coastguard Worker                                    size_t bufferSize,
252*8975f5c5SAndroid Build Coastguard Worker                                    const BufferDataSource &dataSource,
253*8975f5c5SAndroid Build Coastguard Worker                                    size_t updateSize,
254*8975f5c5SAndroid Build Coastguard Worker                                    size_t updateOffset,
255*8975f5c5SAndroid Build Coastguard Worker                                    BufferUpdateType updateType);
256*8975f5c5SAndroid Build Coastguard Worker     angle::Result setDataWithMemoryType(const gl::Context *context,
257*8975f5c5SAndroid Build Coastguard Worker                                         gl::BufferBinding target,
258*8975f5c5SAndroid Build Coastguard Worker                                         const void *data,
259*8975f5c5SAndroid Build Coastguard Worker                                         size_t size,
260*8975f5c5SAndroid Build Coastguard Worker                                         VkMemoryPropertyFlags memoryPropertyFlags,
261*8975f5c5SAndroid Build Coastguard Worker                                         gl::BufferUsage usage);
262*8975f5c5SAndroid Build Coastguard Worker     angle::Result handleDeviceLocalBufferMap(ContextVk *contextVk,
263*8975f5c5SAndroid Build Coastguard Worker                                              VkDeviceSize offset,
264*8975f5c5SAndroid Build Coastguard Worker                                              VkDeviceSize size,
265*8975f5c5SAndroid Build Coastguard Worker                                              uint8_t **mapPtr);
266*8975f5c5SAndroid Build Coastguard Worker     angle::Result mapHostVisibleBuffer(ContextVk *contextVk,
267*8975f5c5SAndroid Build Coastguard Worker                                        VkDeviceSize offset,
268*8975f5c5SAndroid Build Coastguard Worker                                        GLbitfield access,
269*8975f5c5SAndroid Build Coastguard Worker                                        uint8_t **mapPtr);
270*8975f5c5SAndroid Build Coastguard Worker     angle::Result setDataImpl(ContextVk *contextVk,
271*8975f5c5SAndroid Build Coastguard Worker                               size_t bufferSize,
272*8975f5c5SAndroid Build Coastguard Worker                               const BufferDataSource &dataSource,
273*8975f5c5SAndroid Build Coastguard Worker                               size_t updateSize,
274*8975f5c5SAndroid Build Coastguard Worker                               size_t updateOffset,
275*8975f5c5SAndroid Build Coastguard Worker                               BufferUpdateType updateType);
276*8975f5c5SAndroid Build Coastguard Worker     angle::Result release(ContextVk *context);
277*8975f5c5SAndroid Build Coastguard Worker     void dataUpdated();
278*8975f5c5SAndroid Build Coastguard Worker     void dataRangeUpdated(const RangeDeviceSize &range);
279*8975f5c5SAndroid Build Coastguard Worker 
280*8975f5c5SAndroid Build Coastguard Worker     angle::Result acquireBufferHelper(ContextVk *contextVk,
281*8975f5c5SAndroid Build Coastguard Worker                                       size_t sizeInBytes,
282*8975f5c5SAndroid Build Coastguard Worker                                       BufferUsageType usageType);
283*8975f5c5SAndroid Build Coastguard Worker 
isExternalBuffer()284*8975f5c5SAndroid Build Coastguard Worker     bool isExternalBuffer() const { return mClientBuffer != nullptr; }
285*8975f5c5SAndroid Build Coastguard Worker     BufferUpdateType calculateBufferUpdateTypeOnFullUpdate(
286*8975f5c5SAndroid Build Coastguard Worker         vk::Renderer *renderer,
287*8975f5c5SAndroid Build Coastguard Worker         size_t size,
288*8975f5c5SAndroid Build Coastguard Worker         VkMemoryPropertyFlags memoryPropertyFlags,
289*8975f5c5SAndroid Build Coastguard Worker         BufferUsageType usageType,
290*8975f5c5SAndroid Build Coastguard Worker         const void *data) const;
291*8975f5c5SAndroid Build Coastguard Worker     bool shouldRedefineStorage(vk::Renderer *renderer,
292*8975f5c5SAndroid Build Coastguard Worker                                BufferUsageType usageType,
293*8975f5c5SAndroid Build Coastguard Worker                                VkMemoryPropertyFlags memoryPropertyFlags,
294*8975f5c5SAndroid Build Coastguard Worker                                size_t size) const;
295*8975f5c5SAndroid Build Coastguard Worker 
296*8975f5c5SAndroid Build Coastguard Worker     void releaseConversionBuffers(vk::Renderer *renderer);
297*8975f5c5SAndroid Build Coastguard Worker 
298*8975f5c5SAndroid Build Coastguard Worker     vk::BufferHelper mBuffer;
299*8975f5c5SAndroid Build Coastguard Worker 
300*8975f5c5SAndroid Build Coastguard Worker     // If not null, this is the external memory pointer passed from client API.
301*8975f5c5SAndroid Build Coastguard Worker     void *mClientBuffer;
302*8975f5c5SAndroid Build Coastguard Worker 
303*8975f5c5SAndroid Build Coastguard Worker     uint32_t mMemoryTypeIndex;
304*8975f5c5SAndroid Build Coastguard Worker     // Memory/Usage property that will be used for memory allocation.
305*8975f5c5SAndroid Build Coastguard Worker     VkMemoryPropertyFlags mMemoryPropertyFlags;
306*8975f5c5SAndroid Build Coastguard Worker 
307*8975f5c5SAndroid Build Coastguard Worker     // The staging buffer to aid map operations. This is used when buffers are not host visible or
308*8975f5c5SAndroid Build Coastguard Worker     // for performance optimization when only a smaller range of buffer is mapped.
309*8975f5c5SAndroid Build Coastguard Worker     vk::BufferHelper mStagingBuffer;
310*8975f5c5SAndroid Build Coastguard Worker 
311*8975f5c5SAndroid Build Coastguard Worker     // A cache of converted vertex data.
312*8975f5c5SAndroid Build Coastguard Worker     std::vector<VertexConversionBuffer> mVertexConversionBuffers;
313*8975f5c5SAndroid Build Coastguard Worker 
314*8975f5c5SAndroid Build Coastguard Worker     // Tracks whether mStagingBuffer has been mapped to user or not
315*8975f5c5SAndroid Build Coastguard Worker     bool mIsStagingBufferMapped;
316*8975f5c5SAndroid Build Coastguard Worker 
317*8975f5c5SAndroid Build Coastguard Worker     // Tracks if BufferVk object has valid data or not.
318*8975f5c5SAndroid Build Coastguard Worker     bool mHasValidData;
319*8975f5c5SAndroid Build Coastguard Worker 
320*8975f5c5SAndroid Build Coastguard Worker     // True if the buffer is currently mapped for CPU write access. If the map call is originated
321*8975f5c5SAndroid Build Coastguard Worker     // from OpenGLES API call, then this should be consistent with mState.getAccessFlags() bits.
322*8975f5c5SAndroid Build Coastguard Worker     // Otherwise it is mapped from ANGLE internal and will not be consistent with mState access
323*8975f5c5SAndroid Build Coastguard Worker     // bits, so we have to keep record of it.
324*8975f5c5SAndroid Build Coastguard Worker     bool mIsMappedForWrite;
325*8975f5c5SAndroid Build Coastguard Worker     // True if usage is dynamic. May affect how we allocate memory.
326*8975f5c5SAndroid Build Coastguard Worker     BufferUsageType mUsageType;
327*8975f5c5SAndroid Build Coastguard Worker     // Similar as mIsMappedForWrite, this maybe different from mState's getMapOffset/getMapLength if
328*8975f5c5SAndroid Build Coastguard Worker     // mapped from angle internal.
329*8975f5c5SAndroid Build Coastguard Worker     RangeDeviceSize mMappedRange;
330*8975f5c5SAndroid Build Coastguard Worker };
331*8975f5c5SAndroid Build Coastguard Worker 
332*8975f5c5SAndroid Build Coastguard Worker }  // namespace rx
333*8975f5c5SAndroid Build Coastguard Worker 
334*8975f5c5SAndroid Build Coastguard Worker #endif  // LIBANGLE_RENDERER_VULKAN_BUFFERVK_H_
335