Yes, it's clear now. Thanks. Marek
On Sun, May 20, 2018 at 3:05 AM, Mathias Fröhlich <mathias.froehl...@gmx.net > wrote: > Good morning, > > > Are you sure about this? The fixed-func vertex and fragment shaders can > > move zero-stride vertex attribs into constants (uniforms). If a shader > > changes, it might no longer be necessary to submit zero-stride attribs > via > > the vertex API, but this would be missed if _NEW_PROGRAM was ignored. > > If I get your question right then this is something that happens further > down the road. > > So, the array element api, just looking at the code what it does and what > it reads, Just takes a VAO, maps it and walks all the vertex at the index > provided with glArrayElement. Then for that given index all enabled > vertex attributes just provided the vertex attributes enabled state > are put into the immediate mode api. Also the decision of if it should take > the VERT_ATTRIB_POS or VERT_ATTRIB_GENERIC0 attribute to trigger the > immediate mode vertex is completely taken from the enabled state > in the VAO. With enabled state I really mean the application observable > OpenGL api that you modify with glEnableVertexAttribArray and query > using the GL_VERTEX_ATTRIB_ARRAY_ENABLED enum and that you find > in gl_array_attributes::Enabled and condensed in the > gl_vertex_array_object::_Enabled bitmask, both within the VAO. > Given that no shader related value is evaluated from the code triggered > by _ae_invalidate_state I would say I am sure about that. > > Putting current values into uniforms happens in the draw code path > where we mute some may be enabled arrays from the VAO based on > the shader mode. That again is only the decision if some of the generics > contain material array values from within the vbo module or if these > generics are really generics that must not be evaluated from > ffvertex_prog.c. > Based of these enables, not looking at zero strides, ffvertex_prog.c > creates a > vertex shader that exactly reads those arrays that are enabled and not > generally muted from vertex processing due to gl_vertex_processing_mode. > The result of ffvertex_prog.c is a shader that reads some VERT_ATTRIB_* > values > and put aside double inputs has exactly those VERT_BIT_* bits set in > ...inputs_read > that are required due to the current OpenGL fixed function state and the > currently enabled array. Based on the ...inputs_read and the finally > provided arrays > from the VAO, the driver backends (well, the consumers like i965, gallium > or TNL) > only upload/configure those enabled arrays which are consumed by the > shader. > > Putting that together, I can see current vertex attribute values being > taken > from uniforms if they are not enabled in the ctx->Array._DrawVAO. > > Back to the array element api to see that program mode is not required > from there by an other argument: > That VAO that is replayed by glArrayElement may never hit the draw path as > from those immediate mode calls that the glArrayElement api generates, > mesa assembles a new VAO/VBO in the vbo module that is finally either > kept in a display list or used for immediate mode rendering. Depending > on which VERT_ATTRIB_* arrays are enabled in this vbo module created > VAO, ffvertex_prog may be triggered if we are about to draw something > fixed function related. > Also from that thought you can see that changes to shader program state > do not affect the way the VAO should get replayed from the glArrayElement > api. > They *do* affect the way the resulting VAO produced by the vbo module is > processed, but that is nothing that is handled from _ae_invalidate_state. > > Hope this helps? > > best > > Mathias > > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev