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 start, unsigned count, unsigned start_instance, unsigned instance_count) { SVGA3dPrimitiveRange range; unsigned hw_prim; unsigned hw_count; unsigned index_offset = start * index_size; hw_prim = svga_translate_prim(prim, count, &hw_count); if (hw_count == 0) return PIPE_OK; /* nothing to draw */ range.primType = hw_prim; range.primitiveCount = hw_count; range.indexArray.offset = index_offset; range.indexArray.stride = index_size; range.indexWidth = index_size; range.indexBias = index_bias; return svga_hwtnl_prim(hwtnl, &range, count, min_index, max_index, index_buffer, start_instance, instance_count); }
static enum pipe_error simple_draw_arrays( struct svga_hwtnl *hwtnl, unsigned prim, unsigned start, unsigned count ) { SVGA3dPrimitiveRange range; unsigned hw_prim; unsigned hw_count; hw_prim = svga_translate_prim(prim, count, &hw_count); if (hw_count == 0) return PIPE_ERROR_BAD_INPUT; range.primType = hw_prim; range.primitiveCount = hw_count; range.indexArray.surfaceId = SVGA3D_INVALID_ID; range.indexArray.offset = 0; range.indexArray.stride = 0; range.indexWidth = 0; range.indexBias = start; /* Min/max index should be calculated prior to applying bias, so we * end up with min_index = 0, max_index = count - 1 and everybody * looking at those numbers knows to adjust them by * range.indexBias. */ return svga_hwtnl_prim( hwtnl, &range, 0, count - 1, NULL ); }
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 start, unsigned count ) { struct pipe_resource *upload_buffer = NULL; SVGA3dPrimitiveRange range; unsigned hw_prim; unsigned hw_count; unsigned index_offset = start * index_size; 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)) { 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 != PIPE_OK) goto done; /* Don't need to worry about refcounting index_buffer as this is * just a stack variable without a counted reference of its own. * The caller holds the reference. */ index_buffer = upload_buffer; } range.primType = hw_prim; range.primitiveCount = hw_count; range.indexArray.offset = index_offset; range.indexArray.stride = index_size; range.indexWidth = index_size; range.indexBias = index_bias; ret = svga_hwtnl_prim( hwtnl, &range, min_index, max_index, index_buffer ); if (ret != PIPE_OK) goto done; done: if (upload_buffer) pipe_resource_reference( &upload_buffer, NULL ); return ret; }