qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [Bug 1777672] Re: QEMU aarch64 virtual/physical frame buffe


From: David Hoelzer
Subject: [Qemu-devel] [Bug 1777672] Re: QEMU aarch64 virtual/physical frame buffer
Date: Fri, 10 Aug 2018 17:13:34 -0000

The virtual size must be at least the size of the physical display.  One
approach toward double-buffering is to make the virtual height twice the
physical height.  To "flip" the displays you simply change the start of
the visible view port.

See these:

https://lb.raspberrypi.org/forums/viewtopic.php?t=47329
https://www.raspberrypi.org/forums/viewtopic.php?f=67&t=19073&p=324866#p324866

-- 
You received this bug notification because you are a member of qemu-
devel-ml, which is subscribed to QEMU.
https://bugs.launchpad.net/bugs/1777672

Title:
  QEMU aarch64 virtual/physical frame buffer

Status in QEMU:
  New

Bug description:
  I fully recognize that the error here could be mine, but the code is
  pretty simple and straightforward; When emulating a Raspberry PI 3
  using aarch64 and allocating a virtual framebuffer larger than the
  physical frambuffer (for double-buffering purposes), the QEMU window
  shows the full size of the *virtual* framebuffer rather than the size
  of the *physical* framebuffer.

  You can replicate this with code such as:

  
  #define FBWIDTH 1024
  #define FBHEIGHT 768

  void lfb_init()
  {
      uart_puts("Initializing Framebuffer\n");
      mbox[0] = 35*4;
      mbox[1] = MBOX_REQUEST;

      mbox[2] = 0x48003;  //set phy wh
      mbox[3] = 8;
      mbox[4] = 8;
      mbox[5] = FBWIDTH;         //FrameBufferInfo.width
      mbox[6] = FBHEIGHT;          //FrameBufferInfo.height

      mbox[7] = 0x48004;  //set virt wh
      mbox[8] = 8;
      mbox[9] = 8;
      mbox[10] = FBWIDTH;        //FrameBufferInfo.virtual_width
      mbox[11] = FBHEIGHT * 2;         //FrameBufferInfo.virtual_height
      
      mbox[12] = 0x48009; //set virt offset
      mbox[13] = 8;
      mbox[14] = 8;
      mbox[15] = 0;           //FrameBufferInfo.x_offset
      mbox[16] = 0;           //FrameBufferInfo.y.offset
      
      mbox[17] = 0x48005; //set depth
      mbox[18] = 4;
      mbox[19] = 4;
      mbox[20] = 32;          //FrameBufferInfo.depth

      mbox[21] = 0x48006; //set pixel order
      mbox[22] = 4;
      mbox[23] = 4;
      mbox[24] = 1;           //RGB, not BGR preferably

      mbox[25] = 0x40001; //get framebuffer, gets alignment on request
      mbox[26] = 8;
      mbox[27] = 8;
      mbox[28] = 4096;        //FrameBufferInfo.pointer
      mbox[29] = 0;           //FrameBufferInfo.size

      mbox[30] = 0x40008; //get pitch
      mbox[31] = 4;
      mbox[32] = 4;
      mbox[33] = 0;           //FrameBufferInfo.pitch

      mbox[34] = MBOX_TAG_LAST;

      if(mbox_call(MBOX_CH_PROP) && mbox[20]==32 && mbox[28]!=0) {
          mbox[28]&=0x3FFFFFFF;
          fbwidth=mbox[5];
          fbheight=mbox[6];
          pitch=mbox[33];
          lfb=(void*)((unsigned long)mbox[28]);
      }
  }

  I will assume, for the sake of this posting, that the reader
  understands the mailbox architecture and the appropriate address
  definitions for them.  The key point is that allocating a virtual
  buffer twice the height of the physical buffer results in QEMU
  improperly displaying a double-height window.

To manage notifications about this bug go to:
https://bugs.launchpad.net/qemu/+bug/1777672/+subscriptions



reply via email to

[Prev in Thread] Current Thread [Next in Thread]