1"use strict";(globalThis.webpackChunkvrgs_docs_v_3_1=globalThis.webpackChunkvrgs_docs_v_3_1||[]).push([[2634],{61051(e,n,s){s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>c,frontMatter:()=>o,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"general/setup-system/remote-desktop-and-vms","title":"Remote Desktop and Virtual Machines","description":"Why VRGS is slow, blank or refuses to draw over Remote Desktop or in a virtual machine, how to tell which part of the graphics stack failed, and the setups that do work \u2014 including what happens to a node-locked licence on a VM.","source":"@site/docs/general/setup-system/remote-desktop-and-vms.md","sourceDirName":"general/setup-system","slug":"/general/setup-system/remote-desktop-and-vms","permalink":"/docs/next/general/setup-system/remote-desktop-and-vms","draft":false,"unlisted":false,"editUrl":"https://github.com/vrgeoscience/vrgs_docs_v3/tree/master/docs/general/setup-system/remote-desktop-and-vms.md","tags":[],"version":"current","sidebarPosition":3.6,"frontMatter":{"id":"remote-desktop-and-vms","title":"Remote Desktop and Virtual Machines","sidebar_label":"Remote Desktop & VMs","description":"Why VRGS is slow, blank or refuses to draw over Remote Desktop or in a virtual machine, how to tell which part of the graphics stack failed, and the setups that do work \u2014 including what happens to a node-locked licence on a VM.","keywords":["remote desktop","RDP","virtual machine","VM","VDI","Citrix","Azure Virtual Desktop","vGPU","GPU passthrough","software renderer","Vulkan","OpenGL","troubleshooting"],"sidebar_position":3.6},"sidebar":"docs","previous":{"title":"Why Is This Greyed Out?","permalink":"/docs/next/general/setup-system/feature-availability"},"next":{"title":"On Premises Server Setup","permalink":"/docs/next/general/setup-system/on-prem-server"}}');var r=s(74848),i=s(28453);const o={id:"remote-desktop-and-vms",title:"Remote Desktop and Virtual Machines",sidebar_label:"Remote Desktop & VMs",description:"Why VRGS is slow, blank or refuses to draw over Remote Desktop or in a virtual machine, how to tell which part of the graphics stack failed, and the setups that do work \u2014 including what happens to a node-locked licence on a VM.",keywords:["remote desktop","RDP","virtual machine","VM","VDI","Citrix","Azure Virtual Desktop","vGPU","GPU passthrough","software renderer","Vulkan","OpenGL","troubleshooting"],sidebar_position:3.6},a=void 0,l={},d=[{value:"What VRGS needs",id:"what-vrgs-needs",level:2},{value:"Find out what you actually got",id:"find-out-what-you-actually-got",level:2},{value:"Remote Desktop to a physical workstation",id:"remote-desktop-to-a-physical-workstation",level:2},{value:"1. Use a remote tool that attaches to the console session",id:"1-use-a-remote-tool-that-attaches-to-the-console-session",level:3},{value:"2. Allow the GPU into RDP sessions",id:"2-allow-the-gpu-into-rdp-sessions",level:3},{value:"3. Keep VRGS off the remote session entirely",id:"3-keep-vrgs-off-the-remote-session-entirely",level:3},{value:"Virtual machines and virtual desktops",id:"virtual-machines-and-virtual-desktops",level:2},{value:"Licensing on a VM or virtual desktop",id:"licensing-on-a-vm-or-virtual-desktop",level:2},{value:"Performance, once it works",id:"performance-once-it-works",level:2},{value:"Non-persistent desktops re-download everything",id:"non-persistent-desktops-re-download-everything",level:3},{value:"What will not work remotely, at all",id:"what-will-not-work-remotely-at-all",level:2},{value:"Working through it",id:"working-through-it",level:2},{value:"See also",id:"see-also",level:2}];function h(e){const n={a:"a",admonition:"admonition",blockquote:"blockquote",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(n.p,{children:["VRGS runs over Remote Desktop and inside virtual machines, but only when the\nsession has a ",(0,r.jsx)(n.strong,{children:"real GPU with the vendor's own driver"}),' behind it. Almost every\nreport of "VRGS will not start remotely", "the 3D view is black" or "it is\nunusably slow on our VM" comes down to the same thing: the remote session\nreplaced the graphics card with something that cannot do 3D.']}),"\n",(0,r.jsx)(n.p,{children:"This page explains how to confirm that in about a minute, and what to change."}),"\n",(0,r.jsx)(n.h2,{id:"what-vrgs-needs",children:"What VRGS needs"}),"\n",(0,r.jsx)(n.p,{children:"The 3D view is the only part that is fussy. Everything else \u2014 importing,\ninterpreting, exporting, the trees and panels \u2014 is ordinary Windows software\nand behaves normally in any remote session."}),"\n",(0,r.jsx)(n.p,{children:"The 3D view needs one of:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Vulkan 1.2"}),", with a driver that registers a Vulkan driver (an ",(0,r.jsx)(n.em,{children:"ICD"}),"), or"]}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.strong,{children:"OpenGL 4.3 (Core)"})}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"A generic display adapter provides neither. That includes the Microsoft Remote\nDisplay Adapter used by RDP, the Microsoft Basic Render Driver, and the\nsynthetic video adapters in Hyper-V, VMware and VirtualBox when no GPU has been\npassed through."}),"\n",(0,r.jsxs)(n.admonition,{title:"VRGS tries to rescue the situation on its own",type:"note",children:[(0,r.jsxs)(n.p,{children:["At startup VRGS checks whether Vulkan can actually work. If it cannot, VRGS\n",(0,r.jsx)(n.strong,{children:"falls back to OpenGL for that session"})," rather than failing. The saved setting\nis left alone, so installing a working driver restores Vulkan on the next\nlaunch. You will see this in the Messages panel:"]}),(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.code,{children:"[WARNING] Vulkan is not usable on this machine - using the OpenGL renderer for this session. Update the graphics driver to restore Vulkan."})}),"\n"]}),(0,r.jsx)(n.p,{children:"That warning is not itself a fault. It becomes one when OpenGL has no real GPU\nbehind it either \u2014 which is the usual case in a bare remote session."})]}),"\n",(0,r.jsx)(n.h2,{id:"find-out-what-you-actually-got",children:"Find out what you actually got"}),"\n",(0,r.jsx)(n.p,{children:"Do this first. It replaces all guesswork."}),"\n",(0,r.jsxs)(n.p,{children:["Open the ",(0,r.jsx)(n.strong,{children:"Messages"})," panel, or the log file at:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"%LOCALAPPDATA%\\VRGeoscience\\VRGS\\VRGSDebug.LOG\n"})}),"\n",(0,r.jsxs)(n.p,{children:["Look for the line beginning ",(0,r.jsx)(n.code,{children:"Render thread GPU:"}),". It names the vendor, the\nrenderer and the GL version the 3D view is genuinely running on."]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"What you see"}),(0,r.jsx)(n.th,{children:"What it means"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"Render thread GPU: NVIDIA Corporation | NVIDIA RTX A4000 | GL 4.6.0 NVIDIA 551.86"})}),(0,r.jsxs)(n.td,{children:["A real GPU. If VRGS is still slow, the problem is elsewhere \u2014 see ",(0,r.jsx)(n.a,{href:"/docs/next/general/setup-system/large-models",children:"Working with Large Models"}),"."]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"Render thread GPU: Microsoft Corporation | GDI Generic | GL 1.1.0"})}),(0,r.jsx)(n.td,{children:"No GPU driver in the session at all. The 3D view cannot work."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"... | Microsoft Basic Render Driver | ..."})}),(0,r.jsx)(n.td,{children:"Windows' software fallback (WARP). It renders, very slowly, and can draw incorrectly."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.code,{children:"... | llvmpipe | ..."})," or ",(0,r.jsx)(n.code,{children:"softpipe"})]}),(0,r.jsx)(n.td,{children:"A software rasteriser. Same conclusion."})]})]})]}),"\n",(0,r.jsx)(n.p,{children:"VRGS calls this out explicitly when it detects it:"}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.code,{children:"[CRITICAL] WARNING: the 3D view is running on a SOFTWARE renderer (...). Your graphics card is not being used, so 3D will be slow and may display incorrectly."})}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"These are the other lines worth searching the log for:"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Log line"}),(0,r.jsx)(n.th,{children:"Meaning"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"the Vulkan loader (vulkan-1.dll) is not installed"})}),(0,r.jsx)(n.td,{children:"No driver on the machine offers Vulkan at all."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"vkCreateInstance failed (VK_ERROR_INCOMPATIBLE_DRIVER)"})}),(0,r.jsx)(n.td,{children:"A driver is present but predates Vulkan 1.2. Update it."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"the loader is
1installed but reports no Vulkan-capable GPU (0 physical devices)"})}),(0,r.jsx)(n.td,{children:"The classic VM and Remote Desktop signature: the loader is there, a GPU is not."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"Failed to initiate an OpenGL 4.3 context"})}),(0,r.jsx)(n.td,{children:"The OpenGL fallback failed too. Nothing will render until the session has a GPU."})]})]})]}),"\n",(0,r.jsx)(n.h2,{id:"remote-desktop-to-a-physical-workstation",children:"Remote Desktop to a physical workstation"}),"\n",(0,r.jsx)(n.p,{children:"This is the most common case: the machine has a good graphics card, but VRGS\nbehaves as though it does not."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"When you connect over RDP, Windows disconnects the console session and gives\nthe remote session its own display adapter."})," The physical GPU is still in the\nmachine; your session simply is not attached to it."]}),"\n",(0,r.jsx)(n.p,{children:"Three ways out, in order of how well they work."}),"\n",(0,r.jsx)(n.h3,{id:"1-use-a-remote-tool-that-attaches-to-the-console-session",children:"1. Use a remote tool that attaches to the console session"}),"\n",(0,r.jsxs)(n.p,{children:["The most reliable fix, and the one that needs no policy changes. Tools that\nmirror or stream the ",(0,r.jsx)(n.em,{children:"existing"})," console desktop \u2014 rather than opening a new RDP\nsession \u2014 leave the real GPU driving the display, so VRGS sees it normally.\nScreen-sharing and remote-support tools, and the GPU-accelerated streaming\nprotocols sold for remote graphics work, generally behave this way."]}),"\n",(0,r.jsx)(n.admonition,{title:"A headless workstation still needs a display",type:"tip",children:(0,r.jsxs)(n.p,{children:["A machine with no monitor attached may fall back to a basic adapter even at the\nconsole. Leave a monitor connected, or fit an inexpensive ",(0,r.jsx)(n.strong,{children:"display emulator\ndongle"}),' (sometimes sold as a "headless plug"). Some GPU vendors and remote\ntools also install a virtual display driver that does the same job.']})}),"\n",(0,r.jsx)(n.h3,{id:"2-allow-the-gpu-into-rdp-sessions",children:"2. Allow the GPU into RDP sessions"}),"\n",(0,r.jsx)(n.p,{children:"On Windows Server with a GPU installed, enable:"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Computer Configuration \u2192 Administrative Templates \u2192 Windows Components \u2192\nRemote Desktop Services \u2192 Remote Desktop Session Host \u2192 Remote Session\nEnvironment \u2192 Use hardware graphics adapters for all Remote Desktop Services\nsessions"})}),"\n",(0,r.jsx)(n.p,{children:"This lets RDP sessions render on the physical adapter rather than the Microsoft\nRemote Display Adapter."}),"\n",(0,r.jsx)(n.admonition,{title:"The driver decides, not just the policy",type:"caution",children:(0,r.jsxs)(n.p,{children:["Whether OpenGL and Vulkan are actually exposed inside an RDP session depends on\nthe graphics driver. Professional workstation drivers (NVIDIA RTX professional\nand Quadro, AMD Radeon Pro) have long supported this; consumer drivers\nhistorically did not, and the behaviour has changed across driver versions. Do\nnot assume either way \u2014 connect, start VRGS, and read the ",(0,r.jsx)(n.code,{children:"Render thread GPU:"}),"\nline. It tells you what you got."]})}),"\n",(0,r.jsx)(n.h3,{id:"3-keep-vrgs-off-the-remote-session-entirely",children:"3. Keep VRGS off the remote session entirely"}),"\n",(0,r.jsx)(n.p,{children:"Where the work is genuinely interactive 3D interpretation, running VRGS locally\nagainst data on a network share is usually a better experience than any remote\nprotocol. Projects, meshes and point clouds can be opened from a mapped drive or\na UNC path."}),"\n",(0,r.jsx)(n.h2,{id:"virtual-machines-and-virtual-desktops",children:"Virtual machines and virtual desktops"}),"\n",(0,r.jsxs)(n.p,{children:["A VM works with VRGS when \u2014 and only when \u2014 a GPU has been made available to\nthe guest and the guest runs the ",(0,r.jsx)(n.strong,{children:"GPU vend
1or's driver"}),"."]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Setup"}),(0,r.jsx)(n.th,{children:"3D view"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.strong,{children:"GPU passthrough"})," (a whole PCIe card assigned to one VM)"]}),(0,r.jsx)(n.td,{children:"Works. The guest sees a normal GPU."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.strong,{children:"Partitioned vGPU"})," \u2014 NVIDIA vGPU/GRID, AMD MxGPU, Intel GVT-g"]}),(0,r.jsx)(n.td,{children:"Works, given a suitable profile and enough frame buffer. Choose a profile with the VRAM your models need."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.strong,{children:"GPU cloud instances"})," \u2014 Azure NV-series, AWS G-series, GCP GPU VMs"]}),(0,r.jsx)(n.td,{children:"Works. These present a real GPU with a real driver."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.strong,{children:"Hyper-V, VMware or VirtualBox with the default synthetic display"})}),(0,r.jsx)(n.td,{children:"Does not work. No Vulkan, no OpenGL 4.3."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.strong,{children:'The "3D acceleration" checkbox in a desktop hypervisor'})}),(0,r.jsx)(n.td,{children:"Not sufficient. These emulate an older OpenGL feature level and do not reach 4.3."})]})]})]}),"\n",(0,r.jsxs)(n.p,{children:["Two things to check on a VM that ",(0,r.jsx)(n.em,{children:"should"})," work:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"The guest has the vendor driver, not the hypervisor's basic adapter."})," In\nDevice Manager the display adapter should name the actual GPU."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"The vGPU profile has enough VRAM."})," Small profiles carve out a fraction of\nthe card. Treat the profile's frame buffer as the VRAM figure in\n",(0,r.jsx)(n.a,{href:"/docs/next/general/setup-system/hardware-requirements",children:"Hardware Requirements"}),"."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"licensing-on-a-vm-or-virtual-desktop",children:"Licensing on a VM or virtual desktop"}),"\n",(0,r.jsx)(n.p,{children:"Node-locked licences bind to the identity of the machine. A virtual machine's\nidentity is not as fixed as a physical one, which produces two recurring\nproblems:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"A cloned, re-provisioned or non-persistent VM looks like a different\nmachine."})," The licence does not follow it, and each new instance can consume\nanother activation."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Changing the virtual NIC or the VM's board serial changes the identity."}),"\nThe on-premises licence server derives its fingerprint from the CPU ID, the\nmotherboard serial number and the first MAC address, so altering any of them\nbreaks the binding."]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"What to do about it:"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Situation"}),(0,r.jsx)(n.th,{children:"Approach"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Persistent VMs, one per user"}),(0,r.jsx)(n.td,{children:"Node-locked is fine. Pin the MAC address and SMBIOS serial in the VM configuration so they survive a reboot or a migration."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Non-persistent VDI, pooled desktops"}),(0,r.jsxs)(n.td,{children:["Use ",(0,r.jsx)(n.strong,{children:"cloud-floating"}),", or an ",(0,r.jsx)(n.a,{href:"/docs/next/general/setup-system/on-prem-server",children:"on-premises RLM server"}),". Node-locked activation cannot survive a machine that is rebuilt at every logon."]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Retiring or rebuilding a VM"}),(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.strong,{children:"Deactivate first"}),": Home ribbon \u2192 Update \u2192 ",(0,r.jsx)(n.strong,{children:"License Status"})," \u2192 ",(0,r.jsx)(n.strong,{children:"Deactivate"}),". That returns the seat. Destroying the VM without deactivating leaves the activation stranded."]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Air-gapped VMs"}),(0,r.jsxs)(n.td,{children:["Offline activation works normally \u2014 see ",(0,r.jsx)(n.a,{href:"/docs/next/general/setup-system/licensing",children:"Licensing Options"}),"."]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Non-commercial site deployment from an image"}),(0,r.jsxs)(n.td,{children:["Bake the ",(0,r.jsx)(n.code,{children:"VRGS_LICENSE_KEY"})," environment variable into the image; VRGS activates itself on first launch without a prompt."]})]})]})]}),"\n",(0,r.jsxs)(n.p,{children:["If an activation is stranded on a VM you no longer have, contact\n",(0,r.jsx)(n.a,{href:"https://www.vrgeoscience.com/contact-us/",children:"VRGeoscience support"})," to have the\nseat released."]}),"\n",(0,r.jsx)(n.h2,{id:"performance-once-it-works",children:"Performance, once it works"}),"\n",(0,r.jsx)(n.p,{children:"A session with a real GPU still behaves differently from sitting at the machine."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"The 3D view is the worst case for a remote codec."})," Rotating a large model\nis full-motion video at full screen. Reducing the remote session's resolution\nhelps far more than any VRGS setting \u2014 do not run a remote session at 4K."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Latency changes how navigation feels."})," Rotation and zoom lag the mouse.\nThat is the protocol, not VRGS."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Prefer streamed over resident data on a shared GPU."})," On a vGPU profile with\na modest frame buffer, ",(0,r.jsx)(n.strong,{children:"Load Into Memory"})," on a large mesh can exhaust the\nVRAM you have been given. See\n",(0,r.jsx)(n.a,{href:"/docs/next/general/setup-system/large-models",children:"Working with Large Models"}),"."]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"non-persistent-desktops-re-download-everything",children:"Non-
1persistent desktops re-download everything"}),"\n",(0,r.jsx)(n.p,{children:"Two caches are rebuilt from scratch when a profile or an image is discarded:"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Path"}),(0,r.jsx)(n.th,{children:"Contents"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"%LOCALAPPDATA%\\VRGS\\CesiumCache\\tiles.db"})}),(0,r.jsx)(n.td,{children:"The online 3D-tile and basemap cache, roughly 1\u20132 GB"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"%ProgramData%\\VRGeoscience\\models"})}),(0,r.jsx)(n.td,{children:"Downloaded AI and machine-learning models, several GB"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:"The tile cache is per-user, so it is wiped with the profile. Redirect or persist\nit in the desktop image if your users work with online tiles; otherwise it is\nre-downloaded at every logon."}),"\n",(0,r.jsxs)(n.p,{children:["The model cache is ",(0,r.jsx)(n.strong,{children:"machine-wide by default"}),", which is the more useful of the\ntwo when building an image: download the models you need once while preparing\nthe image, and every user of that image gets them without a download. If VRGS\ncannot write to ",(0,r.jsx)(n.code,{children:"%ProgramData%"})," it falls back silently to a per-user\n",(0,r.jsx)(n.code,{children:"%LOCALAPPDATA%\\VRGeoscience\\models"}),", so check the permissions on the\n",(0,r.jsx)(n.code,{children:"%ProgramData%"})," folder if models keep being fetched again."]}),"\n",(0,r.jsx)(n.h2,{id:"what-will-not-work-remotely-at-all",children:"What will not work remotely, at all"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Feature"}),(0,r.jsx)(n.th,{children:"Why"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.strong,{children:"VR"})}),(0,r.jsx)(n.td,{children:"Needs an OpenXR headset physically attached to the machine running VRGS, plus the Vulkan renderer."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.strong,{children:"GNSS field navigation"})}),(0,r.jsxs)(n.td,{children:["Needs a receiver on a serial port on the machine \u2014 see ",(0,r.jsx)(n.a,{href:"/docs/next/general/setup-system/gnss-field-navigation",children:"GNSS Field Navigation"}),"."]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.strong,{children:"Ray-traced shadows and the path tracer"})}),(0,r.jsx)(n.td,{children:"Need a ray-tracing-capable GPU in the session. A vGPU profile may not expose ray tracing even on a card that has it."})]})]})]}),"\n",(0,r.jsx)(n.h2,{id:"working-through-it",children:"Working through it"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsxs)(n.strong,{children:["Start VRGS and read the ",(0,r.jsx)(n.code,{children:"Render thread GPU:"})," line"]})," in the Messages panel\nor in ",(0,r.jsx)(n.code,{children:"VRGSDebug.LOG"}),". If it names a real GPU, your graphics stack is fine and\nthe problem is something else."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Software renderer, or GL 1.1?"})," The session has no GPU. On RDP, use a\nconsole-attaching tool or enable the hardware-adapter policy. On a VM, arrange\npassthrough or a vGPU profile."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Real GPU, but the Vulkan warning appears?"})," The driver is too old or too\nincomplete for Vulkan 1.2. Update it. VRGS runs on OpenGL meanwhile, and\n",(0,r.jsx)(n.a,{href:"/docs/next/general/setup-system/feature-availability",children:"some features are Vulkan-only"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Need to force OpenGL deliberately?"})," Uncheck ",(0,r.jsx)(n.strong,{children:"Project Properties \u2192\nAdvanced & Diagnostics \u2192 Use Vulkan Renderer"}),", or start VRGS with ",(0,r.jsx)(n.code,{children:"-opengl"}),".\nBoth persist, and both take effect at the next launch."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Licence refused after a VM rebuild?"})," The machine identity changed \u2014 see\n",(0,r.jsx)(n.a,{href:"#licensing-on-a-vm-or-virtual-desktop",children:"Licensing on a VM or virtual desktop"}),"\nabove."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"see-also",children:"See also"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"/docs/next/general/setup-system/hardware-requirements",children:"Hardware Requirements"})," \u2014 what the machine needs, GPU included."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"/docs/next/general/setup-system/multi-gpu-systems",children:"Graphics Settings"})," \u2014 choosing the right GPU on a multi-GPU machine."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"/docs/next/general/setup-system/feature-availability",children:"Why Is This Greyed Out?"})," \u2014 including which commands need which renderer."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"/docs/next/general/setup-system/licensing",children:"Licensing Options"})," \u2014 activation, deactivation and licence types."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"/docs/next/general/setup-system/on-prem-server",children:"On Premises Server Setup"})," \u2014 floating licences behind a firewall."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"/docs/next/general/setup-system/large-models",children:"Working with Large Models"})," \u2014 performance once the GPU is working."]}),"\n"]})]})}function c(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},28453(e,n,s){s.d(n,{R:()=>o,x:()=>a});var t=s(96540);const r={},i=t.createContext(r);function o(e){const n=t.useContext(i);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.