build: fix out-of-tree builds in gallium/auxiliary
[mesa.git] / src / gallium / auxiliary / draw / draw_pt_emit.c
index a7917f54b048257be04dcbe1aa6cda69d6bcff2d..fc64048be1b77ed29c7c8b9c0042ea33dd26d429 100644 (file)
@@ -33,6 +33,7 @@
 #include "draw/draw_pt.h"
 #include "translate/translate.h"
 #include "translate/translate_cache.h"
+#include "util/u_prim.h"
 
 struct pt_emit {
    struct draw_context *draw;
@@ -45,38 +46,33 @@ struct pt_emit {
    const struct vertex_info *vinfo;
 };
 
-void draw_pt_emit_prepare( struct pt_emit *emit,
-                          unsigned prim,
-                           unsigned *max_vertices )
+
+void
+draw_pt_emit_prepare(struct pt_emit *emit,
+                     unsigned prim,
+                     unsigned *max_vertices)
 {
    struct draw_context *draw = emit->draw;
    const struct vertex_info *vinfo;
    unsigned dst_offset;
    struct translate_key hw_key;
    unsigned i;
-   boolean ok;
-   
-   /* XXX: need to flush to get prim_vbuf.c to release its allocation?? 
+
+   /* XXX: need to flush to get prim_vbuf.c to release its allocation??
     */
    draw_do_flush( draw, DRAW_FLUSH_BACKEND );
 
-
    /* XXX: may need to defensively reset this later on as clipping can
     * clobber this state in the render backend.
     */
    emit->prim = prim;
 
-   ok = draw->render->set_primitive(draw->render, emit->prim);
-   if (!ok) {
-      assert(0);
-      return;
-   }
+   draw->render->set_primitive(draw->render, emit->prim);
 
    /* Must do this after set_primitive() above:
     */
    emit->vinfo = vinfo = draw->render->get_vertex_info(draw->render);
 
-
    /* Translate from pipeline vertices to hw vertices.
     */
    dst_offset = 0;
@@ -112,51 +108,42 @@ void draw_pt_emit_prepare( struct pt_emit *emit,
    hw_key.output_stride = vinfo->size * 4;
 
    if (!emit->translate ||
-       translate_key_compare(&emit->translate->key, &hw_key) != 0)
-   {
+       translate_key_compare(&emit->translate->key, &hw_key) != 0) {
       translate_key_sanitize(&hw_key);
       emit->translate = translate_cache_find(emit->cache, &hw_key);
    }
 
-   *max_vertices = (draw->render->max_vertex_buffer_bytes / 
+   *max_vertices = (draw->render->max_vertex_buffer_bytes /
                     (vinfo->size * 4));
-
-   /* even number */
-   *max_vertices = *max_vertices & ~1;
 }
 
 
-void draw_pt_emit( struct pt_emit *emit,
-                  const float (*vertex_data)[4],
-                  unsigned vertex_count,
-                  unsigned stride,
-                  const ushort *elts,
-                  unsigned count )
+void
+draw_pt_emit(struct pt_emit *emit,
+             const struct draw_vertex_info *vert_info,
+             const struct draw_prim_info *prim_info)
 {
+   const float (*vertex_data)[4] = (const float (*)[4])vert_info->verts->data;
+   unsigned vertex_count = vert_info->count;
+   unsigned stride = vert_info->stride;
+   const ushort *elts = prim_info->elts;
    struct draw_context *draw = emit->draw;
    struct translate *translate = emit->translate;
    struct vbuf_render *render = draw->render;
+   unsigned start, i;
    void *hw_verts;
 
-   /* XXX: need to flush to get prim_vbuf.c to release its allocation?? 
+   /* XXX: need to flush to get prim_vbuf.c to release its allocation??
     */
    draw_do_flush( draw, DRAW_FLUSH_BACKEND );
 
    if (vertex_count == 0)
       return;
 
-   if (vertex_count >= UNDEFINED_VERTEX_ID) {
-      assert(0);
-      return;
-   }
-
    /* XXX: and work out some way to coordinate the render primitive
     * between vbuf.c and here...
     */
-   if (!draw->render->set_primitive(draw->render, emit->prim)) {
-      assert(0);
-      return;
-   }
+   draw->render->set_primitive(draw->render, emit->prim);
 
    render->allocate_vertices(render,
                              (ushort)translate->key.output_stride,
@@ -164,63 +151,70 @@ void draw_pt_emit( struct pt_emit *emit,
 
    hw_verts = render->map_vertices( render );
    if (!hw_verts) {
-      assert(0);
+      debug_warn_once("map of vertex buffer failed (out of memory?)");
       return;
    }
 
-   translate->set_buffer(translate, 
-                        0, 
+   translate->set_buffer(translate,
+                        0,
                         vertex_data,
-                        stride );
+                        stride,
+                        ~0);
 
-   translate->set_buffer(translate, 
-                        1, 
+   translate->set_buffer(translate,
+                        1,
                         &draw->rasterizer->point_size,
-                        0);
+                        0,
+                        ~0);
 
-   translate->run( translate,
-                  0, 
-                  vertex_count,
-                   draw->instance_id,
-                  hw_verts );
+   /* fetch/translate vertex attribs to fill hw_verts[] */
+   translate->run(translate,
+                 0,
+                 vertex_count,
+                  draw->start_instance,
+                  draw->instance_id,
+                 hw_verts );
 
-   render->unmap_vertices( render, 
-                           0, 
-                           vertex_count - 1 );
+   render->unmap_vertices(render, 0, vertex_count - 1);
 
-   render->draw(render,
-               elts,
-               count);
+   for (start = i = 0;
+        i < prim_info->primitive_count;
+        start += prim_info->primitive_lengths[i], i++)
+   {
+      render->draw_elements(render,
+                            elts + start,
+                            prim_info->primitive_lengths[i]);
+   }
 
    render->release_vertices(render);
 }
 
 
-void draw_pt_emit_linear(struct pt_emit *emit,
-                         const float (*vertex_data)[4],
-                         unsigned stride,
-                         unsigned count)
+void
+draw_pt_emit_linear(struct pt_emit *emit,
+                    const struct draw_vertex_info *vert_info,
+                    const struct draw_prim_info *prim_info)
 {
+   const float (*vertex_data)[4] = (const float (*)[4])vert_info->verts->data;
+   unsigned stride = vert_info->stride;
+   unsigned count = vert_info->count;
    struct draw_context *draw = emit->draw;
    struct translate *translate = emit->translate;
    struct vbuf_render *render = draw->render;
    void *hw_verts;
+   unsigned start, i;
 
 #if 0
    debug_printf("Linear emit\n");
 #endif
-   /* XXX: need to flush to get prim_vbuf.c to release its allocation?? 
+   /* XXX: need to flush to get prim_vbuf.c to release its allocation??
     */
    draw_do_flush( draw, DRAW_FLUSH_BACKEND );
 
-   if (count >= UNDEFINED_VERTEX_ID)
-      goto fail;
-
    /* XXX: and work out some way to coordinate the render primitive
     * between vbuf.c and here...
     */
-   if (!draw->render->set_primitive(draw->render, emit->prim)) 
-      goto fail;
+   draw->render->set_primitive(draw->render, emit->prim);
 
    if (!render->allocate_vertices(render,
                                   (ushort)translate->key.output_stride,
@@ -232,15 +226,16 @@ 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,
                   count,
+                  draw->start_instance,
                   draw->instance_id,
                   hw_verts);
 
@@ -248,26 +243,35 @@ void draw_pt_emit_linear(struct pt_emit *emit,
       unsigned i;
       for (i = 0; i < count; i++) {
          debug_printf("\n\n%s vertex %d:\n", __FUNCTION__, i);
-         draw_dump_emitted_vertex( emit->vinfo, 
-                                   (const uint8_t *)hw_verts + 
+         draw_dump_emitted_vertex( emit->vinfo,
+                                   (const uint8_t *)hw_verts +
                                    translate->key.output_stride * i );
       }
    }
 
    render->unmap_vertices( render, 0, count - 1 );
 
-   render->draw_arrays(render, 0, count);
-
+   for (start = i = 0;
+        i < prim_info->primitive_count;
+        start += prim_info->primitive_lengths[i], i++)
+   {
+      render->draw_arrays(render,
+                          start,
+                          prim_info->primitive_lengths[i]);
+   }
+   
    render->release_vertices(render);
 
    return;
 
 fail:
-   assert(0);
+   debug_warn_once("allocate or map of vertex buffer failed (out of memory?)");
    return;
 }
 
-struct pt_emit *draw_pt_emit_create( struct draw_context *draw )
+
+struct pt_emit *
+draw_pt_emit_create(struct draw_context *draw)
 {
    struct pt_emit *emit = CALLOC_STRUCT(pt_emit);
    if (!emit)
@@ -283,7 +287,9 @@ struct pt_emit *draw_pt_emit_create( struct draw_context *draw )
    return emit;
 }
 
-void draw_pt_emit_destroy( struct pt_emit *emit )
+
+void
+draw_pt_emit_destroy(struct pt_emit *emit)
 {
    if (emit->cache)
       translate_cache_destroy(emit->cache);