On Mon, 2011-02-14 at 11:04 -0800, Marek Olšák wrote:
> On Mon, Feb 14, 2011 at 6:58 PM, José Fonseca 
> <jfons...@vmware.com<mailto:jfons...@vmware.com>> wrote:
> Marek,
> 
> I'm OK with removing pipe_vertex_buffer::max_index but there is a bit
> more work involved, as they are not really equivalent in the guarantees.
> 
> pipe_vertex_buffer::max_index is an attribute of the vertex buffer -- it
> describe the max index that can be fetch from the buffer without running
> into a buffer overflow.  It is an hard limit -- it must be set
> accurately by the state tracker or crashes will occur.  It can be
> removed because it can be derived from the vertex element size, vertex
> element stride, vertex buffer offset, and vertex buffer size.
> 
> pipe_draw_info::max_index is an attribute of the index buffer: it
> describes the maximum index in the index buffer. It is an hint -- there
> may be higher indices in the index buffer, and if so it is OK for the
> driver to ignore those vertices, but it should not crash with a buffer
> overflow.
> 
> Therefore, in order to safely remove pipe_vertex_buffer::max_index, we
> should compute the max_index inside the draw module / pipe drivers, and
> ensure vertices with higher indices will never be removed.
> 
> There are a few places in this patch where you replace
> pipe_vertex_buffer::max_index with ~0 or no checks, which means that
> places which where previous robust to pipe_draw_info::max_index == ~0
> and bogus indices will now start crashing.
> 
> You'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:
> 
> pipe_vertex_buffer::max_index = (pipe_resource::width0 - 
> pipe_vertex_buffer::buffer_offset) / pipe_vertex_buffer::stride - 1
> 
> 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'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:
> 
> pipe_resource::width0 = (pipe_draw_info::max_index + 1) * 
> pipe_vertex_buffer::stride;
> 
> Now we substitute width0 in the first formula:
> 
> 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
>
> 
> If we examine the state tracker code, we'll notice that buffer_offset is 
> always 0 for user buffers. After simplification, we get this:
> 
> pipe_vertex_buffer::max_index = pipe_draw_info::max_index
> 
> And that's the whole story. That said, I'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't need to clamp anything when we 
> fetch vertices, the clamping would basically do nothing. That's why I removed 
> the clamping in Draw and put ~0 in the translate::run parameter and in 
> several other places.
> 
> Does this explanation justify all of my changes in the patch to you?

As I said, I'm perfectly fine with the removal of max_index.

Mesa state tracker may not have been doing the right thing before. It
should have been

   max_index = (pipe_vertex_buffer::size - pipe_vertex_buffer::buffer_offset - 
util_format_size(vertex_element->format)) / pipe_vertex_buffer::stride + 1

this is the logic that needs to be reinstated in the draw module to prevent 
buffer overflows spite bogus indices. But no sweat -- I have a few related draw 
changes on the pipe and I can easily do this.

Jose

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to