mirror of
https://github.com/EduApps-CDG/OpenDX
synced 2024-12-30 09:45:37 +01:00
[dxvk] Add support for general memory barriers
Affects all resources with compatible stage and access flags.
This commit is contained in:
parent
b1540a16e8
commit
3109ab476a
src/dxvk
@ -69,12 +69,25 @@ namespace dxvk {
|
|||||||
|
|
||||||
m_imgSlices.push_back({ image.ptr(), subresources, access });
|
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(
|
bool DxvkBarrierSet::isBufferDirty(
|
||||||
const DxvkBufferSliceHandle& bufSlice,
|
const DxvkBufferSliceHandle& bufSlice,
|
||||||
DxvkAccessFlags bufAccess) {
|
DxvkAccessFlags bufAccess) {
|
||||||
bool result = false;
|
bool result = m_srcAccess || m_dstAccess;
|
||||||
|
|
||||||
for (uint32_t i = 0; i < m_bufSlices.size() && !result; i++) {
|
for (uint32_t i = 0; i < m_bufSlices.size() && !result; i++) {
|
||||||
const DxvkBufferSliceHandle& dstSlice = m_bufSlices[i].slice;
|
const DxvkBufferSliceHandle& dstSlice = m_bufSlices[i].slice;
|
||||||
@ -92,7 +105,8 @@ namespace dxvk {
|
|||||||
const Rc<DxvkImage>& image,
|
const Rc<DxvkImage>& image,
|
||||||
const VkImageSubresourceRange& imgSubres,
|
const VkImageSubresourceRange& imgSubres,
|
||||||
DxvkAccessFlags imgAccess) {
|
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++) {
|
for (uint32_t i = 0; i < m_imgSlices.size() && !result; i++) {
|
||||||
const VkImageSubresourceRange& dstSubres = m_imgSlices[i].subres;
|
const VkImageSubresourceRange& dstSubres = m_imgSlices[i].subres;
|
||||||
@ -109,16 +123,26 @@ namespace dxvk {
|
|||||||
|
|
||||||
|
|
||||||
void DxvkBarrierSet::recordCommands(const Rc<DxvkCommandList>& commandList) {
|
void DxvkBarrierSet::recordCommands(const Rc<DxvkCommandList>& commandList) {
|
||||||
if ((m_srcStages | m_dstStages) != 0) {
|
if (m_srcStages | m_dstStages) {
|
||||||
VkPipelineStageFlags srcFlags = m_srcStages;
|
VkPipelineStageFlags srcFlags = m_srcStages;
|
||||||
VkPipelineStageFlags dstFlags = m_dstStages;
|
VkPipelineStageFlags dstFlags = m_dstStages;
|
||||||
|
|
||||||
if (srcFlags == 0) srcFlags = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
|
if (!srcFlags) srcFlags = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
|
||||||
if (dstFlags == 0) dstFlags = VK_PIPELINE_STAGE_BOTTOM_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(
|
commandList->cmdPipelineBarrier(
|
||||||
srcFlags, dstFlags, 0,
|
srcFlags, dstFlags, 0,
|
||||||
m_memBarriers.size(), m_memBarriers.data(),
|
pMemBarrier ? 1 : 0, pMemBarrier,
|
||||||
m_bufBarriers.size(), m_bufBarriers.data(),
|
m_bufBarriers.size(), m_bufBarriers.data(),
|
||||||
m_imgBarriers.size(), m_imgBarriers.data());
|
m_imgBarriers.size(), m_imgBarriers.data());
|
||||||
|
|
||||||
@ -131,7 +155,6 @@ namespace dxvk {
|
|||||||
m_srcStages = 0;
|
m_srcStages = 0;
|
||||||
m_dstStages = 0;
|
m_dstStages = 0;
|
||||||
|
|
||||||
m_memBarriers.resize(0);
|
|
||||||
m_bufBarriers.resize(0);
|
m_bufBarriers.resize(0);
|
||||||
m_imgBarriers.resize(0);
|
m_imgBarriers.resize(0);
|
||||||
|
|
||||||
|
@ -37,6 +37,12 @@ namespace dxvk {
|
|||||||
VkPipelineStageFlags dstStages,
|
VkPipelineStageFlags dstStages,
|
||||||
VkAccessFlags dstAccess);
|
VkAccessFlags dstAccess);
|
||||||
|
|
||||||
|
void accessMemory(
|
||||||
|
VkPipelineStageFlags srcStages,
|
||||||
|
VkAccessFlags srcAccess,
|
||||||
|
VkPipelineStageFlags dstStages,
|
||||||
|
VkAccessFlags dstAccess);
|
||||||
|
|
||||||
bool isBufferDirty(
|
bool isBufferDirty(
|
||||||
const DxvkBufferSliceHandle& bufSlice,
|
const DxvkBufferSliceHandle& bufSlice,
|
||||||
DxvkAccessFlags bufAccess);
|
DxvkAccessFlags bufAccess);
|
||||||
@ -66,8 +72,10 @@ namespace dxvk {
|
|||||||
|
|
||||||
VkPipelineStageFlags m_srcStages = 0;
|
VkPipelineStageFlags m_srcStages = 0;
|
||||||
VkPipelineStageFlags m_dstStages = 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<VkBufferMemoryBarrier> m_bufBarriers;
|
||||||
std::vector<VkImageMemoryBarrier> m_imgBarriers;
|
std::vector<VkImageMemoryBarrier> m_imgBarriers;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user