VirtualBox

Changeset 83274 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Mar 12, 2020 5:12:56 PM (5 years ago)
Author:
vboxsync
Message:

VMSVGA: Implemented register-based cursor movement interface used by old X11 drivers (see bugref:9424).

Location:
trunk/src/VBox/Devices/Graphics
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA.cpp

    r83273 r83274  
    268268    STAMCOUNTER             StatR3CmdDefineCursor;
    269269    STAMCOUNTER             StatR3CmdDefineAlphaCursor;
     270    STAMCOUNTER             StatR3CmdMoveCursor;
     271    STAMCOUNTER             StatR3CmdDisplayCursor;
    270272    STAMCOUNTER             StatR3CmdEscape;
    271273    STAMCOUNTER             StatR3CmdDefineScreen;
     
    431433    SSMFIELD_ENTRY_IGNORE(      VMSVGAR3STATE, StatR3CmdDefineCursor),
    432434    SSMFIELD_ENTRY_IGNORE(      VMSVGAR3STATE, StatR3CmdDefineAlphaCursor),
     435    SSMFIELD_ENTRY_IGNORE(      VMSVGAR3STATE, StatR3CmdMoveCursor),
     436    SSMFIELD_ENTRY_IGNORE(      VMSVGAR3STATE, StatR3CmdDisplayCursor),
    433437    SSMFIELD_ENTRY_IGNORE(      VMSVGAR3STATE, StatR3CmdEscape),
    434438    SSMFIELD_ENTRY_IGNORE(      VMSVGAR3STATE, StatR3CmdDefineScreen),
     
    528532    SSMFIELD_ENTRY(                 VMSVGAState, cbScanline),
    529533    SSMFIELD_ENTRY_VER(             VMSVGAState, uScreenOffset, VGA_SAVEDSTATE_VERSION_VMSVGA),
     534    SSMFIELD_ENTRY_VER(             VMSVGAState, uCursorX, VGA_SAVEDSTATE_VERSION_VMSVGA_CURSOR),
     535    SSMFIELD_ENTRY_VER(             VMSVGAState, uCursorY, VGA_SAVEDSTATE_VERSION_VMSVGA_CURSOR),
     536    SSMFIELD_ENTRY_VER(             VMSVGAState, uCursorID, VGA_SAVEDSTATE_VERSION_VMSVGA_CURSOR),
     537    SSMFIELD_ENTRY_VER(             VMSVGAState, uCursorOn, VGA_SAVEDSTATE_VERSION_VMSVGA_CURSOR),
    530538    SSMFIELD_ENTRY(                 VMSVGAState, u32MaxWidth),
    531539    SSMFIELD_ENTRY(                 VMSVGAState, u32MaxHeight),
     
    658666        case SVGA_CMD_RECT_COPY:                return "SVGA_CMD_RECT_COPY";
    659667        case SVGA_CMD_DEFINE_CURSOR:            return "SVGA_CMD_DEFINE_CURSOR";
     668        case SVGA_CMD_DISPLAY_CURSOR:           return "SVGA_CMD_DISPLAY_CURSOR";
     669        case SVGA_CMD_MOVE_CURSOR:              return "SVGA_CMD_MOVE_CURSOR";
    660670        case SVGA_CMD_DEFINE_ALPHA_CURSOR:      return "SVGA_CMD_DEFINE_ALPHA_CURSOR";
    661671        case SVGA_CMD_UPDATE_VERBOSE:           return "SVGA_CMD_UPDATE_VERBOSE";
     
    12981308        /* Mouse cursor support. */
    12991309        case SVGA_REG_CURSOR_ID:
     1310            STAM_REL_COUNTER_INC(&pThis->svga.StatRegCursorIdRd);
     1311            *pu32 = pThis->svga.uCursorID;
     1312            break;
     1313
    13001314        case SVGA_REG_CURSOR_X:
     1315            STAM_REL_COUNTER_INC(&pThis->svga.StatRegCursorXRd);
     1316            *pu32 = pThis->svga.uCursorX;
     1317            break;
     1318
    13011319        case SVGA_REG_CURSOR_Y:
     1320            STAM_REL_COUNTER_INC(&pThis->svga.StatRegCursorYRd);
     1321            *pu32 = pThis->svga.uCursorY;
     1322            break;
     1323
    13021324        case SVGA_REG_CURSOR_ON:
    1303             STAM_REL_COUNTER_INC(&pThis->svga.StatRegCursorXxxxRd);
     1325            STAM_REL_COUNTER_INC(&pThis->svga.StatRegCursorOnRd);
     1326            *pu32 = pThis->svga.uCursorOn;
    13041327            break;
    13051328
     
    15561579
    15571580#endif /* IN_RING0 || IN_RING3 */
     1581
     1582#ifdef IN_RING3
     1583
     1584/**
     1585 * Sends cursor position and visibility information from legacy
     1586 * SVGA registers to the front-end.
     1587 */
     1588static void vmsvgaR3RegUpdateCursor(PVGASTATECC pThisCC, PVGASTATE pThis, uint32_t uCursorOn)
     1589{
     1590    /*
     1591     * Writing the X/Y/ID registers does not trigger changes; only writing the
     1592     * SVGA_REG_CURSOR_ON register does. That minimizes the overhead.
     1593     * We boldly assume that guests aren't stupid and aren't writing the CURSOR_ON
     1594     * register if they don't have to.
     1595     */
     1596    uint32_t x, y, idScreen;
     1597    uint32_t fFlags = VBVA_CURSOR_VALID_DATA;
     1598
     1599    x = pThis->svga.uCursorX;
     1600    y = pThis->svga.uCursorY;
     1601    idScreen = SVGA_ID_INVALID; /* The old register interface is single screen only. */
     1602
     1603    /* The original values for SVGA_REG_CURSOR_ON were off (0) and on (1); later, the values
     1604     * were extended as follows:
     1605     *
     1606     *   SVGA_CURSOR_ON_HIDE               0
     1607     *   SVGA_CURSOR_ON_SHOW               1
     1608     *   SVGA_CURSOR_ON_REMOVE_FROM_FB     2 - cursor on but not in the framebuffer
     1609     *   SVGA_CURSOR_ON_RESTORE_TO_FB      3 - cursor on, possibly in the framebuffer
     1610     *
     1611     * Since we never draw the cursor into the guest's framebuffer, we do not need to
     1612     * distinguish between the non-zero values but still remember them.
     1613     */
     1614    if (RT_BOOL(pThis->svga.uCursorOn) != RT_BOOL(uCursorOn))
     1615    {
     1616        LogRel2(("vmsvgaR3RegUpdateCursor: uCursorOn %d prev CursorOn %d (%d,%d)\n", uCursorOn, pThis->svga.uCursorOn, x, y));
     1617        pThisCC->pDrv->pfnVBVAMousePointerShape(pThisCC->pDrv, RT_BOOL(uCursorOn), false, 0, 0, 0, 0, NULL);
     1618    }
     1619    pThis->svga.uCursorOn = uCursorOn;
     1620    pThisCC->pDrv->pfnVBVAReportCursorPosition(pThisCC->pDrv, fFlags, idScreen, x, y);
     1621}
     1622
     1623#endif /* IN_RING3 */
    15581624
    15591625
     
    18031869        /* Mouse cursor support */
    18041870        case SVGA_REG_CURSOR_ID:
     1871            STAM_REL_COUNTER_INC(&pThis->svga.StatRegCursorIdWr);
     1872            pThis->svga.uCursorID = u32;
     1873            break;
     1874
    18051875        case SVGA_REG_CURSOR_X:
     1876            STAM_REL_COUNTER_INC(&pThis->svga.StatRegCursorXWr);
     1877            pThis->svga.uCursorX = u32;
     1878            break;
     1879
    18061880        case SVGA_REG_CURSOR_Y:
     1881            STAM_REL_COUNTER_INC(&pThis->svga.StatRegCursorYWr);
     1882            pThis->svga.uCursorY = u32;
     1883            break;
     1884
    18071885        case SVGA_REG_CURSOR_ON:
    1808             STAM_REL_COUNTER_INC(&pThis->svga.StatRegCursorXxxxWr);
     1886#ifdef IN_RING3
     1887            /* The cursor is only updated when SVGA_REG_CURSOR_ON is written. */
     1888            STAM_REL_COUNTER_INC(&pThis->svga.StatRegCursorOnWr);
     1889            vmsvgaR3RegUpdateCursor(pThisCC, pThis, u32);
     1890#else
     1891            rc = VINF_IOM_R3_IOPORT_WRITE;
     1892#endif
    18091893            break;
    18101894
     
    38493933            }
    38503934
     3935            case SVGA_CMD_MOVE_CURSOR:
     3936            {
     3937                /* Deprecated; there should be no driver which *requires* this command. However, if
     3938                 * we do ecncounter this command, it might be useful to not get the FIFO completely out of
     3939                 * alignment.
     3940                 * May be issued by guest if SVGA_CAP_CURSOR_BYPASS is missing.
     3941                 */
     3942                SVGAFifoCmdMoveCursor *pMoveCursor;
     3943                VMSVGAFIFO_GET_CMD_BUFFER_BREAK(pMoveCursor, SVGAFifoCmdMoveCursor, sizeof(*pMoveCursor));
     3944                STAM_REL_COUNTER_INC(&pSVGAState->StatR3CmdMoveCursor);
     3945
     3946                Log(("vmsvgaR3FifoLoop: MOVE CURSOR to %d,%d\n", pMoveCursor->pos.x, pMoveCursor->pos.y));
     3947                LogRelMax(4, ("Unsupported SVGA_CMD_MOVE_CURSOR command ignored.\n"));
     3948                break;
     3949            }
     3950
     3951            case SVGA_CMD_DISPLAY_CURSOR:
     3952            {
     3953                /* Deprecated; there should be no driver which *requires* this command. However, if
     3954                 * we do ecncounter this command, it might be useful to not get the FIFO completely out of
     3955                 * alignment.
     3956                 * May be issued by guest if SVGA_CAP_CURSOR_BYPASS is missing.
     3957                 */
     3958                SVGAFifoCmdDisplayCursor *pDisplayCursor;
     3959                VMSVGAFIFO_GET_CMD_BUFFER_BREAK(pDisplayCursor, SVGAFifoCmdDisplayCursor, sizeof(*pDisplayCursor));
     3960                STAM_REL_COUNTER_INC(&pSVGAState->StatR3CmdDisplayCursor);
     3961
     3962                Log(("vmsvgaR3FifoLoop: DISPLAY CURSOR id=%d state=%d\n", pDisplayCursor->id, pDisplayCursor->state));
     3963                LogRelMax(4, ("Unsupported SVGA_CMD_DISPLAY_CURSOR command ignored.\n"));
     3964                break;
     3965            }
     3966
    38513967            case SVGA_CMD_ESCAPE:
    38523968            {
     
    55735689    pHlp->pfnPrintf(pHlp, "Cursor byte size:   %u (%#x)\n", pSVGAState->Cursor.cbData, pSVGAState->Cursor.cbData);
    55745690
     5691    pHlp->pfnPrintf(pHlp, "Legacy cursor:      ID %u, state %u\n", pThis->svga.uCursorID, pThis->svga.uCursorOn);
     5692    pHlp->pfnPrintf(pHlp, "Legacy cursor at:   %u,%u\n", pThis->svga.uCursorX, pThis->svga.uCursorY);
    55755693# ifdef VBOX_WITH_VMSVGA3D
    55765694    pHlp->pfnPrintf(pHlp, "3D enabled:         %RTbool\n", pThis->svga.f3DEnabled);
     
    59736091                           | SVGA_CAP_GMR2
    59746092                           | SVGA_CAP_CURSOR
     6093                           | SVGA_CAP_CURSOR_BYPASS
    59756094                           | SVGA_CAP_CURSOR_BYPASS_2
    59766095                           | SVGA_CAP_EXTENDED_FIFO
     
    64146533    REG_CNT(&pSVGAState->StatR3CmdDefineAlphaCursor,      "VMSVGA/Cmd/DefineAlphaCursor",          "SVGA_CMD_DEFINE_ALPHA_CURSOR");
    64156534    REG_CNT(&pSVGAState->StatR3CmdDefineCursor,           "VMSVGA/Cmd/DefineCursor",               "SVGA_CMD_DEFINE_CURSOR");
     6535    REG_CNT(&pSVGAState->StatR3CmdMoveCursor,             "VMSVGA/Cmd/MoveCursor",                 "SVGA_CMD_MOVE_CURSOR");
     6536    REG_CNT(&pSVGAState->StatR3CmdDisplayCursor,          "VMSVGA/Cmd/DisplayCursor",              "SVGA_CMD_DISPLAY_CURSOR");
    64166537    REG_CNT(&pSVGAState->StatR3CmdDefineGmr2,             "VMSVGA/Cmd/DefineGmr2",                 "SVGA_CMD_DEFINE_GMR2");
    64176538    REG_CNT(&pSVGAState->StatR3CmdDefineGmr2Free,         "VMSVGA/Cmd/DefineGmr2/Free",            "Number of SVGA_CMD_DEFINE_GMR2 commands that only frees.");
     
    64346555    REG_CNT(&pThis->svga.StatRegBitsPerPixelWr,           "VMSVGA/Reg/BitsPerPixelWrite",          "SVGA_REG_BITS_PER_PIXEL writes.");
    64356556    REG_CNT(&pThis->svga.StatRegBusyWr,                   "VMSVGA/Reg/BusyWrite",                  "SVGA_REG_BUSY writes.");
    6436     REG_CNT(&pThis->svga.StatRegCursorXxxxWr,             "VMSVGA/Reg/CursorXxxxWrite",            "SVGA_REG_CURSOR_XXXX writes.");
     6557    REG_CNT(&pThis->svga.StatRegCursorXWr,                "VMSVGA/Reg/CursorXWrite",               "SVGA_REG_CURSOR_X writes.");
     6558    REG_CNT(&pThis->svga.StatRegCursorYWr,                "VMSVGA/Reg/CursorYWrite",               "SVGA_REG_CURSOR_Y writes.");
     6559    REG_CNT(&pThis->svga.StatRegCursorIdWr,               "VMSVGA/Reg/CursorIdWrite",              "SVGA_REG_CURSOR_ID writes.");
     6560    REG_CNT(&pThis->svga.StatRegCursorOnWr,               "VMSVGA/Reg/CursorOnWrite",              "SVGA_REG_CURSOR_ON writes.");
    64376561    REG_CNT(&pThis->svga.StatRegDepthWr,                  "VMSVGA/Reg/DepthWrite",                 "SVGA_REG_DEPTH writes.");
    64386562    REG_CNT(&pThis->svga.StatRegDisplayHeightWr,          "VMSVGA/Reg/DisplayHeightWrite",         "SVGA_REG_DISPLAY_HEIGHT writes.");
     
    64676591    REG_CNT(&pThis->svga.StatRegCapabilitesRd,            "VMSVGA/Reg/CapabilitesRead",            "SVGA_REG_CAPABILITIES reads.");
    64686592    REG_CNT(&pThis->svga.StatRegConfigDoneRd,             "VMSVGA/Reg/ConfigDoneRead",             "SVGA_REG_CONFIG_DONE reads.");
    6469     REG_CNT(&pThis->svga.StatRegCursorXxxxRd,             "VMSVGA/Reg/CursorXxxxRead",             "SVGA_REG_CURSOR_XXXX reads.");
     6593    REG_CNT(&pThis->svga.StatRegCursorXRd,                "VMSVGA/Reg/CursorXRead",                "SVGA_REG_CURSOR_X reads.");
     6594    REG_CNT(&pThis->svga.StatRegCursorYRd,                "VMSVGA/Reg/CursorYRead",                "SVGA_REG_CURSOR_Y reads.");
     6595    REG_CNT(&pThis->svga.StatRegCursorIdRd,               "VMSVGA/Reg/CursorIdRead",               "SVGA_REG_CURSOR_ID reads.");
     6596    REG_CNT(&pThis->svga.StatRegCursorOnRd,               "VMSVGA/Reg/CursorOnRead",               "SVGA_REG_CURSOR_ON reads.");
    64706597    REG_CNT(&pThis->svga.StatRegDepthRd,                  "VMSVGA/Reg/DepthRead",                  "SVGA_REG_DEPTH reads.");
    64716598    REG_CNT(&pThis->svga.StatRegDisplayHeightRd,          "VMSVGA/Reg/DisplayHeightRead",          "SVGA_REG_DISPLAY_HEIGHT reads.");
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA.h

    r83156 r83274  
    251251    uint32_t                    uScreenOffset; /* Used only for loading older saved states. */
    252252
     253    /** Legacy cursor state. */
     254    uint32_t                    uCursorX;
     255    uint32_t                    uCursorY;
     256    uint32_t                    uCursorID;
     257    uint32_t                    uCursorOn;
     258
    253259    /** Scratch array.
    254260     * Putting this at the end since it's big it probably not . */
     
    257263    STAMCOUNTER                 StatRegBitsPerPixelWr;
    258264    STAMCOUNTER                 StatRegBusyWr;
    259     STAMCOUNTER                 StatRegCursorXxxxWr;
     265    STAMCOUNTER                 StatRegCursorXWr;
     266    STAMCOUNTER                 StatRegCursorYWr;
     267    STAMCOUNTER                 StatRegCursorIdWr;
     268    STAMCOUNTER                 StatRegCursorOnWr;
    260269    STAMCOUNTER                 StatRegDepthWr;
    261270    STAMCOUNTER                 StatRegDisplayHeightWr;
     
    290299    STAMCOUNTER                 StatRegCapabilitesRd;
    291300    STAMCOUNTER                 StatRegConfigDoneRd;
    292     STAMCOUNTER                 StatRegCursorXxxxRd;
     301    STAMCOUNTER                 StatRegCursorXRd;
     302    STAMCOUNTER                 StatRegCursorYRd;
     303    STAMCOUNTER                 StatRegCursorIdRd;
     304    STAMCOUNTER                 StatRegCursorOnRd;
    293305    STAMCOUNTER                 StatRegDepthRd;
    294306    STAMCOUNTER                 StatRegDisplayHeightRd;
  • trunk/src/VBox/Devices/Graphics/DevVGASavedState.h

    r82968 r83274  
    4747    } while (0)
    4848
    49 #define VGA_SAVEDSTATE_VERSION                   21
     49#define VGA_SAVEDSTATE_VERSION                   22
     50#define VGA_SAVEDSTATE_VERSION_VMSVGA_CURSOR     22 /* Legacy cursor registers. */
    5051#define VGA_SAVEDSTATE_VERSION_VMSVGA_SCREENS    21 /* Screen objects. */
    5152#define VGA_SAVEDSTATE_VERSION_VMSVGA            20 /* Multiple updates and fixes for VMSVGA saved state. */
  • trunk/src/VBox/Devices/Graphics/vmsvga/svga_reg.h

    r76565 r83274  
    10131013   SVGA_CMD_RECT_COPY             = 3,
    10141014   SVGA_CMD_DEFINE_CURSOR         = 19,
     1015   SVGA_CMD_DISPLAY_CURSOR        = 20, // Deprecated.
     1016   SVGA_CMD_MOVE_CURSOR           = 21, // Deprecated.
    10151017   SVGA_CMD_DEFINE_ALPHA_CURSOR   = 22,
    10161018   SVGA_CMD_UPDATE_VERBOSE        = 25,
     
    15561558SVGAFifoCmdRemapGMR2;
    15571559
     1560/*
     1561 * SVGA_CMD_DISPLAY_CURSOR --
     1562 *
     1563 *    Turn the cursor on or off.
     1564 *
     1565 *    Deprecated.
     1566 *
     1567 * Availability:
     1568 *    SVGA_CAP_CURSOR?
     1569 */
     1570
     1571typedef
     1572struct {
     1573   uint32_t id;             // Reserved, must be zero.
     1574   uint32_t state;          // 0=off
     1575} SVGAFifoCmdDisplayCursor;
     1576
     1577/*
     1578 * SVGA_CMD_MOVE_CURSOR --
     1579 *
     1580 *    Set the cursor position.
     1581 *
     1582 *    Deprecated.
     1583 *
     1584 * Availability:
     1585 *    SVGA_CAP_CURSOR?
     1586 */
     1587
     1588typedef
     1589struct {
     1590    SVGASignedPoint     pos;
     1591} SVGAFifoCmdMoveCursor;
     1592
    15581593#endif /* !_SVGA_REG_H_ */
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette