mirror of
https://github.com/skyline-emu/skyline.git
synced 2024-11-22 20:29:15 +01:00
Fix Texture Synchronization Bug
Fixes texture corruption due to incorrect synchronization, the barrier would not enforce waiting till the texture was entirely rendered causing an incomplete texture to be downloaded which lead to rendering bugs for certain GPUs including ARM's Mali GPUs.
This commit is contained in:
parent
aea40e6496
commit
98b366c1f5
@ -118,7 +118,7 @@ namespace skyline::gpu {
|
|||||||
void Texture::CopyFromStagingBuffer(const vk::raii::CommandBuffer &commandBuffer, const std::shared_ptr<memory::StagingBuffer> &stagingBuffer) {
|
void Texture::CopyFromStagingBuffer(const vk::raii::CommandBuffer &commandBuffer, const std::shared_ptr<memory::StagingBuffer> &stagingBuffer) {
|
||||||
auto image{GetBacking()};
|
auto image{GetBacking()};
|
||||||
if (layout == vk::ImageLayout::eUndefined)
|
if (layout == vk::ImageLayout::eUndefined)
|
||||||
commandBuffer.pipelineBarrier(vk::PipelineStageFlagBits::eTopOfPipe, vk::PipelineStageFlagBits::eTransfer, {}, {}, {}, vk::ImageMemoryBarrier{
|
commandBuffer.pipelineBarrier(vk::PipelineStageFlagBits::eHost, vk::PipelineStageFlagBits::eTransfer, {}, {}, {}, vk::ImageMemoryBarrier{
|
||||||
.image = image,
|
.image = image,
|
||||||
.srcAccessMask = vk::AccessFlagBits::eMemoryRead,
|
.srcAccessMask = vk::AccessFlagBits::eMemoryRead,
|
||||||
.dstAccessMask = vk::AccessFlagBits::eTransferWrite,
|
.dstAccessMask = vk::AccessFlagBits::eTransferWrite,
|
||||||
@ -157,7 +157,7 @@ namespace skyline::gpu {
|
|||||||
|
|
||||||
void Texture::CopyIntoStagingBuffer(const vk::raii::CommandBuffer &commandBuffer, const std::shared_ptr<memory::StagingBuffer> &stagingBuffer) {
|
void Texture::CopyIntoStagingBuffer(const vk::raii::CommandBuffer &commandBuffer, const std::shared_ptr<memory::StagingBuffer> &stagingBuffer) {
|
||||||
auto image{GetBacking()};
|
auto image{GetBacking()};
|
||||||
commandBuffer.pipelineBarrier(vk::PipelineStageFlagBits::eTopOfPipe, vk::PipelineStageFlagBits::eTransfer, {}, {}, {}, vk::ImageMemoryBarrier{
|
commandBuffer.pipelineBarrier(vk::PipelineStageFlagBits::eBottomOfPipe, vk::PipelineStageFlagBits::eTransfer, {}, {}, {}, vk::ImageMemoryBarrier{
|
||||||
.image = image,
|
.image = image,
|
||||||
.srcAccessMask = vk::AccessFlagBits::eMemoryWrite,
|
.srcAccessMask = vk::AccessFlagBits::eMemoryWrite,
|
||||||
.dstAccessMask = vk::AccessFlagBits::eTransferRead,
|
.dstAccessMask = vk::AccessFlagBits::eTransferRead,
|
||||||
@ -206,7 +206,6 @@ namespace skyline::gpu {
|
|||||||
|
|
||||||
void Texture::CopyToGuest(u8 *hostBuffer) {
|
void Texture::CopyToGuest(u8 *hostBuffer) {
|
||||||
auto guestOutput{guest->mappings[0].data()};
|
auto guestOutput{guest->mappings[0].data()};
|
||||||
auto size{format->GetSize(dimensions)};
|
|
||||||
|
|
||||||
if (guest->tileConfig.mode == texture::TileMode::Block)
|
if (guest->tileConfig.mode == texture::TileMode::Block)
|
||||||
CopyLinearToBlockLinear(*guest, hostBuffer, guestOutput);
|
CopyLinearToBlockLinear(*guest, hostBuffer, guestOutput);
|
||||||
|
Loading…
Reference in New Issue
Block a user