diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index 18138b4b..72a74411 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -1607,6 +1607,44 @@ namespace dxvk { } + void DxvkContext::emitBufferBarrier( + const Rc& resource, + VkPipelineStageFlags srcStages, + VkAccessFlags srcAccess, + VkPipelineStageFlags dstStages, + VkAccessFlags dstAccess) { + this->spillRenderPass(true); + + m_execBarriers.accessBuffer(resource->getSliceHandle(), + srcStages, srcAccess, dstStages, dstAccess); + + m_cmd->trackResource(resource); + } + + + void DxvkContext::emitImageBarrier( + const Rc& resource, + VkImageLayout srcLayout, + VkPipelineStageFlags srcStages, + VkAccessFlags srcAccess, + VkImageLayout dstLayout, + VkPipelineStageFlags dstStages, + VkAccessFlags dstAccess) { + this->spillRenderPass(true); + this->prepareImage(resource, resource->getAvailableSubresources()); + + if (m_execBarriers.isImageDirty(resource, resource->getAvailableSubresources(), DxvkAccess::Write)) + m_execBarriers.recordCommands(m_cmd); + + m_execBarriers.accessImage( + resource, resource->getAvailableSubresources(), + srcLayout, srcStages, srcAccess, + dstLayout, dstStages, dstAccess); + + m_cmd->trackResource(resource); + } + + void DxvkContext::generateMipmaps( const Rc& imageView, VkFilter filter) { diff --git a/src/dxvk/dxvk_context.h b/src/dxvk/dxvk_context.h index 8a2ab090..9c69d4b2 100644 --- a/src/dxvk/dxvk_context.h +++ b/src/dxvk/dxvk_context.h @@ -868,10 +868,50 @@ namespace dxvk { * \param [in] dstAccess Destination access */ void emitGraphicsBarrier( - VkPipelineStageFlags srcStages, - VkAccessFlags srcAccess, - VkPipelineStageFlags dstStages, - VkAccessFlags dstAccess); + VkPipelineStageFlags srcStages, + VkAccessFlags srcAccess, + VkPipelineStageFlags dstStages, + VkAccessFlags dstAccess); + + /** + * \brief Emits buffer barrier + * + * Can be used to transition foreign resources + * into a state that DXVK can work with. + * \param [in] resource Buffer resource + * \param [in] srcStages Source pipeline stages + * \param [in] srcAccess Source access + * \param [in] dstStages Destination pipeline stages + * \param [in] dstAccess Destination access + */ + void emitBufferBarrier( + const Rc& resource, + VkPipelineStageFlags srcStages, + VkAccessFlags srcAccess, + VkPipelineStageFlags dstStages, + VkAccessFlags dstAccess); + + /** + * \brief Emits image barrier + * + * Can be used to transition foreign resources + * into a state that DXVK can work with. + * \param [in] resource Image resource + * \param [in] srcLayout Current image layout + * \param [in] srcStages Source pipeline stages + * \param [in] srcAccess Source access + * \param [in] dstLayout New image layout + * \param [in] dstStages Destination pipeline stages + * \param [in] dstAccess Destination access + */ + void emitImageBarrier( + const Rc& resource, + VkImageLayout srcLayout, + VkPipelineStageFlags srcStages, + VkAccessFlags srcAccess, + VkImageLayout dstLayout, + VkPipelineStageFlags dstStages, + VkAccessFlags dstAccess); /** * \brief Generates mip maps