VirtualBox

Changeset 71146 in vbox


Ignore:
Timestamp:
Feb 28, 2018 9:54:40 AM (7 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
121039
Message:

DevVGA, Additions: added VBE_DISPI_ID_CFG for querying the virtual graphics card features.

Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/Graphics/VBoxVideoGuest.h

    r69307 r71146  
    126126
    127127DECLHIDDEN(uint32_t) VBoxHGSMIGetMonitorCount(PHGSMIGUESTCOMMANDCONTEXT pCtx);
     128DECLHIDDEN(bool)     VBoxVGACfgAvailable(void);
     129DECLHIDDEN(bool)     VBoxVGACfgQuery(uint16_t u16Id, uint32_t *pu32Value);
    128130DECLHIDDEN(uint32_t) VBoxVideoGetVRAMSize(void);
    129131DECLHIDDEN(bool)     VBoxVideoAnyWidthAllowed(void);
  • trunk/include/VBox/Graphics/VBoxVideoVBE.h

    r69307 r71146  
    5050#define VBE_DISPI_IOPORT_DAC_DATA         0x03C9
    5151
     52/* Cross reference with src/VBox/Devices/Graphics/DevVGA.h */
    5253#define VBE_DISPI_INDEX_ID              0x0
    5354#define VBE_DISPI_INDEX_XRES            0x1
     
    6263#define VBE_DISPI_INDEX_VBOX_VIDEO      0xa
    6364#define VBE_DISPI_INDEX_FB_BASE_HI      0xb
     65#define VBE_DISPI_INDEX_CFG             0xc
    6466
    6567#define VBE_DISPI_ID0                   0xB0C0
     
    7375#define VBE_DISPI_ID_HGSMI              0xBE01
    7476#define VBE_DISPI_ID_ANYX               0xBE02
     77#define VBE_DISPI_ID_CFG                0xBE03 /* VBE_DISPI_INDEX_CFG is available. */
    7578
    7679#define VBE_DISPI_DISABLED              0x00
     
    8386#define VBE_DISPI_NOCLEARMEM            0x80
    8487
     88/* VBE_DISPI_INDEX_CFG content. */
     89#define VBE_DISPI_CFG_MASK_ID           0x0FFF /* Identifier of a configuration value. */
     90#define VBE_DISPI_CFG_MASK_SUPPORT      0x1000 /* Query whether the identifier is supported. */
     91#define VBE_DISPI_CFG_MASK_RESERVED     0xE000 /* For future extensions. Must be 0. */
     92
     93/* VBE_DISPI_INDEX_CFG values. */
     94#define VBE_DISPI_CFG_ID_VERSION        0x0000 /* Version of the configuration interface. */
     95#define VBE_DISPI_CFG_ID_VRAM_SIZE      0x0001 /* VRAM size. */
     96#define VBE_DISPI_CFG_ID_3D             0x0002 /* 3D support. */
     97#define VBE_DISPI_CFG_ID_VMSVGA         0x0003 /* VMSVGA FIFO and ports are available. */
     98
    8599#define VGA_PORT_HGSMI_HOST             0x3b0
    86100#define VGA_PORT_HGSMI_GUEST            0x3d0
  • trunk/src/VBox/Additions/common/VBoxVideo/Modesetting.cpp

    r69309 r71146  
    5959
    6060/**
     61 * Query whether the virtual hardware supports VBE_DISPI_ID_CFG
     62 * and set the interface.
     63 *
     64 * @returns Whether the interface is supported.
     65 */
     66DECLHIDDEN(bool) VBoxVGACfgAvailable(void)
     67{
     68    VBVO_PORT_WRITE_U16(VBE_DISPI_IOPORT_INDEX, VBE_DISPI_INDEX_ID);
     69    VBVO_PORT_WRITE_U16(VBE_DISPI_IOPORT_DATA, VBE_DISPI_ID_CFG);
     70    const uint16_t DispiId = VBVO_PORT_READ_U16(VBE_DISPI_IOPORT_DATA);
     71    return (DispiId == VBE_DISPI_ID_CFG);
     72}
     73
     74
     75/**
     76 * Query a configuration value from the virtual hardware which supports VBE_DISPI_ID_CFG.
     77 * I.e. use this function only if VBoxVGACfgAvailable returns true.
     78 *
     79 * @returns Whether the value is supported.
     80 * @param  u16Id     Identifier of the configuration value (VBE_DISPI_CFG_ID_*).
     81 * @param  pu32Value Where to store value from the host.
     82 */
     83DECLHIDDEN(bool) VBoxVGACfgQuery(uint16_t u16Id, uint32_t *pu32Value)
     84{
     85    VBVO_PORT_WRITE_U16(VBE_DISPI_IOPORT_INDEX, VBE_DISPI_INDEX_CFG);
     86    VBVO_PORT_WRITE_U16(VBE_DISPI_IOPORT_DATA, VBE_DISPI_CFG_MASK_SUPPORT | u16Id);
     87    const uint32_t u32 = VBVO_PORT_READ_U32(VBE_DISPI_IOPORT_DATA);
     88    if (u32)
     89    {
     90        VBVO_PORT_WRITE_U16(VBE_DISPI_IOPORT_DATA, u16Id);
     91        *pu32Value = VBVO_PORT_READ_U32(VBE_DISPI_IOPORT_DATA);
     92        return true;
     93    }
     94
     95    return false;
     96}
     97
     98
     99/**
    61100 * Returns the size of the video RAM in bytes.
    62101 *
     
    65104DECLHIDDEN(uint32_t) VBoxVideoGetVRAMSize(void)
    66105{
    67     /** @note A 32bit read on this port returns the VRAM size. */
     106    /** @note A 32bit read on this port returns the VRAM size if interface is older than VBE_DISPI_ID_CFG. */
    68107    return VBVO_PORT_READ_U32(VBE_DISPI_IOPORT_DATA);
    69108}
  • trunk/src/VBox/Devices/Graphics/DevVGA.cpp

    r70596 r71146  
    847847
    848848#ifdef CONFIG_BOCHS_VBE
     849
     850static uint32_t vbe_read_cfg(PVGASTATE pThis)
     851{
     852    const uint16_t u16Cfg = pThis->vbe_regs[VBE_DISPI_INDEX_CFG];
     853    const uint16_t u16Id = u16Cfg & VBE_DISPI_CFG_MASK_ID;
     854    const bool fQuerySupport = RT_BOOL(u16Cfg & VBE_DISPI_CFG_MASK_SUPPORT);
     855
     856    switch (u16Id)
     857    {
     858        case VBE_DISPI_CFG_ID_VERSION:
     859           return fQuerySupport ? 1 : 0;
     860        case VBE_DISPI_CFG_ID_VRAM_SIZE:
     861           return fQuerySupport ? 1 : pThis->vram_size;
     862        case VBE_DISPI_CFG_ID_3D:
     863           return fQuerySupport ? 1 : pThis->f3DEnabled;
     864        case VBE_DISPI_CFG_ID_VMSVGA:
     865           return fQuerySupport ? 1 : pThis->fVMSVGAEnabled;
     866        default:
     867           return 0; /* Not supported. */
     868    }
     869}
     870
    849871static uint32_t vbe_ioport_read_index(PVGASTATE pThis, uint32_t addr)
    850872{
     
    883905              val = 1;
    884906              break;
     907          case VBE_DISPI_INDEX_CFG:
     908              val = vbe_read_cfg(pThis);
     909              break;
    885910          default:
    886911              Assert(pThis->vbe_index < VBE_DISPI_INDEX_NB);
     
    9851010                val == VBE_DISPI_ID2 ||
    9861011                val == VBE_DISPI_ID3 ||
    987                 val == VBE_DISPI_ID4) {
     1012                val == VBE_DISPI_ID4 ||
     1013                /* VBox extensions. */
     1014                val == VBE_DISPI_ID_VBOX_VIDEO ||
     1015                val == VBE_DISPI_ID_ANYX       ||
     1016#ifdef VBOX_WITH_HGSMI
     1017                val == VBE_DISPI_ID_HGSMI      ||
     1018#endif
     1019                val == VBE_DISPI_ID_CFG)
     1020            {
    9881021                pThis->vbe_regs[pThis->vbe_index] = val;
    9891022            }
    990             if (val == VBE_DISPI_ID_VBOX_VIDEO) {
    991                 pThis->vbe_regs[pThis->vbe_index] = val;
    992             } else if (val == VBE_DISPI_ID_ANYX) {
    993                 pThis->vbe_regs[pThis->vbe_index] = val;
    994             }
    995 #ifdef VBOX_WITH_HGSMI
    996             else if (val == VBE_DISPI_ID_HGSMI) {
    997                 pThis->vbe_regs[pThis->vbe_index] = val;
    998             }
    999 #endif /* VBOX_WITH_HGSMI */
    10001023            break;
    10011024        case VBE_DISPI_INDEX_XRES:
     
    11811204#endif /* IN_RING3 */
    11821205            break;
     1206        case VBE_DISPI_INDEX_CFG:
     1207            pThis->vbe_regs[pThis->vbe_index] = val;
     1208            break;
    11831209        default:
    11841210            break;
     
    27532779    SSMR3PutU32(pSSM, pThis->bank_offset);
    27542780#ifdef CONFIG_BOCHS_VBE
    2755     SSMR3PutU8(pSSM, 1);
     2781    AssertCompile(RT_ELEMENTS(pThis->vbe_regs) < 256);
     2782    SSMR3PutU8(pSSM, (uint8_t)RT_ELEMENTS(pThis->vbe_regs));
    27562783    SSMR3PutU16(pSSM, pThis->vbe_index);
    2757     for(i = 0; i < VBE_DISPI_INDEX_NB_SAVED; i++)
     2784    for(i = 0; i < RT_ELEMENTS(pThis->vbe_regs); i++)
    27582785        SSMR3PutU16(pSSM, pThis->vbe_regs[i]);
    27592786    SSMR3PutU32(pSSM, pThis->vbe_start_addr);
     
    28012828        return VERR_SSM_DATA_UNIT_FORMAT_CHANGED;
    28022829    }
     2830
     2831    if (u8 == 1)
     2832        u8 = VBE_DISPI_INDEX_NB_SAVED; /* Used to save so many registers. */
     2833    if (u8 > RT_ELEMENTS(pThis->vbe_regs))
     2834    {
     2835        Log(("vga_load: saved %d, expected %d!!\n", u8, RT_ELEMENTS(pThis->vbe_regs)));
     2836        return VERR_SSM_DATA_UNIT_FORMAT_CHANGED;
     2837    }
     2838
    28032839    SSMR3GetU16(pSSM, &pThis->vbe_index);
    2804     for(i = 0; i < VBE_DISPI_INDEX_NB_SAVED; i++)
     2840    for(i = 0; i < (int)u8; i++)
    28052841        SSMR3GetU16(pSSM, &pThis->vbe_regs[i]);
    28062842    if (version_id <= VGA_SAVEDSTATE_VERSION_INV_VHEIGHT)
     
    30053041    Assert(PDMCritSectIsOwner(pDevIns->CTX_SUFF(pCritSectRo)));
    30063042
    3007 
    30083043#ifdef VBE_BYTEWISE_IO
    30093044    if (cb == 1)
     
    30273062    if (cb == 4)
    30283063    {
    3029         /* Quick hack for getting the vram size. */
    3030         *pu32 = pThis->vram_size;
     3064        if (pThis->vbe_regs[VBE_DISPI_INDEX_ID] == VBE_DISPI_ID_CFG)
     3065            *pu32 = vbe_ioport_read_data(pThis, Port); /* New interface. */
     3066        else
     3067            *pu32 = pThis->vram_size; /* Quick hack for getting the vram size. */
    30313068        return VINF_SUCCESS;
    30323069    }
     
    61756212#endif
    61766213                                          "SuppressNewYearSplash\0"
     6214                                          "3DEnabled\0"
    61776215                                          ))
    61786216        return PDMDEV_SET_ERROR(pDevIns, VERR_PDM_DEVINS_UNKNOWN_CFG_VALUES,
     
    62036241    AssertLogRelRCReturn(rc, rc);
    62046242    Log(("VGA: VRamSize=%#x fGCenabled=%RTbool fR0Enabled=%RTbool\n", pThis->vram_size, pThis->fGCEnabled, pThis->fR0Enabled));
     6243
     6244    rc = CFGMR3QueryBoolDef(pCfg, "3DEnabled", &pThis->f3DEnabled, false);
     6245    AssertLogRelRCReturn(rc, rc);
    62056246
    62066247#ifdef VBOX_WITH_VMSVGA
  • trunk/src/VBox/Devices/Graphics/DevVGA.h

    r70596 r71146  
    7979
    8080/* Cross reference with <VBoxVideoVBE.h> */
    81 #define VBE_DISPI_INDEX_NB_SAVED        0xb /* Number of saved registers (vbe_regs array) */
    82 #define VBE_DISPI_INDEX_NB              0xc /* Total number of VBE registers */
     81#define VBE_DISPI_INDEX_NB_SAVED        0xb /* Old number of saved registers (vbe_regs array, see vga_load) */
     82#define VBE_DISPI_INDEX_NB              0xd /* Total number of VBE registers */
    8383
    8484#define VGA_STATE_COMMON_BOCHS_VBE              \
    8585    uint16_t vbe_index;                         \
    8686    uint16_t vbe_regs[VBE_DISPI_INDEX_NB];      \
    87     uint16_t alignment[3]; /* pad to 64 bits */ \
     87    uint16_t alignment[2]; /* pad to 64 bits */ \
    8888    uint32_t vbe_start_addr;                    \
    8989    uint32_t vbe_line_offset;                   \
     
    338338    /** Whether to render the guest VRAM to the framebuffer memory. False only for some LFB modes. */
    339339    bool                        fRenderVRAM;
     340    /** Whether 3D is enabled for the VM. */
     341    bool                        f3DEnabled;
    340342# ifdef VBOX_WITH_VMSVGA
    341343    /* Whether the SVGA emulation is enabled or not. */
    342344    bool                        fVMSVGAEnabled;
     345    bool                        Padding4[0+4];
     346# else
    343347    bool                        Padding4[1+4];
    344 # else
    345     bool                        Padding4[2+4];
    346348# endif
    347349
  • trunk/src/VBox/Main/src-client/ConsoleImpl2.cpp

    r71108 r71146  
    37203720        NOREF(fHMEnabled);
    37213721#endif
     3722        BOOL f3DEnabled;
     3723        hrc = ptrMachine->COMGETTER(Accelerate3DEnabled)(&f3DEnabled);                      H();
     3724        InsertConfigInteger(pCfg,  "3DEnabled",            f3DEnabled);
    37223725
    37233726        i_attachStatusDriver(pInst, &mapCrOglLed, 0, 0, NULL, NULL, 0);
     
    37393742                pFramebuffer->Release();
    37403743            }
    3741             BOOL f3DEnabled;
    3742             hrc = ptrMachine->COMGETTER(Accelerate3DEnabled)(&f3DEnabled);                  H();
    37433744            InsertConfigInteger(pCfg, "VMSVGA3dEnabled", f3DEnabled);
    37443745#else
Note: See TracChangeset for help on using the changeset viewer.

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