diff options
author | 2016-07-07 11:18:46 -0700 | |
---|---|---|
committer | 2016-07-07 11:18:46 -0700 | |
commit | db37909347d034943bd6b0922710a94c6c6ea572 (patch) | |
tree | 8e7157e5211065985fa9cbf1cf048ac69755b447 /src/gpu/vk | |
parent | a7f29640f6ab4eb50962a9d9f12d01ac2ce8b471 (diff) |
Add offsets to GrVkBuffer.
BUG=skia:5031
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2127183002
Review-Url: https://codereview.chromium.org/2127183002
Diffstat (limited to 'src/gpu/vk')
-rw-r--r-- | src/gpu/vk/GrVkBuffer.cpp | 13 | ||||
-rw-r--r-- | src/gpu/vk/GrVkBuffer.h | 10 | ||||
-rw-r--r-- | src/gpu/vk/GrVkCommandBuffer.h | 4 | ||||
-rw-r--r-- | src/gpu/vk/GrVkGpu.cpp | 9 | ||||
-rw-r--r-- | src/gpu/vk/GrVkGpu.h | 2 | ||||
-rw-r--r-- | src/gpu/vk/GrVkPipelineState.cpp | 4 |
6 files changed, 24 insertions, 18 deletions
diff --git a/src/gpu/vk/GrVkBuffer.cpp b/src/gpu/vk/GrVkBuffer.cpp index 85d6de8b01..3b9cbc735c 100644 --- a/src/gpu/vk/GrVkBuffer.cpp +++ b/src/gpu/vk/GrVkBuffer.cpp @@ -132,8 +132,9 @@ void* GrVkBuffer::vkMap(const GrVkGpu* gpu) { if (fDesc.fDynamic) { const GrVkAlloc& alloc = this->alloc(); - VkResult err = VK_CALL(gpu, MapMemory(gpu->device(), alloc.fMemory, alloc.fOffset, - VK_WHOLE_SIZE, 0, &fMapPtr)); + VkResult err = VK_CALL(gpu, MapMemory(gpu->device(), alloc.fMemory, + alloc.fOffset + fOffset, + fDesc.fSizeInBytes, 0, &fMapPtr)); if (err) { fMapPtr = nullptr; } @@ -152,7 +153,7 @@ void GrVkBuffer::vkUnmap(GrVkGpu* gpu) { if (fDesc.fDynamic) { VK_CALL(gpu, UnmapMemory(gpu->device(), this->alloc().fMemory)); } else { - gpu->updateBuffer(this, fMapPtr, this->size()); + gpu->updateBuffer(this, fMapPtr, this->offset(), this->size()); delete [] (unsigned char*)fMapPtr; } @@ -172,8 +173,9 @@ bool GrVkBuffer::vkUpdateData(GrVkGpu* gpu, const void* src, size_t srcSizeInByt return false; } + // TODO: update data based on buffer offset if (!fDesc.fDynamic) { - return gpu->updateBuffer(this, src, srcSizeInBytes); + return gpu->updateBuffer(this, src, fOffset, srcSizeInBytes); } if (!fResource->unique()) { @@ -187,7 +189,8 @@ bool GrVkBuffer::vkUpdateData(GrVkGpu* gpu, const void* src, size_t srcSizeInByt void* mapPtr; const GrVkAlloc& alloc = this->alloc(); - VkResult err = VK_CALL(gpu, MapMemory(gpu->device(), alloc.fMemory, alloc.fOffset, + VkResult err = VK_CALL(gpu, MapMemory(gpu->device(), alloc.fMemory, + alloc.fOffset + fOffset, srcSizeInBytes, 0, &mapPtr)); if (VK_SUCCESS != err) { diff --git a/src/gpu/vk/GrVkBuffer.h b/src/gpu/vk/GrVkBuffer.h index 3ea9b86929..966b8102e5 100644 --- a/src/gpu/vk/GrVkBuffer.h +++ b/src/gpu/vk/GrVkBuffer.h @@ -25,10 +25,11 @@ public: SkASSERT(!fResource); } - VkBuffer buffer() const { return fResource->fBuffer; } - const GrVkAlloc& alloc() const { return fResource->fAlloc; } + VkBuffer buffer() const { return fResource->fBuffer; } + const GrVkAlloc& alloc() const { return fResource->fAlloc; } const GrVkResource* resource() const { return fResource; } - size_t size() const { return fDesc.fSizeInBytes; } + size_t size() const { return fDesc.fSizeInBytes; } + VkDeviceSize offset() const { return fOffset; } void addMemoryBarrier(const GrVkGpu* gpu, VkAccessFlags srcAccessMask, @@ -77,7 +78,7 @@ protected: const Desc& descriptor); GrVkBuffer(const Desc& desc, const GrVkBuffer::Resource* resource) - : fDesc(desc), fResource(resource), fMapPtr(nullptr) { + : fDesc(desc), fResource(resource), fOffset(0), fMapPtr(nullptr) { } void* vkMap(const GrVkGpu* gpu); @@ -96,6 +97,7 @@ private: Desc fDesc; const Resource* fResource; + VkDeviceSize fOffset; void* fMapPtr; typedef SkNoncopyable INHERITED; diff --git a/src/gpu/vk/GrVkCommandBuffer.h b/src/gpu/vk/GrVkCommandBuffer.h index 525ea776bb..c8bac336d5 100644 --- a/src/gpu/vk/GrVkCommandBuffer.h +++ b/src/gpu/vk/GrVkCommandBuffer.h @@ -42,7 +42,7 @@ public: void bindVertexBuffer(GrVkGpu* gpu, GrVkVertexBuffer* vbuffer) { VkBuffer vkBuffer = vbuffer->buffer(); if (!fBoundVertexBufferIsValid || vkBuffer != fBoundVertexBuffer) { - VkDeviceSize offset = 0; + VkDeviceSize offset = vbuffer->offset(); GR_VK_CALL(gpu->vkInterface(), CmdBindVertexBuffers(fCmdBuffer, 0, 1, @@ -59,7 +59,7 @@ public: if (!fBoundIndexBufferIsValid || vkBuffer != fBoundIndexBuffer) { GR_VK_CALL(gpu->vkInterface(), CmdBindIndexBuffer(fCmdBuffer, vkBuffer, - 0, + ibuffer->offset(), VK_INDEX_TYPE_UINT16)); fBoundIndexBufferIsValid = true; fBoundIndexBuffer = vkBuffer; diff --git a/src/gpu/vk/GrVkGpu.cpp b/src/gpu/vk/GrVkGpu.cpp index fdec861076..fcbe6eeb58 100644 --- a/src/gpu/vk/GrVkGpu.cpp +++ b/src/gpu/vk/GrVkGpu.cpp @@ -533,7 +533,7 @@ bool GrVkGpu::uploadTexDataOptimal(GrVkTexture* tex, VkBufferImageCopy& region = regions.push_back(); memset(®ion, 0, sizeof(VkBufferImageCopy)); - region.bufferOffset = individualMipOffsets[currentMipLevel]; + region.bufferOffset = transferBuffer->offset() + individualMipOffsets[currentMipLevel]; region.bufferRowLength = currentWidth; region.bufferImageHeight = currentHeight; region.imageSubresource = { VK_IMAGE_ASPECT_COLOR_BIT, SkToU32(currentMipLevel), 0, 1 }; @@ -670,10 +670,11 @@ GrTexture* GrVkGpu::onCreateTexture(const GrSurfaceDesc& desc, SkBudgeted budget //////////////////////////////////////////////////////////////////////////////// -bool GrVkGpu::updateBuffer(GrVkBuffer* buffer, const void* src, size_t srcSizeInBytes) { +bool GrVkGpu::updateBuffer(GrVkBuffer* buffer, const void* src, + VkDeviceSize offset, VkDeviceSize size) { // Update the buffer - fCurrentCmdBuffer->updateBuffer(this, buffer, 0, srcSizeInBytes, src); + fCurrentCmdBuffer->updateBuffer(this, buffer, offset, size, src); return true; } @@ -1445,7 +1446,7 @@ bool GrVkGpu::onReadPixels(GrSurface* surface, // Copy the image to a buffer so we can map it to cpu memory VkBufferImageCopy region; memset(®ion, 0, sizeof(VkBufferImageCopy)); - region.bufferOffset = 0; + region.bufferOffset = transferBuffer->offset(); region.bufferRowLength = 0; // Forces RowLength to be width. We handle the rowBytes below. region.bufferImageHeight = 0; // Forces height to be tightly packed. Only useful for 3d images. region.imageSubresource = { VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1 }; diff --git a/src/gpu/vk/GrVkGpu.h b/src/gpu/vk/GrVkGpu.h index 29a3acad45..a0530f46a4 100644 --- a/src/gpu/vk/GrVkGpu.h +++ b/src/gpu/vk/GrVkGpu.h @@ -138,7 +138,7 @@ public: void generateMipmap(GrVkTexture* tex) const; - bool updateBuffer(GrVkBuffer* buffer, const void* src, size_t srcSizeInBytes); + bool updateBuffer(GrVkBuffer* buffer, const void* src, VkDeviceSize offset, VkDeviceSize size); // Heaps enum Heap { diff --git a/src/gpu/vk/GrVkPipelineState.cpp b/src/gpu/vk/GrVkPipelineState.cpp index 10a1ac9204..94d6305bc9 100644 --- a/src/gpu/vk/GrVkPipelineState.cpp +++ b/src/gpu/vk/GrVkPipelineState.cpp @@ -238,7 +238,7 @@ void GrVkPipelineState::writeUniformBuffers(const GrVkGpu* gpu) { ++uniformBindingUpdateCount; memset(&vertBufferInfo, 0, sizeof(VkDescriptorBufferInfo)); vertBufferInfo.buffer = fVertexUniformBuffer->buffer(); - vertBufferInfo.offset = 0; + vertBufferInfo.offset = fVertexUniformBuffer->offset(); vertBufferInfo.range = fVertexUniformBuffer->size(); descriptorWrites[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; @@ -262,7 +262,7 @@ void GrVkPipelineState::writeUniformBuffers(const GrVkGpu* gpu) { ++uniformBindingUpdateCount; memset(&fragBufferInfo, 0, sizeof(VkDescriptorBufferInfo)); fragBufferInfo.buffer = fFragmentUniformBuffer->buffer(); - fragBufferInfo.offset = 0; + fragBufferInfo.offset = fFragmentUniformBuffer->offset(); fragBufferInfo.range = fFragmentUniformBuffer->size(); descriptorWrites[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; |