VirtualBox

Changeset 53731 in vbox for trunk/src/VBox/Devices/Graphics


Ignore:
Timestamp:
Jan 4, 2015 6:52:39 AM (10 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
97509
Message:

VMSVGA3d/darwin: Some tweaks.

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

Legend:

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

    r53729 r53731  
    607607 *
    608608 * @returns true if supported, false if not.
    609  * @param   fGLVersion          The OpenGL version.
     609 * @param   fActualGLVersion    The actual OpenGL version we're working against.
     610 * @param   fMinGLVersion       The OpenGL version that introduced this feature
     611 *                              into the core.
    610612 * @param   pszWantedExtension  The name of the OpenGL extension we want.
    611613 * @remarks Init time only.
    612614 */
    613 static bool vmsvga3dCheckGLExtension(float fGLVersion, const char *pszWantedExtension)
    614 {
     615static bool vmsvga3dCheckGLExtension(float fActualGLVersion, float fMinGLVersion, const char *pszWantedExtension)
     616{
     617    bool fRet = false;
     618
    615619#if defined(RT_OS_DARWIN)
    616620    /*
    617621     * OpenGL 3.2+ core profile (glGetString(GL_EXTENSIONS) returns NULL).
     622     * It also avoids listing extensions that have been promoted into the core.
    618623     */
    619624
    620625    /* Seems like extensions are assimilated into the OpenGL core, so we do
    621626       hardcoded checks for these as per gl3.h. */
    622     if (   fGLVersion >= 3.0
    623         && (   strcmp(pszWantedExtension, "GL_ARB_framebuffer_object") == 0
    624             || strcmp(pszWantedExtension, "GL_ARB_map_buffer_range") == 0
    625             || strcmp(pszWantedExtension, "GL_ARB_vertex_array_object") == 0) )
    626         return true;
    627     if (   fGLVersion >= 3.1
    628         && (   strcmp(pszWantedExtension, "GL_ARB_copy_buffer") == 0
    629             || strcmp(pszWantedExtension, "GL_ARB_uniform_buffer_object") == 0
    630             || strcmp(pszWantedExtension, "GL_ARB_vertex_array_object") == 0) )
    631         return true;
    632     if (   fGLVersion >= 3.2
    633         && (   strcmp(pszWantedExtension, "GL_ARB_draw_elements_base_vertex") == 0
    634             || strcmp(pszWantedExtension, "GL_ARB_provoking_vertex") == 0
    635             || strcmp(pszWantedExtension, "GL_ARB_sync") == 0
    636             || strcmp(pszWantedExtension, "GL_ARB_texture_multisample") == 0) )
    637         return true;
    638     if (   fGLVersion >= 3.3
    639         && (   strcmp(pszWantedExtension, "GL_ARB_blend_func_extended") == 0
    640             || strcmp(pszWantedExtension, "GL_ARB_sampler_objects") == 0
    641             || strcmp(pszWantedExtension, "GL_ARB_explicit_attrib_location") == 0
    642             || strcmp(pszWantedExtension, "GL_ARB_occlusion_query2") == 0
    643             || strcmp(pszWantedExtension, "GL_ARB_shader_bit_encoding") == 0
    644             || strcmp(pszWantedExtension, "GL_ARB_texture_rgb10_a2ui") == 0
    645             || strcmp(pszWantedExtension, "GL_ARB_texture_swizzle") == 0
    646             || strcmp(pszWantedExtension, "GL_ARB_timer_query") == 0
    647             || strcmp(pszWantedExtension, "GL_ARB_vertex_type_2_10_10_10_rev") == 0) )
    648         return true;
    649     if (   fGLVersion >= 4.0
    650         && (   strcmp(pszWantedExtension, "GL_ARB_texture_query_lod") == 0
    651             || strcmp(pszWantedExtension, "GL_ARB_draw_indirect") == 0
    652             || strcmp(pszWantedExtension, "GL_ARB_gpu_shader5") == 0
    653             || strcmp(pszWantedExtension, "GL_ARB_gpu_shader_fp64") == 0
    654             || strcmp(pszWantedExtension, "GL_ARB_shader_subroutine") == 0
    655             || strcmp(pszWantedExtension, "GL_ARB_tessellation_shader") == 0
    656             || strcmp(pszWantedExtension, "GL_ARB_texture_buffer_object_rgb32") == 0
    657             || strcmp(pszWantedExtension, "GL_ARB_texture_cube_map_array") == 0
    658             || strcmp(pszWantedExtension, "GL_ARB_texture_gather") == 0
    659             || strcmp(pszWantedExtension, "GL_ARB_transform_feedback2") == 0
    660             || strcmp(pszWantedExtension, "GL_ARB_transform_feedback3") == 0) )
    661         return true;
    662     if (   fGLVersion >= 4.1
    663         && (   strcmp(pszWantedExtension, "GL_ARB_ES2_compatibility") == 0
    664             || strcmp(pszWantedExtension, "GL_ARB_get_program_binary") == 0
    665             || strcmp(pszWantedExtension, "GL_ARB_separate_shader_objects") == 0
    666             || strcmp(pszWantedExtension, "GL_ARB_shader_precision") == 0
    667             || strcmp(pszWantedExtension, "GL_ARB_vertex_attrib_64bit") == 0
    668             || strcmp(pszWantedExtension, "GL_ARB_viewport_array") == 0) )
    669         return true;
    670 
    671 
    672     /* Search the GL_EXTENSIONS array. */
    673     static PFNGLGETSTRINGIPROC s_pfnGlGetStringi = NULL;
    674     if (!s_pfnGlGetStringi)
    675     {
    676          s_pfnGlGetStringi = (PFNGLGETSTRINGIPROC)OGLGETPROCADDRESS("glGetStringi");
    677          AssertLogRelReturn(s_pfnGlGetStringi, false);
    678     }
    679 
    680     GLint cExtensions = 1024;
    681     VMSVGA3D_INIT_CHECKED_GL_GET_INTEGER_VALUE(GL_NUM_EXTENSIONS, &cExtensions);
    682 
    683     for (GLint idxCur = 0; idxCur < cExtensions; idxCur++)
    684     {
    685         const char *pszCur = (const char *)s_pfnGlGetStringi(GL_EXTENSIONS, idxCur);
    686         if (pszCur && !strcmp(pszCur, pszWantedExtension))
    687             return true;
    688     }
    689 
     627    if (0) { /*nothing*/ }
     628    else if (   fActualGLVersion >= 2.0
     629             && (   strcmp(pszWantedExtension, "GL_ARB_draw_buffers") == 0
     630                 || strcmp(pszWantedExtension, "GL_ARB_shader_objects") == 0 /*??*/
     631                 || strcmp(pszWantedExtension, "GL_ARB_vertex_shader") == 0 /*??*/
     632                 || strcmp(pszWantedExtension, "GL_ARB_fragment_shader") == 0 /*??*/
     633                 || strcmp(pszWantedExtension, "GL_ARB_shading_language_100") == 0 /*??*/
     634                 || strcmp(pszWantedExtension, "GL_ARB_texture_non_power_of_two") == 0
     635                 || strcmp(pszWantedExtension, "GL_ARB_point_sprite") == 0
     636                 || strcmp(pszWantedExtension, "GL_ATI_separate_stencil") == 0
     637                 || strcmp(pszWantedExtension, "GL_EXT_stencil_two_side") == 0) )
     638        fRet = true;
     639    else if (   fActualGLVersion >= 2.1
     640             && (   strcmp(pszWantedExtension, "GL_EXT_texture_sRGB") == 0
     641                 || strcmp(pszWantedExtension, "GL_ARB_pixel_buffer_object") == 0) )
     642        fRet = true;
     643    else if (   fActualGLVersion >= 3.0
     644             && (   strcmp(pszWantedExtension, "GL_ARB_framebuffer_object") == 0
     645                 || strcmp(pszWantedExtension, "GL_ARB_map_buffer_range") == 0
     646                 || strcmp(pszWantedExtension, "GL_ARB_vertex_array_object") == 0) )
     647        fRet = true;
     648    else if (   fActualGLVersion >= 3.1
     649             && (   strcmp(pszWantedExtension, "GL_ARB_copy_buffer") == 0
     650                 || strcmp(pszWantedExtension, "GL_ARB_uniform_buffer_object") == 0
     651                 || strcmp(pszWantedExtension, "GL_ARB_vertex_array_object") == 0) )
     652        fRet = true;
     653    else if (   fActualGLVersion >= 3.2
     654             && (   strcmp(pszWantedExtension, "GL_ARB_draw_elements_base_vertex") == 0
     655                 || strcmp(pszWantedExtension, "GL_ARB_vertex_array_bgra") == 0
     656                 || strcmp(pszWantedExtension, "GL_ARB_provoking_vertex") == 0
     657                 || strcmp(pszWantedExtension, "GL_ARB_seamless_cube_map") == 0
     658                 || strcmp(pszWantedExtension, "GL_ARB_fragment_coord_conventions") == 0
     659                 || strcmp(pszWantedExtension, "GL_ARB_depth_clamp") == 0
     660                 || strcmp(pszWantedExtension, "GL_ARB_sync") == 0
     661                 || strcmp(pszWantedExtension, "GL_ARB_texture_multisample") == 0) )
     662        fRet = true;
     663    else if (   fActualGLVersion >= 3.3
     664             && (   strcmp(pszWantedExtension, "GL_ARB_blend_func_extended") == 0
     665                 || strcmp(pszWantedExtension, "GL_ARB_sampler_objects") == 0
     666                 || strcmp(pszWantedExtension, "GL_ARB_explicit_attrib_location") == 0
     667                 || strcmp(pszWantedExtension, "GL_ARB_occlusion_query2") == 0
     668                 || strcmp(pszWantedExtension, "GL_ARB_shader_bit_encoding") == 0
     669                 || strcmp(pszWantedExtension, "GL_ARB_texture_rgb10_a2ui") == 0
     670                 || strcmp(pszWantedExtension, "GL_ARB_texture_swizzle") == 0
     671                 || strcmp(pszWantedExtension, "GL_ARB_timer_query") == 0
     672                 || strcmp(pszWantedExtension, "GL_ARB_vertex_type_2_10_10_10_rev") == 0) )
     673        fRet = true;
     674    else if (   fActualGLVersion >= 4.0
     675             && (   strcmp(pszWantedExtension, "GL_ARB_texture_query_lod") == 0
     676                 || strcmp(pszWantedExtension, "GL_ARB_draw_indirect") == 0
     677                 || strcmp(pszWantedExtension, "GL_ARB_gpu_shader5") == 0
     678                 || strcmp(pszWantedExtension, "GL_ARB_gpu_shader_fp64") == 0
     679                 || strcmp(pszWantedExtension, "GL_ARB_shader_subroutine") == 0
     680                 || strcmp(pszWantedExtension, "GL_ARB_tessellation_shader") == 0
     681                 || strcmp(pszWantedExtension, "GL_ARB_texture_buffer_object_rgb32") == 0
     682                 || strcmp(pszWantedExtension, "GL_ARB_texture_cube_map_array") == 0
     683                 || strcmp(pszWantedExtension, "GL_ARB_texture_gather") == 0
     684                 || strcmp(pszWantedExtension, "GL_ARB_transform_feedback2") == 0
     685                 || strcmp(pszWantedExtension, "GL_ARB_transform_feedback3") == 0) )
     686        fRet = true;
     687    else if (   fActualGLVersion >= 4.1
     688             && (   strcmp(pszWantedExtension, "GL_ARB_ES2_compatibility") == 0
     689                 || strcmp(pszWantedExtension, "GL_ARB_get_program_binary") == 0
     690                 || strcmp(pszWantedExtension, "GL_ARB_separate_shader_objects") == 0
     691                 || strcmp(pszWantedExtension, "GL_ARB_shader_precision") == 0
     692                 || strcmp(pszWantedExtension, "GL_ARB_vertex_attrib_64bit") == 0
     693                 || strcmp(pszWantedExtension, "GL_ARB_viewport_array") == 0) )
     694        fRet = true;
     695    else
     696    {
     697        /* Search the GL_EXTENSIONS array. */
     698        static PFNGLGETSTRINGIPROC s_pfnGlGetStringi = NULL;
     699        if (!s_pfnGlGetStringi)
     700        {
     701             s_pfnGlGetStringi = (PFNGLGETSTRINGIPROC)OGLGETPROCADDRESS("glGetStringi");
     702             AssertLogRelReturn(s_pfnGlGetStringi, false);
     703        }
     704
     705        GLint cExtensions = 1024;
     706        VMSVGA3D_INIT_CHECKED_GL_GET_INTEGER_VALUE(GL_NUM_EXTENSIONS, &cExtensions);
     707
     708        for (GLint idxCur = 0; idxCur < cExtensions; idxCur++)
     709        {
     710            const char *pszCur = (const char *)s_pfnGlGetStringi(GL_EXTENSIONS, idxCur);
     711            if (pszCur && !strcmp(pszCur, pszWantedExtension))
     712            {
     713                fRet = true;
     714                break;
     715            }
     716        }
     717    }
    690718#else
    691719    /*
     
    707735                 ||  pExtensionSupported[cchWantedExtension] == '\0')
    708736           )
    709             return true;
     737        {
     738            fRet = true;
     739            break;
     740        }
    710741
    711742        pExtensionSupported += cchWantedExtension;
     
    713744#endif
    714745
    715     return false;
     746    /* Temporarily.  Later start if (fMinGLVersion != 0.0 && fActualGLVersion >= fMinGLVersion) return true; */
     747    AssertMsg(fMinGLVersion == 0.0 || fRet == (fActualGLVersion >= fMinGLVersion),
     748              ("%s actual:%d min:%d\n", pszWantedExtension, (int)(fActualGLVersion * 10), (int)(fMinGLVersion * 10) ));
     749    return fRet;
    716750}
    717751
     
    736770    {
    737771        const char *pszExt = (const char *)pfnGlGetStringi(GL_EXTENSIONS, idxCur);
    738         const char *pszFmt = idxCur % 1 ? "  %s" : "\nVMSVGA3d:  %s";
     772        const char *pszFmt = idxCur % 3 ? " %-26s" : "\nVMSVGA3d:  %-26s";
    739773        LogRel((pszFmt, pszExt));
    740774    }
     
    805839    pState->fGLVersion = atof((const char *)glGetString(GL_VERSION));
    806840
    807     if (vmsvga3dCheckGLExtension(pState->fGLVersion, "GL_ARB_framebuffer_object"))
     841    if (vmsvga3dCheckGLExtension(pState->fGLVersion, 3.0, "GL_ARB_framebuffer_object"))
    808842    {
    809843        pState->ext.glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC)OGLGETPROCADDRESS("glIsRenderbuffer");
     
    870904
    871905    /* OpenGL 3.2 core */
    872     if (vmsvga3dCheckGLExtension(pState->fGLVersion, "GL_ARB_draw_elements_base_vertex"))
     906    if (vmsvga3dCheckGLExtension(pState->fGLVersion, 3.2, "GL_ARB_draw_elements_base_vertex"))
    873907    {
    874908        pState->ext.glDrawElementsBaseVertex          = (PFNGLDRAWELEMENTSBASEVERTEXPROC)OGLGETPROCADDRESS("glDrawElementsBaseVertex");
     
    879913
    880914    /* OpenGL 3.2 core */
    881     if (vmsvga3dCheckGLExtension(pState->fGLVersion, "GL_ARB_provoking_vertex"))
     915    if (vmsvga3dCheckGLExtension(pState->fGLVersion, 3.2, "GL_ARB_provoking_vertex"))
    882916    {
    883917        pState->ext.glProvokingVertex                 = (PFNGLPROVOKINGVERTEXPROC)OGLGETPROCADDRESS("glProvokingVertex");
     
    887921
    888922    /* Extension support */
    889     pState->ext.fEXT_stencil_two_side = vmsvga3dCheckGLExtension(pState->fGLVersion, "GL_EXT_stencil_two_side");
     923#ifdef RT_OS_DARWIN
     924    /** @todo OpenGL version history suggest this, verify...  */
     925    pState->ext.fEXT_stencil_two_side = vmsvga3dCheckGLExtension(pState->fGLVersion, 2.0, "GL_EXT_stencil_two_side");
     926#else
     927    pState->ext.fEXT_stencil_two_side = vmsvga3dCheckGLExtension(pState->fGLVersion, 0.0, "GL_EXT_stencil_two_side");
     928#endif
    890929
    891930    /* First set sensible defaults. */
     
    923962                                                            &pState->caps.maxVertexShaderInstructions));
    924963    }
    925     pState->caps.fS3TCSupported = vmsvga3dCheckGLExtension(pState->fGLVersion, "GL_EXT_texture_compression_s3tc");
     964    pState->caps.fS3TCSupported = vmsvga3dCheckGLExtension(pState->fGLVersion, 0.0, "GL_EXT_texture_compression_s3tc");
    926965
    927966    /* http://http://www.opengl.org/wiki/Detecting_the_Shader_Model
     
    935974     */
    936975    /** @todo: distinguish between vertex and pixel shaders??? */
    937     if (vmsvga3dCheckGLExtension(pState->fGLVersion, "GL_NV_gpu_program4"))
     976    if (vmsvga3dCheckGLExtension(pState->fGLVersion, 0.0, "GL_NV_gpu_program4"))
    938977    {
    939978        pState->caps.vertexShaderVersion   = SVGA3DVSVERSION_40;
     
    941980    }
    942981    else
    943     if (    vmsvga3dCheckGLExtension(pState->fGLVersion, "GL_NV_vertex_program3")
    944         ||  vmsvga3dCheckGLExtension(pState->fGLVersion, "GL_ARB_shader_texture_lod"))  /* Wine claims this suggests SM 3.0 support */
     982    if (    vmsvga3dCheckGLExtension(pState->fGLVersion, 0.0, "GL_NV_vertex_program3")
     983#if 0 /** @todo this is contrary to the ATI <= SM2.0. */
     984        ||  vmsvga3dCheckGLExtension(pState->fGLVersion, 0.0, "GL_ARB_shader_texture_lod")  /* Wine claims this suggests SM 3.0 support */
     985#endif
     986        )
    945987    {
    946988        pState->caps.vertexShaderVersion   = SVGA3DVSVERSION_30;
     
    948990    }
    949991    else
    950     if (vmsvga3dCheckGLExtension(pState->fGLVersion, "GL_ARB_fragment_program"))
     992    if (vmsvga3dCheckGLExtension(pState->fGLVersion, 0.0, "GL_ARB_fragment_program"))
    951993    {
    952994        pState->caps.vertexShaderVersion   = SVGA3DVSVERSION_20;
     
    9601002    }
    9611003
    962     if (!vmsvga3dCheckGLExtension(pState->fGLVersion, "GL_ARB_vertex_array_bgra"))
     1004    if (!vmsvga3dCheckGLExtension(pState->fGLVersion, 3.2, "GL_ARB_vertex_array_bgra"))
    9631005    {
    9641006        /** @todo Intel drivers don't support this extension! */
  • trunk/src/VBox/Devices/Graphics/shaderlib/directx.c

    r53728 r53731  
    20542054            check_gl_extension(gl_info, (const char *)glGetStringi(GL_EXTENSIONS, idxExt));
    20552055
     2056        if (fGLVersion >= 1.1)
     2057        {
     2058            check_gl_extension(gl_info, "GL_EXT_vertex_array");
     2059            check_gl_extension(gl_info, "GL_EXT_polygon_offset");
     2060            check_gl_extension(gl_info, "GL_EXT_blend_logic_op");
     2061            check_gl_extension(gl_info, "GL_EXT_texture");
     2062            check_gl_extension(gl_info, "GL_EXT_copy_texture");
     2063            check_gl_extension(gl_info, "GL_EXT_subtexture");
     2064            check_gl_extension(gl_info, "GL_EXT_texture_object");
     2065            check_gl_extension(gl_info, "GL_ARB_framebuffer_object");
     2066            check_gl_extension(gl_info, "GL_ARB_map_buffer_range");
     2067            check_gl_extension(gl_info, "GL_ARB_vertex_array_object");
     2068        }
     2069        if (fGLVersion >= 1.2)
     2070        {
     2071            check_gl_extension(gl_info, "EXT_texture3D");
     2072            check_gl_extension(gl_info, "EXT_bgra");
     2073            check_gl_extension(gl_info, "EXT_packed_pixels");
     2074            check_gl_extension(gl_info, "EXT_rescale_normal");
     2075            check_gl_extension(gl_info, "EXT_separate_specular_color");
     2076            check_gl_extension(gl_info, "SGIS_texture_edge_clamp");
     2077            check_gl_extension(gl_info, "SGIS_texture_lod");
     2078            check_gl_extension(gl_info, "EXT_draw_range_elements");
     2079        }
     2080        if (fGLVersion >= 1.3)
     2081        {
     2082            check_gl_extension(gl_info, "GL_ARB_texture_compression");
     2083            check_gl_extension(gl_info, "GL_ARB_texture_cube_map");
     2084            check_gl_extension(gl_info, "GL_ARB_multisample");
     2085            check_gl_extension(gl_info, "GL_ARB_multitexture");
     2086            check_gl_extension(gl_info, "GL_ARB_texture_env_add");
     2087            check_gl_extension(gl_info, "GL_ARB_texture_env_combine");
     2088            check_gl_extension(gl_info, "GL_ARB_texture_env_dot3");
     2089            check_gl_extension(gl_info, "GL_ARB_texture_border_clamp");
     2090            check_gl_extension(gl_info, "GL_ARB_transpose_matrix");
     2091        }
     2092        if (fGLVersion >= 1.5)
     2093        {
     2094            check_gl_extension(gl_info, "GL_SGIS_generate_mipmap");
     2095            /*check_gl_extension(gl_info, "GL_NV_blend_equare");*/
     2096            check_gl_extension(gl_info, "GL_ARB_depth_texture");
     2097            check_gl_extension(gl_info, "GL_ARB_shadow");
     2098            check_gl_extension(gl_info, "GL_EXT_fog_coord");
     2099            check_gl_extension(gl_info, "GL_EXT_multi_draw_arrays");
     2100            check_gl_extension(gl_info, "GL_ARB_point_parameters");
     2101            check_gl_extension(gl_info, "GL_EXT_secondary_color");
     2102            check_gl_extension(gl_info, "GL_EXT_blend_func_separate");
     2103            check_gl_extension(gl_info, "GL_EXT_stencil_wrap");
     2104            check_gl_extension(gl_info, "GL_ARB_texture_env_crossbar");
     2105            check_gl_extension(gl_info, "GL_EXT_texture_lod_bias");
     2106            check_gl_extension(gl_info, "GL_ARB_texture_mirrored_repeat");
     2107            check_gl_extension(gl_info, "GL_ARB_window_pos");
     2108        }
     2109        if (fGLVersion >= 1.6)
     2110        {
     2111            check_gl_extension(gl_info, "GL_ARB_vertex_buffer_object");
     2112            check_gl_extension(gl_info, "GL_ARB_occlusion_query");
     2113            check_gl_extension(gl_info, "GL_EXT_shadow_funcs");
     2114        }
     2115        if (fGLVersion >= 2.0)
     2116        {
     2117            check_gl_extension(gl_info, "GL_ARB_shader_objects"); /*??*/
     2118            check_gl_extension(gl_info, "GL_ARB_vertex_shader"); /*??*/
     2119            check_gl_extension(gl_info, "GL_ARB_fragment_shader"); /*??*/
     2120            check_gl_extension(gl_info, "GL_ARB_shading_language_100"); /*??*/
     2121            check_gl_extension(gl_info, "GL_ARB_draw_buffers");
     2122            check_gl_extension(gl_info, "GL_ARB_texture_non_power_of_two");
     2123            check_gl_extension(gl_info, "GL_ARB_point_sprite");
     2124            check_gl_extension(gl_info, "GL_ATI_separate_stencil");
     2125            check_gl_extension(gl_info, "GL_EXT_stencil_two_side");
     2126        }
     2127        if (fGLVersion >= 2.1)
     2128        {
     2129            check_gl_extension(gl_info, "GL_ARB_pixel_buffer_object");
     2130            check_gl_extension(gl_info, "GL_EXT_texture_sRGB");
     2131        }
     2132        if (fGLVersion >= 3.0)
     2133        {
     2134            check_gl_extension(gl_info, "GL_ARB_framebuffer_object");
     2135            check_gl_extension(gl_info, "GL_ARB_map_buffer_range");
     2136            check_gl_extension(gl_info, "GL_ARB_vertex_array_object");
     2137        }
    20562138        if (fGLVersion >= 3.0)
    20572139        {
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