mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-02-25 09:20:30 +01:00
draw: Pass-through pipe_buffer::max_index to translate.
max_index must be observed to prevent crashes due to bad index data. I've been using this patch for some time without regressions. Some places, where we use internal vertex buffer, it is not entirely clear what max_index should be, so passing just ~0 to avoid regressions for now.
This commit is contained in:
parent
fc431a58dc
commit
2a30d3d74a
7 changed files with 34 additions and 19 deletions
|
|
@ -137,7 +137,7 @@ emit_vertex( struct vbuf_stage *vbuf,
|
|||
*/
|
||||
/* Note: we really do want data[0] here, not data[pos]:
|
||||
*/
|
||||
vbuf->translate->set_buffer(vbuf->translate, 0, vertex->data[0], 0);
|
||||
vbuf->translate->set_buffer(vbuf->translate, 0, vertex->data[0], 0, ~0);
|
||||
vbuf->translate->run(vbuf->translate, 0, 1, 0, vbuf->vertex_ptr);
|
||||
|
||||
if (0) draw_dump_emitted_vertex(vbuf->vinfo, (uint8_t *)vbuf->vertex_ptr);
|
||||
|
|
@ -271,7 +271,7 @@ vbuf_start_prim( struct vbuf_stage *vbuf, uint prim )
|
|||
translate_key_sanitize(&hw_key);
|
||||
vbuf->translate = translate_cache_find(vbuf->cache, &hw_key);
|
||||
|
||||
vbuf->translate->set_buffer(vbuf->translate, 1, &vbuf->point_size, 0);
|
||||
vbuf->translate->set_buffer(vbuf->translate, 1, &vbuf->point_size, 0, ~0);
|
||||
}
|
||||
|
||||
vbuf->point_size = vbuf->stage.draw->rasterizer->point_size;
|
||||
|
|
|
|||
|
|
@ -171,12 +171,14 @@ void draw_pt_emit( struct pt_emit *emit,
|
|||
translate->set_buffer(translate,
|
||||
0,
|
||||
vertex_data,
|
||||
stride );
|
||||
stride,
|
||||
~0);
|
||||
|
||||
translate->set_buffer(translate,
|
||||
1,
|
||||
&draw->rasterizer->point_size,
|
||||
0);
|
||||
0,
|
||||
~0);
|
||||
|
||||
translate->run( translate,
|
||||
0,
|
||||
|
|
@ -232,11 +234,11 @@ void draw_pt_emit_linear(struct pt_emit *emit,
|
|||
goto fail;
|
||||
|
||||
translate->set_buffer(translate, 0,
|
||||
vertex_data, stride);
|
||||
vertex_data, stride, count - 1);
|
||||
|
||||
translate->set_buffer(translate, 1,
|
||||
&draw->rasterizer->point_size,
|
||||
0);
|
||||
0, ~0);
|
||||
|
||||
translate->run(translate,
|
||||
0,
|
||||
|
|
|
|||
|
|
@ -149,7 +149,8 @@ void draw_pt_fetch_prepare( struct pt_fetch *fetch,
|
|||
fetch->translate->set_buffer(fetch->translate,
|
||||
draw->pt.nr_vertex_buffers,
|
||||
&vh,
|
||||
0);
|
||||
0,
|
||||
~0);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -172,7 +173,8 @@ void draw_pt_fetch_run( struct pt_fetch *fetch,
|
|||
i,
|
||||
((char *)draw->pt.user.vbuffer[i] +
|
||||
draw->pt.vertex_buffer[i].buffer_offset),
|
||||
draw->pt.vertex_buffer[i].stride );
|
||||
draw->pt.vertex_buffer[i].stride,
|
||||
draw->pt.vertex_buffer[i].max_index);
|
||||
}
|
||||
|
||||
translate->run_elts( translate,
|
||||
|
|
@ -198,7 +200,8 @@ void draw_pt_fetch_run_linear( struct pt_fetch *fetch,
|
|||
i,
|
||||
((char *)draw->pt.user.vbuffer[i] +
|
||||
draw->pt.vertex_buffer[i].buffer_offset),
|
||||
draw->pt.vertex_buffer[i].stride );
|
||||
draw->pt.vertex_buffer[i].stride,
|
||||
draw->pt.vertex_buffer[i].max_index);
|
||||
}
|
||||
|
||||
translate->run( translate,
|
||||
|
|
|
|||
|
|
@ -168,7 +168,8 @@ static void fetch_emit_prepare( struct draw_pt_middle_end *middle,
|
|||
feme->translate->set_buffer(feme->translate,
|
||||
draw->pt.nr_vertex_buffers,
|
||||
&feme->point_size,
|
||||
0);
|
||||
0,
|
||||
~0);
|
||||
}
|
||||
|
||||
feme->point_size = draw->rasterizer->point_size;
|
||||
|
|
@ -178,7 +179,8 @@ static void fetch_emit_prepare( struct draw_pt_middle_end *middle,
|
|||
i,
|
||||
((char *)draw->pt.user.vbuffer[i] +
|
||||
draw->pt.vertex_buffer[i].buffer_offset),
|
||||
draw->pt.vertex_buffer[i].stride );
|
||||
draw->pt.vertex_buffer[i].stride,
|
||||
draw->pt.vertex_buffer[i].max_index);
|
||||
}
|
||||
|
||||
*max_vertices = (draw->render->max_vertex_buffer_bytes /
|
||||
|
|
|
|||
|
|
@ -167,7 +167,8 @@ static void fse_prepare( struct draw_pt_middle_end *middle,
|
|||
i,
|
||||
((const ubyte *) draw->pt.user.vbuffer[i] +
|
||||
draw->pt.vertex_buffer[i].buffer_offset),
|
||||
draw->pt.vertex_buffer[i].stride );
|
||||
draw->pt.vertex_buffer[i].stride,
|
||||
draw->pt.vertex_buffer[i].max_index );
|
||||
}
|
||||
|
||||
*max_vertices = (draw->render->max_vertex_buffer_bytes /
|
||||
|
|
|
|||
|
|
@ -80,7 +80,8 @@ struct draw_vs_varient {
|
|||
void (*set_buffer)( struct draw_vs_varient *,
|
||||
unsigned i,
|
||||
const void *ptr,
|
||||
unsigned stride );
|
||||
unsigned stride,
|
||||
unsigned max_stride );
|
||||
|
||||
void (PIPE_CDECL *run_linear)( struct draw_vs_varient *shader,
|
||||
unsigned start,
|
||||
|
|
|
|||
|
|
@ -66,14 +66,16 @@ struct draw_vs_varient_generic {
|
|||
static void vsvg_set_buffer( struct draw_vs_varient *varient,
|
||||
unsigned buffer,
|
||||
const void *ptr,
|
||||
unsigned stride )
|
||||
unsigned stride,
|
||||
unsigned max_index )
|
||||
{
|
||||
struct draw_vs_varient_generic *vsvg = (struct draw_vs_varient_generic *)varient;
|
||||
|
||||
vsvg->fetch->set_buffer(vsvg->fetch,
|
||||
buffer,
|
||||
ptr,
|
||||
stride);
|
||||
stride,
|
||||
max_index );
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -172,12 +174,14 @@ static void PIPE_CDECL vsvg_run_elts( struct draw_vs_varient *varient,
|
|||
vsvg->emit->set_buffer( vsvg->emit,
|
||||
0,
|
||||
temp_buffer,
|
||||
temp_vertex_stride );
|
||||
temp_vertex_stride,
|
||||
~0 );
|
||||
|
||||
vsvg->emit->set_buffer( vsvg->emit,
|
||||
1,
|
||||
&vsvg->draw->rasterizer->point_size,
|
||||
0);
|
||||
0,
|
||||
~0 );
|
||||
|
||||
vsvg->emit->run( vsvg->emit,
|
||||
0, count,
|
||||
|
|
@ -232,12 +236,14 @@ static void PIPE_CDECL vsvg_run_linear( struct draw_vs_varient *varient,
|
|||
vsvg->emit->set_buffer( vsvg->emit,
|
||||
0,
|
||||
temp_buffer,
|
||||
temp_vertex_stride );
|
||||
temp_vertex_stride,
|
||||
~0 );
|
||||
|
||||
vsvg->emit->set_buffer( vsvg->emit,
|
||||
1,
|
||||
&vsvg->draw->rasterizer->point_size,
|
||||
0);
|
||||
0,
|
||||
~0 );
|
||||
|
||||
vsvg->emit->run( vsvg->emit,
|
||||
0, count,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue