VirtualBox

Ignore:
Timestamp:
Jul 18, 2012 8:41:29 PM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
79234
Message:

wddm: autoresize, etc. fixes, more to follow..

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/common/VBoxMPCommon.h

    r38739 r42217  
    4242
    4343#ifdef VBOX_WDDM_MINIPORT
    44 void VBoxWddmInvalidateVideoModesInfo(PVBOXMP_DEVEXT pExt);
    45 PVBOXWDDM_VIDEOMODES_INFO VBoxWddmUpdateVideoModesInfo(PVBOXMP_DEVEXT pExt, PVBOXWDDM_RECOMMENDVIDPN pVidPnInfo);
     44void VBoxWddmInvalidateAllVideoModesInfos(PVBOXMP_DEVEXT pExt);
     45void VBoxWddmInvalidateVideoModesInfo(PVBOXMP_DEVEXT pExt, D3DDDI_VIDEO_PRESENT_TARGET_ID VidPnTargetId);
     46PVBOXWDDM_VIDEOMODES_INFO VBoxWddmUpdateVideoModesInfoByMask(PVBOXMP_DEVEXT pExt, uint8_t *pScreenIdMask);
     47PVBOXWDDM_VIDEOMODES_INFO VBoxWddmUpdateAllVideoModesInfos(PVBOXMP_DEVEXT pExt);
    4648NTSTATUS VBoxWddmGetModesForResolution(VIDEO_MODE_INFORMATION *pAllModes, uint32_t cAllModes, int iSearchPreferredMode,
    4749                                       const D3DKMDT_2DREGION *pResolution, VIDEO_MODE_INFORMATION * pModes,
     
    5052PVBOXWDDM_VIDEOMODES_INFO VBoxWddmGetVideoModesInfo(PVBOXMP_DEVEXT pExt, D3DDDI_VIDEO_PRESENT_TARGET_ID VidPnTargetId);
    5153bool VBoxWddmFillMode(VIDEO_MODE_INFORMATION *pInfo, D3DDDIFORMAT enmFormat, ULONG w, ULONG h);
     54bool VBoxWddmFillMode(VIDEO_MODE_INFORMATION *pInfo, D3DDDIFORMAT enmFormat, ULONG w, ULONG h);
     55void VBoxWddmAdjustMode(PVBOXMP_DEVEXT pExt, PVBOXWDDM_ADJUSTVIDEOMODE pMode);
     56void VBoxWddmAdjustModes(PVBOXMP_DEVEXT pExt, uint32_t cModes, PVBOXWDDM_ADJUSTVIDEOMODE aModes);
    5257#endif
    5358
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/common/VBoxMPVidModes.cpp

    r42128 r42217  
    10901090}
    10911091
    1092 void VBoxWddmInvalidateVideoModesInfo(PVBOXMP_DEVEXT pExt)
    1093 {
     1092void VBoxWddmInvalidateVideoModesInfo(PVBOXMP_DEVEXT pExt, D3DDDI_VIDEO_PRESENT_TARGET_ID VidPnTargetId)
     1093{
     1094    if (VidPnTargetId != D3DDDI_ID_ALL)
     1095    {
     1096        if (VidPnTargetId >= RT_ELEMENTS(g_aVBoxVideoModeInfos))
     1097        {
     1098            WARN(("VidPnTargetId (%d) must be less than (%d)", VidPnTargetId, RT_ELEMENTS(g_aVBoxVideoModeInfos)));
     1099            return;
     1100        }
     1101        g_aVBoxVideoModeInfos[VidPnTargetId].cModes = 0;
     1102        return;
     1103    }
     1104
    10941105    for (UINT i = 0; i < RT_ELEMENTS(g_aVBoxVideoModeInfos); ++i)
    10951106    {
     
    10981109}
    10991110
    1100 PVBOXWDDM_VIDEOMODES_INFO VBoxWddmUpdateVideoModesInfo(PVBOXMP_DEVEXT pExt, PVBOXWDDM_RECOMMENDVIDPN pVidPnInfo)
    1101 {
    1102     VBoxWddmInvalidateVideoModesInfo(pExt);
    1103 
    1104     if (pVidPnInfo)
    1105     {
    1106         for (UINT i = 0; i < pVidPnInfo->cScreenInfos; ++i)
    1107         {
    1108             PVBOXWDDM_RECOMMENDVIDPN_SCREEN_INFO pScreenInfo = &pVidPnInfo->aScreenInfos[i];
    1109             Assert(pScreenInfo->Id < (DWORD)VBoxCommonFromDeviceExt(pExt)->cDisplays);
    1110             if (pScreenInfo->Id < (DWORD)VBoxCommonFromDeviceExt(pExt)->cDisplays)
    1111             {
    1112                 PVBOXWDDM_VIDEOMODES_INFO pInfo = &g_aVBoxVideoModeInfos[pScreenInfo->Id];
    1113                 VIDEO_MODE_INFORMATION ModeInfo = {0};
    1114                 D3DDDIFORMAT enmFormat;
    1115                 switch (pScreenInfo->BitsPerPixel)
    1116                 {
    1117                     case 32:
    1118                         enmFormat = D3DDDIFMT_A8R8G8B8;
    1119                         break;
    1120                     case 24:
    1121                         enmFormat = D3DDDIFMT_R8G8B8;
    1122                         break;
    1123                     case 16:
    1124                         enmFormat = D3DDDIFMT_R5G6B5;
    1125                         break;
    1126                     case 8:
    1127                         enmFormat = D3DDDIFMT_P8;
    1128                         break;
    1129                     default:
    1130                         Assert(0);
    1131                         enmFormat = D3DDDIFMT_UNKNOWN;
    1132                         break;
    1133                 }
    1134                 if (enmFormat != D3DDDIFMT_UNKNOWN)
    1135                 {
    1136                     if (VBoxWddmFillMode(pExt, pScreenInfo->Id, &ModeInfo, enmFormat, pScreenInfo->Width, pScreenInfo->Height))
    1137                     {
    1138                         VBoxWddmBuildVideoModesInfo(pExt, pScreenInfo->Id, pInfo, &ModeInfo, 1);
    1139                     }
    1140                     else
    1141                     {
    1142                         Assert(0);
    1143                     }
    1144                 }
    1145             }
    1146         }
     1111void VBoxWddmInvalidateAllVideoModesInfos(PVBOXMP_DEVEXT pExt)
     1112{
     1113    VBoxWddmInvalidateVideoModesInfo(pExt, D3DDDI_ID_ALL);
     1114}
     1115
     1116PVBOXWDDM_VIDEOMODES_INFO VBoxWddmUpdateVideoModesInfoByMask(PVBOXMP_DEVEXT pExt, uint8_t *pScreenIdMask)
     1117{
     1118    for (int i = 0; i < VBoxCommonFromDeviceExt(pExt)->cDisplays; ++i)
     1119    {
     1120        if (ASMBitTest(pScreenIdMask, i))
     1121            VBoxWddmInvalidateVideoModesInfo(pExt, i);
    11471122    }
    11481123
     
    11501125    VBoxWddmGetAllVideoModesInfos(pExt);
    11511126    return g_aVBoxVideoModeInfos;
     1127}
     1128
     1129PVBOXWDDM_VIDEOMODES_INFO VBoxWddmUpdateAllVideoModesInfos(PVBOXMP_DEVEXT pExt)
     1130{
     1131    VBoxWddmInvalidateAllVideoModesInfos(pExt);
     1132
     1133    /* ensure we have all the rest populated */
     1134    VBoxWddmGetAllVideoModesInfos(pExt);
     1135    return g_aVBoxVideoModeInfos;
     1136}
     1137
     1138void VBoxWddmAdjustMode(PVBOXMP_DEVEXT pExt, PVBOXWDDM_ADJUSTVIDEOMODE pMode)
     1139{
     1140    pMode->fFlags = 0;
     1141
     1142    if (pMode->Mode.Id >= (UINT)VBoxCommonFromDeviceExt(pExt)->cDisplays)
     1143    {
     1144        WARN(("invalid screen id (%d)", pMode->Mode.Id));
     1145        pMode->fFlags = VBOXWDDM_ADJUSTVIDEOMODE_F_INVALISCREENID;
     1146        return;
     1147    }
     1148
     1149    PVBOXWDDM_TARGET pTarget = &pExt->aTargets[pMode->Mode.Id];
     1150    /* @todo: this info should go from the target actually */
     1151    PVBOXWDDM_SOURCE pSource = &pExt->aSources[pMode->Mode.Id];
     1152    if (pTarget->HeightVisible /* <- active */
     1153            && pSource->AllocData.SurfDesc.width == pMode->Mode.Width
     1154            && pSource->AllocData.SurfDesc.height == pMode->Mode.Height
     1155            && pSource->AllocData.SurfDesc.bpp == pMode->Mode.BitsPerPixel)
     1156    {
     1157        pMode->fFlags = VBOXWDDM_ADJUSTVIDEOMODE_F_CURRENT;
     1158        return;
     1159    }
     1160
     1161    UINT newWidth = pMode->Mode.Width;
     1162    UINT newHeight = pMode->Mode.Height;
     1163    UINT newBpp = pMode->Mode.BitsPerPixel;
     1164
     1165    if (!VBoxMPValidateVideoModeParams(pExt, pMode->Mode.Id, newWidth, newHeight, newBpp))
     1166    {
     1167        PVBOXWDDM_SOURCE pSource = &pExt->aSources[pMode->Mode.Id];
     1168        pMode->fFlags = VBOXWDDM_ADJUSTVIDEOMODE_F_UNSUPPORTED;
     1169    }
     1170
     1171    if (pMode->Mode.Width != newWidth
     1172            || pMode->Mode.Height != newHeight
     1173            || pMode->Mode.BitsPerPixel != newBpp)
     1174    {
     1175        pMode->fFlags |= VBOXWDDM_ADJUSTVIDEOMODE_F_ADJUSTED;
     1176        pMode->Mode.Width = newWidth;
     1177        pMode->Mode.Height = newHeight;
     1178        pMode->Mode.BitsPerPixel = newBpp;
     1179    }
     1180
     1181    if (pTarget->HeightVisible /* <- active */
     1182            && pSource->AllocData.SurfDesc.width == pMode->Mode.Width
     1183            && pSource->AllocData.SurfDesc.height == pMode->Mode.Height
     1184            && pSource->AllocData.SurfDesc.bpp == pMode->Mode.BitsPerPixel)
     1185    {
     1186        pMode->fFlags |= VBOXWDDM_ADJUSTVIDEOMODE_F_CURRENT;
     1187        if (pMode->fFlags & VBOXWDDM_ADJUSTVIDEOMODE_F_UNSUPPORTED)
     1188        {
     1189            WARN(("current mode is reported as unsupported, cleaning the unsupported flag"));
     1190            pMode->fFlags &= ~VBOXWDDM_ADJUSTVIDEOMODE_F_UNSUPPORTED;
     1191        }
     1192    }
     1193}
     1194
     1195void VBoxWddmAdjustModes(PVBOXMP_DEVEXT pExt, uint32_t cModes, PVBOXWDDM_ADJUSTVIDEOMODE aModes)
     1196{
     1197    for (UINT i = 0; i < cModes; ++i)
     1198    {
     1199        PVBOXWDDM_ADJUSTVIDEOMODE pMode = &aModes[i];
     1200        VBoxWddmAdjustMode(pExt, pMode);
     1201    }
    11521202}
    11531203
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVidPn.cpp

    r42158 r42217  
    219219    NTSTATUS Status = STATUS_SUCCESS;
    220220
    221     pVsi->VideoStandard  = D3DKMDT_VSS_VESA_DMT;
     221    pVsi->VideoStandard  = D3DKMDT_VSS_OTHER;
    222222    pVsi->ActiveSize = *pResolution;
    223223    pVsi->VSyncFreq.Numerator = VSync * 1000;
    224224    pVsi->VSyncFreq.Denominator = 1000;
    225     pVsi->TotalSize.cx = pVsi->ActiveSize.cx + VBOXVDPN_C_DISPLAY_HBLANK_SIZE;
    226     pVsi->TotalSize.cy = pVsi->ActiveSize.cy + VBOXVDPN_C_DISPLAY_VBLANK_SIZE;
     225    pVsi->TotalSize.cx = pVsi->ActiveSize.cx;// + VBOXVDPN_C_DISPLAY_HBLANK_SIZE;
     226    pVsi->TotalSize.cy = pVsi->ActiveSize.cy;// + VBOXVDPN_C_DISPLAY_VBLANK_SIZE;
    227227    pVsi->PixelRate = pVsi->TotalSize.cx * pVsi->TotalSize.cy * VSync;
    228228    pVsi->HSyncFreq.Numerator = (UINT)((pVsi->PixelRate / pVsi->TotalSize.cy) * 1000);
     
    527527    D3DKMDT_2DREGION *paResolutions;
    528528    uint32_t cResolutions;
    529     BOOLEAN fMatch;
     529    BOOLEAN fMatched;
    530530} VBOXVIDPNMATCHMONMODESENUM, *PVBOXVIDPNMATCHMONMODESENUM;
    531531
     
    535535    PVBOXVIDPNMATCHMONMODESENUM pInfo = (PVBOXVIDPNMATCHMONMODESENUM)pContext;
    536536
    537     Assert(pInfo->fMatch);
     537    Assert(pInfo->fMatched);
     538
     539    BOOLEAN fFound = FALSE;
    538540
    539541    for (UINT i = 0; i < pInfo->cResolutions; ++i)
    540542    {
    541543        D3DKMDT_2DREGION *pResolution = &pInfo->paResolutions[i];
    542         if (pMonitorSMI->VideoSignalInfo.ActiveSize.cx != pResolution->cx
    543                 || pMonitorSMI->VideoSignalInfo.ActiveSize.cy != pResolution->cy)
    544         {
    545             pInfo->fMatch = FALSE;
     544        if (pMonitorSMI->VideoSignalInfo.ActiveSize.cx == pResolution->cx
     545                && pMonitorSMI->VideoSignalInfo.ActiveSize.cy == pResolution->cy)
     546        {
     547            fFound = TRUE;
    546548            break;
    547549        }
    548550    }
    549551
     552    if (!fFound)
     553        pInfo->fMatched = FALSE;
     554
    550555    pMonitorSMSIf->pfnReleaseModeInfo(hMonitorSMS, pMonitorSMI);
    551556
    552     return pInfo->fMatch;
     557    return pInfo->fMatched;
    553558}
    554559
     
    585590    }
    586591
    587     VBOXVIDPNMATCHMONMODESENUM Info;
    588     Info.paResolutions = pResolutions;
    589     Info.cResolutions = cResolutions;
    590     Info.fMatch = TRUE;
    591 
    592     Status = vboxVidPnEnumMonitorSourceModes(hMonitorSMS, pMonitorSMSIf, vboxFidPnMatchMonitorModesEnum, &Info);
     592    /* we care only about monitor modes covering all needed resolutions,
     593     * we do NOT care if resolutions do not cover some monitor modes */
     594    SIZE_T cModes = 0;
     595    Status = pMonitorSMSIf->pfnGetNumModes(hMonitorSMS, &cModes);
    593596    if (NT_SUCCESS(Status))
    594597    {
    595         *pfMatch = Info.fMatch;
    596     }
     598        if (cModes < cResolutions)
     599            *pfMatch = FALSE;
     600        else
     601        {
     602            VBOXVIDPNMATCHMONMODESENUM Info;
     603            Info.paResolutions = pResolutions;
     604            Info.cResolutions = cResolutions;
     605            Info.fMatched = TRUE;
     606
     607            Status = vboxVidPnEnumMonitorSourceModes(hMonitorSMS, pMonitorSMSIf, vboxFidPnMatchMonitorModesEnum, &Info);
     608            if (NT_SUCCESS(Status))
     609                *pfMatch = Info.fMatched;
     610        }
     611    }
     612    else
     613        WARN(("pfnGetNumModes failed, Status 0x%x", Status));
    597614
    598615    NTSTATUS tmpStatus = pMonitorInterface->pfnReleaseMonitorSourceModeSet(pDevExt->u.primary.DxgkInterface.DeviceHandle, hMonitorSMS);
     
    12991316                    {
    13001317                        Status = vboxVidPnPopulateTargetModeInfoFromLegacy(pNewVidPnTargetModeInfo, pResolution, i == pInfo->iPreferredResolution);
    1301                         Assert(Status == STATUS_SUCCESS);
    13021318                        if (NT_SUCCESS(Status))
    13031319                        {
     
    13091325                                continue;
    13101326                            }
     1327                            else
     1328                            {
     1329                                WARN(("pfnAddMode failed, Status 0x%x", Status));
     1330                            }
     1331                        }
     1332                        else
     1333                        {
     1334                            WARN(("vboxVidPnPopulateTargetModeInfoFromLegacy failed, Status 0x%x", Status));
    13111335                        }
    13121336
     
    13141338                        Assert(tmpStatus == STATUS_SUCCESS);
    13151339                    }
     1340
    13161341                    /* we're here because of an error */
    13171342                    Assert(!NT_SUCCESS(Status));
    1318                     break;
     1343                    /* ignore mode addition failure */
     1344                    Status = STATUS_SUCCESS;
     1345                    continue;
    13191346                }
    13201347            }
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp

    r42170 r42217  
    681681
    682682        bChanged[i] = !fMatch;
    683 
    684         if (!fMatch)
    685         {
    686             Status = vboxWddmChildStatusReportReconnected(pDevExt, i);
    687             if (!NT_SUCCESS(Status))
     683    }
     684
     685    if (!NT_SUCCESS(Status))
     686    {
     687        WARN(("updating monitor modes failed, Status(0x%x)", Status));
     688        return Status;
     689    }
     690
     691    for (i = 0; i < VBoxCommonFromDeviceExt(pDevExt)->cDisplays; ++i)
     692    {
     693        if (bChanged[i])
     694        {
     695            NTSTATUS tmpStatus = vboxWddmChildStatusReportReconnected(pDevExt, i);
     696            if (!NT_SUCCESS(tmpStatus))
    688697            {
    689698                WARN(("vboxWddmChildStatusReportReconnected failed Status(0x%x)", Status));
     
    692701            }
    693702        }
    694     }
    695 
    696     if (!NT_SUCCESS(Status))
    697     {
    698         WARN(("updating monitor modes failed, Status(0x%x)", Status));
    699         return Status;
    700703    }
    701704
     
    11211124
    11221125                    VBoxMPCmnInitCustomVideoModes(pDevExt);
    1123                     VBoxWddmInvalidateVideoModesInfo(pDevExt);
     1126                    VBoxWddmInvalidateAllVideoModesInfos(pDevExt);
     1127
     1128                    pDevExt->fAnyX = VBoxVideoAnyWidthAllowed();
    11241129#if 0
    11251130                    vboxShRcTreeInit(pDevExt);
     
    41374142            case VBOXESC_REINITVIDEOMODES:
    41384143            {
    4139                 PVBOXWDDM_VIDEOMODES_INFO pInfo = VBoxWddmUpdateVideoModesInfo(pDevExt, NULL);
    4140                 Status = vboxWddmChildStatusCheck(pDevExt, pInfo);
     4144                if (pEscape->Flags.HardwareAccess)
     4145                {
     4146                    WARN(("VBOXESC_REINITVIDEOMODES called with HardwareAccess flag set, failing"));
     4147                    Status = STATUS_INVALID_PARAMETER;
     4148                    break;
     4149                }
     4150                WARN(("VBOXESC_REINITVIDEOMODESBYMASK should be called instead"));
     4151                PVBOXWDDM_VIDEOMODES_INFO pInfos = VBoxWddmUpdateAllVideoModesInfos(pDevExt);
     4152                Status = vboxWddmChildStatusCheck(pDevExt, pInfos);
    41414153                if (!NT_SUCCESS(Status))
    41424154                {
     
    41444156                }
    41454157                break;
     4158            }
     4159            case VBOXESC_REINITVIDEOMODESBYMASK:
     4160            {
     4161                BOOLEAN fCheckDisplayRecconect = (pEscapeHdr->u32CmdSpecific & VBOXWDDM_REINITVIDEOMODESBYMASK_F_RECONNECT_DISPLAYS_ON_CHANGE);
     4162                if (fCheckDisplayRecconect && pEscape->Flags.HardwareAccess)
     4163                {
     4164                    WARN(("VBOXESC_REINITVIDEOMODESBYMASK called with HardwareAccess flag set, failing"));
     4165                    Status = STATUS_INVALID_PARAMETER;
     4166                    break;
     4167                }
     4168                if (pEscape->PrivateDriverDataSize != sizeof (VBOXDISPIFESCAPE_REINITVIDEOMODESBYMASK))
     4169                {
     4170                    WARN(("invalid private driver size %d", pEscape->PrivateDriverDataSize));
     4171                    Status = STATUS_INVALID_PARAMETER;
     4172                    break;
     4173                }
     4174                PVBOXDISPIFESCAPE_REINITVIDEOMODESBYMASK pData = (PVBOXDISPIFESCAPE_REINITVIDEOMODESBYMASK)pEscapeHdr;
     4175                PVBOXWDDM_VIDEOMODES_INFO pInfos = VBoxWddmUpdateVideoModesInfoByMask(pDevExt, pData->ScreenMask);
     4176                if (fCheckDisplayRecconect)
     4177                {
     4178                    Status = vboxWddmChildStatusCheck(pDevExt, pInfos);
     4179                    if (!NT_SUCCESS(Status))
     4180                    {
     4181                        WARN(("vboxWddmChildStatusCheck failed, Status 0x%x", Status));
     4182                    }
     4183                }
     4184                break;
     4185            }
     4186            case VBOXESC_ADJUSTVIDEOMODES:
     4187            {
     4188                if (!pEscape->Flags.HardwareAccess)
     4189                {
     4190                    WARN(("VBOXESC_ADJUSTVIDEOMODES called without HardwareAccess flag set, failing"));
     4191                    Status = STATUS_INVALID_PARAMETER;
     4192                    break;
     4193                }
     4194
     4195                uint32_t cModes = pEscapeHdr->u32CmdSpecific;
     4196                if (cModes > VBOXWDDM_TRAILARRAY_MAXELEMENTSU32(VBOXDISPIFESCAPE_ADJUSTVIDEOMODES, aScreenInfos)
     4197                        || pEscape->PrivateDriverDataSize != RT_OFFSETOF(VBOXDISPIFESCAPE_ADJUSTVIDEOMODES, aScreenInfos[cModes]))
     4198                {
     4199                    WARN(("invalid modes count passed"));
     4200                    Status = STATUS_INVALID_PARAMETER;
     4201                    break;
     4202                }
     4203
     4204                PVBOXDISPIFESCAPE_ADJUSTVIDEOMODES pPodesInfo = (PVBOXDISPIFESCAPE_ADJUSTVIDEOMODES)pEscapeHdr;
     4205                VBoxWddmAdjustModes(pDevExt, cModes, pPodesInfo->aScreenInfos);
     4206                Status = STATUS_SUCCESS;
    41464207            }
    41474208            case VBOXESC_SHRC_ADDREF:
     
    43944455    PVBOXWDDM_RECOMMENDVIDPN pVidPnInfo = pRecommendFunctionalVidPnArg->PrivateDriverDataSize >= sizeof (VBOXWDDM_RECOMMENDVIDPN) ?
    43954456            (PVBOXWDDM_RECOMMENDVIDPN)pRecommendFunctionalVidPnArg->pPrivateDriverData : NULL;
    4396     PVBOXWDDM_VIDEOMODES_INFO pInfos = VBoxWddmUpdateVideoModesInfo(pDevExt, NULL /*pVidPnInfo*/);
     4457    PVBOXWDDM_VIDEOMODES_INFO pInfos = VBoxWddmUpdateAllVideoModesInfos(pDevExt);
    43974458    int i;
    43984459
     
    44104471        Status = vboxVidPnCheckAddMonitorModes(pDevExt, i, D3DKMDT_MCO_DRIVER, pInfo->aResolutions, pInfo->cResolutions, pInfo->iPreferredResolution);
    44114472#endif
    4412         Assert(Status == STATUS_SUCCESS);
    44134473        if (Status != STATUS_SUCCESS)
    44144474        {
    4415             LOGREL(("vboxVidPnCheckAddMonitorModes failed Status(0x%x)", Status));
     4475            WARN(("vboxVidPnCheckAddMonitorModes failed Status(0x%x)", Status));
    44164476            break;
    44174477        }
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