mirror of
https://github.com/cemu-project/Cemu.git
synced 2025-07-03 21:41:19 +12:00
macOS: Workaround for MoltenVK stride limitation (#534)
This commit is contained in:
parent
79e731d9b4
commit
a3476c7b7c
6 changed files with 57 additions and 3 deletions
|
@ -3458,6 +3458,36 @@ void VulkanRenderer::buffer_bindVertexBuffer(uint32 bufferIndex, uint32 offset,
|
|||
vkCmdBindVertexBuffers(m_state.currentCommandBuffer, bufferIndex, 1, &attrBuffer, &attrOffset);
|
||||
}
|
||||
|
||||
void VulkanRenderer::buffer_bindVertexStrideWorkaroundBuffer(VkBuffer fixedBuffer, uint32 offset, uint32 bufferIndex, uint32 size)
|
||||
{
|
||||
cemu_assert_debug(bufferIndex < LATTE_MAX_VERTEX_BUFFERS);
|
||||
m_state.currentVertexBinding[bufferIndex].offset = 0xFFFFFFFF;
|
||||
VkBuffer attrBuffer = fixedBuffer;
|
||||
VkDeviceSize attrOffset = offset;
|
||||
vkCmdBindVertexBuffers(m_state.currentCommandBuffer, bufferIndex, 1, &attrBuffer, &attrOffset);
|
||||
}
|
||||
|
||||
std::pair<VkBuffer, uint32> VulkanRenderer::buffer_genStrideWorkaroundVertexBuffer(MPTR buffer, uint32 size, uint32 oldStride)
|
||||
{
|
||||
cemu_assert_debug(oldStride % 4 != 0);
|
||||
|
||||
std::span<uint8> old_buffer{memory_getPointerFromPhysicalOffset(buffer), size};
|
||||
|
||||
//new stride is the nearest multiple of 4
|
||||
uint32 newStride = oldStride + (4-(oldStride % 4));
|
||||
uint32 newSize = size / oldStride * newStride;
|
||||
|
||||
auto new_buffer_alloc = memoryManager->getMetalStrideWorkaroundAllocator().AllocateBufferMemory(newSize, 128);
|
||||
|
||||
std::span<uint8> new_buffer{new_buffer_alloc.memPtr, new_buffer_alloc.size};
|
||||
|
||||
for(size_t elem = 0; elem < size / oldStride; elem++)
|
||||
{
|
||||
memcpy(&new_buffer[elem * newStride], &old_buffer[elem * oldStride], oldStride);
|
||||
}
|
||||
return {new_buffer_alloc.vkBuffer, new_buffer_alloc.bufferOffset};
|
||||
}
|
||||
|
||||
void VulkanRenderer::buffer_bindUniformBuffer(LatteConst::ShaderType shaderType, uint32 bufferIndex, uint32 offset, uint32 size)
|
||||
{
|
||||
cemu_assert_debug(!m_useHostMemoryForCache);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue