devsh-graphics-programming / nabla Goto Github PK
View Code? Open in Web Editor NEWVulkan, OptiX and CUDA Interoperation Modular Rendering Library and Framework for PC/Linux/Android
Home Page: http://devsh.eu
License: Apache License 2.0
Vulkan, OptiX and CUDA Interoperation Modular Rendering Library and Framework for PC/Linux/Android
Home Page: http://devsh.eu
License: Apache License 2.0
Prevent Double Loads of assets caused by multiple threads deciding to load an asset because all have queried the asset cache before either was done loading
Assets should have a lock which should prevent read-accesses while an asset is being modified, and more than one thread/fiber modifying an asset.
There is a possibility of a double load of an asset occuring if following events occur in this order:
Because the Cache is a multimap, both assets which are identical sit in the cache. This order of events is not the only one that produces the bug, other orders such as 123465, 123546, 132456, etc. will result in this problem.
Improve the Readers-Writers Lock in FW_Mutex to be more in line with std::recursive_lock APIs, at least the reading lock should be able to be recursive (writer lock not so much).
There should be an explicit method to:
If writer lock has not been acquired then all the mutators of IAsset
should assert
.
However const-qualified
functions should acquire the reader lock implicitly.
We need to improve our cache container to be able to take "reservations" for keys, that is:
This might require a readers/writers lock, and/or sempahores/condition variables.
We need to analyze this design for the possibility of dead-locks because assets are DAGs and during the process of loading a single thread could put down multiple reservations.
Upgrade the example so it matches the new APIs
Use shared memory and nbl_glsl_workgroupInclusiveAdd
to have fast and easy Prefix Sums of entire rows/columns.
Do multiple box blurs in single dispatch.
Follow the style of examples of ext::FFT
and ext::Tonemapper
.
Old discussions buildaworldnet/IrrlichtBAW#70
The aim is to facilitate the packing of meshe vertex and index data into IGPUBuffers
.
The vertex data will use "programmable fetching"/"programmable pulling" as opposed to the hardware vertex inputs of MeshPackerV1
, while maintaining the use of a hardware index buffer (for vertex pre and post transform cache).
This will allow us to pack all meshes together, not just certain subsets who's vertex formats match.
Common functionality should be factored out into MeshPackerBase
to service both V1 and V2, especially the triangle "meshlet"/"cluster" division algorithm referenced in buildaworldnet/IrrlichtBAW#535
Multiple meshes need to be made to use the same pipeline in order to be feasible to be used with Multi Draw Indirect.
Attempting to leverage hardware vertex inputs leads to an NP-complete packing problem because we need to divide meshes into subsets that are compatible with each other.
This is why we skip hardware inputs (when you provide a pipeline to the user for the packed meshes, it shall have 0 vertex input attributes or bindings).
Same allocate
, optional shrink
and then commit
pattern should be followed.
Factor out the vertex data de-interleaving and conversion from other triangle topologies to TRIANGLE_LIST, from MeshPackerV1
into a common base.
Use a GeneralPurposeAllocator to allocate space for deinterleaved vertex data freely, now there are no constraints on the splitting of the buffer intro parts imposed by baseVertex
(in V2 it should be 0 because vertex inputs wont be used).
The only constraint now is that alignment=sizeof(dataType)
, so 16 bit index buffer needs allocation alignment of 2 bytes, R8G8B8A8_UNORM
vertex data needs alignment of 4 bytes, while R32G32B32A32_SFLOAT
needs alignment of 16 bytes.
Data which cannot be fetched from an SSBO (mostly 24bit formats) or a UTB/STB shall not be supported (either convert of error out when allocating a mesh.
The user has a choice of either overriding their vertex fetching from
layout(location = X) in vec3 vPos;
void main()
{
vec3 pos = vPos;
...
}
to either
// aliasing, all SSBO declarations map to the same descriptor in the descriptor set
layout(set = Y, binding = X) readonly buffer MeshPackedDataAsVec4
{
vec4 vertexData[];
} asVec4;
layout(set = Y, binding = X) readonly buffer MeshPackedDataAsUvec2
{
uvec2 vertexData[];
} asUvec2;
// could be an SSBO instead of UBO
layout(set = Y, binding = Z) uniform VertexDataOffsetTable
{
int dataOffsetTable[];
} vertexPosition;
void main()
{
vec3 pos = asVec4.vertexData[gl_VertexIndex+vertexPosition.dataOffsetTable[gl_DrawID]];
...
}
or
// no aliasing, extra descriptor bindings get used, but user gets "automagical" format conversions from UTB
// NOTE: `gsamplerBuffer` and `texelFetch` could be replaced with `gimageBuffer` and `imageRead` respectively for STB
layout(set = Y, binding = X+0) uniform samplerBuffer MeshPackedDataRGB32_SFLOAT;
layout(set = Y, binding = X+1) uniform usamplerBuffer MeshPackedDataRGBA16_UNORM;
// could be an SSBO instead of UBO
layout(set = Y, binding = Z) uniform VertexDataOffsetTable
{
int dataOffsetTable[];
} vertexPosition;
void main()
{
vec3 pos = texelFetch(MeshPackedDataRGB32_SFLOAT,int(gl_VertexIndex)+vertexPosition.dataOffsetTable[gl_DrawID]).xyz;
...
}
In all the above cases, its the user's responsability (outside the scope of the mesh packer):
We should probably define vec3 nbl_getVertexPosition(in uint vertexID)
in all builtin shaders (MTL, default, Mitsuba, etc.), as well as vec3 nbl_getVertexNormal(in uint vertexID)
and vec2 nbl_getUVCoordinate_X(in uint vertexID)
(X
denoting some number). This paired with appropriate macro guards (DEFINED
and DECLARED
) would be to facilitate easier overloads, like the overloads we currently allow for nbl_computeLighting
or nbl_bsdf_cos_eval
. The above GLSL example doesn't have the override mechanism demonstrated.
Feel free to ask any more questions.
Reads from bad pointers
Start ex 22 with the staircase scene, Continue when NBL_DEBUG_BREAK_IF
is triggered because of unsupported XML tags.
After taking a while, the program will crash.
No crashing, same visuals as RelWithDebInfo
raytracing
Since engine utilises glsl in many places, I suggest switch to glm instead of own math library. Advantage is that lots of optimisations already done and tested in that library, and when you decide go mobile it will be ready to use and optimised.
Values returned by nbl_glsl_workgroupExclusiveMin
are shifted by one place to the right,
so, result[0] = identity
, result[1] = identity
, and result[2]
is what result[1]
should have been and so on..
Need to be able to importance sample an envmap.
Most discussed in buildaworldnet/IrrlichtBAW#494
No idea if we should do column choice followed by row choice or some sort of hierarchical descent (quadtree / BSP style).
IAsset
and eliminate a possible "double load" bugSAssetBundle
hold the metadata, not the IAsset
Assets should have a lock which should prevent read-accesses while an asset is being modified, and more than one thread/fiber modifying an asset.
There is a possibility of a double load of an asset occuring if following events occur in this order:
Because the Cache is a multimap, both assets which are identical sit in the cache. This order of events is not the only one that produces the bug, other orders such as 123465, 123546, 132456, etc. will result in this problem.
Right now we have needless asset duplication if we want to convey different metadata with an asset that is 100% content ideantical, this especially impacts pipelines such as those returned by the MTL loader.
This results in unnecessary clone
calls and multiple assets in the associative CPU2GPU cache, as well as multiple GPU objects which introduce many state changes.
The original design wanted the flexibility of attaching specific purpose metadata to each object in the DAG (especially pipelines for shader inputs and meshes for instancing data), however it has become evident that most of the time we're having many DAG objects point to the same metadata objects and a global metadata object would achieve everything we have so far (even specific metadata to IAsset in the DAG pairings).
Improve the Readers-Writers Lock in FW_Mutex to be more in line with std::recursive_lock APIs, at least the reading lock should be able to be recursive (writer lock not so much).
There should be an explicit method to:
If writer lock has not been acquired then all the mutators of IAsset
should assert
.
However const-qualified
functions should acquire the reader lock implicitly.
We need to improve our cache container to be able to take "reservations" for keys, that is:
This might require a readers/writers lock, and/or sempahores/condition variables.
We need to analyze this design for the possibility of dead-locks because assets are DAGs and during the process of loading a single thread could put down multiple reservations.
Rename IAssetMetadata
to IAssetBundleMetadata
, remove it from the IAsset
but add it to SAssetBundle
.
Pipeline and Mesh specific metadata can be rephrased and recreated in the context of global metadata objects (have the global metadata keep maps of simple structs, etc.).
Simplify the whole system so there's only one global metadata type per loader.
Initialization:
Simulation:
Figure out what the !"£% is this for and if its Nvidia only (if it is then !"£% it):
https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VkPipelineCoverageModulationStateCreateInfoNV.html
https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VkPipelineCoverageToColorStateCreateInfoNV.html
reduction modes:
https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VkCoverageReductionModeNV.html
just the array of locations:
https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VkSampleLocationEXT.html
just the stuff about the grid, the sample per pixel count you can derive (I guess)
https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VkSampleLocationsInfoEXT.html
Need to test Wayland window and Wayland EGL surface. For it, EGL functions must be loaded from .so (test this as well if this is working correctly -- see src/nbl/video/CEGLCaller.h
). To be able to use Wayland, one has to choose to run Wayland session while logging into Linux.
Tests should happen on Intel GPU, since Nvidia apparently doesnt support Wayland: https://forums.developer.nvidia.com/t/how-do-i-run-wayland-on-nvidia-geforce-rtx-2070/157870 (it's (almost?) impossible to run Wayland session on NV drivers)
Use my vulkan
branch. Best to ask me about specific commit to checkout for tests (the branch is continuosly used for development). Make sure to uncomment what was commented out in this commit Crisspl@16b83e7 and uncomment #define _NBL_TEST_WAYLAND
in include/nbl/core/compile_config.h
.
daily_pt.xml
raygen.comp
and closestHit.comp
nbl::system
to be able to download textures and meshes over HTTP/URLcommit
on GPU Virtual Texture and Virtual GeometryAn example:
struct ScanPushConstants
{
uint stride;
uint element_count_pass;
uint element_count_total;
};
struct SortPushConstants
{
uint shift;
uint element_count_total;
};
layout(push_constant) uniform PushConstants
{
layout (offset = 0) ScanPushConstants params_scan;
layout (offset = 12) SortPushConstants params_sort;
} pc;
SortPushConstants::shift
and SortPushConstants::element_count_total
gets the same values as first two members of ScanPushConstants
if you just put everything into one block like following, it works perfectly, with the same C++ code
layout(push_constant) uniform PushConstants
{
layout (offset = 0) uint scan_stride;
layout (offset = 4) uint scan_element_count_pass;
layout (offset = 8) uint scan_element_count_total;
layout (offset = 12) uint sort_shift;
layout (offset = 16) uint sort_element_count_total;
} pc;
C++ code in question,
const asset::SPushConstantRange pc_range[2] =
{
{ asset::ISpecializedShader::ESS_COMPUTE, 0u, sizeof(ScanPushConstants) },
{ asset::ISpecializedShader::ESS_COMPUTE, 12u, sizeof(SortPushConstants) },
};
auto pipeline_layout = driver->createGPUPipelineLayout(pc_range, pc_range + 2u, std::move(scan_ds_layout), std::move(sort_ds_layout));
..
driver->pushConstants(pipeline_layout.get(), asset::ISpecializedShader::ESS_COMPUTE, pc_range[0].offset, pc_range[0].size, &scan_pc);
driver->pushConstants(pipeline_layout.get(), asset::ISpecializedShader::ESS_COMPUTE, pc_range[1].offset, pc_range[1].size, &sort_pc);
This branch could be cloned and build to reproduce the bug
Here is a Renderdoc capture
Following could be related:
This article covers the functionality of the Steam Input API.
The Steam Input API is designed to allow you to easily enable full support for Steam Input devices (I assume that the device list hasn't been updated in a while because there is no PS5 controller listed, which is 100% supported) in your game. Let's go over some concepts of the API.
Steam Input Configurator (SIC) is an intermediate layer, built into the client that translates the input, passed by the input device into the output, defined by the user, depending on the SIC mode.
SIC supports two modes of translation: legacy and native.
Legacy Mode is the compatability mode, designed for games that do not implement the steam input API. In this case SIC just translates one physical input into some other physical input (e.g. X key -> Alt key). This mode works on any supported input device.
Legacy mode is great, but it has several drawbacks. One of them is that the game doesn't know about the existance of SIC, it just receives raw physical input, so it's hard to match up the on-screen glyphs.
In Native Mode, the game receives input data from the controller in the form of actions (so the game does not receive the action like "Button X was pressed, but the action "Jump""). In this case the game has no idea about what "buttons" are pressed by the controller. All the configuration is managed by the SIC. That being said, the game can also receive from the SIC the info about what key was actually triggered (this is done for the on-screen glyphs like "Press the X button).
The Steam Input API (SIAPI) is the API that allows developers communicate with the SIC in Native Mode. Players can set up fully customized input mappings for any game in their library, using native mode, legacy mode, or even a mix of both. These input mappings are called "controller configurations" and a player can make many different ones for a single game, as well as share them with other players online.
The API doesn't necessarily support Legacy Mode.
What Steam Input can do:
What Steam Input cannot do:
How do you get events from the gamepad:
Is there a way to send custom events to the controler:
Does SteamInput syphon events on its own or do i pump them myself?
Still need to figure some things out, but it requires a thorough search through docs, so i'll postpone it till monday.
we could consider using this one instead of current libjpeg
WIP
To be done on Crisspl's vulkan
branch
Stuff currently in the io
namespace and other things which shall be in the system namespace:
https://github.com/Crisspl/Nabla/blob/vulkan/include/IFileSystem.h
https://github.com/Crisspl/Nabla/blob/vulkan/include/IFileList.h
https://github.com/Crisspl/Nabla/blob/vulkan/include/IFileArchive.h
~~ https://github.com/Crisspl/Nabla/blob/vulkan/include/ILogger.h [rewrite to use string_view
, customize the output channel, dont make it a global etc.] ~~
https://github.com/Crisspl/Nabla/blob/vulkan/include/path.h [all functionality to be deleted]
https://github.com/Crisspl/Nabla/blob/vulkan/include/IrrlichtDevice.h#L69 [yield and sleep need to be deleted]
https://github.com/Crisspl/Nabla/blob/vulkan/include/IrrlichtDevice.h#L96 [logger and OS operator need to move]
https://github.com/Crisspl/Nabla/blob/vulkan/include/IrrlichtDevice.h#L110 [timer needs a rewrite]
https://github.com/Crisspl/Nabla/blob/vulkan/include/IOSOperator.h
https://github.com/Crisspl/Nabla/blob/vulkan/include/ITimer.h [timer needs a rewrite]
Got rewritten Can stay as-is right now, but candidate for rewrite in the future (stays in the include
directory, does not move to nbl/system
)
https://github.com/Crisspl/Nabla/blob/vulkan/include/IReadFile.h
https://github.com/Crisspl/Nabla/blob/vulkan/include/IWriteFile.h
Zauwazylismy drugi problem z @criss , mianowicie ze jakis tam loader byc moze bedzie musial zrobic inspekcje dependent asseta (np. popatrzec w pixele tekstury, introspectowac shader, extrakcja info z descriptor seta) ktora wymaga aby ten asset nie byl dummy.
Problem taki ze nie mozna poprostu zrobic wszystkiego speculatively CPU_PERSISTENT bo mielibysmy ten sam problem co w IrrlichtBaW, tzn. ze wszystkie dane co moglyby byc GPU-only siedza na CPU jako kopie i zabieraja RAM.
Dlatego zrobilismy funckje restoreFrom dla kazdego asseta.
Wtedy "access to dependent asset required not to be a dummy, which is not builtin and IMMUTABLE, workflow" wyglada tak:
A przedtem wygladal tak:
P.S. Useful to solve alongside #50
The ballot hack doesnt seem to work (infinite loop)
Get an AMD GPU.
It should work
It probably also affects Intel
CLEAN, LEADR or any of the other techniques to be implemented as an IImageFilter based off the Mip-Mapping/Convolution filter.
Basically filter normals, derive a new roughness.
Get the thing compiling on ARM.
Nabla doesn't compile on ARM, which precludes it from running on the Nintendo Switch, Apple M1 based macs, iOS, Android and the Pi5.
Debug a lot and trap unaligned memory accesses.
Rewrite the math lib to something that can compile GLSL code and uses both SSE4.2, AVX,AVX2, and NEON
Widen the Android abi filter to arm64-v8a
and x86_64
.
Also make Nabla compile on ARM-linux.
Use C++17 filesystem for all the path and folder stuff.
An old pseudo-code idea snippet: buildaworldnet/IrrlichtBAW#7 (comment)
Generate a mip-map of a single channel texture to a two channel texture using Min-Max operators
Implement raymarching which takes into account the pixel footprint, etc. to properly allocate tracing budget.
Initial idea was to just have a .basis
texture loader, but now KTX2 has it!
buildaworldnet/IrrlichtBAW#342
Pimp our KTX loader to support KTX2 and Binomial's Basis-U
It would be useful to know what hardware exactly we're aiming to support and have some CI for it.
We should have a clear cutoff point for hardware, and acquire the old hardware for our CI farm.
Public:
WebGL will not be supported.
Free but Private (extension/branch available to licensed developers):
OS: latest 10
CPU: Anything with SSE4.2
GPU:
OS: Anything with GCC 8.x
CPU: Anything with SSE4.2 (maybe ARM as well at some point in the future)
GPU:
OS: Android API level 28
CPU: x86_64 first, then 64bit ARM
GPU:
Everything as Android, except the only API available is OpenGL ES 3.1 with requirement for OES_texture_view
OS: High Sierra and newer
CPU: x86_64 first, then M1/M2 as well
GPU:
The requirement for AMD GCN architecture excludes the first Mac Mini, most of the 3rd gen Macbook Pro lineup and most of the pre-2017 iMac models with Radeon Graphics.
Yes you can now congratulate yourself for buying a literal $6000 trashcan.
SoC: A11 and above
Right now cmd buffer records commands into an std::vector
making little use of the command pool's memory blocks except for placing variable length arguments into it, it also uses the GeneralpurposeAddressAllocator which is the most robust but also the slowest.
Furthermore it records the OpenGL commands' arguments it would like to perform, but leaves out the state caching to the state tracker in the submission queue thread. In Vulkan (and Nabla) command buffers always start out in the initial state, so its possible to use the state tracker up-front when recording and only record the OpenGL commands that will actually be needed (this has a huge impact on binds).
Only do it if profiler shows a lot of time spent in commandbuffer recording.
This issue covers features of the StreamInput future API.
Note: currently there is no info on how all these features will look like in the actual API (spec should be released in the next 12 months).
There are 3 main capability groups:
OS-agnostic API. Some input devices support will be added via Khronos extensions.
Sensor processing capabilities:
The API is going to be graph-based: each input device is a separate node, and a combination of the input devices is a new kind of node - Filter Node. An app can access both high-level filter nodes and low-level device nodes.
A Filter Node can include image-processing (Can use APIs such as OpenCL and OpenMAX and receive data from external media frameworks).
This is literally the only data i managed to dig up about StreamInput. It doesn't even have a wikipedia page XD. Everything is taken from The Khronos StreamInput Overview Page.
Allow for resizes, minimizes, maximizes and rotations (mobile).
Some platforms' implementations wont allow for certain things, so capabilities must be queryable at runtime and most operations should return a bool or an enum to notify of success (please no static capability sets via inheritance).
One example is a resize, which may not be achievable to the requested size, so the actual size after the operation (same as current if nothing done) needs to be returned)
To be implemented separately in every derived window class for Win32, X11, Wayland, derivations of ForeignWindow (SDL2 which we shall use for Android)
Probably an window event callback needs to be able to be hooked up (at least to notify of an On-Resize).
The window functions from the IrrlichtDevice need to die
https://github.com/Crisspl/Nabla/blob/vulkan/include/IrrlichtDevice.h#L191
https://github.com/Crisspl/Nabla/blob/vulkan/include/IrrlichtDevice.h#L114
First bug is that one command buffer can influence the state of another, in ex 29 @sadiuk is setting the viewport in one cmdbuffer and submitting that before the renderloop, and somehow the viewport size seems to be propagated (use latest Renderdoc nightly build to capture frame 0 and 1).
Second bug is, I changed the commandbuffer recording order a little bit plus optimized the UBO update, and I get absolutely flooded with the following
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:771:glGeneral.pglGetIntegerv(GL_FRAMEBUFFER_BINDING, reinterpret_cast<GLint*>(&bound)): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:771:glGeneral.pglGetIntegerv(GL_FRAMEBUFFER_BINDING, reinterpret_cast<GLint*>(&bound)): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
OpenGL error: Error has been generated. GL error GL_INVALID_OPERATION in VertexArrayElementBuffer: (ID: 1306369058) buffer 1053253632 is not zero or the name of an existing buffer object
C:\work\master\src\nbl\video\IOpenGL_FunctionTable.h:861:glGeneral.pglGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &boundFBO): error 0x502
Run ex 29
Same visual output as the deferred_event_handler_fix
branch
SWIG
Support mesh shaders
Implement in GL and GLES using
https://www.khronos.org/registry/OpenGL/extensions/NV/NV_mesh_shader.txt
On VK implement using the KHR extension.
Should be only begun when the VK backend is operational.
Everything uses the same sampler as the floating point samplers.
Try and use integer or unsigned integer texture formats
Integer and unsigned integer textures use a proper sampler.
Any
Shared libs config for Win32, Linux and Android.
Currently builds of Nabla incl. samples can be in excess of 50 GB, using .dll could cut it down by an order of magnitude,
Produce 1 .dll/.so per namespace (also split up the static libs like this).
Dependencies are still to be linked statically into Nabla namespace libs (don't want DLL hell).
To complete after appsincadd contract is finalized.
OpenGL backend no longer plays nicely with OpenCL and CUDA
OpenGL with Windows and X11
ES and Vulkan not necessary.
This issue covers native window event handling support on several operating systems, including Windows, Linux(X11, Wayland) and Android. It also contains suggestions for possible lightweight cross-platform libraries which can be used in Nabl to simplify this process.
Window event handling on Windows works in a very straightforward manner: you define 2 things:
So the actual code that will allow you to handle events looks like this:
#include "Windows.h"
Define a window procedure:
LRESULT stdcall MainWindowProc(HWND hwnd, uint uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_CLOSE: // User closes the window
PostQuitMessage(0);
break;
case WM_SIZING: // User resizes the window
//Handle resizing
break;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
And an event loop in the main function:
int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
HWND hwnd;
// Create window
// ...
// ...
ShowWindow(hwnd, SW_SHOW);
UpdateWindow(hwnd);
MSG msg; // the message we'll receive
while(GetMessage(&msg, nullptr, 0, 0))
{
TraslateMessage(&msg);
DispatchMessage(&msg);
}
}
The X11 event handling looks pretty similar to how it works on Windows. However, here you do not define a callback(like the MainWindowProc), but do all the dirty work iside the main function.
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xos.h>
First you define stuff like window, display etc for the X11 window application to work.
Display *dis = XOpenDisplay((char *)0);;
unsigned long black, white;
black=BlackPixel(dis,screen);
white=WhitePixel(dis, screen);
Window win = XCreateSimpleWindow(dis,DefaultRootWindow(dis),0,0, 200, 300, 5, white, black);
Then you need an event loop to wait for events and handle them.
Since, unlike on Windows, the event types are not as specific (e.g. ConfigureNotify event means that the window could be either moved, or resized, or the border width was changed or all 3 at once), you either need to store the previous window state, or update all possible properties:
Option 1:
XEvent event;
while(1)
{
XNextEvent(dis, &event);
//Since
if(event.type == ConfigureNotify)
{
XResizeWindow(dis, win, event.width, event.height);
XMoveWindow(dis, win, event.x, evennt.y);
//... All possible event handlings
//...
//...
}
}
Option 2:
XEvent event;
while(1)
{
XNextEvent(dis, &event);
//Since
if(event.type == ConfigureNotify && event.width != prevWidth || event.height != prevHeight)
{
// Update prevWidth, prevHeight
XResizeWindow(dis, win, event.width, event.height);
//...
//...
}
}
With wayland the situation is not as pleasant as with previous systems. Here you do not get nice events that can tell you what exactly happened to your window, but define listeners for simple events like mouse pointer moving, clicking, entering/leaving the window surface, etc. All the other stuff should be handled manually.
Let's go through main ideas behing window event handling.
Before we connect all the stuff in main
, lets create a listener for a pointer:
// Mouse enter the window surface
static void pointer_handle_enter(void *data, struct wl_pointer *pointer,
uint32_t serial, struct wl_surface *surface,
wl_fixed_t sx, wl_fixed_t sy)
{
fprintf(stderr, "Pointer entered surface %p at %d %d\n", surface, sx, sy);
}
// Mouse leave the window surface
static void pointer_handle_leave(void *data, struct wl_pointer *pointer,
uint32_t serial, struct wl_surface *surface)
{
fprintf(stderr, "Pointer left surface %p\n", surface);
}
// Mouse move
static void pointer_handle_motion(void *data, struct wl_pointer *pointer,
uint32_t time, wl_fixed_t sx, wl_fixed_t sy)
{
printf("Pointer moved at %d %d\n", sx, sy);
}
// Mouse click
static void pointer_handle_button(void *data, struct wl_pointer *wl_pointer,
uint32_t serial, uint32_t time, uint32_t button,
uint32_t state)
{
printf("Pointer button click\n");
// !!!! This is where you can perform window resizing, moving and stuff.
if (button == BTN_LEFT && state == WL_POINTER_BUTTON_STATE_PRESSED)
wl_shell_surface_move(shell_surface,
seat, serial);
}
// This one seems to be a one-axis gesture like the left-to-right swipe
static void pointer_handle_axis(void *data, struct wl_pointer *wl_pointer,
uint32_t time, uint32_t axis, wl_fixed_t value)
{
printf("Pointer handle axis\n");
}
static const wl_pointer_listener pointer_listener = {
pointer_handle_enter,
pointer_handle_leave,
pointer_handle_motion,
pointer_handle_button,
pointer_handle_axis,
};
Then there goes a LOT of code that registers all those listeners, and then we bind all the stuff in the main
:
Note: for simplicity i removed a lot of code and error handling so this code will not actually work.
int main()
{
wl_display* display = wl_display_connect(NULL);
// Some other stuff, unrelated to this issue....
wl_surface* surface = wl_compositor_create_surface(compositor);
// In Wayland there should be a shell surface on top of the actuall surface that catches pointer events.
wl_shell_surface shell_surface = wl_shell_get_shell_surface(shell, surface);
wl_shell_surface_set_toplevel(shell_surface);
wl_shell_surface_add_listener(shell_surface,
&shell_surface_listener, NULL);
init_egl();
create_window();
// The event loop itself
while (wl_display_dispatch(display) != -1) {
;
}
wl_display_disconnect(display);
}
A complete tutorial on wayland events is here
A simple program program that tracks when a window is moved can be found here.
Android provides C++ programming capabilities via the JNI (Java native interface) - basically a set of java-like functions in C++.
Window (and other kinds of) events are processesed by defining two event handlers in the entry point and registering them:
#include <EGL/egl.h>
#include <GLES/gl.h>
#include <android/sensor.h>
#include <android/log.h>
#include <android_native_app_glue>
void android_main(struct android_app* state) {
engine engine;
memset(&engine, 0, sizeof(engine));
state->userData = &engine;
state->onAppCmd = applicationCommandHandler;
state->onInputEvent = inputHandler;
engine.app = state;
}
Where the applicationCommandFunc
is the callback which processes events like window initialization, window termination etc and the inputHandler
is the function which recieves and processes input events like key presses.
Here I've posted possible implementations of those two:
void applicationCommandHandler(android_app *app, int32_t cmd)
{
switch (cmd)
{
case APP_CMD_INIT_WINDOW:
initialize();
break;
case APP_CMD_TERM_WINDOW:
finalize();
break;
default:
break;
}
}
int32_t inputHandler(android_app *app, AInputEvent *inputEvent)
{
if (AInputEvent_getType(inputEvent) == AINPUT_EVENT_TYPE_KEY &&
AKeyEvent_getKeyCode(inputEvent) == AKEYCODE_BACK)
{
ANativeActivity_finish(app->activity);
return 1;
}
if (AInputEvent_getType(inputEvent) == AINPUT_EVENT_TYPE_MOTION)
{
// TODO: Handle touch event...
return 1;
}
return 0;
}
Render water without the use of tessellation shaders, wholly in screen space.
Vertex throughput is a scarce resource, and rendering subpixel triangles is suboptimal.
LoD seams are also a problem.
Render scene without water to a Lit color buffer + depth.
Take a copy of the depth buffer.
Group planar reflectors into "pools", assign each pool an ID.
Give quality choice for displacement and dynamic reflections (on/off).
Render occlusion meshes (same as normal meshes, but "pushed back" conservatively) into the depth attachment only, as a z-prepass.
Re-render the meshes with early-Z hint (reinforce with software test against old Z), this time with raymarched displacement #55 , do all the shading and refraction.
Special handling of the case "camera inside displacement hull" would be required.
Render the meshes with forced early-Z, don't displace, just use the normal map (flat water).
If dynamic reflections are enabled then "occlusion queries" will be performed while rendering, i.e. each pool will increment an atomic counter assigned to it in an SSBO for every visible pixel, and build a (possibly screen space) bounding box. The pool with the highest number of pixels will be assigned dynamic reflections, and a small compute shader will compute the view and cropped projection matrix of the planar reflector camera.
All the pools without dynamic reflections will sample a cubemap instead.
The headers have paths like this irr/builtin/material_compiler/glsl/
The headers should have paths like this irr/builtin/glsl/material_compiler/
with the glsl
folder first.
Tackle and fix in #22
Old AMD and mobile GPUs love to make our lives difficulr by limiting the dispatch shape with constraint that the number of workgroups in the X-axis be <=64k.
A new utility function in nbl::core
that can split a T (either uint32_t or uint64_t) into 3 factors which when multiplied are either greater than or equal to the input.
For example a 64M input would be factored into (64k,1024,1).
The approximate 3-factor algorithm would have to do the following:
Furthermore all compute extensions and samples (included but not limited to FFT, Scan, RadixSort) will have to be adjusted to this (wg_count
in the computed dispatch parameters and the use of gl_GlobalInvocationIndex
,gl_WorkgroupID
, etc.).
First of all: cmd buffers, queues and families are purely GPU objects, so I see no point in having CPU and GPU counterparts.
ICommandBuffer design is in the UML, however command buffers comes along with command pools. Command pools are opaque Vulkan objects used to minimize cost of acquaring/allocating resources for a set of cmd buffers assigned to a cmd pool. Also they in case of concurrency they require external synchronization. So what I'm thinking is that we don't expose command pools for users at all. Instead [under Vulkan backend], under the hood there can be created one command pool per queue family per thread. This can be done dynamically (when there's a need for such, i.e. cmd buffer is created by some thread using some queue family). This obviously means that all command buffers created by thread X and using queue family at index Y are "bounded to" the same command pool. In GL backend command pools would be non-existent at all.
I think we'll need to redefine what device
is in Nabla. Currently is the main class to which (upon creation) we're passing what backend we want to use, then it's creating IVideoDriver, IAssetManager, IFileSystem etc... AFAIK Nabla doesnt let user choose the device, not even talking about using more than one device (GPU) at a time. There should be such possibility and then by device
we mean something that will hold VkPhysicalDevice
handle. device
will create driver
object that will hold VkDevice
handle and, while creating, deciding what queue
objects will be created (and more).
Same as Vulkan API does it. We can even use the same struct VkQueueFamilyProperties
. We can query all queue families offered by current physical device with vkGetPhysicalDeviceQueueFamilyProperties
. So at engine startup we query those to smart_refctd_dynamic_array
or something and let user device->getQueueFamilyProperties()
them. There's no need for anything like IQueueFamily engine-API objects.
In result API normalization between backends boils down to what is returned from getQueueFamilyProperties()
. For Vulkan it's obvious. For GL we can for example report that there exists just one queue family with all (https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VkQueueFlagBits.html) capabilities with one queue. I dont know. Is there a way to query such things via GL API? Like whether our device supports graphics (maybe it's compute-only)? Not even asking about specific queues and their capabilities, I'm sure OpenGL hides it from user.
If queue family properties are queried from device as described above (via get*()
), then obviously driver
creation must be deferred (not instantly created on device
construction). IQueue objects are then created automatically by engine based on info given for driver
creation (VkDeviceQueueCreateInfo
s). Driver should have an API function to access them.
Actual UMLs and more design I'll post tomorrow.
Mesh packers actual allocators (together with reserved space) should be remade after a shrink (there's a special move ctor for this sort of operation).
There's also a bit more on the wishlist in the comments in the following commit:
da60a7b
I should still be able to carry out allocations in a GPU mesh packer (the allocator state should be a copy of the CPU mesh packer state at GPU construction time).
When shrink is called, allocator address space shrinks and so does reserved space.
Irrelevant.
Swapchain is created from surface and other params like minImageCount. Swapchain images can be gathered from the swapchain. Then we're creating as many FBOs as there are images (and obvs attaching one image to each) and render to an fbo of number queried from vkAcquireNextImageKHR
No direct access to swapchain images, no explicit swapchain actually. In SDL2 double-buffering and swapping is done with a single call (SDL_Flip(surface)
or SDL_RenderPresent(renderer)
-- not sure, Magnum uses SDL_Flip but SDL2 migration guide says it's been replaced with SDL_RenderPresent, however i dont know what is that renderer yet)
https://wiki.libsdl.org/MigrationGuide
https://github.com/mosra/magnum/blob/master/src/Magnum/Platform/Sdl2Application.cpp#L439
Swapchain and surface have to be one thing in our API.
OpenGL impl should be pretty straight forward then, however...
On Vulkan.. Swapchain/Surface API cannot expose images because in you OpenGL cannot do this. So:
A) do under-the-hood blits into swapchian images in Vulkan, or
B) make Swapchain/Surface API expose images, so that things are getting easy in Vulkan, but in OpenGL we're doing under-the-hood blits into default framebuffer (seems like much better option tbh)
Anyway seems like Swapchain and Surface need to get together into a single interface
Especially ICPUMeshBuffer::caclVertexCount()
This issue covers native drag & drop support on several operating systems, including Windows, Linux, macOS, IOS and Android. It also contains suggestions for possible lightweight cross-platform libraries which can be used in Nabla to simplify this process.
Drag&Drop on windows works in a very easy manner. To start with, you need a window that will accept files and enable Drag&Drop.
#include <windows.h>
HWND window;
window = CreateWindow("Window class", "Drag&Drop test", WS_OVERLAPPEDWINDOW, 100, 100, 1280, 960, nullptr, nullptr, nullptr, nullptr);
ShowWindow(window, SW_SHOWNORMAL); q
DragAcceptFiles(window, TRUE);
In WindowProc you also need to define proper drop handling:
LRESULT WINAPI WndProc(HWND window, UINT message, WPARAM wparam, LPARAM lparam)
{
if(message == WM_DROPFILES)
{
char filename[MAX_PATH];
uint32_t num_of_files = DragQueryFile(lparam, 0xffffffff, nullptr, 0);
for(int i = 0; i < num_of_files; i++)
{
DragQueryFiles(lparam, i, filename, MAX_PATH);
std::cout << filename << "\n";
}
}
}
With X11 the sitution is much more complicated. Unlike on Windows, Linux has no drag & drop standart, so many organizations have implemented their own protocols, so the program, written for one protocol cannot communicate via Drag&Drop with those, written for different protocols.
Still there is one, most commonly used protocol - XDND.
To implement something minimal, lets make two processes:
#include <sys/types.h>
#include <X11/Xlib.h>
int main()
{
pit_t pid = fork();
if(pid_t == -1) return -1;
createWindow(pid);
}
Where the createWindow function looks something like this:
void createWindow(pid_t pid)
{
// Distribute parent/child process duties...
Display *display = XOpenDisplay(NULL);
Window window = XCreateSimpleWindow(display, RootWindow(display, N), 0, 0, 1, 1, 0, BlackPixel(display, N), WhitePixel(display, N));
// Then goes the initialization of atoms and stuff...
// ...
// ...
Atom XdndDrop = XInternAtom(display, "XdndDrop", False);
// ...
bool keep_listening = true;
XEvent event;
while(keep_listening)
{
XNextEvent(display, &event);
if(event.xclient.message_type == XdndDrop)
{
// Extract event data...
}
}
}
You can view the full code of drag & drop handling example with X11 here.
If you think that X11 is the only counter-intuitive part of cross-platform drag & drop implementation, you're totally wrong, because it also can be applied to wayland interface.
To get access to the clipboard and drag & drop interfaces, clients can bind to the wl_data_device_manager
. We’ll also need to bind to a seat:
static struct wl_data_device_manager *data_device_manager = NULL;
static struct wl_seat *seat = NULL;
static void registry_handle_global(void *data, struct wl_registry *registry,
uint32_t name, const char *interface, uint32_t version) {
if (strcmp(interface, wl_data_device_manager_interface.name) == 0) {
data_device_manager = wl_registry_bind(registry, name,
&wl_data_device_manager_interface, 3);
} else if (strcmp(interface, wl_seat_interface.name) == 0 && seat == NULL) {
seat = wl_registry_bind(registry, name, &wl_seat_interface, 1);
}
}
After binding, we’ll need to create a wl_data_device
object to interact with the clipboard and drag & drop on a particular seat:
struct wl_data_device *data_device = wl_data_device_manager_get_data_device(data_device_manager, seat);
and a data source listener with the source itself:
static const struct wl_data_source_listener data_source_listener = {
// .send and .cancelled are the same as the clipboard case
.target = data_source_handle_target,
.action = data_source_handle_action,
};
struct wl_data_source *source =
wl_data_device_manager_create_data_source(data_device_manager);
wl_data_source_add_listener(source, &data_source_listener, NULL);
wl_data_source_offer(source, "text/plain");
wl_data_source_set_actions(source, WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE | WL_DATA_MANAGER_DND_ACTION_COPY);
Note that wl_data_source_offer
allows you to specify the data format.
Also create a surface (drag & drop area):
struct wl_surface *icon = NULL;
wl_data_device_start_drag(data_device, source, origin, icon,
pointer_button_serial);
After that, you can perform event handling, covered in-depth here.
On macOS the d&d features are implemented pretty easily. Actually there are several ways to do that, but they're all pretty similar so I'm only gonna cover one of them.
First you need to create class, derived from NSView and specify the formats you want d&d to work with:
class TestView: NSView {
let supportedTypes: [NSPasteboard.PasteboardType] = [.tiff, .color, .string, .fileURL]
}
Then allow the view accept these formats by overriding the registerForDraggedTypes method:
override func awakeFromNib() {
self.registerForDraggedTypes(supportedTypes)
}
The next method will allow you to detect when the draggable object enters the dropping area (TestView):
override func draggingEntered(_ sender: NSDraggingInfo) -> NSDragOperation {
let canReadPasteboardObjects = sender.draggingPasteboard.canReadObject(forClasses: [NSImage.self, NSColor.self, NSString.self, NSURL.self], options: nil)
if canReadPasteboardObjects {
return .copy
}
return NSDragOperation()
}
To implement the actual drop operation, override the next method:
override func performDragOperation(_ sender: NSDraggingInfo) -> Bool {
guard let pasteboardObjects = sender.draggingPasteboard.readObjects(forClasses: [NSImage.self, NSColor.self, NSString.self, NSURL.self], options: nil), pasteboardObjects.count > 0 else { return false }
pasteboardObjects.forEach { (object) in // go through every object that's being dragged
if let image = object as? NSImage {
avatarInfo.setImageData(using: image)
}
if let color = object as? NSColor {
avatarInfo.setColorData(using: color)
}
if let quote = object as? NSString {
avatarInfo.quote = quote as String
}
if let url = object as? NSURL {
self.handleFileURLObject(url as URL)
}
}
}
This issue covers native clipboard support on several operating systems, including Windows, Linux, macOS, IOS and Android. It also contains suggestions for possible lightweight cross-platform libraries which can be used in Nabla to simplify this process.
The clipboard support on Windows is very straightforward. A clipboard is a global buffer that can be used between applications to store the data of various formats.
In order to use the clipboard you must first open it:
#include <windows.h>
int32_t res = OpenClipboard(0);
assert(res != 0);
The only parameter is a handle to the window to be associated with the open clipboard. If this parameter is NULL
, the open clipboard is associated with the current task.
To copy data into the clipboard, you first must clear the data, currently stored in it and then fill in the clipboard buffer:
ClearClipboard();
const char* data = "Data to be stored in clipboard";
const size_t data_size = strlen(data) + 1;
HGLOBAL h = GlobalAlloc(GMEM_MOVEABLE, data_size);
strcpy(GlobalLock(h), LPCSTR(data));
GlobalUnlock(h);
SetClipboardData(CF_TEXT, h);
The first input parameter for SetClipboardData is the data format. The documentation on supported clipboard formats on Windows can be seen here.
To get the data, currently stored in the clipboard, the process is even more simple:
const char* data = (const char*)GetClipboardData(CF_TEXT);
When you're done with clipboard, you must close it:
CloseClipboard();
The clipboard on Linux is supported via the X11 library. The clipboard managing process is a bit different then on Windows and a little more cumbersome.
The X11 library is a multi-buffer library, but the only two buffers we're gonna focus on are:
Primary
buffer.Unlike Windows, Linux clipboard buffers are not global objects, but application-side buffers. To change the buffer data, an application just changes its local data and notifies the server than it is the new owner of the buffer.
To get the data, currently stored in the clipboard, an application must request it from the current owner.
The first two things you need to use the clipboard features are X11 server connection (display) and the window.
#include <X11/Xlib.h>
Display * display = XOpenDisplay(0);
Window window = XCreateSimpleWindow(display, RootWindow(display, N), 0, 0, 1, 1, 0, BlackPixel(display, N), WhitePixel(display, N));
We also need to create property atoms
which are unique identifiers, associated with the properties:
Atom targets_atom = XInternAtom(display, "TARGETS", 0);
Atom text_atom = XInternAtom(display, "TEXT", 0);
Atom utf8 = XInternAtom(display, "UTF8_STRING", 1);
Atom selection = XInternAtom(display, "CLIPBOARD", 0); // Can also be "PRIMARY"
Then we set this application to be the owner of the buffer:
XSetSelectionOwner (display, selection, window, 0);
if (XGetSelectionOwner (display, selection) != window) return;
Some event handling:
XEvent event;
XNextEvent(display, &event);
if(event.type == SelectionRequest)
{
XSelectionRequestEvent * xsr = &event.xselectionrequest;
XSelectionEvent ev = {0};
int R = 0;
ev.type = SelectionNotify;
ev.display = xsr->display;
ev.requestor = xsr->requestor;
ev.selection = xsr->selection;
ev.time = xsr->time;
ev.target = xsr->target;
ev.property = xsr->property;
if (ev.target == utf8)
R = XChangeProperty(ev.display, ev.requestor, ev.property, utf8, 8, PropModeReplace, text, size);
else ev.property = None;
if ((R & 2) == 0) XSendEvent (display, ev.requestor, 0, 0, (XEvent *)&ev); // this actually copies the data to clipboard
}
The pasting process is a bit more simple:
const char* data_to_get = nullptr;
Atom utf8 = XInternAtom(display, "UTF8_STRING", True);
XEvent event;
int format;
unsigned long N, size;
char * data, * paste_data = 0;
Atom target;
Atom CLIPBOARD = XInternAtom(display, "CLIPBOARD", 0); // Can also be "PRIMARY"
Atom XSEL_DATA = XInternAtom(display, "XSEL_DATA", 0);
First request a buffer:
XConvertSelection(display, CLIPBOARD, utf8, XSEL_DATA, window, CurrentTime);
XSync(display, 0);
XNextEvent(display, &event);
Then wait until the owner prepares a buffer.
while (event.type != SelectionNotify)
{
XNextEvent(display, &event);
}
And finally read buffer content from window property:
XGetWindowProperty(event.xselection.display, event.xselection.requestor, event.xselection.property, 0L,(~0L), 0, AnyPropertyType, &target, &format, &size, &N,(unsigned char**)&data);
if(target == utf8) {
paste_data = strndup(data, size);
XFree(data);
}
In the end you must delete the property:
XDeleteProperty(event.xselection.display, event.xselection.requestor, event.xselection.property);
SO (The second answer), and The Minimal X11 Copy-Pasting Functionality Implementation
For Mac OS(macOS 10.0+) Apple provides a nice interface of clipboard management - NSPasteboard.
Also there is a clipboard version, available on both MacOS and IOS - UIPasteboard
To use the pasteboard (it's called pasteboard on macOS/IOS, so I'll use that term further on) you need to get the global pasteboard object:
NSPasteboard *pasteBoard = [NSPasteboard generalPasteboard];
UIPasteboard *pasteBoard = [UIPasteboard generalPasteboard];
Then, to copy text into the pasteboard, use these two lines:
NSString* string_to_write = @"Data to be stored in the pasteboard";
BOOl pasted = [pasteBoard setString:string_to_write forType:NSStringPboardType];
You can also store data of different format, using setData(_:forType:)
method.
To get the text, currently stored in the pasteboard, do this:
NSString* data_from_pasteboard = [pasteBoard stringForType:NSStringPboardType];
For android there is a good class that helps you manage clipboard - ClipboardManager
First create an instance of the ClipboardManager class:
ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
Then create a ClipData class instance and provide it with some data and push it to the clipboard:
String text = "Text to be stored in the stored in the clipboard";
ClipData clip = ClipData.newPlainText(label, text);
clipboard.setPrimaryClip(clip);
It is also possible to set the data of different formats, using the static ClipData methods.
To get the data, stored in the clipboard:
ClipData data = getPrimaryClip();
CharSequence text = data.getPrimaryClip().getText();
Apparently there are not many open-source cross-platform libraries for clipboard management.
IMO, the Clip library is the one to go with. I think it's not that big of a problem to make it work on IOS (even though it uses the way of clipboard management, not available in IOS), and the Android support is something that should be added on our own.
extGlSwapInterval(-1)
used to be called in the engine at OpenGL initialization, now nothing is chosen at all.
Call extGlSwapInterval
with the following values:
1
total VSync (when VK_PRESENT_MODE_FIFO_KHR
is present)0
no VSync (probably VK_PRESENT_MODE_IMMEDIATE_KHR
or MAILBOX
, I believe this depends on double buffering or not)-1
if late then tear (when VK_PRESENT_MODE_FIFO_RELAXED_KHR
is present)Position Update Dispatch
Takes the requested relative user-control transform updates, and animation blends scheduled for this frame (animation blending rate is different per-node, and supplied from a buffer).
The user supplied relative matrices overwrite the target nodes' relative transforms (blend manager's relative transform modifications are pushed to TransformTreeManager
before user sourced CPU relative transform modifications are pushed to TransformTreeManager
).
The first blend for a node overwrites the target node relative transform, the following accumulate.
We map 1 invocation : 1 node, not 1 invocation : 1 blend.
Therefore the blendlists need to be kept together by nodeID via
https://github.com/Devsh-Graphics-Programming/Nabla/blob/scene_manager/include/nbl/builtin/glsl/transform_tree/modification_request_range.glsl
Nodes without parents should write to their global matrices directly as an optimization if possible.
Input:
Output:
Improvement: Reduce blend rates for nodes that have small projections on the screen (far away), out of frustums, not visible by occlusion culling.
At this point a question poses itself, do we control the Animation Rate via comparing the current_timestamp-last_modified_timestamp>animation_rate_delta
(which requires us to launch an invocation for every single animated node), or do we somehow bin/sort the nodes by update frequency (how!?) and dispatch only what we need ( would need a prefix sum dispatch before the main one).
Best thing would be to treat this like a particle system (have animation records jump between buckets), but then it makes it pretty hard to remove/pause/suspect/end already added animations (requires parallel searching in the deletion list).
Manual control of skeleton nodes is achieved via not having any animation blends.
Global matrix override achieved via not having/detaching from a parent.
Bind pose matrices handled via adding pseudo-children.
From the quick read of criss_android
branch I didnt find a commandpool reset function/method.
Creating a resettable commandbuffer requires a special flag on the pool which apparently slows down its allocator (I think linear can be used when you never plan on reclaiming resources).
On another hand, the pool can always be reset without any special flags, and this is supposedly the fastest method.
With this functionality we could improve @sadiuk's CommonAPI example utilities to create SC_IMG_COUNT
command pools, and expect the user to use a different pool for every frame and reset them before every frame.
Implement a pool reset functionality, but it will have to kill/put the allocated commandbuffers in the invalid state (or intial, no idea... read the Vulkan spec).
When running with a Current Working Directory different that the executable, the denoiser fails with
Parse status: XML_STATUS_OK
????: error: **REDACTED**/ShaderCommon.glsl:33: '#include' : Could not open file for header name: irr/builtin/glsl/colorspace/EOTF.glsl
????: error: **REDACTED**/ShaderCommon.glsl:34: '#include' : Could not open file for header name: irr/builtin/glsl/colorspace/encodeCIEXYZ.glsl
????: error: **REDACTED**/ShaderCommon.glsl:35: '#include' : Could not open file for header name: irr/builtin/glsl/colorspace/decodeCIEXYZ.glsl
????: error: **REDACTED**/ShaderCommon.glsl:36: '#include' : Could not open file for header name: irr/builtin/glsl/colorspace/OETF.glsl
????: error: **REDACTED**/ShaderCommon.glsl:51: '#include' : Could not open file for header name: irr/builtin/glsl/ext/LumaMeter/impl.glsl
????: error: **REDACTED**/ShaderCommon.glsl:70: '#include' : Could not open file for header name: irr/builtin/glsl/ext/LumaMeter/common.glsl
Run any example compiled with NBL_EMBED_BUILTIN_RESOURCES with a different CWD.
When engine is compiled with NBL_EMBED_BUILTIN_RESOURCES
, GLSL headers with absolute paths should always be found.
Reported on Windows so far.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.