Merge pull request #21 from libcg/stadium2

[dxvk] fix missing renderPassEnd calls
This commit is contained in:
Philip Rebohle 2018-01-21 09:03:50 +01:00 committed by GitHub
commit 45108a8724
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 74 additions and 68 deletions

View File

@ -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());
} }