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:
parent
a87ae8aba4
commit
f41a7c7c87
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
*
|
*
|
||||||
|
@ -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,
|
||||||
|
Loading…
Reference in New Issue
Block a user