[Mesa-dev] [PATCH 0/6] Mesa/Gallium vertex array state optimizations
Marek Olšák
maraeo at gmail.com
Sun Feb 13 13:04:17 PST 2011
On Sun, Feb 13, 2011 at 8:45 PM, Keith Whitwell <keithw at vmware.com> wrote:
> Marek,
>
> These patches look good, but have you covered the case where the
> application is changing the contents of vertex arrays without
> rebinding/notifying GL in any way?
>
> eg. an app could do:
>
> memcpy(varray, foo, ...);
> glDrawArrays(...);
> memcpy(varray, bar, ...);
> glDrawArrays(...);
>
> with these changes will drivers still notice the difference?
>
Keith,
Yes, they will. If vertex buffers are not re-set in st_draw_vbo,
redefine_user_buffer is called for each user buffer which is set and that
tells a driver which buffer ranges need to be re-uploaded. This can be found
in the last hunk of the last patch, specifically:
@@ -646,6 +664,26 @@ st_draw_vbo(struct gl_context *ctx,
#endif
}
+ /* Notify the driver that the content of user buffers may have been
+ * changed. */
+ if (!new_array && st->num_user_vbs) {
+ for (i = 0; i < st->num_user_vbs; i++) {
+ if (st->user_vb[i]) {
+ unsigned stride = st->user_vb_stride[i];
+
+ if (stride) {
+ pipe->redefine_user_buffer(pipe, st->user_vb[i],
+ min_index * stride,
+ (max_index + 1 - min_index) *
stride);
+ } else {
+ /* stride == 0 */
+ pipe->redefine_user_buffer(pipe, st->user_vb[i],
+ 0, st->user_vb[i]->width0);
+ }
+ }
+ }
+ }
+
setup_index_buffer(ctx, ib, &ibuffer);
pipe->set_index_buffer(pipe, &ibuffer);
What remains to implement is using this information in drivers to re-upload
the buffer ranges marked with redefine_user_buffer. r300g, r600g, some
nouveau drivers, and anything which uses Draw do not need this information,
so they are safe. I think the only driver which needs special handling is
svga, but I don't know that driver so well to be able to do it.
If svga used u_vbuf_mgr, which can determine the dirty buffer ranges by
other means and can re-upload vertices by itself, this redefine_user_buffer
hook wouldn't be needed (besides for updating width0). It would also clean
up svga quite a bit, because u_vbuf_mgr can transparently translate vertices
to formats and layouts compatible with D3D9.
Marek
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20110213/a867dcc4/attachment.htm>
More information about the mesa-dev
mailing list