Re: [Development] New SceneGraph related issue
Ok, that stack trace doesn't tell me much as the interesting parameters are optimized out :/ If this was a general bug, I suspect the issue would be present in a lot of places though, so my immediate reaction is to point towards the emulator :) You can compare the buffer size used in uploadBatches() to the offsets and sizes used in the renderMergedBatch() function, but from what I can see, they are all correct. There is no way to disable optimizations or use the old renderer. The new logic is here to stay. cheers, Gunnar Fra: Tomasz Olszak [olszak.tom...@gmail.com] Sendt: 12. september 2013 18:53 To: Sletta Gunnar Cc: development@qt-project.org Emne: Re: [Development] New SceneGraph related issue I got stracktrace. It is as you predicted glDrwaElements. Is there any possibility to make some kind of workaround patch to make it work on emulator (I suppose it is emulator GL issue), perhabs by turning off some optimizations and so on? I would like to add such patch to rpm emulator package until problem will be fixed. #0 0xb7fe1424 in __kernel_vsyscall () No symbol table info available. #1 0xb69a0cc1 in raise () from /lib/libc.so.6 No symbol table info available. #2 0xb69a40ee in abort () from /lib/libc.so.6 No symbol table info available. #3 0xb6999888 in __assert_fail () from /lib/libc.so.6 No symbol table info available. #4 0xb4866d2c in glGetBufferSubDataARB () from /usr/lib/host-gl/libGL.so.1.2 No symbol table info available. #5 0xb4866d62 in glGetBufferSubData () from /usr/lib/host-gl/libGL.so.1.2 No symbol table info available. #6 0xb6c20dec in glDrawElements () from /usr/lib/libGLESv2.so.1 No symbol table info available. #7 0xb7cc3096 in QSGBatchRenderer::Renderer::renderMergedBatch ( this=0x84e6800, batch=0x84e8100) at scenegraph/coreapi/qsgbatchrenderer.cpp:1863 draw = value optimized out offset = value optimized out i = value optimized out e = value optimized out __PRETTY_FUNCTION__ = void QSGBatchRenderer::Renderer::renderMergedBatch(const QSGBatchRenderer::Batch*) ---Type return to continue, or q return to quit--- sms = 0x84e5420 g = 0x84e7bbc attrNames = value optimized out gn = 0xb7fc2e5c material = value optimized out program = value optimized out #8 0xb7cc4e3f in QSGBatchRenderer::Renderer::renderBatches (this=0x84e6800) at scenegraph/coreapi/qsgbatchrenderer.cpp:2008 b = value optimized out i = value optimized out __PRETTY_FUNCTION__ = void QSGBatchRenderer::Renderer::renderBatches() renderOpaque = value optimized out renderAlpha = true #9 0xb7cc6718 in QSGBatchRenderer::Renderer::render (this=0x84e6800) at scenegraph/coreapi/qsgbatchrenderer.cpp:2168 __PRETTY_FUNCTION__ = virtual void QSGBatchRenderer::Renderer::render() #10 0xb7cd5e10 in QSGRenderer::renderScene (this=0x84e6800, bindable=...) at scenegraph/coreapi/qsgrenderer.cpp:274 profileFrames = value optimized out bindTime = 0 renderTime = 0 ---Type return to continue, or q return to quit--- __PRETTY_FUNCTION__ = void QSGRenderer::renderScene(const QSGBindable) #11 0xb7cd60dd in QSGRenderer::renderScene (this=0x84e6800) at scenegraph/coreapi/qsgrenderer.cpp:231 b = warning: RTTI symbol not found for class 'QSGRenderer::renderScene()::B' {QSGBindable = { _vptr.QSGBindable = 0xb7fb4240}, No data fields} #12 0xb7ce7e4c in QSGContext::renderNextFrame (this=0x845d620, renderer=0x84e6800, fboId=0) at scenegraph/qsgcontext.cpp:367 No locals. #13 0xb7d3273e in QQuickWindowPrivate::renderSceneGraph (this=0x848c870, size=...) at items/qquickwindow.cpp:358 _qml_memory_scope = {pushed = false} q = 0x845dc30 fboId = 0 devicePixelRatio = value optimized out #14 0xb7d0bb04 in QSGGuiThreadRenderLoop::renderWindow (this=0x8498128, window=0x845dc30) at scenegraph/qsgrenderloop.cpp:288 data = @0x8489ba4 current = value optimized out alsoSwap = true cd = 0x848c870 renderTime = 0 swapTime = value optimized out ---Type return to continue, or q return to quit--- __PRETTY_FUNCTION__ = void QSGGuiThreadRenderLoop::renderWindow(QQuickWindow*) syncTime = 0 renderTimer = {t1 = -4611697219702095867, t2 = 55969188728} profileFrames = false #15 0xb7d0c4ee in QSGGuiThreadRenderLoop::exposureChanged (this=0x8498128, window=0x845dc30) at scenegraph/qsgrenderloop.cpp:335 No locals. #16 0xb7d319be in QQuickWindow::exposeEvent (this=0x845dc30) at items/qquickwindow.cpp:214 d = value optimized out #17 0xb71f6b94 in QWindow::event(QEvent*) () from /usr/lib/libQt5Gui.so.5 No symbol table info available. #18 0xb7d3dcb4 in QQuickWindow::event (this=0x845dc30, e=0xb880) at items/qquickwindow.cpp:1241 d = value optimized out #19 0xb6ec782a
Re: [Development] New SceneGraph related issue
On Sep 11, 2013, at 11:12 PM, Tomasz Olszak olszak.tom...@gmail.com wrote: Hi, I have strange issue running most recent Qt sources on Tizen emulator (qemu i586). Also I know that there are issues with supporting HW acceleration. For example I need to export QML_BAD_GUI_RENDER_LOOP=1 because multithreaded OpenGl is a little broken there. Anyway: When I run simple Qml App (ApplicationWindow with rectangle) I get: QtHelloWorld: client_gl.c:1585: glGetBufferSubDataARB: Assertion `offset + size = buffer-size' failed. do you have the rest of the stack trace? Though I suspect it would be coming from the glDrawElements call in renderMergedBatches. Aborted (core dumped) after setting (noopaque is significant because it prevents app from crash) QSG_RENDERER_DEBUG=render,build,change,upload,rootfs,dump,noalpha,noopaque,noclip setting noopaque means for this example that you are not drawing anything, so it greatly reduces the stuff that the renderer does :) I get: Batch thresholds: nodes: 64 vertices: 1024 Using buffer strategy: static dirty: Added RootNode 0x9ba3a58 dirty= 0 ) dirty: Matrix TransformNode( 0x9ba3a90 identity dirty= 0 ) dirty: Added Node( 0x9bc79b0 dirty= 0 flags= 1 ) dirty: Added TransformNode( 0x9bc73e0 identity dirty= 0 ) Updater::updateStates() - nodes have been added - transforms have changed RootNode 0x9ba3a58 dirty= 0 ) TransformNode( 0x9ba3a90 identity dirty= 0 ) Node( 0x9bc79b0 dirty= 0 flags= 1 ) TransformNode( 0x9bc73e0 identity dirty= 0 ) Node( 0x9bc72d8 dirty= 0 flags= 1 ) TransformNode( 0x9bc7498 identity dirty= 0 ) Node( 0x9bc76c0 dirty= 0 flags= 1 ) TransformNode( 0x9bc76f0 identity dirty= 0 ) Node( 0x9bc7808 dirty= 0 flags= 1 ) GeometryNode( 0x9bc7838 strip #V: 4 #I: 4 x1= 0 y1= 0 x2= 100 y2= 100 materialtype= 0xb77093e4 ) dirty= 0 TransformNode( 0x9bc7550 identity dirty= 0 ) Node( 0x9bc77a8 dirty= 0 flags= 1 ) TransformNode( 0x9bc7608 translate 0 600 0 dirty= 0 ) Node( 0x9bc77d8 dirty= 0 flags= 1 ) Renderer::render() QSGRenderer(0x9bc6528) rebuild: full Opaque render lists (complete) : - element: 0x9bc79e0 batch: 0x0 node: GeometryNode( 0x9bc7838 strip #V: 4 #I: 4 x1= 0 y1= 0 x2= 100 y2= 100 materialtype= 0xb77093e4 ) dirty= 0 order: 1 Alpha render list: (complete) : Opaque Batches: - Batch 0 0x9bc7ff8 upload root: 0x0 - element: 0x9bc79e0 node: GeometryNode( 0x9bc7838 strip #V: 4 #I: 4 x1= 0 y1= 0 x2= 100 y2= 100 materialtype= 0xb77093e4 ) dirty= 0 1 Alpha Batches: Uploading Opaque Batches: - batch 0x9bc7ff8 first: 0x9bc79e0 root: 0x0 merged: 1 positionAttribute 0 vbo: 0 : 76 - uploading element: 0x9bc79e0 GeometryNode( 0x9bc7838 strip #V: 4 #I: 4 x1= 0 y1= 0 x2= 100 y2= 100 materialtype= 0xb77093e4 ) dirty= 0 0x9bc7e78 48 64 -- Vertex Data, count: 4 - 12 bytes/vertex --- 0: 0:(2,float * 100 0 ) 1:(4,ubyte 255 0 0 255 ) Z:(0) --- 1: 0:(2,float * 0 0 ) 1:(4,ubyte 255 0 0 255 ) Z:(0) --- 2: 0:(2,float * 100 100 ) 1:(4,ubyte 255 0 0 255 ) Z:(0) --- 3: 0:(2,float * 0 100 ) 1:(4,ubyte 255 0 0 255 ) Z:(0) -- Index Data, count: 6 --- 0 0 1 2 3 3 -- DrawSet: indexCount: 6 vertices: 0 z: 48 indices: 64 --- vertex/index buffers unmapped, batch upload completed... Uploading Alpha Batches: Rendering: - Opaque: 1 nodes in 1 batches... - Alpha: 0 nodes in 0 batches... - Breakdown of render time: preprocess=0, updates=0, binding=0, render=10, total=11 - Breakdown of frame time; sync: 0 ms render: 11 ms swap: 33 ms total: 46 ms time since last frame: 1 ms dirty: Matrix TransformNode( 0x9bc7498 identity dirty= 0 ) dirty: Matrix TransformNode( 0x9bc7608 translate 0 1280 0 dirty= 0 ) dirty: Matrix TransformNode( 0x9bc73e0 identity dirty= 0 ) dirty: Matrix TransformNode( 0x9ba3a90 identity dirty= 0 ) Updater::updateStates() - transforms have changed RootNode 0x9ba3a58 dirty= 0 ) TransformNode( 0x9ba3a90 identity dirty= 0 ) Node( 0x9bc79b0 dirty= 0 flags= 1 ) TransformNode( 0x9bc73e0 identity dirty= 0 ) Node( 0x9bc72d8 dirty= 0 flags= 1 ) TransformNode( 0x9bc7498 identity dirty= 0 ) Node( 0x9bc76c0 dirty= 0 flags= 1 ) TransformNode( 0x9bc76f0 identity dirty= 0 ) Node( 0x9bc7808 dirty= 0 flags= 1 ) GeometryNode( 0x9bc7838 strip #V: 4 #I: 4 x1= 0 y1= 0 x2= 100 y2= 100 materialtype= 0xb77093e4 ) dirty= 0 TransformNode( 0x9bc7550 identity dirty= 0 ) Node( 0x9bc77a8 dirty= 0 flags= 1 ) TransformNode( 0x9bc7608 translate 0 1280 0 dirty= 0 ) Node( 0x9bc77d8 dirty= 0 flags= 1 ) Renderer::render() QSGRenderer(0x9bc6528) rebuild: none
Re: [Development] New SceneGraph related issue
2013/9/12 Sletta Gunnar gunnar.sle...@digia.com On Sep 11, 2013, at 11:12 PM, Tomasz Olszak olszak.tom...@gmail.com wrote: Hi, I have strange issue running most recent Qt sources on Tizen emulator (qemu i586). Also I know that there are issues with supporting HW acceleration. For example I need to export QML_BAD_GUI_RENDER_LOOP=1 because multithreaded OpenGl is a little broken there. Anyway: When I run simple Qml App (ApplicationWindow with rectangle) I get: QtHelloWorld: client_gl.c:1585: glGetBufferSubDataARB: Assertion `offset + size = buffer-size' failed. do you have the rest of the stack trace? Though I suspect it would be coming from the glDrawElements call in renderMergedBatches. I will get and send the stacktrace soon, It was difficult to get because of SMACK configuration. Aborted (core dumped) after setting (noopaque is significant because it prevents app from crash) QSG_RENDERER_DEBUG=render,build,change,upload,rootfs,dump,noalpha,noopaque,noclip setting noopaque means for this example that you are not drawing anything, so it greatly reduces the stuff that the renderer does :) Ok :) Thanks. I will be back with more gdb output. -- regards / pozdrawiam, Tomasz Olszak Qt for Tizen | http://qt-project.org/wiki/Tizen Qt Certified Developer | http://qt-project.org http://linkedin.com/in/tolszak ___ Development mailing list Development@qt-project.org http://lists.qt-project.org/mailman/listinfo/development
Re: [Development] New SceneGraph related issue
I got stracktrace. It is as you predicted glDrwaElements. Is there any possibility to make some kind of workaround patch to make it work on emulator (I suppose it is emulator GL issue), perhabs by turning off some optimizations and so on? I would like to add such patch to rpm emulator package until problem will be fixed. #0 0xb7fe1424 in __kernel_vsyscall () No symbol table info available. #1 0xb69a0cc1 in raise () from /lib/libc.so.6 No symbol table info available. #2 0xb69a40ee in abort () from /lib/libc.so.6 No symbol table info available. #3 0xb6999888 in __assert_fail () from /lib/libc.so.6 No symbol table info available. #4 0xb4866d2c in glGetBufferSubDataARB () from /usr/lib/host-gl/libGL.so.1.2 No symbol table info available. #5 0xb4866d62 in glGetBufferSubData () from /usr/lib/host-gl/libGL.so.1.2 No symbol table info available. #6 0xb6c20dec in glDrawElements () from /usr/lib/libGLESv2.so.1 No symbol table info available. #7 0xb7cc3096 in QSGBatchRenderer::Renderer::renderMergedBatch ( this=0x84e6800, batch=0x84e8100) at scenegraph/coreapi/qsgbatchrenderer.cpp:1863 draw = value optimized out offset = value optimized out i = value optimized out e = value optimized out __PRETTY_FUNCTION__ = void QSGBatchRenderer::Renderer::renderMergedBatch(const QSGBatchRenderer::Batch*) ---Type return to continue, or q return to quit--- sms = 0x84e5420 g = 0x84e7bbc attrNames = value optimized out gn = 0xb7fc2e5c material = value optimized out program = value optimized out #8 0xb7cc4e3f in QSGBatchRenderer::Renderer::renderBatches (this=0x84e6800) at scenegraph/coreapi/qsgbatchrenderer.cpp:2008 b = value optimized out i = value optimized out __PRETTY_FUNCTION__ = void QSGBatchRenderer::Renderer::renderBatches() renderOpaque = value optimized out renderAlpha = true #9 0xb7cc6718 in QSGBatchRenderer::Renderer::render (this=0x84e6800) at scenegraph/coreapi/qsgbatchrenderer.cpp:2168 __PRETTY_FUNCTION__ = virtual void QSGBatchRenderer::Renderer::render() #10 0xb7cd5e10 in QSGRenderer::renderScene (this=0x84e6800, bindable=...) at scenegraph/coreapi/qsgrenderer.cpp:274 profileFrames = value optimized out bindTime = 0 renderTime = 0 ---Type return to continue, or q return to quit--- __PRETTY_FUNCTION__ = void QSGRenderer::renderScene(const QSGBindable) #11 0xb7cd60dd in QSGRenderer::renderScene (this=0x84e6800) at scenegraph/coreapi/qsgrenderer.cpp:231 b = warning: RTTI symbol not found for class 'QSGRenderer::renderScene()::B' {QSGBindable = { _vptr.QSGBindable = 0xb7fb4240}, No data fields} #12 0xb7ce7e4c in QSGContext::renderNextFrame (this=0x845d620, renderer=0x84e6800, fboId=0) at scenegraph/qsgcontext.cpp:367 No locals. #13 0xb7d3273e in QQuickWindowPrivate::renderSceneGraph (this=0x848c870, size=...) at items/qquickwindow.cpp:358 _qml_memory_scope = {pushed = false} q = 0x845dc30 fboId = 0 devicePixelRatio = value optimized out #14 0xb7d0bb04 in QSGGuiThreadRenderLoop::renderWindow (this=0x8498128, window=0x845dc30) at scenegraph/qsgrenderloop.cpp:288 data = @0x8489ba4 current = value optimized out alsoSwap = true cd = 0x848c870 renderTime = 0 swapTime = value optimized out ---Type return to continue, or q return to quit--- __PRETTY_FUNCTION__ = void QSGGuiThreadRenderLoop::renderWindow(QQuickWindow*) syncTime = 0 renderTimer = {t1 = -4611697219702095867, t2 = 55969188728} profileFrames = false #15 0xb7d0c4ee in QSGGuiThreadRenderLoop::exposureChanged (this=0x8498128, window=0x845dc30) at scenegraph/qsgrenderloop.cpp:335 No locals. #16 0xb7d319be in QQuickWindow::exposeEvent (this=0x845dc30) at items/qquickwindow.cpp:214 d = value optimized out #17 0xb71f6b94 in QWindow::event(QEvent*) () from /usr/lib/libQt5Gui.so.5 No symbol table info available. #18 0xb7d3dcb4 in QQuickWindow::event (this=0x845dc30, e=0xb880) at items/qquickwindow.cpp:1241 d = value optimized out #19 0xb6ec782a in QCoreApplicationPrivate::notify_helper (this=0x8055458, receiver=0x845dc30, event=0xb880) at kernel/qcoreapplication.cpp:986 No locals. #20 0xb6ec78cb in QCoreApplication::notify (this=0xbc80, receiver=0x845dc30, event=0xb880) at kernel/qcoreapplication.cpp:931 d = 0x8055458 __PRETTY_FUNCTION__ = virtual bool QCoreApplication::notify(QObject*, Q---Type return to continue, or q return to quit--- Event*) #21 0xb71e643b in QGuiApplication::notify(QObject*, QEvent*) () from /usr/lib/libQt5Gui.so.5 No symbol table info available. #22 0xb6ec752b in QCoreApplication::notifyInternal (this=0xbc80, receiver=0x845dc30, event=0xb880) at kernel/qcoreapplication.cpp:869 threadData = 0x80545b0 result = false
[Development] New SceneGraph related issue
Hi, I have strange issue running most recent Qt sources on Tizen emulator (qemu i586). Also I know that there are issues with supporting HW acceleration. For example I need to export QML_BAD_GUI_RENDER_LOOP=1 because multithreaded OpenGl is a little broken there. Anyway: When I run simple Qml App (ApplicationWindow with rectangle) I get: QtHelloWorld: client_gl.c:1585: glGetBufferSubDataARB: Assertion `offset + size = buffer-size' failed. Aborted (core dumped) after setting (noopaque is significant because it prevents app from crash) QSG_RENDERER_DEBUG=render,build,change,upload,rootfs,dump,noalpha,noopaque,noclip I get: Batch thresholds: nodes: 64 vertices: 1024 Using buffer strategy: static dirty: Added RootNode 0x9ba3a58 dirty= 0 ) dirty: Matrix TransformNode( 0x9ba3a90 identity dirty= 0 ) dirty: Added Node( 0x9bc79b0 dirty= 0 flags= 1 ) dirty: Added TransformNode( 0x9bc73e0 identity dirty= 0 ) Updater::updateStates() - nodes have been added - transforms have changed RootNode 0x9ba3a58 dirty= 0 ) TransformNode( 0x9ba3a90 identity dirty= 0 ) Node( 0x9bc79b0 dirty= 0 flags= 1 ) TransformNode( 0x9bc73e0 identity dirty= 0 ) Node( 0x9bc72d8 dirty= 0 flags= 1 ) TransformNode( 0x9bc7498 identity dirty= 0 ) Node( 0x9bc76c0 dirty= 0 flags= 1 ) TransformNode( 0x9bc76f0 identity dirty= 0 ) Node( 0x9bc7808 dirty= 0 flags= 1 ) GeometryNode( 0x9bc7838 strip #V: 4 #I: 4 x1= 0 y1= 0 x2= 100 y2= 100 materialtype= 0xb77093e4 ) dirty= 0 TransformNode( 0x9bc7550 identity dirty= 0 ) Node( 0x9bc77a8 dirty= 0 flags= 1 ) TransformNode( 0x9bc7608 translate 0 600 0 dirty= 0 ) Node( 0x9bc77d8 dirty= 0 flags= 1 ) Renderer::render() QSGRenderer(0x9bc6528) rebuild: full Opaque render lists (complete) : - element: 0x9bc79e0 batch: 0x0 node: GeometryNode( 0x9bc7838 strip #V: 4 #I: 4 x1= 0 y1= 0 x2= 100 y2= 100 materialtype= 0xb77093e4 ) dirty= 0 order: 1 Alpha render list: (complete) : Opaque Batches: - Batch 0 0x9bc7ff8 upload root: 0x0 - element: 0x9bc79e0 node: GeometryNode( 0x9bc7838 strip #V: 4 #I: 4 x1= 0 y1= 0 x2= 100 y2= 100 materialtype= 0xb77093e4 ) dirty= 0 1 Alpha Batches: Uploading Opaque Batches: - batch 0x9bc7ff8 first: 0x9bc79e0 root: 0x0 merged: 1 positionAttribute 0 vbo: 0 : 76 - uploading element: 0x9bc79e0 GeometryNode( 0x9bc7838 strip #V: 4 #I: 4 x1= 0 y1= 0 x2= 100 y2= 100 materialtype= 0xb77093e4 ) dirty= 0 0x9bc7e78 48 64 -- Vertex Data, count: 4 - 12 bytes/vertex --- 0: 0:(2,float * 100 0 ) 1:(4,ubyte 255 0 0 255 ) Z:(0) --- 1: 0:(2,float * 0 0 ) 1:(4,ubyte 255 0 0 255 ) Z:(0) --- 2: 0:(2,float * 100 100 ) 1:(4,ubyte 255 0 0 255 ) Z:(0) --- 3: 0:(2,float * 0 100 ) 1:(4,ubyte 255 0 0 255 ) Z:(0) -- Index Data, count: 6 --- 0 0 1 2 3 3 -- DrawSet: indexCount: 6 vertices: 0 z: 48 indices: 64 --- vertex/index buffers unmapped, batch upload completed... Uploading Alpha Batches: Rendering: - Opaque: 1 nodes in 1 batches... - Alpha: 0 nodes in 0 batches... - Breakdown of render time: preprocess=0, updates=0, binding=0, render=10, total=11 - Breakdown of frame time; sync: 0 ms render: 11 ms swap: 33 ms total: 46 ms time since last frame: 1 ms dirty: Matrix TransformNode( 0x9bc7498 identity dirty= 0 ) dirty: Matrix TransformNode( 0x9bc7608 translate 0 1280 0 dirty= 0 ) dirty: Matrix TransformNode( 0x9bc73e0 identity dirty= 0 ) dirty: Matrix TransformNode( 0x9ba3a90 identity dirty= 0 ) Updater::updateStates() - transforms have changed RootNode 0x9ba3a58 dirty= 0 ) TransformNode( 0x9ba3a90 identity dirty= 0 ) Node( 0x9bc79b0 dirty= 0 flags= 1 ) TransformNode( 0x9bc73e0 identity dirty= 0 ) Node( 0x9bc72d8 dirty= 0 flags= 1 ) TransformNode( 0x9bc7498 identity dirty= 0 ) Node( 0x9bc76c0 dirty= 0 flags= 1 ) TransformNode( 0x9bc76f0 identity dirty= 0 ) Node( 0x9bc7808 dirty= 0 flags= 1 ) GeometryNode( 0x9bc7838 strip #V: 4 #I: 4 x1= 0 y1= 0 x2= 100 y2= 100 materialtype= 0xb77093e4 ) dirty= 0 TransformNode( 0x9bc7550 identity dirty= 0 ) Node( 0x9bc77a8 dirty= 0 flags= 1 ) TransformNode( 0x9bc7608 translate 0 1280 0 dirty= 0 ) Node( 0x9bc77d8 dirty= 0 flags= 1 ) Renderer::render() QSGRenderer(0x9bc6528) rebuild: none Uploading Opaque Batches: - batch 0x9bc7ff8 first: 0x9bc79e0 root: 0x0 merged: 1 positionAttribute 0 vbo: 1 : 76 - uploading element: 0x9bc79e0 GeometryNode( 0x9bc7838 strip #V: 4 #I: 4 x1= 0 y1= 0 x2= 100 y2= 100 materialtype= 0xb77093e4 ) dirty= 0 0x9bc7e78 48 64 -- Vertex Data, count: 4 - 12 bytes/vertex --- 0: 0:(2,float * 100 0 ) 1:(4,ubyte 255 0 0 255 ) Z:(0) --- 1: 0:(2,float * 0 0 ) 1:(4,ubyte 255 0 0 255 ) Z:(0) --- 2: 0:(2,float * 100 100 ) 1:(4,ubyte 255 0 0 255 ) Z:(0) --- 3: 0:(2,float * 0