diff --git a/rpcs3/Emu/RSX/GL/GLVertexBuffers.cpp b/rpcs3/Emu/RSX/GL/GLVertexBuffers.cpp index 6a1d2798b..ce088e1b3 100644 --- a/rpcs3/Emu/RSX/GL/GLVertexBuffers.cpp +++ b/rpcs3/Emu/RSX/GL/GLVertexBuffers.cpp @@ -232,7 +232,6 @@ namespace gsl::span dest_span(dst, data_size); write_vertex_array_data_to_buffer(dest_span, vertex_array.data, vertex_count, vertex_array.type, vertex_array.attribute_size, vertex_array.stride, rsx::get_vertex_type_size_on_host(vertex_array.type, vertex_array.attribute_size)); - prepare_buffer_for_writing(dst, vertex_array.type, vertex_array.attribute_size, vertex_count); texture.copy_from(m_attrib_ring_info, gl_type, buffer_offset, data_size); @@ -243,27 +242,20 @@ namespace int location; if (!m_program->uniforms.has_location(s_reg_table[vertex_register.index], &location)) return; - switch (vertex_register.type) - { - case rsx::vertex_base_type::f: - { - const u32 element_size = rsx::get_vertex_type_size_on_host(vertex_register.type, vertex_register.attribute_size); - const u32 gl_type = to_gl_internal_type(vertex_register.type, vertex_register.attribute_size); - const u32 data_size = element_size; - auto& texture = m_gl_attrib_buffers[vertex_register.index]; + const u32 element_size = rsx::get_vertex_type_size_on_host(vertex_register.type, vertex_register.attribute_size); + const u32 gl_type = to_gl_internal_type(vertex_register.type, vertex_register.attribute_size); + const u32 data_size = element_size; - auto mapping = m_attrib_ring_info.alloc_from_heap(data_size, m_min_texbuffer_alignment); - u8 *dst = static_cast(mapping.first); + auto& texture = m_gl_attrib_buffers[vertex_register.index]; - memcpy(dst, vertex_register.data.data(), element_size); - texture.copy_from(m_attrib_ring_info, gl_type, mapping.second, data_size); - break; - } - default: - LOG_ERROR(RSX, "bad non array vertex data format (type=%d, size=%d)", (u32)vertex_register.type, vertex_register.attribute_size); - break; - } + auto mapping = m_attrib_ring_info.alloc_from_heap(data_size, m_min_texbuffer_alignment); + u8 *dst = static_cast(mapping.first); + + memcpy(dst, vertex_register.data.data(), element_size); + prepare_buffer_for_writing(dst, vertex_register.type, vertex_register.attribute_size, vertex_count); + + texture.copy_from(m_attrib_ring_info, gl_type, mapping.second, data_size); } void operator()(const rsx::empty_vertex_array& vbo) diff --git a/rpcs3/Emu/RSX/VK/VKVertexBuffers.cpp b/rpcs3/Emu/RSX/VK/VKVertexBuffers.cpp index 5973084ce..fdda3cedf 100644 --- a/rpcs3/Emu/RSX/VK/VKVertexBuffers.cpp +++ b/rpcs3/Emu/RSX/VK/VKVertexBuffers.cpp @@ -260,12 +260,10 @@ namespace void operator()(const rsx::vertex_array_buffer& vertex_array) { // Fill vertex_array - u32 element_size = - rsx::get_vertex_type_size_on_host(vertex_array.type, vertex_array.attribute_size); + u32 element_size = rsx::get_vertex_type_size_on_host(vertex_array.type, vertex_array.attribute_size); u32 real_element_size = vk::get_suitable_vk_size(vertex_array.type, vertex_array.attribute_size); u32 upload_size = real_element_size * vertex_count; - bool requires_expansion = vk::requires_component_expansion(vertex_array.type, vertex_array.attribute_size); VkDeviceSize offset_in_attrib_buffer = m_attrib_ring_info.alloc<256>(upload_size); void *dst = m_attrib_ring_info.map(offset_in_attrib_buffer, upload_size); @@ -286,44 +284,34 @@ namespace void operator()(const rsx::vertex_array_register& vertex_register) { - switch (vertex_register.type) + size_t data_size = rsx::get_vertex_type_size_on_host(vertex_register.type, vertex_register.attribute_size); + const VkFormat format = vk::get_suitable_vk_format(vertex_register.type, vertex_register.attribute_size); + + u32 offset_in_attrib_buffer = 0; + + if (vk::requires_component_expansion(vertex_register.type, vertex_register.attribute_size)) { - case rsx::vertex_base_type::f: + const u32 num_stored_verts = static_cast( + data_size / (sizeof(float) * vertex_register.attribute_size)); + const u32 real_element_size = vk::get_suitable_vk_size(vertex_register.type, vertex_register.attribute_size); + + data_size = real_element_size * num_stored_verts; + offset_in_attrib_buffer = m_attrib_ring_info.alloc<256>(data_size); + void *dst = m_attrib_ring_info.map(offset_in_attrib_buffer, data_size); + + vk::expand_array_components(reinterpret_cast(vertex_register.data.data()), dst, num_stored_verts); + m_attrib_ring_info.unmap(); + } + else { - size_t data_size = rsx::get_vertex_type_size_on_host( - vertex_register.type, vertex_register.attribute_size); - const VkFormat format = vk::get_suitable_vk_format(vertex_register.type, vertex_register.attribute_size); - - u32 offset_in_attrib_buffer = 0; - - if (vk::requires_component_expansion(vertex_register.type, vertex_register.attribute_size)) - { - const u32 num_stored_verts = static_cast( - data_size / (sizeof(float) * vertex_register.attribute_size)); - const u32 real_element_size = vk::get_suitable_vk_size(vertex_register.type, vertex_register.attribute_size); - - data_size = real_element_size * num_stored_verts; - offset_in_attrib_buffer = m_attrib_ring_info.alloc<256>(data_size); - void *dst = m_attrib_ring_info.map(offset_in_attrib_buffer, data_size); - - vk::expand_array_components(reinterpret_cast(vertex_register.data.data()), dst, num_stored_verts); - m_attrib_ring_info.unmap(); - } - else - { - offset_in_attrib_buffer = m_attrib_ring_info.alloc<256>(data_size); - void *dst = m_attrib_ring_info.map(offset_in_attrib_buffer, data_size); - memcpy(dst, vertex_register.data.data(), data_size); - m_attrib_ring_info.unmap(); - } - - m_buffer_view_to_clean.push_back(std::make_unique(device, m_attrib_ring_info.heap->value, format, offset_in_attrib_buffer, data_size)); - m_program->bind_uniform(m_buffer_view_to_clean.back()->value, s_reg_table[vertex_register.index], descriptor_sets); - break; - } - default: - fmt::throw_exception("Unknown base type %d" HERE, (u32)vertex_register.type); + offset_in_attrib_buffer = m_attrib_ring_info.alloc<256>(data_size); + void *dst = m_attrib_ring_info.map(offset_in_attrib_buffer, data_size); + memcpy(dst, vertex_register.data.data(), data_size); + m_attrib_ring_info.unmap(); } + + m_buffer_view_to_clean.push_back(std::make_unique(device, m_attrib_ring_info.heap->value, format, offset_in_attrib_buffer, data_size)); + m_program->bind_uniform(m_buffer_view_to_clean.back()->value, s_reg_table[vertex_register.index], descriptor_sets); } void operator()(const rsx::empty_vertex_array& vbo)