1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-02-20 19:54:19 +01:00

[dxvk] Add support for general memory barriers

Affects all resources with compatible stage and access flags.
This commit is contained in:
Philip Rebohle 2019-01-22 14:16:24 +01:00
parent b1540a16e8
commit 3109ab476a
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
2 changed files with 39 additions and 8 deletions

View File

@ -69,12 +69,25 @@ namespace dxvk {
m_imgSlices.push_back({ image.ptr(), subresources, access });
}
void DxvkBarrierSet::accessMemory(
VkPipelineStageFlags srcStages,
VkAccessFlags srcAccess,
VkPipelineStageFlags dstStages,
VkAccessFlags dstAccess) {
m_srcStages |= srcStages;
m_dstStages |= dstStages;
m_srcAccess |= srcAccess;
m_dstAccess |= dstAccess;
}
bool DxvkBarrierSet::isBufferDirty(
const DxvkBufferSliceHandle& bufSlice,
DxvkAccessFlags bufAccess) {
bool result = false;
bool result = m_srcAccess || m_dstAccess;
for (uint32_t i = 0; i < m_bufSlices.size() && !result; i++) {
const DxvkBufferSliceHandle& dstSlice = m_bufSlices[i].slice;
@ -92,7 +105,8 @@ namespace dxvk {
const Rc<DxvkImage>& image,
const VkImageSubresourceRange& imgSubres,
DxvkAccessFlags imgAccess) {
bool result = false;
bool result = (m_srcStages & image->info().stages)
&& (m_srcAccess & image->info().access);
for (uint32_t i = 0; i < m_imgSlices.size() && !result; i++) {
const VkImageSubresourceRange& dstSubres = m_imgSlices[i].subres;
@ -109,16 +123,26 @@ namespace dxvk {
void DxvkBarrierSet::recordCommands(const Rc<DxvkCommandList>& commandList) {
if ((m_srcStages | m_dstStages) != 0) {
if (m_srcStages | m_dstStages) {
VkPipelineStageFlags srcFlags = m_srcStages;
VkPipelineStageFlags dstFlags = m_dstStages;
if (srcFlags == 0) srcFlags = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
if (dstFlags == 0) dstFlags = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
if (!srcFlags) srcFlags = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
if (!dstFlags) dstFlags = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
VkMemoryBarrier memBarrier;
memBarrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
memBarrier.pNext = nullptr;
memBarrier.srcAccessMask = m_srcAccess;
memBarrier.dstAccessMask = m_dstAccess;
VkMemoryBarrier* pMemBarrier = nullptr;
if (m_srcAccess | m_dstAccess)
pMemBarrier = &memBarrier;
commandList->cmdPipelineBarrier(
srcFlags, dstFlags, 0,
m_memBarriers.size(), m_memBarriers.data(),
pMemBarrier ? 1 : 0, pMemBarrier,
m_bufBarriers.size(), m_bufBarriers.data(),
m_imgBarriers.size(), m_imgBarriers.data());
@ -131,7 +155,6 @@ namespace dxvk {
m_srcStages = 0;
m_dstStages = 0;
m_memBarriers.resize(0);
m_bufBarriers.resize(0);
m_imgBarriers.resize(0);

View File

@ -37,6 +37,12 @@ namespace dxvk {
VkPipelineStageFlags dstStages,
VkAccessFlags dstAccess);
void accessMemory(
VkPipelineStageFlags srcStages,
VkAccessFlags srcAccess,
VkPipelineStageFlags dstStages,
VkAccessFlags dstAccess);
bool isBufferDirty(
const DxvkBufferSliceHandle& bufSlice,
DxvkAccessFlags bufAccess);
@ -66,8 +72,10 @@ namespace dxvk {
VkPipelineStageFlags m_srcStages = 0;
VkPipelineStageFlags m_dstStages = 0;
VkAccessFlags m_srcAccess = 0;
VkAccessFlags m_dstAccess = 0;
std::vector<VkMemoryBarrier> m_memBarriers;
std::vector<VkBufferMemoryBarrier> m_bufBarriers;
std::vector<VkImageMemoryBarrier> m_imgBarriers;