docs: function createFBO(renderState) {
      m_handle = renderState.m_context.createFramebuffer();
      renderState.m_context.bindFramebuffer(vgl.GL.FRAMEBUFFER, m_handle);
  
      var colorBufferHandle, depthBufferHandle,
          colorTexture = m_fboAttachmentMap[vgl.GL.COLOR_ATTACHMENT0],
          depthTexture = m_fboAttachmentMap[vgl.GL.DEPTH_ATTACHMENT];
  
      if (!colorTexture) {
        colorBufferHandle = renderState.m_context.createRenderbuffer();
        renderState.m_context.bindRenderbuffer(vgl.GL.RENDERBUFFER, colorBufferHandle);
        renderState.m_context.renderbufferStorage(vgl.GL.RENDERBUFFER,
          vgl.GL.RGB565, m_width, m_height);
        renderState.m_context.framebufferRenderbuffer(vgl.GL.FRAMEBUFFER,
          vgl.GL.COLOR_ATTACHMENT0, vgl.GL.RENDERBUFFER, colorBufferHandle);
        m_fboAttachmentMap[vgl.COLOR_ATTACHMENT0] = colorBufferHandle;
      } else {
        updateTexture(colorTexture, renderState);
        colorTexture.bind(renderState);
        renderState.m_context.framebufferTexture2D(vgl.GL.FRAMEBUFFER,
          vgl.GL.COLOR_ATTACHMENT0, vgl.GL.TEXTURE_2D,
          colorTexture.textureHandle(), 0);
      }
  
      if (!depthTexture) {
        depthBufferHandle = vgl.GL.createRenderbuffer();
        renderState.m_context.bindRenderbuffer(vgl.GL.RENDERBUFFER, depthBufferHandle);
        renderState.m_context.renderbufferStorage(vgl.GL.RENDERBUFFER,
          vgl.GL.DEPTH_COMPONENT16, m_width, m_height);
        renderState.m_context.framebufferRenderbuffer(vgl.GL.FRAMEBUFFER,
          vgl.GL.DEPTH_ATTACHMENT, vgl.GL.RENDERBUFFER, depthBufferHandle);
        m_fboAttachmentMap[vgl.DEPTH_ATTACHMENT] = depthBufferHandle;
      } else {
        updateTexture(depthTexture, renderState);
        depthTexture.bind(renderState);
        renderState.m_context.framebufferTexture2D(vgl.GL.FRAMEBUFFER,
          vgl.GL.DEPTH_ATTACHMENT, vgl.GL.TEXTURE_2D,
          depthTexture.textureHandle(), 0);
      }
  
      m_fboCreationTime.modified();
    }