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