qemu-devel
[Top][All Lists]
Advanced

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

Re: VGA hardware cursor query


From: Mark Cave-Ayland
Subject: Re: VGA hardware cursor query
Date: Thu, 4 Aug 2022 09:19:04 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.10.0

On 01/08/2022 04:58, Elliot Nunn wrote:

Dear all,

I want to give Mac OS 9 clients access to hardware cursor support, to improve
responsiveness in absolute-cursor mode.

Would it be acceptable to add a hardware cursor interface to the VGA device?
And if so, can anyone advise on an appropriate register layout?

This is an example of such a patch. Because it alters the Bochs VBE interface
it is ONLY an example, NOT fit for acceptance. I have omitted the changes to
the binary driver qemu_vga.ndrv.

Kind regards,

Elliot Nunn

---
  hw/display/vga.c               |  35 +++++++++++++++++++++++++++++++++
  include/hw/display/bochs-vbe.h |   7 +++++--
  pc-bios/qemu_vga.ndrv          | Bin 18752 -> 20944 bytes
  3 files changed, 40 insertions(+), 2 deletions(-)

diff --git a/hw/display/vga.c b/hw/display/vga.c
index 5dca2d1528..9b562e24e2 100644
--- a/hw/display/vga.c
+++ b/hw/display/vga.c
@@ -744,6 +744,10 @@ void vbe_ioport_write_data(void *opaque, uint32_t addr, 
uint32_t val)
  {
      VGACommonState *s = opaque;
+ static size_t cursorCounter;
+    static uint8_t cursorData[16 * 16 * 4];
+    QEMUCursor *cursor;
+
      if (s->vbe_index <= VBE_DISPI_INDEX_NB) {
          trace_vga_vbe_write(s->vbe_index, val);
          switch(s->vbe_index) {
@@ -796,6 +800,37 @@ void vbe_ioport_write_data(void *opaque, uint32_t addr, 
uint32_t val)
              s->vbe_regs[s->vbe_index] = val;
              vga_update_memory_access(s);
              break;
+
+        case VBE_DISPI_INDEX_CURSOR_IMG:
+            cursorData[cursorCounter++] = val >> 8;
+            cursorData[cursorCounter++] = val;
+            cursorCounter &= sizeof(cursorData) - 1;
+            break;
+
+        case VBE_DISPI_INDEX_CURSOR_HOTSPOT:
+            cursor = cursor_alloc(16, 16);
+
+            if (val == 0x8080) { // blank cursor
+                for (int i = 0; i < 16*16; i++) {
+                    cursor->data[i] = 0;
+                }
+            } else {
+                for (int i = 0; i < 16*16; i++) {
+                    cursor->data[i] =
+                        ((uint32_t)cursorData[i*4] << 24) |
+                        ((uint32_t)cursorData[i*4+1] << 16) |
+                        ((uint32_t)cursorData[i*4+2] << 8) |
+                        (uint32_t)cursorData[i*4+3];
+                }
+
+                cursor->hot_x = (int8_t)(val >> 8);
+                cursor->hot_y = (int8_t)val;
+            }
+
+            dpy_cursor_define(s->con, cursor);
+            cursor_put(cursor); // dealloc
+            break;
+
          default:
              break;
          }
diff --git a/include/hw/display/bochs-vbe.h b/include/hw/display/bochs-vbe.h
index bc2f046eee..7de409bae7 100644
--- a/include/hw/display/bochs-vbe.h
+++ b/include/hw/display/bochs-vbe.h
@@ -19,7 +19,10 @@
  #define VBE_DISPI_INDEX_VIRT_HEIGHT     0x7
  #define VBE_DISPI_INDEX_X_OFFSET        0x8
  #define VBE_DISPI_INDEX_Y_OFFSET        0x9
-#define VBE_DISPI_INDEX_NB              0xa /* size of vbe_regs[] */
+#define VBE_DISPI_INDEX_CURSOR_IMG      0xb
+#define VBE_DISPI_INDEX_CURSOR_HOTSPOT  0xc
+#define VBE_DISPI_INDEX_CURSOR_ABS      0xd
+#define VBE_DISPI_INDEX_NB              0xe /* size of vbe_regs[] */
  #define VBE_DISPI_INDEX_VIDEO_MEMORY_64K 0xa /* read-only, not in vbe_regs */
/* VBE_DISPI_INDEX_ID */
@@ -54,7 +57,7 @@
/* bochs vbe register region */
  #define PCI_VGA_BOCHS_OFFSET  0x500
-#define PCI_VGA_BOCHS_SIZE    (0x0b * 2)
+#define PCI_VGA_BOCHS_SIZE    (VBE_DISPI_INDEX_NB * 2)
/* qemu extension register region */
  #define PCI_VGA_QEXT_OFFSET   0x600

Hi Elliot,

Nice work! Have you been in contact with the Bochs developers to see what their thoughts are to your proposed changes? Generally QEMU prefers to implement documented specifications, so this would be the best route to go.


ATB,

Mark.



reply via email to

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