mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 07:47:35 +00:00
Kernel: Implement buffer flipping for VirtIOGPU framebuffers
This solves tearing issues and improves performance when updating the VirtIOGPU framebuffers.
This commit is contained in:
parent
6e792553f2
commit
7fdf902e4a
7 changed files with 148 additions and 65 deletions
|
@ -127,12 +127,12 @@ VirtIOGPUResourceID VirtIOGPU::create_2d_resource(VirtIOGPURect rect)
|
|||
return resource_id;
|
||||
}
|
||||
|
||||
void VirtIOGPU::ensure_backing_storage(Region& region, size_t buffer_length, VirtIOGPUResourceID resource_id)
|
||||
void VirtIOGPU::ensure_backing_storage(Region& region, size_t buffer_offset, size_t buffer_length, VirtIOGPUResourceID resource_id)
|
||||
{
|
||||
VERIFY(m_operation_lock.is_locked());
|
||||
// Allocate backing region
|
||||
auto& vm_object = region.vmobject();
|
||||
size_t desired_num_pages = page_round_up(buffer_length);
|
||||
size_t desired_num_pages = page_round_up(buffer_offset + buffer_length);
|
||||
auto& pages = vm_object.physical_pages();
|
||||
for (size_t i = pages.size(); i < desired_num_pages / PAGE_SIZE; ++i) {
|
||||
auto page = MM.allocate_user_physical_page();
|
||||
|
@ -141,7 +141,11 @@ void VirtIOGPU::ensure_backing_storage(Region& region, size_t buffer_length, Vir
|
|||
pages.append(move(page));
|
||||
}
|
||||
region.remap();
|
||||
size_t num_mem_regions = vm_object.page_count();
|
||||
|
||||
VERIFY(buffer_offset % PAGE_SIZE == 0);
|
||||
VERIFY(buffer_length % PAGE_SIZE == 0);
|
||||
auto first_page_index = buffer_offset / PAGE_SIZE;
|
||||
size_t num_mem_regions = buffer_length / PAGE_SIZE;
|
||||
|
||||
// Send request
|
||||
auto& request = *reinterpret_cast<VirtIOGPUResourceAttachBacking*>(m_scratch_space->vaddr().as_ptr());
|
||||
|
@ -152,7 +156,7 @@ void VirtIOGPU::ensure_backing_storage(Region& region, size_t buffer_length, Vir
|
|||
request.resource_id = resource_id.value();
|
||||
request.num_entries = num_mem_regions;
|
||||
for (size_t i = 0; i < num_mem_regions; ++i) {
|
||||
request.entries[i].address = region.physical_page(i)->paddr().get();
|
||||
request.entries[i].address = region.physical_page(first_page_index + i)->paddr().get();
|
||||
request.entries[i].length = PAGE_SIZE;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue