Mesa (master): draw: Pass-through pipe_buffer::max_index to translate.

Jose Fonseca jrfonseca at kemper.freedesktop.org
Mon Apr 26 15:06:09 UTC 2010


Module: Mesa
Branch: master
Commit: 2a30d3d74a0b87f8066659952628ccd072a4e2b0
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=2a30d3d74a0b87f8066659952628ccd072a4e2b0

Author: José Fonseca <jfonseca at vmware.com>
Date:   Mon Apr 26 14:55:16 2010 +0100

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.

---

 src/gallium/auxiliary/draw/draw_pipe_vbuf.c        |    4 ++--
 src/gallium/auxiliary/draw/draw_pt_emit.c          |   10 ++++++----
 src/gallium/auxiliary/draw/draw_pt_fetch.c         |    9 ++++++---
 src/gallium/auxiliary/draw/draw_pt_fetch_emit.c    |    6 ++++--
 .../auxiliary/draw/draw_pt_fetch_shade_emit.c      |    3 ++-
 src/gallium/auxiliary/draw/draw_vs.h               |    3 ++-
 src/gallium/auxiliary/draw/draw_vs_varient.c       |   18 ++++++++++++------
 7 files changed, 34 insertions(+), 19 deletions(-)

diff --git a/src/gallium/auxiliary/draw/draw_pipe_vbuf.c b/src/gallium/auxiliary/draw/draw_pipe_vbuf.c
index ee2b811..abbf624 100644
--- a/src/gallium/auxiliary/draw/draw_pipe_vbuf.c
+++ b/src/gallium/auxiliary/draw/draw_pipe_vbuf.c
@@ -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;
diff --git a/src/gallium/auxiliary/draw/draw_pt_emit.c b/src/gallium/auxiliary/draw/draw_pt_emit.c
index a7917f5..ad48fa3 100644
--- a/src/gallium/auxiliary/draw/draw_pt_emit.c
+++ b/src/gallium/auxiliary/draw/draw_pt_emit.c
@@ -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,
diff --git a/src/gallium/auxiliary/draw/draw_pt_fetch.c b/src/gallium/auxiliary/draw/draw_pt_fetch.c
index 252be50..a134722 100644
--- a/src/gallium/auxiliary/draw/draw_pt_fetch.c
+++ b/src/gallium/auxiliary/draw/draw_pt_fetch.c
@@ -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,
diff --git a/src/gallium/auxiliary/draw/draw_pt_fetch_emit.c b/src/gallium/auxiliary/draw/draw_pt_fetch_emit.c
index 1994ddf..d7735bf 100644
--- a/src/gallium/auxiliary/draw/draw_pt_fetch_emit.c
+++ b/src/gallium/auxiliary/draw/draw_pt_fetch_emit.c
@@ -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 / 
diff --git a/src/gallium/auxiliary/draw/draw_pt_fetch_shade_emit.c b/src/gallium/auxiliary/draw/draw_pt_fetch_shade_emit.c
index 389e2b1..cbb5b6c 100644
--- a/src/gallium/auxiliary/draw/draw_pt_fetch_shade_emit.c
+++ b/src/gallium/auxiliary/draw/draw_pt_fetch_shade_emit.c
@@ -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 / 
diff --git a/src/gallium/auxiliary/draw/draw_vs.h b/src/gallium/auxiliary/draw/draw_vs.h
index f493323..efead42 100644
--- a/src/gallium/auxiliary/draw/draw_vs.h
+++ b/src/gallium/auxiliary/draw/draw_vs.h
@@ -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,
diff --git a/src/gallium/auxiliary/draw/draw_vs_varient.c b/src/gallium/auxiliary/draw/draw_vs_varient.c
index 5ed706c..0abd827 100644
--- a/src/gallium/auxiliary/draw/draw_vs_varient.c
+++ b/src/gallium/auxiliary/draw/draw_vs_varient.c
@@ -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,




More information about the mesa-commit mailing list