mirror of
https://github.com/skyline-emu/skyline.git
synced 2024-12-29 14:05:29 +03:00
Fix Mapping Caching For Maxwell 3D Buffers
Code involving caching of mappings was copied from `RenderTarget` without much consideration for applicability in buffers, the reason for caching mappings in RTs was that the view may be invalidated by more than the IOVA/Size being changed but this doesn't hold true for buffers generally so invalidation can only be on the view level with the mappings being looked up every time since the invalidation would likely change them.
This commit is contained in:
parent
ff27dce24c
commit
e48a7d7009
@ -543,10 +543,8 @@ namespace skyline::gpu::interconnect {
|
|||||||
else if (constantBufferSelector.view)
|
else if (constantBufferSelector.view)
|
||||||
return &*constantBufferSelector.view;
|
return &*constantBufferSelector.view;
|
||||||
|
|
||||||
if (constantBufferSelector.guest.mappings.empty()) {
|
auto mappings{channelCtx.asCtx->gmmu.TranslateRange(constantBufferSelector.iova, constantBufferSelector.size)};
|
||||||
auto mappings{channelCtx.asCtx->gmmu.TranslateRange(constantBufferSelector.iova, constantBufferSelector.size)};
|
constantBufferSelector.guest.mappings.assign(mappings.begin(), mappings.end());
|
||||||
constantBufferSelector.guest.mappings.assign(mappings.begin(), mappings.end());
|
|
||||||
}
|
|
||||||
|
|
||||||
constantBufferSelector.view = gpu.buffer.FindOrCreate(constantBufferSelector.guest);
|
constantBufferSelector.view = gpu.buffer.FindOrCreate(constantBufferSelector.guest);
|
||||||
return constantBufferSelector.view.get();
|
return constantBufferSelector.view.get();
|
||||||
@ -1259,7 +1257,6 @@ namespace skyline::gpu::interconnect {
|
|||||||
vk::VertexInputBindingDescription bindingDescription{};
|
vk::VertexInputBindingDescription bindingDescription{};
|
||||||
vk::VertexInputBindingDivisorDescriptionEXT bindingDivisorDescription{};
|
vk::VertexInputBindingDivisorDescriptionEXT bindingDivisorDescription{};
|
||||||
IOVA start{}, end{}; //!< IOVAs covering a contiguous region in GPU AS with the vertex buffer
|
IOVA start{}, end{}; //!< IOVAs covering a contiguous region in GPU AS with the vertex buffer
|
||||||
GuestBuffer guest;
|
|
||||||
std::shared_ptr<BufferView> view;
|
std::shared_ptr<BufferView> view;
|
||||||
};
|
};
|
||||||
std::array<VertexBuffer, maxwell3d::VertexBufferCount> vertexBuffers{};
|
std::array<VertexBuffer, maxwell3d::VertexBufferCount> vertexBuffers{};
|
||||||
@ -1476,12 +1473,11 @@ namespace skyline::gpu::interconnect {
|
|||||||
else if (vertexBuffer.view)
|
else if (vertexBuffer.view)
|
||||||
return vertexBuffer.view.get();
|
return vertexBuffer.view.get();
|
||||||
|
|
||||||
if (vertexBuffer.guest.mappings.empty()) {
|
GuestBuffer guest;
|
||||||
auto mappings{channelCtx.asCtx->gmmu.TranslateRange(vertexBuffer.start, (vertexBuffer.end + 1) - vertexBuffer.start)};
|
auto mappings{channelCtx.asCtx->gmmu.TranslateRange(vertexBuffer.start, (vertexBuffer.end + 1) - vertexBuffer.start)};
|
||||||
vertexBuffer.guest.mappings.assign(mappings.begin(), mappings.end());
|
guest.mappings.assign(mappings.begin(), mappings.end());
|
||||||
}
|
|
||||||
|
|
||||||
vertexBuffer.view = gpu.buffer.FindOrCreate(vertexBuffer.guest);
|
vertexBuffer.view = gpu.buffer.FindOrCreate(guest);
|
||||||
return vertexBuffer.view.get();
|
return vertexBuffer.view.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user