Index: src/gpu/vk/GrVkBuffer.cpp |
diff --git a/src/gpu/vk/GrVkBuffer.cpp b/src/gpu/vk/GrVkBuffer.cpp |
index 1c7c4d0e25358f03631a9a6ed290cadff4ee9c6d..d28a8ccbf1e1cfaf542dd0293a47e13a21ed9ee2 100644 |
--- a/src/gpu/vk/GrVkBuffer.cpp |
+++ b/src/gpu/vk/GrVkBuffer.cpp |
@@ -29,23 +29,26 @@ const GrVkBuffer::Resource* GrVkBuffer::Create(const GrVkGpu* gpu, const Desc& d |
bufInfo.flags = 0; |
bufInfo.size = desc.fSizeInBytes; |
switch (desc.fType) { |
- case kVertex_Type: |
- bufInfo.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT; |
- break; |
- case kIndex_Type: |
- bufInfo.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT; |
- break; |
- case kUniform_Type: |
- bufInfo.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT; |
- break; |
- case kCopyRead_Type: |
- bufInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT; |
- break; |
- case kCopyWrite_Type: |
- bufInfo.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT; |
- break; |
- |
+ case kVertex_Type: |
+ bufInfo.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT; |
+ break; |
+ case kIndex_Type: |
+ bufInfo.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT; |
+ break; |
+ case kUniform_Type: |
+ bufInfo.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT; |
+ break; |
+ case kCopyRead_Type: |
+ bufInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT; |
+ break; |
+ case kCopyWrite_Type: |
+ bufInfo.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT; |
+ break; |
+ } |
+ if (!desc.fDynamic) { |
+ bufInfo.usage |= VK_BUFFER_USAGE_TRANSFER_DST_BIT; |
} |
+ |
bufInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE; |
bufInfo.queueFamilyIndexCount = 0; |
bufInfo.pQueueFamilyIndices = nullptr; |
@@ -59,6 +62,7 @@ const GrVkBuffer::Resource* GrVkBuffer::Create(const GrVkGpu* gpu, const Desc& d |
if (!GrVkMemory::AllocAndBindBufferMemory(gpu, |
buffer, |
desc.fType, |
+ desc.fDynamic, |
&alloc)) { |
return nullptr; |
} |
@@ -120,6 +124,9 @@ void GrVkBuffer::vkAbandon() { |
void* GrVkBuffer::vkMap(const GrVkGpu* gpu) { |
VALIDATE(); |
SkASSERT(!this->vkIsMapped()); |
+ if (!fDesc.fDynamic) { |
+ return nullptr; |
+ } |
if (!fResource->unique()) { |
// in use by the command buffer, so we need to create a new one |
@@ -141,6 +148,7 @@ void* GrVkBuffer::vkMap(const GrVkGpu* gpu) { |
void GrVkBuffer::vkUnmap(const GrVkGpu* gpu) { |
VALIDATE(); |
SkASSERT(this->vkIsMapped()); |
+ SkASSERT(fDesc.fDynamic); |
VK_CALL(gpu, UnmapMemory(gpu->device(), this->alloc().fMemory)); |
@@ -152,7 +160,7 @@ bool GrVkBuffer::vkIsMapped() const { |
return SkToBool(fMapPtr); |
} |
-bool GrVkBuffer::vkUpdateData(const GrVkGpu* gpu, const void* src, size_t srcSizeInBytes, |
+bool GrVkBuffer::vkUpdateData(GrVkGpu* gpu, const void* src, size_t srcSizeInBytes, |
bool* createdNewBuffer) { |
SkASSERT(!this->vkIsMapped()); |
VALIDATE(); |
@@ -160,6 +168,10 @@ bool GrVkBuffer::vkUpdateData(const GrVkGpu* gpu, const void* src, size_t srcSiz |
return false; |
} |
+ if (!fDesc.fDynamic) { |
+ return gpu->updateBuffer(this, src, srcSizeInBytes); |
+ } |
+ |
if (!fResource->unique()) { |
// in use by the command buffer, so we need to create a new one |
fResource->unref(gpu); |