rsx: Relax restriction on vertex register data fetch

This commit is contained in:
kd-11
2017-05-17 14:37:36 +03:00
parent d4ddc40988
commit 0efc3c1c6c
2 changed files with 37 additions and 57 deletions
+11 -19
View File
@@ -232,7 +232,6 @@ namespace
gsl::span<gsl::byte> dest_span(dst, data_size); gsl::span<gsl::byte> 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)); 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); 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); texture.copy_from(m_attrib_ring_info, gl_type, buffer_offset, data_size);
@@ -243,27 +242,20 @@ namespace
int location; int location;
if (!m_program->uniforms.has_location(s_reg_table[vertex_register.index], &location)) if (!m_program->uniforms.has_location(s_reg_table[vertex_register.index], &location))
return; 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); auto& texture = m_gl_attrib_buffers[vertex_register.index];
u8 *dst = static_cast<u8*>(mapping.first);
memcpy(dst, vertex_register.data.data(), element_size); auto mapping = m_attrib_ring_info.alloc_from_heap(data_size, m_min_texbuffer_alignment);
texture.copy_from(m_attrib_ring_info, gl_type, mapping.second, data_size); u8 *dst = static_cast<u8*>(mapping.first);
break;
} memcpy(dst, vertex_register.data.data(), element_size);
default: prepare_buffer_for_writing(dst, vertex_register.type, vertex_register.attribute_size, vertex_count);
LOG_ERROR(RSX, "bad non array vertex data format (type=%d, size=%d)", (u32)vertex_register.type, vertex_register.attribute_size);
break; texture.copy_from(m_attrib_ring_info, gl_type, mapping.second, data_size);
}
} }
void operator()(const rsx::empty_vertex_array& vbo) void operator()(const rsx::empty_vertex_array& vbo)
+26 -38
View File
@@ -260,12 +260,10 @@ namespace
void operator()(const rsx::vertex_array_buffer& vertex_array) void operator()(const rsx::vertex_array_buffer& vertex_array)
{ {
// Fill vertex_array // Fill vertex_array
u32 element_size = u32 element_size = rsx::get_vertex_type_size_on_host(vertex_array.type, vertex_array.attribute_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 real_element_size = vk::get_suitable_vk_size(vertex_array.type, vertex_array.attribute_size);
u32 upload_size = real_element_size * vertex_count; 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); 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); 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) 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<u32>(
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<float, 3, 4, 1>(reinterpret_cast<const float*>(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( offset_in_attrib_buffer = m_attrib_ring_info.alloc<256>(data_size);
vertex_register.type, vertex_register.attribute_size); void *dst = m_attrib_ring_info.map(offset_in_attrib_buffer, data_size);
const VkFormat format = vk::get_suitable_vk_format(vertex_register.type, vertex_register.attribute_size); memcpy(dst, vertex_register.data.data(), data_size);
m_attrib_ring_info.unmap();
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<u32>(
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<float, 3, 4, 1>(reinterpret_cast<const float*>(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<vk::buffer_view>(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);
} }
m_buffer_view_to_clean.push_back(std::make_unique<vk::buffer_view>(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) void operator()(const rsx::empty_vertex_array& vbo)