VMWare 中的 JOGL - 未看到纹理更新

JOGL inside VMWare - texture updates not seen

我有一段代码在 Windows 7 native 或 Ubuntu 16.04 native 下运行良好,但是在带有 vmwgfx 的 VMPlayer 6 中使用 Ubuntu 16.04 它不会更新,除非你移动 window。在所有 3 种情况下完全相同的代码。

节点这是旧的 JOGL 1

代码

public class JoglTest2 {

    public static class JoglPanel extends GLJPanel {
        public JoglPanel() {
            addGLEventListener(new EventListener());
            new FPSAnimator(this, 10).start();
        }
    }

    public static class EventListener implements GLEventListener {

        private int textureData;
        int width = 100;
        int height = 200;
        private int clock;

        @Override
        public void display(GLAutoDrawable drawable) {
            GL gl = drawable.getGL();

            gl.glClear(GL.GL_COLOR_BUFFER_BIT);
            gl.glLoadIdentity();

            gl.glClearColor(0.5f, 0, 0.5f, 1);

            gl.glActiveTexture(GL.GL_TEXTURE0);
            gl.glEnable(GL.GL_TEXTURE_2D);
            gl.glBindTexture(GL.GL_TEXTURE_2D, this.textureData);

            int[] data = new int[width];
            for (int x = 0; x < width; x++) {
                int red = (x + clock) % 255;
                int green = 0;
                int blue = 127;
                data[x] = 255 | (blue << 8) | (green << 16) | (red << 24);
            }
            clock++;
            IntBuffer dataBuffer = IntBuffer.wrap(data);
            gl.glTexSubImage2D(GL.GL_TEXTURE_2D, 0, 0, (clock % height), width, 1, GL.GL_RGBA,
                    GL.GL_UNSIGNED_INT_8_8_8_8, dataBuffer);

            gl.glBegin(GL.GL_QUADS);
            gl.glTexCoord2f(0f, 0f);
            gl.glVertex2f(-1.0f, -1.0f);
            gl.glTexCoord2f(0f, 1.0f);
            gl.glVertex2f(-1.0f, 1.0f);
            gl.glTexCoord2f(1.0f, 1.0f);
            gl.glVertex2f(1.0f, 1.0f);
            gl.glTexCoord2f(1.0f, 0);
            gl.glVertex2f(1.f, -1.0f);
            gl.glEnd();
        }

        @Override
        public void displayChanged(GLAutoDrawable arg0, boolean arg1, boolean arg2) {
        }

        @Override
        public void init(GLAutoDrawable drawable) {
            GL gl = drawable.getGL();
            final int[] tmp = new int[1];
            gl.glGenTextures(1, tmp, 0);
            textureData = tmp[0];

            int[] data = new int[width * height];
            IntBuffer dataBuffer = IntBuffer.wrap(data);
            gl.glActiveTexture(GL.GL_TEXTURE0);
            gl.glBindTexture(GL.GL_TEXTURE_2D, this.textureData);
            gl.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA, width, height, 0, GL.GL_RGBA, GL.GL_UNSIGNED_INT_8_8_8_8,
                    dataBuffer);
            gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER,
                    GL.GL_LINEAR);
            gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER,
                    GL.GL_LINEAR);
            gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_S,
                    GL.GL_CLAMP_TO_EDGE);
            gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_T,
                    GL.GL_CLAMP_TO_EDGE);

            int shaderId = gl.glCreateShader(GL.GL_FRAGMENT_SHADER);
            final String[] strs = {             "uniform sampler2D inputTexture;\n"+
                    "void main(void) {\n" +
                    "   gl_FragColor = texture2D(inputTexture, gl_TexCoord[0].st);\n" +
                    "}\n"
            };
            gl.glShaderSource(shaderId, strs.length, strs, (int[]) null, 0);

            gl.glCompileShader(shaderId);
            int progId = gl.glCreateProgram();
            gl.glAttachShader(progId, shaderId);
            gl.glLinkProgram(progId);

            int uniformInputTexture = gl.glGetUniformLocation(progId, "inputTexture");
            gl.glUseProgram(progId);
            gl.glUniform1i(uniformInputTexture, 0);

        }

        @Override
        public void reshape(GLAutoDrawable arg0, int arg1, int arg2, int arg3, int arg4) {
        }

    }

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.getContentPane().setLayout(new BorderLayout());
        frame.getContentPane().add(new JoglPanel());
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setSize(200, 200);
        frame.setVisible(true);
    }
}

Windows

Ubuntu VMWare 中的 16.04

我花了很多时间查看有关如何执行此操作的指南,但在 Linux 中找不到导致它失败的问题。其他 OpenGL 应用程序、glxgears 等工作正常...

glxinfo | grep -i opengl
OpenGL vendor string: VMware, Inc.
OpenGL renderer string: Gallium 0.4 on SVGA3D; build: RELEASE;  LLVM;
OpenGL version string: 2.1 Mesa 11.2.0
OpenGL shading language version string: 1.20
OpenGL extensions:
OpenGL ES profile version string: OpenGL ES 2.0 Mesa 11.2.0
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 1.0.16
OpenGL ES profile extensions:

唯一的转发方式是将现有代码迁移到JOGL2。在这种情况下,它在 VMWare 中按预期执行。移植到 JOGL2 相当简单。