r600g/sb: improve optimization of conditional instructions
[mesa.git] / src / gallium / drivers / svga / svga_draw_elements.c
index 7ec4a058fc787ca39118ccc14a0a01356999b269..f0815b144ae85820ff4fe65a2dd95ad6641cc6aa 100644 (file)
@@ -33,7 +33,6 @@
 #include "svga_resource_buffer.h"
 #include "svga_winsys.h"
 #include "svga_context.h"
-
 #include "svga_hw_reg.h"
 
 
@@ -54,8 +53,9 @@ translate_indices( struct svga_hwtnl *hwtnl,
    struct pipe_resource *dst = NULL;
    void *dst_map = NULL;
 
-   dst = pipe_buffer_create( pipe->screen, 
-                            PIPE_BIND_INDEX_BUFFER, 
+   dst = pipe_buffer_create( pipe->screen,
+                            PIPE_BIND_INDEX_BUFFER,
+                            PIPE_USAGE_STATIC,
                             size );
    if (dst == NULL)
       goto fail;
@@ -72,18 +72,18 @@ translate_indices( struct svga_hwtnl *hwtnl,
               nr,
               dst_map );
 
-   pipe_buffer_unmap( pipe, src, src_transfer );
-   pipe_buffer_unmap( pipe, dst, dst_transfer );
+   pipe_buffer_unmap( pipe, src_transfer );
+   pipe_buffer_unmap( pipe, dst_transfer );
 
    *out_buf = dst;
    return PIPE_OK;
 
 fail:
    if (src_map)
-      pipe_buffer_unmap( pipe, src, src_transfer );
+      pipe_buffer_unmap( pipe, src_transfer );
 
    if (dst_map)
-      pipe_buffer_unmap( pipe, dst, dst_transfer );
+      pipe_buffer_unmap( pipe, dst_transfer );
 
    if (dst)
       pipe->screen->resource_destroy( pipe->screen, dst );
@@ -99,36 +99,37 @@ enum pipe_error
 svga_hwtnl_simple_draw_range_elements( struct svga_hwtnl *hwtnl,
                                        struct pipe_resource *index_buffer,
                                        unsigned index_size,
+                                       int index_bias,
                                        unsigned min_index,
                                        unsigned max_index,
-                                       unsigned prim, 
+                                       unsigned prim,
                                        unsigned start,
-                                       unsigned count,
-                                       unsigned bias )
+                                       unsigned count )
 {
    struct pipe_resource *upload_buffer = NULL;
    SVGA3dPrimitiveRange range;
    unsigned hw_prim;
    unsigned hw_count;
    unsigned index_offset = start * index_size;
-   int ret = PIPE_OK;
+   enum pipe_error ret = PIPE_OK;
 
    hw_prim = svga_translate_prim(prim, count, &hw_count);
    if (hw_count == 0)
       goto done;
 
-   if (index_buffer && 
-       svga_buffer_is_user_buffer(index_buffer)) 
+   if (index_buffer &&
+       svga_buffer_is_user_buffer(index_buffer))
    {
       assert( index_buffer->width0 >= index_offset + count * index_size );
 
       ret = u_upload_buffer( hwtnl->upload_ib,
+                             0,
                              index_offset,
                              count * index_size,
                              index_buffer,
                              &index_offset,
-                             &upload_buffer );
-      if (ret)
+                             &upload_buffer);
+      if (ret != PIPE_OK)
          goto done;
 
       /* Don't need to worry about refcounting index_buffer as this is
@@ -143,10 +144,10 @@ svga_hwtnl_simple_draw_range_elements( struct svga_hwtnl *hwtnl,
    range.indexArray.offset = index_offset;
    range.indexArray.stride = index_size;
    range.indexWidth = index_size;
-   range.indexBias = bias;
-      
+   range.indexBias = index_bias;
+
    ret = svga_hwtnl_prim( hwtnl, &range, min_index, max_index, index_buffer );
-   if (ret)
+   if (ret != PIPE_OK)
       goto done;
 
 done:
@@ -163,17 +164,17 @@ enum pipe_error
 svga_hwtnl_draw_range_elements( struct svga_hwtnl *hwtnl,
                                 struct pipe_resource *index_buffer,
                                 unsigned index_size,
+                                int index_bias,
                                 unsigned min_index,
                                 unsigned max_index,
-                                unsigned prim, unsigned start, unsigned count,
-                                unsigned bias)
+                                unsigned prim, unsigned start, unsigned count)
 {
    unsigned gen_prim, gen_size, gen_nr, gen_type;
    u_translate_func gen_func;
    enum pipe_error ret = PIPE_OK;
 
-   if (hwtnl->api_fillmode != PIPE_POLYGON_MODE_FILL && 
-       prim >= PIPE_PRIM_TRIANGLES) 
+   if (hwtnl->api_fillmode != PIPE_POLYGON_MODE_FILL &&
+       prim >= PIPE_PRIM_TRIANGLES)
    {
       gen_type = u_unfilled_translator( prim,
                                         index_size,
@@ -198,15 +199,15 @@ svga_hwtnl_draw_range_elements( struct svga_hwtnl *hwtnl,
                                      &gen_func );
    }
 
-   
    if (gen_type == U_TRANSLATE_MEMCPY) {
-      /* No need for translation, just pass through to hardware: 
+      /* No need for translation, just pass through to hardware:
        */
       return svga_hwtnl_simple_draw_range_elements( hwtnl, index_buffer,
                                                     index_size,
+                                                    index_bias,
                                                     min_index,
                                                     max_index,
-                                                    gen_prim, start, count, bias );
+                                                    gen_prim, start, count );
    }
    else {
       struct pipe_resource *gen_buf = NULL;
@@ -225,19 +226,19 @@ svga_hwtnl_draw_range_elements( struct svga_hwtnl *hwtnl,
                                gen_size,
                                gen_func,
                                &gen_buf );
-      if (ret)
+      if (ret != PIPE_OK)
          goto done;
 
       ret = svga_hwtnl_simple_draw_range_elements( hwtnl,
                                                    gen_buf,
                                                    gen_size,
+                                                   index_bias,
                                                    min_index,
                                                    max_index,
                                                    gen_prim,
                                                    0,
-                                                   gen_nr,
-                                                   bias );
-      if (ret)
+                                                   gen_nr );
+      if (ret != PIPE_OK)
          goto done;
 
    done:
@@ -247,8 +248,3 @@ svga_hwtnl_draw_range_elements( struct svga_hwtnl *hwtnl,
       return ret;
    }
 }
-
-
-
-
-