1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2024-12-03 22:24:13 +01:00

[dxvk] Use DxvkPhysicalBufferSlice for buffer memory barriers

This commit is contained in:
Philip Rebohle 2018-01-18 17:32:34 +01:00
parent a87ae8aba4
commit f41a7c7c87
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
6 changed files with 68 additions and 29 deletions

View File

@ -6,9 +6,7 @@ namespace dxvk {
DxvkBarrierSet::~DxvkBarrierSet() { } DxvkBarrierSet::~DxvkBarrierSet() { }
void DxvkBarrierSet::accessBuffer( void DxvkBarrierSet::accessBuffer(
const Rc<DxvkBuffer>& buffer, const DxvkPhysicalBufferSlice& bufSlice,
VkDeviceSize offset,
VkDeviceSize size,
VkPipelineStageFlags srcStages, VkPipelineStageFlags srcStages,
VkAccessFlags srcAccess, VkAccessFlags srcAccess,
VkPipelineStageFlags dstStages, VkPipelineStageFlags dstStages,
@ -27,9 +25,9 @@ namespace dxvk {
barrier.dstAccessMask = dstAccess; barrier.dstAccessMask = dstAccess;
barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
barrier.buffer = buffer->handle(); barrier.buffer = bufSlice.handle();
barrier.offset = offset; barrier.offset = bufSlice.offset();
barrier.size = size; barrier.size = bufSlice.length();
m_bufBarriers.push_back(barrier); m_bufBarriers.push_back(barrier);
} }
} }

View File

@ -21,9 +21,7 @@ namespace dxvk {
~DxvkBarrierSet(); ~DxvkBarrierSet();
void accessBuffer( void accessBuffer(
const Rc<DxvkBuffer>& buffer, const DxvkPhysicalBufferSlice& bufSlice,
VkDeviceSize offset,
VkDeviceSize size,
VkPipelineStageFlags srcStages, VkPipelineStageFlags srcStages,
VkAccessFlags srcAccess, VkAccessFlags srcAccess,
VkPipelineStageFlags dstStages, VkPipelineStageFlags dstStages,

View File

@ -15,14 +15,13 @@ namespace dxvk {
} }
void DxvkBuffer::renameResource( void DxvkBuffer::renameResource(const DxvkPhysicalBufferSlice& resource) {
const Rc<DxvkPhysicalBuffer>& resource) {
m_resource = resource; m_resource = resource;
} }
Rc<DxvkPhysicalBuffer> DxvkBuffer::allocateResource() { DxvkPhysicalBufferSlice DxvkBuffer::allocateResource() {
return m_device->allocBufferResource(m_info, m_memFlags); return m_device->allocBufferResource(m_info, m_memFlags)->slice(0);
} }

View File

@ -44,7 +44,7 @@ namespace dxvk {
* \returns Buffer handle * \returns Buffer handle
*/ */
VkBuffer handle() const { VkBuffer handle() const {
return m_resource->handle();; return m_resource.handle();
} }
/** /**
@ -57,7 +57,7 @@ namespace dxvk {
* \returns Pointer to mapped memory region * \returns Pointer to mapped memory region
*/ */
void* mapPtr(VkDeviceSize offset) const { void* mapPtr(VkDeviceSize offset) const {
return m_resource->mapPtr(offset); return m_resource.mapPtr(offset);
} }
/** /**
@ -70,7 +70,7 @@ namespace dxvk {
* \returns \c true if the buffer is in use * \returns \c true if the buffer is in use
*/ */
bool isInUse() const { bool isInUse() const {
return m_resource->isInUse(); return m_resource.resource()->isInUse();
} }
/** /**
@ -80,7 +80,7 @@ namespace dxvk {
* \returns The resource object * \returns The resource object
*/ */
Rc<DxvkResource> resource() const { Rc<DxvkResource> resource() const {
return m_resource; return m_resource.resource();
} }
/** /**
@ -93,13 +93,36 @@ namespace dxvk {
* \param [in] resource The new backing resource * \param [in] resource The new backing resource
*/ */
void renameResource( void renameResource(
const Rc<DxvkPhysicalBuffer>& resource); const DxvkPhysicalBufferSlice& resource);
/** /**
* \brief Allocates new backing resource * \brief Allocates new backing resource
* \returns The new buffer * \returns The new buffer
*/ */
Rc<DxvkPhysicalBuffer> allocateResource(); DxvkPhysicalBufferSlice allocateResource();
/**
* \brief Physical buffer slice
*
* Retrieves a slice into the physical
* buffer which backs this buffer.
* \returns The backing slice
*/
DxvkPhysicalBufferSlice slice() const {
return m_resource;
}
/**
* \brief Physical buffer sub slice
*
* Retrieves a sub slice into the backing buffer.
* \param [in] offset Offset into the buffer
* \param [in] length Length of the slice
* \returns The sub slice
*/
DxvkPhysicalBufferSlice subSlice(VkDeviceSize offset, VkDeviceSize length) const {
return m_resource.subSlice(offset, length);
}
private: private:
@ -107,7 +130,7 @@ namespace dxvk {
DxvkBufferCreateInfo m_info; DxvkBufferCreateInfo m_info;
VkMemoryPropertyFlags m_memFlags; VkMemoryPropertyFlags m_memFlags;
Rc<DxvkPhysicalBuffer> m_resource; DxvkPhysicalBufferSlice m_resource;
}; };
@ -154,6 +177,16 @@ namespace dxvk {
return m_buffer; return m_buffer;
} }
/**
* \brief Underlying buffer slice
* \returns Slice backing the view
*/
DxvkPhysicalBufferSlice slice() const {
return m_buffer->subSlice(
m_info.rangeOffset,
m_info.rangeLength);
}
private: private:
Rc<vk::DeviceFn> m_vkd; Rc<vk::DeviceFn> m_vkd;
@ -217,6 +250,10 @@ namespace dxvk {
return m_length; return m_length;
} }
DxvkPhysicalBufferSlice physicalSlice() const {
return m_buffer->subSlice(m_offset, m_length);
}
void* mapPtr(VkDeviceSize offset) const { void* mapPtr(VkDeviceSize offset) const {
return m_buffer->mapPtr(m_offset + offset); return m_buffer->mapPtr(m_offset + offset);
} }

View File

@ -162,6 +162,17 @@ namespace dxvk {
return m_length; return m_length;
} }
/**
* \brief Sub slice into the physical buffer
*
* \param [in] offset Offset, relative to this slice
* \param [in] length Number of bytes of the sub slice
* \returns The sub slice
*/
DxvkPhysicalBufferSlice subSlice(VkDeviceSize offset, VkDeviceSize length) const {
return DxvkPhysicalBufferSlice(m_buffer, m_offset + offset, length);
}
/** /**
* \brief Map pointer * \brief Map pointer
* *

View File

@ -273,14 +273,14 @@ namespace dxvk {
1, &bufferRegion); 1, &bufferRegion);
m_barriers.accessBuffer( m_barriers.accessBuffer(
srcBuffer, srcOffset, numBytes, srcBuffer->subSlice(srcOffset, numBytes),
VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
VK_ACCESS_TRANSFER_READ_BIT, VK_ACCESS_TRANSFER_READ_BIT,
srcBuffer->info().stages, srcBuffer->info().stages,
srcBuffer->info().access); srcBuffer->info().access);
m_barriers.accessBuffer( m_barriers.accessBuffer(
dstBuffer, dstOffset, numBytes, dstBuffer->subSlice(dstOffset, numBytes),
VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
dstBuffer->info().stages, dstBuffer->info().stages,
@ -652,7 +652,7 @@ namespace dxvk {
} }
m_barriers.accessBuffer( m_barriers.accessBuffer(
buffer, offset, size, buffer->subSlice(offset, size),
VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
buffer->info().stages, buffer->info().stages,
@ -1274,9 +1274,7 @@ namespace dxvk {
if (binding.type == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) { if (binding.type == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) {
m_barriers.accessBuffer( m_barriers.accessBuffer(
slot.bufferSlice.buffer(), slot.bufferSlice.physicalSlice(),
slot.bufferSlice.offset(),
slot.bufferSlice.length(),
VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_READ_BIT |
VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_SHADER_WRITE_BIT,
@ -1284,9 +1282,7 @@ namespace dxvk {
slot.bufferSlice.buffer()->info().access); slot.bufferSlice.buffer()->info().access);
} else if (binding.type == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER) { } else if (binding.type == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER) {
m_barriers.accessBuffer( m_barriers.accessBuffer(
slot.bufferView->buffer(), slot.bufferView->slice(),
slot.bufferView->info().rangeOffset,
slot.bufferView->info().rangeLength,
VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_READ_BIT |
VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_SHADER_WRITE_BIT,