VirtualBox

Changeset 81594 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Oct 30, 2019 6:47:23 PM (5 years ago)
Author:
vboxsync
Message:

WDDM: increase the max mouse pointer size to 256x256; use the VMSVGA interface to report the pointer shape to the host.

Location:
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPTypes.h

    r80876 r81594  
    5050#define VBOXWDDM_C_PATH_LOCATION_LIST_SIZE 0xc00
    5151
     52#ifndef VBOX_WITH_MESA3D
    5253#define VBOXWDDM_C_POINTER_MAX_WIDTH  64
    5354#define VBOXWDDM_C_POINTER_MAX_HEIGHT 64
     55#else
     56#define VBOXWDDM_C_POINTER_MAX_WIDTH  256
     57#define VBOXWDDM_C_POINTER_MAX_HEIGHT 256
     58#define VBOXWDDM_C_POINTER_MAX_WIDTH_LEGACY  64
     59#define VBOXWDDM_C_POINTER_MAX_HEIGHT_LEGACY 64
     60#endif
    5461
    5562#define VBOXWDDM_POINTER_ATTRIBUTES_SIZE VBOXWDDM_ROUNDBOUND( \
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp

    r80876 r81594  
    18681868            pCaps->MaxPointerWidth  = VBOXWDDM_C_POINTER_MAX_WIDTH;
    18691869            pCaps->MaxPointerHeight = VBOXWDDM_C_POINTER_MAX_HEIGHT;
     1870#ifdef VBOX_WITH_MESA3D
     1871            if (pDevExt->enmHwType == VBOXVIDEO_HWTYPE_VBOX)
     1872            {
     1873                pCaps->MaxPointerWidth  = VBOXWDDM_C_POINTER_MAX_WIDTH_LEGACY;
     1874                pCaps->MaxPointerHeight = VBOXWDDM_C_POINTER_MAX_HEIGHT_LEGACY;
     1875            }
     1876#endif
    18701877            pCaps->PointerCaps.Value = 3; /* Monochrome , Color*/ /* MaskedColor == Value | 4, disable for now */
    18711878            if (!g_VBoxDisplayOnly)
     
    29322939}
    29332940
     2941bool vboxWddmUpdatePointerShape(PVBOXMP_DEVEXT pDevExt, PVIDEO_POINTER_ATTRIBUTES pAttrs, uint32_t cbLength)
     2942{
     2943#ifdef VBOX_WITH_MESA3D
     2944    if (pDevExt->enmHwType != VBOXVIDEO_HWTYPE_VBOX)
     2945    {
     2946        NTSTATUS Status = STATUS_SUCCESS;
     2947
     2948        /** @todo Get rid of the unnecesary en-/decode procedure (XPDM legacy). */
     2949        uint32_t fFlags = pAttrs->Enable & 0x0000FFFF;
     2950        uint32_t xHot = (pAttrs->Enable >> 16) & 0xFF;
     2951        uint32_t yHot = (pAttrs->Enable >> 24) & 0xFF;
     2952        uint32_t cWidth = pAttrs->Width;
     2953        uint32_t cHeight = pAttrs->Height;
     2954        uint32_t cbAndMask = 0;
     2955        uint32_t cbXorMask = 0;
     2956
     2957        if (fFlags & VBOX_MOUSE_POINTER_SHAPE)
     2958        {
     2959            /* Size of the pointer data: sizeof(AND mask) + sizeof(XOR mask) */
     2960            cbAndMask = ((((cWidth + 7) / 8) * cHeight + 3) & ~3);
     2961            cbXorMask = cWidth * 4 * cHeight;
     2962
     2963            /* Send the shape to the host. */
     2964            if (fFlags & VBOX_MOUSE_POINTER_ALPHA)
     2965            {
     2966                void const *pvImage = &pAttrs->Pixels[cbAndMask];
     2967                Status = GaDefineAlphaCursor(pDevExt->pGa,
     2968                                             xHot,
     2969                                             yHot,
     2970                                             cWidth,
     2971                                             cHeight,
     2972                                             pvImage,
     2973                                             cbXorMask);
     2974            }
     2975            else
     2976            {
     2977                uint32_t u32AndMaskDepth = 1;
     2978                uint32_t u32XorMaskDepth = 32;
     2979
     2980                void const *pvAndMask = &pAttrs->Pixels[0];
     2981                void const *pvXorMask = &pAttrs->Pixels[cbAndMask];
     2982                Status = GaDefineCursor(pDevExt->pGa,
     2983                                        xHot,
     2984                                        yHot,
     2985                                        cWidth,
     2986                                        cHeight,
     2987                                        u32AndMaskDepth,
     2988                                        u32XorMaskDepth,
     2989                                        pvAndMask,
     2990                                        cbAndMask,
     2991                                        pvXorMask,
     2992                                        cbXorMask);
     2993            }
     2994        }
     2995
     2996        /** @todo Hack: Use the legacy interface to handle visibility.
     2997         * Eventually the VMSVGA WDDM driver should use the SVGA_FIFO_CURSOR_* interface.
     2998         */
     2999        VIDEO_POINTER_ATTRIBUTES attrs;
     3000        RT_ZERO(attrs);
     3001        attrs.Enable = pAttrs->Enable & VBOX_MOUSE_POINTER_VISIBLE;
     3002        if (!VBoxMPCmnUpdatePointerShape(VBoxCommonFromDeviceExt(pDevExt), &attrs, sizeof(attrs)))
     3003        {
     3004            Status = STATUS_INVALID_PARAMETER;
     3005        }
     3006
     3007        return Status == STATUS_SUCCESS;
     3008    }
     3009#endif
     3010
     3011    /* VBOXVIDEO_HWTYPE_VBOX */
     3012    return VBoxMPCmnUpdatePointerShape(VBoxCommonFromDeviceExt(pDevExt), pAttrs, cbLength);
     3013}
     3014
    29343015static void vboxWddmHostPointerEnable(PVBOXMP_DEVEXT pDevExt, BOOLEAN fEnable)
    29353016{
     
    29403021        PointerAttributes.Enable = VBOX_MOUSE_POINTER_VISIBLE;
    29413022    }
    2942     VBoxMPCmnUpdatePointerShape(VBoxCommonFromDeviceExt(pDevExt), &PointerAttributes, sizeof(PointerAttributes));
     3023    vboxWddmUpdatePointerShape(pDevExt, &PointerAttributes, sizeof(PointerAttributes));
    29433024}
    29443025
     
    29853066        if (fScreenChanged)
    29863067        {
    2987             BOOLEAN bResult = VBoxMPCmnUpdatePointerShape(VBoxCommonFromDeviceExt(pDevExt), &pPointerInfo->Attributes.data, VBOXWDDM_POINTER_ATTRIBUTES_SIZE);
     3068            BOOLEAN bResult = vboxWddmUpdatePointerShape(pDevExt, &pPointerInfo->Attributes.data, VBOXWDDM_POINTER_ATTRIBUTES_SIZE);
    29883069            if (!bResult)
    29893070            {
     
    30233104        {
    30243105            pDevExt->PointerInfo.iLastReportedScreen = pSetPointerShape->VidPnSourceId;
    3025             if (VBoxMPCmnUpdatePointerShape(VBoxCommonFromDeviceExt(pDevExt), &pPointerInfo->Attributes.data, VBOXWDDM_POINTER_ATTRIBUTES_SIZE))
     3106            if (vboxWddmUpdatePointerShape(pDevExt, &pPointerInfo->Attributes.data, VBOXWDDM_POINTER_ATTRIBUTES_SIZE))
    30263107                Status = STATUS_SUCCESS;
    30273108            else
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/gallium/Svga.cpp

    r76790 r81594  
    10141014}
    10151015
     1016NTSTATUS SvgaGenDefineCursor(PVBOXWDDM_EXT_VMSVGA pSvga,
     1017                             uint32_t u32HotspotX, uint32_t u32HotspotY, uint32_t u32Width, uint32_t u32Height,
     1018                             uint32_t u32AndMaskDepth, uint32_t u32XorMaskDepth,
     1019                             void const *pvAndMask, uint32_t cbAndMask, void const *pvXorMask, uint32_t cbXorMask,
     1020                             void *pvDst,
     1021                             uint32_t cbDst,
     1022                             uint32_t *pcbOut)
     1023{
     1024    RT_NOREF(pSvga);
     1025
     1026    const uint32_t cbCmd =   sizeof(uint32_t)
     1027                           + sizeof(SVGAFifoCmdDefineCursor)
     1028                           + cbAndMask
     1029                           + cbXorMask;
     1030
     1031    const uint32_t cbRequired = cbCmd;
     1032    if (pcbOut)
     1033    {
     1034        *pcbOut = cbRequired;
     1035    }
     1036
     1037    if (cbDst < cbRequired)
     1038    {
     1039        return STATUS_BUFFER_OVERFLOW;
     1040    }
     1041
     1042    SvgaCmdDefineCursor(pvDst, u32HotspotX, u32HotspotY, u32Width, u32Height,
     1043                        u32AndMaskDepth, u32XorMaskDepth,
     1044                        pvAndMask, cbAndMask, pvXorMask, cbXorMask);
     1045
     1046    return STATUS_SUCCESS;
     1047}
     1048
     1049NTSTATUS SvgaDefineCursor(PVBOXWDDM_EXT_VMSVGA pSvga,
     1050                          uint32_t u32HotspotX, uint32_t u32HotspotY, uint32_t u32Width, uint32_t u32Height,
     1051                          uint32_t u32AndMaskDepth, uint32_t u32XorMaskDepth,
     1052                          void const *pvAndMask, uint32_t cbAndMask, void const *pvXorMask, uint32_t cbXorMask)
     1053{
     1054    NTSTATUS Status = STATUS_SUCCESS;
     1055
     1056    uint32_t cbSubmit = 0;
     1057    SvgaGenDefineCursor(pSvga,
     1058                        u32HotspotX, u32HotspotY, u32Width, u32Height,
     1059                        u32AndMaskDepth, u32XorMaskDepth,
     1060                        pvAndMask, cbAndMask, pvXorMask, cbXorMask,
     1061                        NULL, 0, &cbSubmit);
     1062
     1063    void *pvCmd = SvgaFifoReserve(pSvga, cbSubmit);
     1064    if (pvCmd)
     1065    {
     1066        Status = SvgaGenDefineCursor(pSvga,
     1067                                     u32HotspotX, u32HotspotY, u32Width, u32Height,
     1068                                     u32AndMaskDepth, u32XorMaskDepth,
     1069                                     pvAndMask, cbAndMask, pvXorMask, cbXorMask,
     1070                                     pvCmd, cbSubmit, NULL);
     1071        Assert(Status == STATUS_SUCCESS);
     1072        SvgaFifoCommit(pSvga, cbSubmit);
     1073    }
     1074    else
     1075    {
     1076        Status = STATUS_INSUFFICIENT_RESOURCES;
     1077    }
     1078
     1079    return Status;
     1080}
     1081
     1082NTSTATUS SvgaGenDefineAlphaCursor(PVBOXWDDM_EXT_VMSVGA pSvga,
     1083                                  uint32_t u32HotspotX, uint32_t u32HotspotY, uint32_t u32Width, uint32_t u32Height,
     1084                                  void const *pvImage, uint32_t cbImage,
     1085                                  void *pvDst,
     1086                                  uint32_t cbDst,
     1087                                  uint32_t *pcbOut)
     1088{
     1089    RT_NOREF(pSvga);
     1090
     1091    const uint32_t cbCmd =   sizeof(uint32_t)
     1092                           + sizeof(SVGAFifoCmdDefineAlphaCursor)
     1093                           + cbImage;
     1094
     1095    const uint32_t cbRequired = cbCmd;
     1096    if (pcbOut)
     1097    {
     1098        *pcbOut = cbRequired;
     1099    }
     1100
     1101    if (cbDst < cbRequired)
     1102    {
     1103        return STATUS_BUFFER_OVERFLOW;
     1104    }
     1105
     1106    SvgaCmdDefineAlphaCursor(pvDst, u32HotspotX, u32HotspotY, u32Width, u32Height,
     1107                             pvImage, cbImage);
     1108
     1109    return STATUS_SUCCESS;
     1110}
     1111
     1112NTSTATUS SvgaDefineAlphaCursor(PVBOXWDDM_EXT_VMSVGA pSvga,
     1113                               uint32_t u32HotspotX, uint32_t u32HotspotY, uint32_t u32Width, uint32_t u32Height,
     1114                               void const *pvImage, uint32_t cbImage)
     1115{
     1116    NTSTATUS Status = STATUS_SUCCESS;
     1117
     1118    uint32_t cbSubmit = 0;
     1119    SvgaGenDefineAlphaCursor(pSvga,
     1120                             u32HotspotX, u32HotspotY, u32Width, u32Height,
     1121                             pvImage, cbImage,
     1122                             NULL, 0, &cbSubmit);
     1123
     1124    void *pvCmd = SvgaFifoReserve(pSvga, cbSubmit);
     1125    if (pvCmd)
     1126    {
     1127        Status = SvgaGenDefineAlphaCursor(pSvga,
     1128                                          u32HotspotX, u32HotspotY, u32Width, u32Height,
     1129                                          pvImage, cbImage,
     1130                                          pvCmd, cbSubmit, NULL);
     1131        Assert(Status == STATUS_SUCCESS);
     1132        SvgaFifoCommit(pSvga, cbSubmit);
     1133    }
     1134    else
     1135    {
     1136        Status = STATUS_INSUFFICIENT_RESOURCES;
     1137    }
     1138
     1139    return Status;
     1140}
     1141
     1142
    10161143NTSTATUS SvgaGenDefineGMRFB(PVBOXWDDM_EXT_VMSVGA pSvga,
    10171144                            uint32_t u32Offset,
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/gallium/Svga.h

    r76790 r81594  
    269269                    uint32_t u32Height);
    270270
     271NTSTATUS SvgaDefineCursor(PVBOXWDDM_EXT_VMSVGA pSvga,
     272                          uint32_t u32HotspotX,
     273                          uint32_t u32HotspotY,
     274                          uint32_t u32Width,
     275                          uint32_t u32Height,
     276                          uint32_t u32AndMaskDepth,
     277                          uint32_t u32XorMaskDepth,
     278                          void const *pvAndMask,
     279                          uint32_t cbAndMask,
     280                          void const *pvXorMask,
     281                          uint32_t cbXorMask);
     282
     283NTSTATUS SvgaDefineAlphaCursor(PVBOXWDDM_EXT_VMSVGA pSvga,
     284                               uint32_t u32HotspotX,
     285                               uint32_t u32HotspotY,
     286                               uint32_t u32Width,
     287                               uint32_t u32Height,
     288                               void const *pvImage,
     289                               uint32_t cbImage);
     290
    271291NTSTATUS SvgaGenDefineGMRFB(PVBOXWDDM_EXT_VMSVGA pSvga,
    272292                            uint32_t u32Offset,
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/gallium/SvgaCmd.cpp

    r76553 r81594  
    7373}
    7474
     75void SvgaCmdDefineCursor(void *pvCmd, uint32_t u32HotspotX, uint32_t u32HotspotY, uint32_t u32Width, uint32_t u32Height,
     76                         uint32_t u32AndMaskDepth, uint32_t u32XorMaskDepth,
     77                         void const *pvAndMask, uint32_t cbAndMask, void const *pvXorMask, uint32_t cbXorMask)
     78{
     79    uint32_t *pu32Id = (uint32_t *)pvCmd;
     80    SVGAFifoCmdDefineCursor *pCommand = (SVGAFifoCmdDefineCursor *)&pu32Id[1];
     81
     82    *pu32Id = SVGA_CMD_DEFINE_CURSOR;
     83
     84    pCommand->id = 0;
     85    pCommand->hotspotX = u32HotspotX;
     86    pCommand->hotspotY = u32HotspotY;
     87    pCommand->width = u32Width;
     88    pCommand->height = u32Height;
     89    pCommand->andMaskDepth = u32AndMaskDepth;
     90    pCommand->xorMaskDepth = u32XorMaskDepth;
     91
     92    uint8_t *pu8AndMask = (uint8_t *)&pCommand[1];
     93    memcpy(pu8AndMask, pvAndMask, cbAndMask);
     94
     95    uint8_t *pu8XorMask = pu8AndMask + cbAndMask;
     96    memcpy(pu8XorMask, pvXorMask, cbXorMask);
     97}
     98
     99void SvgaCmdDefineAlphaCursor(void *pvCmd, uint32_t u32HotspotX, uint32_t u32HotspotY, uint32_t u32Width, uint32_t u32Height,
     100                              void const *pvImage, uint32_t cbImage)
     101{
     102    uint32_t *pu32Id = (uint32_t *)pvCmd;
     103    SVGAFifoCmdDefineAlphaCursor *pCommand = (SVGAFifoCmdDefineAlphaCursor *)&pu32Id[1];
     104
     105    *pu32Id = SVGA_CMD_DEFINE_ALPHA_CURSOR;
     106
     107    pCommand->id = 0;
     108    pCommand->hotspotX = u32HotspotX;
     109    pCommand->hotspotY = u32HotspotY;
     110    pCommand->width = u32Width;
     111    pCommand->height = u32Height;
     112
     113    uint8_t *pu8Image = (uint8_t *)&pCommand[1];
     114    memcpy(pu8Image, pvImage, cbImage);
     115}
     116
    75117void SvgaCmdFence(void *pvCmd, uint32_t u32Fence)
    76118{
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/gallium/SvgaCmd.h

    r76563 r81594  
    2929void SvgaCmdDestroyScreen(void *pvCmd, uint32_t u32Id);
    3030void SvgaCmdUpdate(void *pvCmd, uint32_t u32X, uint32_t u32Y, uint32_t u32Width, uint32_t u32Height);
     31void SvgaCmdDefineCursor(void *pvCmd, uint32_t u32HotspotX, uint32_t u32HotspotY, uint32_t u32Width, uint32_t u32Height,
     32                         uint32_t u32AndMaskDepth, uint32_t u32XorMaskDepth,
     33                         void const *pvAndMask, uint32_t cbAndMask, void const *pvXorMask, uint32_t cbXorMask);
     34void SvgaCmdDefineAlphaCursor(void *pvCmd, uint32_t u32HotspotX, uint32_t u32HotspotY, uint32_t u32Width, uint32_t u32Height,
     35                              void const *pvImage, uint32_t cbImage);
    3136void SvgaCmdFence(void *pvCmd, uint32_t u32Fence);
    3237void SvgaCmdDefineGMRFB(void *pvCmd, uint32_t u32Offset, uint32_t u32BytesPerLine);
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/gallium/VBoxMPGaWddm.cpp

    r80422 r81594  
    193193    VBOXWDDM_EXT_VMSVGA *pSvga = pGaDevExt->hw.pSvga;
    194194    return SvgaUpdate(pSvga, u32X, u32Y, u32Width, u32Height);
     195}
     196
     197NTSTATUS GaDefineCursor(PVBOXWDDM_EXT_GA pGaDevExt,
     198                        uint32_t u32HotspotX,
     199                        uint32_t u32HotspotY,
     200                        uint32_t u32Width,
     201                        uint32_t u32Height,
     202                        uint32_t u32AndMaskDepth,
     203                        uint32_t u32XorMaskDepth,
     204                        void const *pvAndMask,
     205                        uint32_t cbAndMask,
     206                        void const *pvXorMask,
     207                        uint32_t cbXorMask)
     208{
     209    VBOXWDDM_EXT_VMSVGA *pSvga = pGaDevExt->hw.pSvga;
     210    return SvgaDefineCursor(pSvga, u32HotspotX, u32HotspotY, u32Width, u32Height,
     211                            u32AndMaskDepth, u32XorMaskDepth,
     212                            pvAndMask, cbAndMask, pvXorMask, cbXorMask);
     213}
     214
     215NTSTATUS GaDefineAlphaCursor(PVBOXWDDM_EXT_GA pGaDevExt,
     216                             uint32_t u32HotspotX,
     217                             uint32_t u32HotspotY,
     218                             uint32_t u32Width,
     219                             uint32_t u32Height,
     220                             void const *pvImage,
     221                             uint32_t cbImage)
     222{
     223    VBOXWDDM_EXT_VMSVGA *pSvga = pGaDevExt->hw.pSvga;
     224    return SvgaDefineAlphaCursor(pSvga, u32HotspotX, u32HotspotY, u32Width, u32Height,
     225                                 pvImage, cbImage);
    195226}
    196227
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/gallium/VBoxMPGaWddm.h

    r76790 r81594  
    5858                  uint32_t u32Height);
    5959
     60NTSTATUS GaDefineCursor(PVBOXWDDM_EXT_GA pGaDevExt,
     61                        uint32_t u32HotspotX,
     62                        uint32_t u32HotspotY,
     63                        uint32_t u32Width,
     64                        uint32_t u32Height,
     65                        uint32_t u32AndMaskDepth,
     66                        uint32_t u32XorMaskDepth,
     67                        void const *pvAndMask,
     68                        uint32_t cbAndMask,
     69                        void const *pvXorMask,
     70                        uint32_t cbXorMask);
     71
     72NTSTATUS GaDefineAlphaCursor(PVBOXWDDM_EXT_GA pGaDevExt,
     73                             uint32_t u32HotspotX,
     74                             uint32_t u32HotspotY,
     75                             uint32_t u32Width,
     76                             uint32_t u32Height,
     77                             void const *pvImage,
     78                             uint32_t cbImage);
     79
    6080NTSTATUS APIENTRY GaDxgkDdiBuildPagingBuffer(const HANDLE hAdapter,
    6181                                             DXGKARG_BUILDPAGINGBUFFER *pBuildPagingBuffer);
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