<div class="gmail_quote">On Mon, Feb 14, 2011 at 6:58 PM, José Fonseca <span dir="ltr">&lt;<a href="mailto:jfonseca@vmware.com">jfonseca@vmware.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">

Marek,<br>
<br>
I&#39;m OK with removing pipe_vertex_buffer::max_index but there is a bit<br>
more work involved, as they are not really equivalent in the guarantees.<br>
<br>
pipe_vertex_buffer::max_index is an attribute of the vertex buffer -- it<br>
describe the max index that can be fetch from the buffer without running<br>
into a buffer overflow.  It is an hard limit -- it must be set<br>
accurately by the state tracker or crashes will occur.  It can be<br>
removed because it can be derived from the vertex element size, vertex<br>
element stride, vertex buffer offset, and vertex buffer size.<br>
<br>
pipe_draw_info::max_index is an attribute of the index buffer: it<br>
describes the maximum index in the index buffer. It is an hint -- there<br>
may be higher indices in the index buffer, and if so it is OK for the<br>
driver to ignore those vertices, but it should not crash with a buffer<br>
overflow.<br>
<br>
Therefore, in order to safely remove pipe_vertex_buffer::max_index, we<br>
should compute the max_index inside the draw module / pipe drivers, and<br>
ensure vertices with higher indices will never be removed.<br>
<br>
There are a few places in this patch where you replace<br>
pipe_vertex_buffer::max_index with ~0 or no checks, which means that<br>
places which where previous robust to pipe_draw_info::max_index == ~0<br>
and bogus indices will now start crashing.<br></blockquote></div><br>You&#39;re right in theory. In practice, 
pipe_vertex_buffer::max_index was really derived from the value which is put in pipe_draw_info::max_index and was correctly initialized for user buffers only. It was set to ~0 for hardware buffers. Moreover, it could also be computed with:<br>

<br>pipe_vertex_buffer::max_index = (pipe_resource::width0 - pipe_vertex_buffer::buffer_offset) / pipe_vertex_buffer::stride - 1<br><br>So it was already redundant. Basically, pipe_resource::width0 is also redundant for user buffers, because it is actually computed from pipe_draw_info::max_index too. It&#39;s all logical because the index bounds are the only info we have about user buffers and we compute all the other properties from it. This is how width0 is computed:<br>

<br>pipe_resource::width0 = (pipe_draw_info::max_index + 1) * pipe_vertex_buffer::stride;<br><br>Now we substitute width0 in the first formula:<br><br>pipe_vertex_buffer::max_index = ((pipe_draw_info::max_index + 1) * pipe_vertex_buffer::stride - pipe_vertex_buffer::buffer_offset) / pipe_vertex_buffer::stride - 1<br>

<br>If we examine the state tracker code, we&#39;ll notice that buffer_offset is always 0 for user buffers. After simplification, we get this:<br><br>pipe_vertex_buffer::max_index = pipe_draw_info::max_index<br>
<br>And that&#39;s the whole story. That said, I&#39;d like not to call set_vertex_buffers only to update max_index if I can get the same info from pipe_draw_info. Because pipe_vertex_buffer::max_index was really the maximum index value in the index buffer, we don&#39;t need to clamp anything when we fetch vertices, the clamping would basically do nothing. That&#39;s why I removed the clamping in Draw and put ~0 in the translate::run parameter and in several other places.<br>

<br>Does this explanation justify all of my changes in the patch to you?<br><br>Marek<br>