mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-03-02 04:29:14 +01:00
[dxvk] fix missing renderPassEnd calls
vkCmdBlitImage and vkCmdResolveImage need to be called outside a render pass. flatten logic. this fixes mipmap generation with Trackmania.
This commit is contained in:
parent
952ac5d5f9
commit
f88a1d5dce
@ -259,39 +259,40 @@ namespace dxvk {
|
|||||||
const Rc<DxvkBuffer>& srcBuffer,
|
const Rc<DxvkBuffer>& srcBuffer,
|
||||||
VkDeviceSize srcOffset,
|
VkDeviceSize srcOffset,
|
||||||
VkDeviceSize numBytes) {
|
VkDeviceSize numBytes) {
|
||||||
if (numBytes != 0) {
|
if (numBytes == 0)
|
||||||
this->renderPassEnd();
|
return;
|
||||||
|
|
||||||
auto dstSlice = dstBuffer->subSlice(dstOffset, numBytes);
|
this->renderPassEnd();
|
||||||
auto srcSlice = srcBuffer->subSlice(srcOffset, numBytes);
|
|
||||||
|
auto dstSlice = dstBuffer->subSlice(dstOffset, numBytes);
|
||||||
VkBufferCopy bufferRegion;
|
auto srcSlice = srcBuffer->subSlice(srcOffset, numBytes);
|
||||||
bufferRegion.srcOffset = srcSlice.offset();
|
|
||||||
bufferRegion.dstOffset = dstSlice.offset();
|
VkBufferCopy bufferRegion;
|
||||||
bufferRegion.size = dstSlice.length();
|
bufferRegion.srcOffset = srcSlice.offset();
|
||||||
|
bufferRegion.dstOffset = dstSlice.offset();
|
||||||
m_cmd->cmdCopyBuffer(
|
bufferRegion.size = dstSlice.length();
|
||||||
srcSlice.handle(),
|
|
||||||
dstSlice.handle(),
|
m_cmd->cmdCopyBuffer(
|
||||||
1, &bufferRegion);
|
srcSlice.handle(),
|
||||||
|
dstSlice.handle(),
|
||||||
m_barriers.accessBuffer(srcSlice,
|
1, &bufferRegion);
|
||||||
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
|
||||||
VK_ACCESS_TRANSFER_READ_BIT,
|
m_barriers.accessBuffer(srcSlice,
|
||||||
srcBuffer->info().stages,
|
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||||
srcBuffer->info().access);
|
VK_ACCESS_TRANSFER_READ_BIT,
|
||||||
|
srcBuffer->info().stages,
|
||||||
m_barriers.accessBuffer(dstSlice,
|
srcBuffer->info().access);
|
||||||
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
|
||||||
VK_ACCESS_TRANSFER_WRITE_BIT,
|
m_barriers.accessBuffer(dstSlice,
|
||||||
dstBuffer->info().stages,
|
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||||
dstBuffer->info().access);
|
VK_ACCESS_TRANSFER_WRITE_BIT,
|
||||||
|
dstBuffer->info().stages,
|
||||||
m_barriers.recordCommands(m_cmd);
|
dstBuffer->info().access);
|
||||||
|
|
||||||
m_cmd->trackResource(dstBuffer->resource());
|
m_barriers.recordCommands(m_cmd);
|
||||||
m_cmd->trackResource(srcBuffer->resource());
|
|
||||||
}
|
m_cmd->trackResource(dstBuffer->resource());
|
||||||
|
m_cmd->trackResource(srcBuffer->resource());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -616,6 +617,8 @@ namespace dxvk {
|
|||||||
if (subresources.levelCount <= 1)
|
if (subresources.levelCount <= 1)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
this->renderPassEnd();
|
||||||
|
|
||||||
// The top-most level will only be read. We can
|
// The top-most level will only be read. We can
|
||||||
// discard the contents of all the lower levels
|
// discard the contents of all the lower levels
|
||||||
// since we're going to override them anyway.
|
// since we're going to override them anyway.
|
||||||
@ -757,6 +760,8 @@ namespace dxvk {
|
|||||||
const VkImageSubresourceLayers& dstSubresources,
|
const VkImageSubresourceLayers& dstSubresources,
|
||||||
const Rc<DxvkImage>& srcImage,
|
const Rc<DxvkImage>& srcImage,
|
||||||
const VkImageSubresourceLayers& srcSubresources) {
|
const VkImageSubresourceLayers& srcSubresources) {
|
||||||
|
this->renderPassEnd();
|
||||||
|
|
||||||
VkImageSubresourceRange dstSubresourceRange = {
|
VkImageSubresourceRange dstSubresourceRange = {
|
||||||
dstSubresources.aspectMask,
|
dstSubresources.aspectMask,
|
||||||
dstSubresources.mipLevel, 1,
|
dstSubresources.mipLevel, 1,
|
||||||
@ -828,43 +833,44 @@ namespace dxvk {
|
|||||||
VkDeviceSize offset,
|
VkDeviceSize offset,
|
||||||
VkDeviceSize size,
|
VkDeviceSize size,
|
||||||
const void* data) {
|
const void* data) {
|
||||||
|
if (size == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
this->renderPassEnd();
|
this->renderPassEnd();
|
||||||
|
|
||||||
if (size != 0) {
|
auto physicalSlice = buffer->subSlice(offset, size);
|
||||||
auto physicalSlice = buffer->subSlice(offset, size);
|
|
||||||
|
// Vulkan specifies that small amounts of data (up to 64kB) can
|
||||||
// Vulkan specifies that small amounts of data (up to 64kB) can
|
// be copied to a buffer directly if the size is a multiple of
|
||||||
// be copied to a buffer directly if the size is a multiple of
|
// four. Anything else must be copied through a staging buffer.
|
||||||
// four. Anything else must be copied through a staging buffer.
|
// We'll limit the size to 4kB in order to keep command buffers
|
||||||
// We'll limit the size to 4kB in order to keep command buffers
|
// reasonably small, we do not know how much data apps may upload.
|
||||||
// reasonably small, we do not know how much data apps may upload.
|
if ((size <= 4096) && ((size & 0x3) == 0) && ((offset & 0x3) == 0)) {
|
||||||
if ((size <= 4096) && ((size & 0x3) == 0) && ((offset & 0x3) == 0)) {
|
m_cmd->cmdUpdateBuffer(
|
||||||
m_cmd->cmdUpdateBuffer(
|
physicalSlice.handle(),
|
||||||
physicalSlice.handle(),
|
physicalSlice.offset(),
|
||||||
physicalSlice.offset(),
|
physicalSlice.length(),
|
||||||
physicalSlice.length(),
|
data);
|
||||||
data);
|
} else {
|
||||||
} else {
|
auto slice = m_cmd->stagedAlloc(size);
|
||||||
auto slice = m_cmd->stagedAlloc(size);
|
std::memcpy(slice.mapPtr, data, size);
|
||||||
std::memcpy(slice.mapPtr, data, size);
|
|
||||||
|
m_cmd->stagedBufferCopy(
|
||||||
m_cmd->stagedBufferCopy(
|
physicalSlice.handle(),
|
||||||
physicalSlice.handle(),
|
physicalSlice.offset(),
|
||||||
physicalSlice.offset(),
|
physicalSlice.length(),
|
||||||
physicalSlice.length(),
|
slice);
|
||||||
slice);
|
|
||||||
}
|
|
||||||
|
|
||||||
m_barriers.accessBuffer(
|
|
||||||
physicalSlice,
|
|
||||||
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
|
||||||
VK_ACCESS_TRANSFER_WRITE_BIT,
|
|
||||||
buffer->info().stages,
|
|
||||||
buffer->info().access);
|
|
||||||
m_barriers.recordCommands(m_cmd);
|
|
||||||
|
|
||||||
m_cmd->trackResource(buffer->resource());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_barriers.accessBuffer(
|
||||||
|
physicalSlice,
|
||||||
|
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||||
|
VK_ACCESS_TRANSFER_WRITE_BIT,
|
||||||
|
buffer->info().stages,
|
||||||
|
buffer->info().access);
|
||||||
|
m_barriers.recordCommands(m_cmd);
|
||||||
|
|
||||||
|
m_cmd->trackResource(buffer->resource());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user