3

I am trying to generate a large image using WebGL and Xvfb.

When the WebGL canvas size is up to 8192x8192px - it's working great and I get my image.
When the WebGL canvas size is larger than 8192x8192px - it's not generating my image.

Script is being run on a Xvfb display with Mesa drivers 10.1.3 on Ubuntu 14.04 on a digital ocean VPS.

I suspect that I can't get my large image because it exceeds GL_MAX_TEXTURE_SIZE limit (it is 8192). Seems like this limit was raised to 16k in Mesa 7.10 but I don't know why it's still 8k for me with Mesa 10.1.3.

How can I raise GL_MAX_TEXTURE_SIZE from 8192 to 16384?

Here is some additional info:

$> nohup Xvfb :99 -ac -screen 0 10000x10000x24 &

$> DISPLAY=:99 glxinfo -l | grep GL_MAX_TEXTURE_SIZE
GL_MAX_TEXTURE_SIZE = 8192

$> DISPLAY=:99 glxinfo -l | grep Mesa
OpenGL version string: 2.1 Mesa 10.1.3

Here are some packages I have installed:

$> apt list --installed | grep mesa
libgl1-mesa-dev/trusty-updates,now 10.1.3-0ubuntu0.6 amd64 [installed]
libgl1-mesa-dri/trusty-updates,now 10.1.3-0ubuntu0.6 amd64 [installed]
libgl1-mesa-glx/trusty-updates,now 10.1.3-0ubuntu0.6 amd64 [installed,automatic]
libglapi-mesa/trusty-updates,now 10.1.3-0ubuntu0.6 amd64 [installed,automatic]
libglu1-mesa/trusty,now 9.0.0-2 amd64 [installed,automatic]
libglu1-mesa-dev/trusty,now 9.0.0-2 amd64 [installed]
mesa-common-dev/trusty-updates,now 10.1.3-0ubuntu0.6 amd64 [installed,automatic]
mesa-utils/trusty,now 8.1.0-2 amd64 [installed]

$> apt list --installed | grep gl
gir1.2-glib-2.0/trusty-updates,now 1.40.0-1ubuntu0.2 amd64 [installed]
libclass-singleton-perl/trusty,now 1.4-1 all [installed,automatic]
libdbus-glib-1-2/trusty,now 0.100.2-1 amd64 [installed]
libgl1-mesa-dev/trusty-updates,now 10.1.3-0ubuntu0.6 amd64 [installed]
libgl1-mesa-dri/trusty-updates,now 10.1.3-0ubuntu0.6 amd64 [installed]
libgl1-mesa-glx/trusty-updates,now 10.1.3-0ubuntu0.6 amd64 [installed,automatic]
libglapi-mesa/trusty-updates,now 10.1.3-0ubuntu0.6 amd64 [installed,automatic]
libglew-dev/trusty,now 1.10.0-3 amd64 [installed]
libglew1.10/trusty,now 1.10.0-3 amd64 [installed,automatic]
libglib2.0-0/trusty-updates,now 2.40.2-0ubuntu1 amd64 [installed]
libglib2.0-data/trusty-updates,now 2.40.2-0ubuntu1 all [installed]
libglu1-mesa/trusty,now 9.0.0-2 amd64 [installed,automatic]
libglu1-mesa-dev/trusty,now 9.0.0-2 amd64 [installed]
libxcb-glx0/trusty,now 1.10-2ubuntu1 amd64 [installed,automatic]
libxcb-glx0-dev/trusty,now 1.10-2ubuntu1 amd64 [installed,automatic]
node-glob/trusty,now 3.2.6-1 all [installed,automatic]
x11proto-gl-dev/trusty,now 1.4.17-1 all [installed,automatic]

I am running an example script from headless-gl combined with pngjs to output a red square png:

// test.js

var PNG = require('pngjs').PNG
//Create context
var width   = 64
var height  = 64
var gl = require('gl')(width, height, { preserveDrawingBuffer: true })

//Clear screen to red
gl.clearColor(1, 0, 0, 1)
gl.clear(gl.COLOR_BUFFER_BIT)

function glToPNGStream(gl) {
  const png = new PNG({ width, height })

  let a
  let b
  let g
  let k
  let m
  let r
  const pixels = new Uint8Array(4 * width * height)
  gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixels)
  for (let j = 0; j < height; j++) {
    for (let i = 0; i < width; i++) {
      k = j * width + i
      r = pixels[4 * k]
      g = pixels[4 * k + 1]
      b = pixels[4 * k + 2]
      a = pixels[4 * k + 3]
      m = (height - j + 1) * width + i
      png.data[4 * m] = r
      png.data[4 * m + 1] = g
      png.data[4 * m + 2] = b
      png.data[4 * m + 3] = a
    }
  }
  return png.pack()
}

glToPNGStream(gl).pipe(process.stdout)
genpfault
  • 51,148
  • 11
  • 85
  • 139
Karlis Bikis
  • 73
  • 1
  • 5

2 Answers2

0

Unless it's a software implementation, you cannot increase the maximum texture size of your implementation. For hardware OpenGL implementations, that is defined by what the hardware allows, so it's not changing.

The increase you're talking about is in Mesa's software OpenGL rasterizer. For hardware drivers, it'll use what the GPU provides.

Nicol Bolas
  • 449,505
  • 63
  • 781
  • 982
0

Xdummy has GL_MAX_TEXTURE_SIZE = 16384 and is usually a drop-in replacement for Xvfb so you could switch to using that.

totaam
  • 1,306
  • 14
  • 25