aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/vk
diff options
context:
space:
mode:
authorGravatar jvanverth <jvanverth@google.com>2016-07-07 11:18:46 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2016-07-07 11:18:46 -0700
commitdb37909347d034943bd6b0922710a94c6c6ea572 (patch)
tree8e7157e5211065985fa9cbf1cf048ac69755b447 /src/gpu/vk
parenta7f29640f6ab4eb50962a9d9f12d01ac2ce8b471 (diff)
Add offsets to GrVkBuffer.
Diffstat (limited to 'src/gpu/vk')
-rw-r--r--src/gpu/vk/GrVkBuffer.cpp13
-rw-r--r--src/gpu/vk/GrVkBuffer.h10
-rw-r--r--src/gpu/vk/GrVkCommandBuffer.h4
-rw-r--r--src/gpu/vk/GrVkGpu.cpp9
-rw-r--r--src/gpu/vk/GrVkGpu.h2
-rw-r--r--src/gpu/vk/GrVkPipelineState.cpp4
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(&region, 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(&region, 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;