[haiku-commits] Re: haiku: hrev52163 - src/system/boot/platform/generic headers/private/kernel/boot/platform/generic src/system/boot/platform/u-boot src/system/boot/platform/amiga_m68k src/system/boot/platform/bios_ia32

  • From: Stephan Aßmus <superstippi@xxxxxx>
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Fri, 3 Aug 2018 14:08:08 +0200

Hi,

Am 03.08.2018 um 13:41 schrieb Fredrik Holmqvist:

-       if (clear)
-               memset((void*)frameBuffer, 0,
-                       gKernelArgs.frame_buffer.physical_buffer.size);
+       addr_t pos = 0;
+       // Limit area to clear to estimated screen area
+       // UEFI can happily report a >256M framebuffer
+       addr_t size = min_c(gKernelArgs.frame_buffer.width
+                       * gKernelArgs.frame_buffer.height * 4,
+               gKernelArgs.frame_buffer.physical_buffer.size);
+
+       if (size >= 64) {
+               // Align writes
+               for (addr_t align = 8 - (frameBuffer & 7); pos < align; pos++)
+                       *(char*)(frameBuffer + pos) = 0;
+               // Write eight bytes, many many times, but not too many
+               for (addr_t alignSize = size - 8; pos < alignSize; pos +=8) {
+                       *(uint32*)(frameBuffer + pos) = 0;
+                       *(uint32*)(frameBuffer + pos + 4) = 0;
+               }
+       }
+       // Write a few bytes more
+       for (; pos < size; pos++)
+               *(char*)(frameBuffer + pos) = 0;

I take it the implementation of memset() which is used at this point, is not optimized in this way. But wouldn't it make sense to replace whatever implementation with what you have above? Or would that make memset() slower for when the target address is not video memory?

Best regards,
-Stephan


Other related posts: