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

[dxvk] Use new lifetime tracking for resources

This commit is contained in:
Philip Rebohle 2024-10-17 16:14:46 +02:00 committed by Philip Rebohle
parent 8389734e9f
commit cc22ccfc5c
6 changed files with 89 additions and 119 deletions

View File

@ -366,7 +366,6 @@ namespace dxvk {
void DxvkCommandList::reset() { void DxvkCommandList::reset() {
// Free resources and other objects // Free resources and other objects
// that are no longer in use // that are no longer in use
m_resources.reset();
m_objectTracker.clear(); m_objectTracker.clear();
// Less important stuff // Less important stuff

View File

@ -9,7 +9,6 @@
#include "dxvk_gpu_event.h" #include "dxvk_gpu_event.h"
#include "dxvk_gpu_query.h" #include "dxvk_gpu_query.h"
#include "dxvk_graphics.h" #include "dxvk_graphics.h"
#include "dxvk_lifetime.h"
#include "dxvk_limits.h" #include "dxvk_limits.h"
#include "dxvk_pipelayout.h" #include "dxvk_pipelayout.h"
#include "dxvk_presenter.h" #include "dxvk_presenter.h"
@ -247,29 +246,6 @@ namespace dxvk {
*/ */
void next(); void next();
/**
* \brief Adds a resource to track
*
* Adds a resource to the internal resource tracker.
* Resources will be kept alive and "in use" until
* the device can guarantee that the submission has
* completed.
*/
template<DxvkAccess Access, typename T>
void trackResource(Rc<T>&& rc) {
m_resources.trackResource(DxvkLifetime<DxvkResource>(std::move(rc), Access));
}
template<DxvkAccess Access, typename T>
void trackResource(const Rc<T>& rc) {
m_resources.trackResource(DxvkLifetime<DxvkResource>(rc.ptr(), Access));
}
template<DxvkAccess Access, typename T>
void trackResource(T* rc) {
m_resources.trackResource(DxvkLifetime<DxvkResource>(rc, Access));
}
/** /**
* \brief Tracks an object * \brief Tracks an object
* *
@ -331,7 +307,6 @@ namespace dxvk {
* \brief Notifies resources and signals * \brief Notifies resources and signals
*/ */
void notifyObjects() { void notifyObjects() {
m_resources.reset();
m_objectTracker.clear(); m_objectTracker.clear();
m_signalTracker.notify(); m_signalTracker.notify();
} }
@ -1082,8 +1057,6 @@ namespace dxvk {
PresenterSync m_wsiSemaphores = { }; PresenterSync m_wsiSemaphores = { };
DxvkObjectTracker m_objectTracker; DxvkObjectTracker m_objectTracker;
DxvkLifetimeTracker m_resources;
DxvkSignalTracker m_signalTracker; DxvkSignalTracker m_signalTracker;
DxvkStatCounters m_statCounters; DxvkStatCounters m_statCounters;

View File

@ -208,7 +208,7 @@ namespace dxvk {
m_rtLayouts.depth = layout; m_rtLayouts.depth = layout;
} }
m_cmd->trackResource<DxvkAccess::Write>(image); m_cmd->track(image, DxvkAccess::Write);
} }
} }
@ -250,7 +250,7 @@ namespace dxvk {
VK_PIPELINE_STAGE_2_TRANSFER_BIT, VK_PIPELINE_STAGE_2_TRANSFER_BIT,
VK_ACCESS_2_TRANSFER_WRITE_BIT); VK_ACCESS_2_TRANSFER_WRITE_BIT);
m_cmd->trackResource<DxvkAccess::Write>(buffer); m_cmd->track(buffer, DxvkAccess::Write);
} }
@ -305,7 +305,7 @@ namespace dxvk {
accessBuffer(DxvkCmdBuffer::ExecBuffer, *bufferView, accessBuffer(DxvkCmdBuffer::ExecBuffer, *bufferView,
VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT, VK_ACCESS_2_SHADER_WRITE_BIT); VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT, VK_ACCESS_2_SHADER_WRITE_BIT);
m_cmd->trackResource<DxvkAccess::Write>(bufferView->buffer()); m_cmd->track(bufferView->buffer(), DxvkAccess::Write);
} }
@ -432,8 +432,8 @@ namespace dxvk {
VK_PIPELINE_STAGE_2_TRANSFER_BIT, VK_PIPELINE_STAGE_2_TRANSFER_BIT,
VK_ACCESS_2_TRANSFER_WRITE_BIT); VK_ACCESS_2_TRANSFER_WRITE_BIT);
m_cmd->trackResource<DxvkAccess::Write>(dstBuffer); m_cmd->track(dstBuffer, DxvkAccess::Write);
m_cmd->trackResource<DxvkAccess::Read>(srcBuffer); m_cmd->track(srcBuffer, DxvkAccess::Read);
} }
@ -703,7 +703,7 @@ namespace dxvk {
viewInfo.offset = 0; viewInfo.offset = 0;
srcView = tmpBuffer->createView(viewInfo); srcView = tmpBuffer->createView(viewInfo);
m_cmd->trackResource<DxvkAccess::Write>(tmpBuffer); m_cmd->track(tmpBuffer, DxvkAccess::Write);
} }
auto pipeInfo = m_common->metaCopy().getCopyFormattedBufferPipeline(); auto pipeInfo = m_common->metaCopy().getCopyFormattedBufferPipeline();
@ -764,8 +764,8 @@ namespace dxvk {
VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT, VK_ACCESS_2_SHADER_READ_BIT); VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT, VK_ACCESS_2_SHADER_READ_BIT);
// Track all involved resources // Track all involved resources
m_cmd->trackResource<DxvkAccess::Write>(dstBuffer); m_cmd->track(dstBuffer, DxvkAccess::Write);
m_cmd->trackResource<DxvkAccess::Read>(srcBuffer); m_cmd->track(srcBuffer, DxvkAccess::Read);
} }
@ -1004,7 +1004,7 @@ namespace dxvk {
VK_PIPELINE_STAGE_2_TRANSFER_BIT, VK_ACCESS_2_TRANSFER_WRITE_BIT, VK_PIPELINE_STAGE_2_TRANSFER_BIT, VK_ACCESS_2_TRANSFER_WRITE_BIT,
buffer->info().stages, buffer->info().access); buffer->info().stages, buffer->info().access);
m_cmd->trackResource<DxvkAccess::Write>(buffer); m_cmd->track(buffer, DxvkAccess::Write);
} }
@ -1017,7 +1017,7 @@ namespace dxvk {
*image, subresources, initialLayout, *image, subresources, initialLayout,
VK_PIPELINE_STAGE_2_NONE, 0); VK_PIPELINE_STAGE_2_NONE, 0);
m_cmd->trackResource<DxvkAccess::None>(image); m_cmd->track(image, DxvkAccess::None);
} else { } else {
VkImageLayout clearLayout = image->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); VkImageLayout clearLayout = image->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
@ -1078,7 +1078,7 @@ namespace dxvk {
} }
} }
m_cmd->trackResource<DxvkAccess::Read>(zeroBuffer); m_cmd->track(zeroBuffer, DxvkAccess::Read);
} }
} else { } else {
if (subresources.aspectMask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) { if (subresources.aspectMask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) {
@ -1099,7 +1099,7 @@ namespace dxvk {
VK_PIPELINE_STAGE_2_TRANSFER_BIT, VK_PIPELINE_STAGE_2_TRANSFER_BIT,
VK_ACCESS_2_TRANSFER_WRITE_BIT); VK_ACCESS_2_TRANSFER_WRITE_BIT);
m_cmd->trackResource<DxvkAccess::Write>(image); m_cmd->track(image, DxvkAccess::Write);
} }
} }
@ -1149,7 +1149,7 @@ namespace dxvk {
*image, image->getAvailableSubresources(), *image, image->getAvailableSubresources(),
VK_IMAGE_LAYOUT_UNDEFINED, VK_PIPELINE_STAGE_2_NONE, 0); VK_IMAGE_LAYOUT_UNDEFINED, VK_PIPELINE_STAGE_2_NONE, 0);
m_cmd->trackResource<DxvkAccess::Write>(image); m_cmd->track(image, DxvkAccess::Write);
} }
@ -1187,7 +1187,7 @@ namespace dxvk {
*resource, 0, resource->info().size, *resource, 0, resource->info().size,
srcStages, srcAccess, dstStages, dstAccess); srcStages, srcAccess, dstStages, dstAccess);
m_cmd->trackResource<DxvkAccess::Write>(resource); m_cmd->track(resource, DxvkAccess::Write);
} }
@ -1209,7 +1209,7 @@ namespace dxvk {
srcLayout, srcStages, srcAccess, srcLayout, srcStages, srcAccess,
dstLayout, dstStages, dstAccess); dstLayout, dstStages, dstAccess);
m_cmd->trackResource<DxvkAccess::Write>(resource); m_cmd->track(resource, DxvkAccess::Write);
} }
@ -1372,7 +1372,7 @@ namespace dxvk {
VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT); VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT);
} }
m_cmd->trackResource<DxvkAccess::Write>(imageView->image()); m_cmd->track(imageView->image(), DxvkAccess::Write);
m_cmd->track(sampler); m_cmd->track(sampler);
} }
@ -1501,7 +1501,7 @@ namespace dxvk {
oldLayout, image->info().stages, image->info().access, oldLayout, image->info().stages, image->info().access,
newLayout, image->info().stages, image->info().access); newLayout, image->info().stages, image->info().access);
m_cmd->trackResource<DxvkAccess::Write>(image); m_cmd->track(image, DxvkAccess::Write);
return true; return true;
} }
@ -1704,7 +1704,7 @@ namespace dxvk {
srcLayout, dstImage->info().stages, dstImage->info().access, srcLayout, dstImage->info().stages, dstImage->info().access,
dstLayout, dstImage->info().stages, dstImage->info().access); dstLayout, dstImage->info().stages, dstImage->info().access);
m_cmd->trackResource<DxvkAccess::Write>(dstImage); m_cmd->track(dstImage, DxvkAccess::Write);
} }
} }
@ -1860,7 +1860,7 @@ namespace dxvk {
imageView->image()->info().stages, imageView->image()->info().stages,
imageView->image()->info().access); imageView->image()->info().access);
m_cmd->trackResource<DxvkAccess::Write>(imageView->image()); m_cmd->track(imageView->image(), DxvkAccess::Write);
} else { } else {
// Perform the operation when starting the next render pass // Perform the operation when starting the next render pass
if ((clearAspects | discardAspects) & VK_IMAGE_ASPECT_COLOR_BIT) { if ((clearAspects | discardAspects) & VK_IMAGE_ASPECT_COLOR_BIT) {
@ -1997,7 +1997,7 @@ namespace dxvk {
VK_PIPELINE_STAGE_2_TRANSFER_BIT, VK_PIPELINE_STAGE_2_TRANSFER_BIT,
VK_ACCESS_2_TRANSFER_WRITE_BIT); VK_ACCESS_2_TRANSFER_WRITE_BIT);
m_cmd->trackResource<DxvkAccess::Write>(buffer); m_cmd->track(buffer, DxvkAccess::Write);
} }
@ -2038,8 +2038,8 @@ namespace dxvk {
buffer->info().stages, buffer->info().access); buffer->info().stages, buffer->info().access);
} }
m_cmd->trackResource<DxvkAccess::Read>(source); m_cmd->track(source, DxvkAccess::Read);
m_cmd->trackResource<DxvkAccess::Write>(buffer); m_cmd->track(buffer, DxvkAccess::Write);
} }
@ -2366,7 +2366,7 @@ namespace dxvk {
dstPageTable->updateMapping(m_cmd.ptr(), bind.dstPage, std::move(mapping)); dstPageTable->updateMapping(m_cmd.ptr(), bind.dstPage, std::move(mapping));
} }
m_cmd->trackResource<DxvkAccess::Write>(bindInfo.dstResource); m_cmd->track(bindInfo.dstResource, DxvkAccess::Write);
} }
@ -2430,8 +2430,7 @@ namespace dxvk {
*r.first, 0, r.first->info().size, *r.first, 0, r.first->info().size,
VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT, accessFlags); VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT, accessFlags);
if (r.second.test(DxvkAccess::Read)) m_cmd->trackResource<DxvkAccess::Read>(r.first); m_cmd->track(r.first, r.second.test(DxvkAccess::Write) ? DxvkAccess::Write : DxvkAccess::Read);
if (r.second.test(DxvkAccess::Write)) m_cmd->trackResource<DxvkAccess::Write>(r.first);
} }
for (auto& r : images) { for (auto& r : images) {
@ -2441,8 +2440,7 @@ namespace dxvk {
r.first->getAvailableSubresources(), r.first->info().layout, r.first->getAvailableSubresources(), r.first->info().layout,
VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT, accessFlags); VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT, accessFlags);
if (r.second.test(DxvkAccess::Read)) m_cmd->trackResource<DxvkAccess::Read>(r.first); m_cmd->track(r.first, r.second.test(DxvkAccess::Write) ? DxvkAccess::Write : DxvkAccess::Read);
if (r.second.test(DxvkAccess::Write)) m_cmd->trackResource<DxvkAccess::Write>(r.first);
} }
} }
@ -2649,8 +2647,8 @@ namespace dxvk {
VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT,
VK_ACCESS_2_SHADER_READ_BIT); VK_ACCESS_2_SHADER_READ_BIT);
m_cmd->trackResource<DxvkAccess::Write>(dstView->image()); m_cmd->track(dstView->image(), DxvkAccess::Write);
m_cmd->trackResource<DxvkAccess::Read>(srcView->image()); m_cmd->track(srcView->image(), DxvkAccess::Read);
m_cmd->track(sampler); m_cmd->track(sampler);
} }
@ -2703,8 +2701,8 @@ namespace dxvk {
*srcView->image(), srcView->imageSubresources(), srcLayout, *srcView->image(), srcView->imageSubresources(), srcLayout,
VK_PIPELINE_STAGE_2_TRANSFER_BIT, VK_ACCESS_2_TRANSFER_READ_BIT); VK_PIPELINE_STAGE_2_TRANSFER_BIT, VK_ACCESS_2_TRANSFER_READ_BIT);
m_cmd->trackResource<DxvkAccess::Write>(dstView->image()); m_cmd->track(dstView->image(), DxvkAccess::Write);
m_cmd->trackResource<DxvkAccess::Read>(srcView->image()); m_cmd->track(srcView->image(), DxvkAccess::Read);
} }
@ -2851,8 +2849,8 @@ namespace dxvk {
accessBuffer(DxvkCmdBuffer::ExecBuffer, *buffer, bufferOffset, dataSize, accessBuffer(DxvkCmdBuffer::ExecBuffer, *buffer, bufferOffset, dataSize,
VK_PIPELINE_STAGE_2_TRANSFER_BIT, VK_ACCESS_2_TRANSFER_READ_BIT); VK_PIPELINE_STAGE_2_TRANSFER_BIT, VK_ACCESS_2_TRANSFER_READ_BIT);
m_cmd->trackResource<DxvkAccess::Write>(image); m_cmd->track(image, DxvkAccess::Write);
m_cmd->trackResource<DxvkAccess::Read>(buffer); m_cmd->track(buffer, DxvkAccess::Read);
} }
@ -3081,8 +3079,8 @@ namespace dxvk {
VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT,
VK_ACCESS_2_SHADER_READ_BIT); VK_ACCESS_2_SHADER_READ_BIT);
m_cmd->trackResource<DxvkAccess::Write>(image); m_cmd->track(image, DxvkAccess::Write);
m_cmd->trackResource<DxvkAccess::Read>(buffer); m_cmd->track(buffer, DxvkAccess::Read);
} }
@ -3131,8 +3129,8 @@ namespace dxvk {
accessBuffer(DxvkCmdBuffer::ExecBuffer, *buffer, bufferOffset, dataSize, accessBuffer(DxvkCmdBuffer::ExecBuffer, *buffer, bufferOffset, dataSize,
VK_PIPELINE_STAGE_2_TRANSFER_BIT, VK_ACCESS_2_TRANSFER_WRITE_BIT); VK_PIPELINE_STAGE_2_TRANSFER_BIT, VK_ACCESS_2_TRANSFER_WRITE_BIT);
m_cmd->trackResource<DxvkAccess::Write>(buffer); m_cmd->track(buffer, DxvkAccess::Write);
m_cmd->trackResource<DxvkAccess::Read>(image); m_cmd->track(image, DxvkAccess::Read);
} }
@ -3296,8 +3294,8 @@ namespace dxvk {
vk::makeSubresourceRange(imageSubresource), imageLayout, vk::makeSubresourceRange(imageSubresource), imageLayout,
VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT, VK_ACCESS_2_SHADER_READ_BIT); VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT, VK_ACCESS_2_SHADER_READ_BIT);
m_cmd->trackResource<DxvkAccess::Write>(buffer); m_cmd->track(buffer, DxvkAccess::Write);
m_cmd->trackResource<DxvkAccess::Read>(image); m_cmd->track(image, DxvkAccess::Read);
} }
@ -3404,7 +3402,7 @@ namespace dxvk {
*imageView->image(), imageView->imageSubresources(), *imageView->image(), imageView->imageSubresources(),
clearLayout, clearStages, clearAccess); clearLayout, clearStages, clearAccess);
m_cmd->trackResource<DxvkAccess::Write>(imageView->image()); m_cmd->track(imageView->image(), DxvkAccess::Write);
} }
} }
@ -3475,7 +3473,7 @@ namespace dxvk {
VK_IMAGE_LAYOUT_GENERAL, VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT, VK_IMAGE_LAYOUT_GENERAL, VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
VK_ACCESS_2_SHADER_WRITE_BIT); VK_ACCESS_2_SHADER_WRITE_BIT);
m_cmd->trackResource<DxvkAccess::Write>(imageView->image()); m_cmd->track(imageView->image(), DxvkAccess::Write);
} }
@ -3546,8 +3544,8 @@ namespace dxvk {
*srcImage, srcSubresourceRange, srcImageLayout, *srcImage, srcSubresourceRange, srcImageLayout,
VK_PIPELINE_STAGE_2_TRANSFER_BIT, VK_ACCESS_2_TRANSFER_READ_BIT); VK_PIPELINE_STAGE_2_TRANSFER_BIT, VK_ACCESS_2_TRANSFER_READ_BIT);
m_cmd->trackResource<DxvkAccess::Write>(dstImage); m_cmd->track(dstImage, DxvkAccess::Write);
m_cmd->trackResource<DxvkAccess::Read>(srcImage); m_cmd->track(srcImage, DxvkAccess::Read);
} }
@ -3739,8 +3737,8 @@ namespace dxvk {
*dstImage, dstSubresourceRange, *dstImage, dstSubresourceRange,
dstLayout, dstStages, dstAccess); dstLayout, dstStages, dstAccess);
m_cmd->trackResource<DxvkAccess::Write>(dstImage); m_cmd->track(dstImage, DxvkAccess::Write);
m_cmd->trackResource<DxvkAccess::Read>(srcImage); m_cmd->track(srcImage, DxvkAccess::Read);
} }
@ -3887,8 +3885,8 @@ namespace dxvk {
*sparse, 0, sparse->info().size, VK_PIPELINE_STAGE_2_TRANSFER_BIT, *sparse, 0, sparse->info().size, VK_PIPELINE_STAGE_2_TRANSFER_BIT,
ToBuffer ? VK_ACCESS_2_TRANSFER_READ_BIT : VK_ACCESS_2_TRANSFER_WRITE_BIT); ToBuffer ? VK_ACCESS_2_TRANSFER_READ_BIT : VK_ACCESS_2_TRANSFER_WRITE_BIT);
m_cmd->trackResource<ToBuffer ? DxvkAccess::Read : DxvkAccess::Write>(sparse); m_cmd->track(sparse, ToBuffer ? DxvkAccess::Read : DxvkAccess::Write);
m_cmd->trackResource<ToBuffer ? DxvkAccess::Write : DxvkAccess::Read>(buffer); m_cmd->track(buffer, ToBuffer ? DxvkAccess::Write : DxvkAccess::Read);
} }
@ -3965,8 +3963,8 @@ namespace dxvk {
*sparse, sparseSubresources, transferLayout, *sparse, sparseSubresources, transferLayout,
VK_PIPELINE_STAGE_2_TRANSFER_BIT, transferAccess); VK_PIPELINE_STAGE_2_TRANSFER_BIT, transferAccess);
m_cmd->trackResource<ToBuffer ? DxvkAccess::Read : DxvkAccess::Write>(sparse); m_cmd->track(sparse, ToBuffer ? DxvkAccess::Read : DxvkAccess::Write);
m_cmd->trackResource<ToBuffer ? DxvkAccess::Write : DxvkAccess::Read>(buffer); m_cmd->track(buffer, ToBuffer ? DxvkAccess::Write : DxvkAccess::Read);
} }
@ -4019,8 +4017,8 @@ namespace dxvk {
VK_PIPELINE_STAGE_2_TRANSFER_BIT, VK_PIPELINE_STAGE_2_TRANSFER_BIT,
VK_ACCESS_2_TRANSFER_READ_BIT); VK_ACCESS_2_TRANSFER_READ_BIT);
m_cmd->trackResource<DxvkAccess::Write>(dstImage); m_cmd->track(dstImage, DxvkAccess::Write);
m_cmd->trackResource<DxvkAccess::Read>(srcImage); m_cmd->track(srcImage, DxvkAccess::Read);
} }
@ -4108,8 +4106,8 @@ namespace dxvk {
VK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BIT, VK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BIT,
VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT); VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT);
m_cmd->trackResource<DxvkAccess::Write>(dstImage); m_cmd->track(dstImage, DxvkAccess::Write);
m_cmd->trackResource<DxvkAccess::Read>(srcImage); m_cmd->track(srcImage, DxvkAccess::Read);
} }
@ -4309,8 +4307,8 @@ namespace dxvk {
*dstImage, dstSubresourceRange, *dstImage, dstSubresourceRange,
dstLayout, dstStages, dstAccess); dstLayout, dstStages, dstAccess);
m_cmd->trackResource<DxvkAccess::Write>(dstImage); m_cmd->track(dstImage, DxvkAccess::Write);
m_cmd->trackResource<DxvkAccess::Read>(srcImage); m_cmd->track(srcImage, DxvkAccess::Read);
} }
@ -4407,8 +4405,8 @@ namespace dxvk {
VK_PIPELINE_STAGE_2_TRANSFER_BIT, VK_ACCESS_2_TRANSFER_WRITE_BIT); VK_PIPELINE_STAGE_2_TRANSFER_BIT, VK_ACCESS_2_TRANSFER_WRITE_BIT);
} }
m_cmd->trackResource<DxvkAccess::Read>(source); m_cmd->track(source, DxvkAccess::Read);
m_cmd->trackResource<DxvkAccess::Write>(image); m_cmd->track(image, DxvkAccess::Write);
} }
@ -4707,7 +4705,7 @@ namespace dxvk {
} }
for (uint32_t i = 0; i < framebufferInfo.numAttachments(); i++) for (uint32_t i = 0; i < framebufferInfo.numAttachments(); i++)
m_cmd->trackResource<DxvkAccess::Write>(framebufferInfo.getAttachment(i).view->image()); m_cmd->track(framebufferInfo.getAttachment(i).view->image(), DxvkAccess::Write);
m_cmd->addStatCtr(DxvkStatCounter::CmdRenderPassCount, 1); m_cmd->addStatCtr(DxvkStatCounter::CmdRenderPassCount, 1);
} }
@ -4763,7 +4761,7 @@ namespace dxvk {
ctrOffsets[i] = physSlice.offset; ctrOffsets[i] = physSlice.offset;
if (physSlice.handle != VK_NULL_HANDLE) if (physSlice.handle != VK_NULL_HANDLE)
m_cmd->trackResource<DxvkAccess::Read>(m_state.xfb.activeCounters[i].buffer()); m_cmd->track(m_state.xfb.activeCounters[i].buffer(), DxvkAccess::Read);
} }
m_cmd->cmdBeginTransformFeedback( m_cmd->cmdBeginTransformFeedback(
@ -4789,7 +4787,7 @@ namespace dxvk {
ctrOffsets[i] = physSlice.offset; ctrOffsets[i] = physSlice.offset;
if (physSlice.handle != VK_NULL_HANDLE) if (physSlice.handle != VK_NULL_HANDLE)
m_cmd->trackResource<DxvkAccess::Write>(m_state.xfb.activeCounters[i].buffer()); m_cmd->track(m_state.xfb.activeCounters[i].buffer(), DxvkAccess::Write);
m_state.xfb.activeCounters[i] = DxvkBufferSlice(); m_state.xfb.activeCounters[i] = DxvkBufferSlice();
} }
@ -5134,7 +5132,7 @@ namespace dxvk {
descriptorInfo.image.imageLayout = res.imageView->image()->info().layout; descriptorInfo.image.imageLayout = res.imageView->image()->info().layout;
if (m_rcTracked.set(binding.resourceBinding)) if (m_rcTracked.set(binding.resourceBinding))
m_cmd->trackResource<DxvkAccess::Read>(res.imageView->image()); m_cmd->track(res.imageView->image(), DxvkAccess::Read);
} else { } else {
descriptorInfo.image.sampler = VK_NULL_HANDLE; descriptorInfo.image.sampler = VK_NULL_HANDLE;
descriptorInfo.image.imageView = VK_NULL_HANDLE; descriptorInfo.image.imageView = VK_NULL_HANDLE;
@ -5151,7 +5149,7 @@ namespace dxvk {
descriptorInfo.image.imageLayout = res.imageView->image()->info().layout; descriptorInfo.image.imageLayout = res.imageView->image()->info().layout;
if (m_rcTracked.set(binding.resourceBinding)) if (m_rcTracked.set(binding.resourceBinding))
m_cmd->trackResource<DxvkAccess::Write>(res.imageView->image()); m_cmd->track(res.imageView->image(), DxvkAccess::Write);
} else { } else {
descriptorInfo.image.sampler = VK_NULL_HANDLE; descriptorInfo.image.sampler = VK_NULL_HANDLE;
descriptorInfo.image.imageView = VK_NULL_HANDLE; descriptorInfo.image.imageView = VK_NULL_HANDLE;
@ -5170,7 +5168,7 @@ namespace dxvk {
if (m_rcTracked.set(binding.resourceBinding)) { if (m_rcTracked.set(binding.resourceBinding)) {
m_cmd->track(res.sampler); m_cmd->track(res.sampler);
m_cmd->trackResource<DxvkAccess::Read>(res.imageView->image()); m_cmd->track(res.imageView->image(), DxvkAccess::Read);
} }
} else { } else {
descriptorInfo.image.sampler = m_common->dummyResources().samplerHandle(); descriptorInfo.image.sampler = m_common->dummyResources().samplerHandle();
@ -5186,7 +5184,7 @@ namespace dxvk {
descriptorInfo.texelBuffer = res.bufferView->handle(); descriptorInfo.texelBuffer = res.bufferView->handle();
if (m_rcTracked.set(binding.resourceBinding)) if (m_rcTracked.set(binding.resourceBinding))
m_cmd->trackResource<DxvkAccess::Read>(res.bufferView->buffer()); m_cmd->track(res.bufferView->buffer(), DxvkAccess::Read);
} else { } else {
descriptorInfo.texelBuffer = VK_NULL_HANDLE; descriptorInfo.texelBuffer = VK_NULL_HANDLE;
} }
@ -5199,7 +5197,7 @@ namespace dxvk {
descriptorInfo.texelBuffer = res.bufferView->handle(); descriptorInfo.texelBuffer = res.bufferView->handle();
if (m_rcTracked.set(binding.resourceBinding)) if (m_rcTracked.set(binding.resourceBinding))
m_cmd->trackResource<DxvkAccess::Write>(res.bufferView->buffer()); m_cmd->track(res.bufferView->buffer(), DxvkAccess::Write);
} else { } else {
descriptorInfo.texelBuffer = VK_NULL_HANDLE; descriptorInfo.texelBuffer = VK_NULL_HANDLE;
} }
@ -5212,7 +5210,7 @@ namespace dxvk {
descriptorInfo = res.bufferSlice.getDescriptor(); descriptorInfo = res.bufferSlice.getDescriptor();
if (m_rcTracked.set(binding.resourceBinding)) if (m_rcTracked.set(binding.resourceBinding))
m_cmd->trackResource<DxvkAccess::Read>(res.bufferSlice.buffer()); m_cmd->track(res.bufferSlice.buffer(), DxvkAccess::Read);
} else { } else {
descriptorInfo.buffer.buffer = VK_NULL_HANDLE; descriptorInfo.buffer.buffer = VK_NULL_HANDLE;
descriptorInfo.buffer.offset = 0; descriptorInfo.buffer.offset = 0;
@ -5227,7 +5225,7 @@ namespace dxvk {
descriptorInfo = res.bufferSlice.getDescriptor(); descriptorInfo = res.bufferSlice.getDescriptor();
if (m_rcTracked.set(binding.resourceBinding)) if (m_rcTracked.set(binding.resourceBinding))
m_cmd->trackResource<DxvkAccess::Write>(res.bufferSlice.buffer()); m_cmd->track(res.bufferSlice.buffer(), DxvkAccess::Write);
} else { } else {
descriptorInfo.buffer.buffer = VK_NULL_HANDLE; descriptorInfo.buffer.buffer = VK_NULL_HANDLE;
descriptorInfo.buffer.offset = 0; descriptorInfo.buffer.offset = 0;
@ -5365,7 +5363,7 @@ namespace dxvk {
VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT,
VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT); VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT);
m_cmd->trackResource<DxvkAccess::Write>(attachment.view->image()); m_cmd->track(attachment.view->image(), DxvkAccess::Write);
} }
} }
@ -5383,7 +5381,7 @@ namespace dxvk {
? VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT ? VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT
: VK_ACCESS_2_NONE); : VK_ACCESS_2_NONE);
m_cmd->trackResource<DxvkAccess::Write>(attachment.view->image()); m_cmd->track(attachment.view->image(), DxvkAccess::Write);
} }
} }
@ -5512,7 +5510,7 @@ namespace dxvk {
} }
if (m_vbTracked.set(MaxNumVertexBindings)) if (m_vbTracked.set(MaxNumVertexBindings))
m_cmd->trackResource<DxvkAccess::Read>(m_state.vi.indexBuffer.buffer()); m_cmd->track(m_state.vi.indexBuffer.buffer(), DxvkAccess::Read);
return true; return true;
} }
@ -5551,7 +5549,7 @@ namespace dxvk {
} }
if (m_vbTracked.set(binding)) if (m_vbTracked.set(binding))
m_cmd->trackResource<DxvkAccess::Read>(m_state.vi.vertexBuffers[binding].buffer()); m_cmd->track(m_state.vi.vertexBuffers[binding].buffer(), DxvkAccess::Read);
} else { } else {
buffers[i] = VK_NULL_HANDLE; buffers[i] = VK_NULL_HANDLE;
offsets[i] = 0; offsets[i] = 0;
@ -5608,7 +5606,7 @@ namespace dxvk {
const Rc<DxvkBuffer>& buffer = m_state.xfb.buffers[i].buffer(); const Rc<DxvkBuffer>& buffer = m_state.xfb.buffers[i].buffer();
buffer->setXfbVertexStride(gsInfo.xfbStrides[i]); buffer->setXfbVertexStride(gsInfo.xfbStrides[i]);
m_cmd->trackResource<DxvkAccess::Write>(buffer); m_cmd->track(buffer, DxvkAccess::Write);
} }
} }
@ -6172,10 +6170,10 @@ namespace dxvk {
m_flags.clr(DxvkContextFlag::DirtyDrawBuffer); m_flags.clr(DxvkContextFlag::DirtyDrawBuffer);
if (m_state.id.argBuffer.length()) if (m_state.id.argBuffer.length())
m_cmd->trackResource<DxvkAccess::Read>(m_state.id.argBuffer.buffer()); m_cmd->track(m_state.id.argBuffer.buffer(), DxvkAccess::Read);
if (m_state.id.cntBuffer.length()) if (m_state.id.cntBuffer.length())
m_cmd->trackResource<DxvkAccess::Read>(m_state.id.cntBuffer.buffer()); m_cmd->track(m_state.id.cntBuffer.buffer(), DxvkAccess::Read);
} }
} }
@ -6338,7 +6336,7 @@ namespace dxvk {
copy.pRegions = &region; copy.pRegions = &region;
m_cmd->cmdCopyBuffer(DxvkCmdBuffer::ExecBuffer, &copy); m_cmd->cmdCopyBuffer(DxvkCmdBuffer::ExecBuffer, &copy);
m_cmd->trackResource<DxvkAccess::Write>(info.buffer); m_cmd->track(info.buffer, DxvkAccess::Write);
invalidateBuffer(info.buffer, Rc<DxvkResourceAllocation>(info.storage)); invalidateBuffer(info.buffer, Rc<DxvkResourceAllocation>(info.storage));
} }
@ -6393,7 +6391,7 @@ namespace dxvk {
copy.pRegions = imageRegions.data(); copy.pRegions = imageRegions.data();
m_cmd->cmdCopyImage(DxvkCmdBuffer::ExecBuffer, &copy); m_cmd->cmdCopyImage(DxvkCmdBuffer::ExecBuffer, &copy);
m_cmd->trackResource<DxvkAccess::Write>(info.image); m_cmd->track(info.image, DxvkAccess::Write);
// Invalidate image and emit post-copy barrier to use the correct layout // Invalidate image and emit post-copy barrier to use the correct layout
invalidateImageWithUsage(info.image, Rc<DxvkResourceAllocation>(info.storage), info.usageInfo); invalidateImageWithUsage(info.image, Rc<DxvkResourceAllocation>(info.storage), info.usageInfo);

View File

@ -340,11 +340,11 @@ namespace dxvk {
ctx.cmd->cmdDraw(3, 1, 0, 0); ctx.cmd->cmdDraw(3, 1, 0, 0);
// Make sure to keep used resources alive // Make sure to keep used resources alive
ctx.cmd->trackResource<DxvkAccess::Read>(srcView->image()); ctx.cmd->track(srcView->image(), DxvkAccess::Read);
ctx.cmd->trackResource<DxvkAccess::Write>(dstView->image()); ctx.cmd->track(dstView->image(), DxvkAccess::Write);
if (m_gammaImage) if (m_gammaImage)
ctx.cmd->trackResource<DxvkAccess::Read>(m_gammaImage); ctx.cmd->track(m_gammaImage, DxvkAccess::Read);
ctx.cmd->track(m_samplerGamma); ctx.cmd->track(m_samplerGamma);
ctx.cmd->track(m_samplerPresent); ctx.cmd->track(m_samplerPresent);
@ -444,8 +444,8 @@ namespace dxvk {
ctx.cmd->cmdPipelineBarrier(DxvkCmdBuffer::ExecBuffer, &depInfo); ctx.cmd->cmdPipelineBarrier(DxvkCmdBuffer::ExecBuffer, &depInfo);
ctx.cmd->trackResource<DxvkAccess::Read>(buffer); ctx.cmd->track(buffer, DxvkAccess::Read);
ctx.cmd->trackResource<DxvkAccess::Write>(image); ctx.cmd->track(image, DxvkAccess::Write);
} }

View File

@ -373,7 +373,7 @@ namespace dxvk::hud {
drawInfoBuffer, textBufferView, 2u); drawInfoBuffer, textBufferView, 2u);
// Make sure GPU resources are being kept alive as necessary // Make sure GPU resources are being kept alive as necessary
ctx.cmd->trackResource<DxvkAccess::Write>(m_gpuBuffer); ctx.cmd->track(m_gpuBuffer, DxvkAccess::Write);
ctx.cmd->track(m_query); ctx.cmd->track(m_query);
} }
@ -419,7 +419,7 @@ namespace dxvk::hud {
ctx.cmd->cmdDraw(4, 1, 0, 0); ctx.cmd->cmdDraw(4, 1, 0, 0);
ctx.cmd->trackResource<DxvkAccess::Read>(m_gpuBuffer); ctx.cmd->track(m_gpuBuffer, DxvkAccess::Read);
} }
@ -473,7 +473,7 @@ namespace dxvk::hud {
depInfo.pMemoryBarriers = &barrier; depInfo.pMemoryBarriers = &barrier;
ctx.cmd->cmdPipelineBarrier(DxvkCmdBuffer::InitBuffer, &depInfo); ctx.cmd->cmdPipelineBarrier(DxvkCmdBuffer::InitBuffer, &depInfo);
ctx.cmd->trackResource<DxvkAccess::Write>(m_gpuBuffer); ctx.cmd->track(m_gpuBuffer, DxvkAccess::Write);
m_query = m_device->createRawQuery(VK_QUERY_TYPE_TIMESTAMP); m_query = m_device->createRawQuery(VK_QUERY_TYPE_TIMESTAMP);
} }
@ -1176,7 +1176,7 @@ namespace dxvk::hud {
ctx.cmd->cmdDraw(4, m_drawInfos.size(), 0, 0); ctx.cmd->cmdDraw(4, m_drawInfos.size(), 0, 0);
// Track data buffer lifetime // Track data buffer lifetime
ctx.cmd->trackResource<DxvkAccess::Read>(m_dataBuffer); ctx.cmd->track(m_dataBuffer, DxvkAccess::Read);
m_drawInfos.clear(); m_drawInfos.clear();
} }

View File

@ -191,9 +191,9 @@ namespace dxvk::hud {
m_textBufferView->handle(), m_textDraws.size()); m_textBufferView->handle(), m_textDraws.size());
// Ensure all used resources are kept alive // Ensure all used resources are kept alive
ctx.cmd->trackResource<DxvkAccess::Read>(m_textBuffer); ctx.cmd->track(m_textBuffer, DxvkAccess::Read);
ctx.cmd->trackResource<DxvkAccess::Read>(m_fontBuffer); ctx.cmd->track(m_fontBuffer, DxvkAccess::Read);
ctx.cmd->trackResource<DxvkAccess::Read>(m_fontTexture); ctx.cmd->track(m_fontTexture, DxvkAccess::Read);
ctx.cmd->track(m_fontSampler); ctx.cmd->track(m_fontSampler);
// Reset internal text buffers // Reset internal text buffers
@ -482,9 +482,9 @@ namespace dxvk::hud {
ctx.cmd->cmdPipelineBarrier(DxvkCmdBuffer::InitBuffer, &depInfo); ctx.cmd->cmdPipelineBarrier(DxvkCmdBuffer::InitBuffer, &depInfo);
ctx.cmd->trackResource<DxvkAccess::Read>(uploadBuffer); ctx.cmd->track(uploadBuffer, DxvkAccess::Read);
ctx.cmd->trackResource<DxvkAccess::Write>(m_fontBuffer); ctx.cmd->track(m_fontBuffer, DxvkAccess::Write);
ctx.cmd->trackResource<DxvkAccess::Write>(m_fontTexture); ctx.cmd->track(m_fontTexture, DxvkAccess::Write);
} }