1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/********************************************************** 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2008-2009 VMware, Inc. All rights reserved. 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * obtaining a copy of this software and associated documentation 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * files (the "Software"), to deal in the Software without 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * restriction, including without limitation the rights to use, copy, 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * modify, merge, publish, distribute, sublicense, and/or sell copies 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software, and to permit persons to whom the Software is 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * furnished to do so, subject to the following conditions: 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * included in all copies or substantial portions of the Software. 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE. 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **********************************************************/ 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_inlines.h" 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_upload_mgr.h" 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "indices/u_indices.h" 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "svga_cmd.h" 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "svga_draw.h" 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "svga_draw_private.h" 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "svga_resource_buffer.h" 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "svga_winsys.h" 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "svga_context.h" 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "svga_hw_reg.h" 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic enum pipe_error 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtranslate_indices( struct svga_hwtnl *hwtnl, 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *src, 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned offset, 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned nr, 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned index_size, 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u_translate_func translate, 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource **out_buf ) 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context *pipe = &hwtnl->svga->pipe; 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_transfer *src_transfer = NULL; 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_transfer *dst_transfer = NULL; 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned size = index_size * nr; 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const void *src_map = NULL; 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *dst = NULL; 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *dst_map = NULL; 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst = pipe_buffer_create( pipe->screen, 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_BIND_INDEX_BUFFER, 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_USAGE_STATIC, 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size ); 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dst == NULL) 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto fail; 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src_map = pipe_buffer_map( pipe, src, PIPE_TRANSFER_READ, &src_transfer ); 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (src_map == NULL) 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto fail; 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst_map = pipe_buffer_map( pipe, dst, PIPE_TRANSFER_WRITE, &dst_transfer ); 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dst_map == NULL) 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto fail; 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org translate( (const char *)src_map + offset, 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nr, 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst_map ); 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_buffer_unmap( pipe, src_transfer ); 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_buffer_unmap( pipe, dst_transfer ); 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *out_buf = dst; 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_OK; 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgfail: 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (src_map) 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_buffer_unmap( pipe, src_transfer ); 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dst_map) 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_buffer_unmap( pipe, dst_transfer ); 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dst) 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->screen->resource_destroy( pipe->screen, dst ); 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_ERROR_OUT_OF_MEMORY; 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum pipe_error 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsvga_hwtnl_simple_draw_range_elements( struct svga_hwtnl *hwtnl, 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *index_buffer, 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned index_size, 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int index_bias, 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned min_index, 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned max_index, 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned prim, 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned start, 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned count ) 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *upload_buffer = NULL; 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SVGA3dPrimitiveRange range; 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned hw_prim; 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned hw_count; 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned index_offset = start * index_size; 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum pipe_error ret = PIPE_OK; 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org hw_prim = svga_translate_prim(prim, count, &hw_count); 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (hw_count == 0) 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto done; 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (index_buffer && 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org svga_buffer_is_user_buffer(index_buffer)) 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert( index_buffer->width0 >= index_offset + count * index_size ); 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = u_upload_buffer( hwtnl->upload_ib, 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org index_offset, 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org count * index_size, 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org index_buffer, 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &index_offset, 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &upload_buffer); 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ret != PIPE_OK) 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto done; 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Don't need to worry about refcounting index_buffer as this is 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * just a stack variable without a counted reference of its own. 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The caller holds the reference. 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org index_buffer = upload_buffer; 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org range.primType = hw_prim; 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org range.primitiveCount = hw_count; 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org range.indexArray.offset = index_offset; 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org range.indexArray.stride = index_size; 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org range.indexWidth = index_size; 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org range.indexBias = index_bias; 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = svga_hwtnl_prim( hwtnl, &range, min_index, max_index, index_buffer ); 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ret != PIPE_OK) 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto done; 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdone: 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (upload_buffer) 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference( &upload_buffer, NULL ); 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ret; 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum pipe_error 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsvga_hwtnl_draw_range_elements( struct svga_hwtnl *hwtnl, 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *index_buffer, 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned index_size, 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int index_bias, 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned min_index, 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned max_index, 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned prim, unsigned start, unsigned count) 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned gen_prim, gen_size, gen_nr, gen_type; 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u_translate_func gen_func; 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum pipe_error ret = PIPE_OK; 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (hwtnl->api_fillmode != PIPE_POLYGON_MODE_FILL && 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prim >= PIPE_PRIM_TRIANGLES) 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gen_type = u_unfilled_translator( prim, 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org index_size, 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org count, 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org hwtnl->api_fillmode, 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &gen_prim, 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &gen_size, 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &gen_nr, 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &gen_func ); 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gen_type = u_index_translator( svga_hw_prims, 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prim, 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org index_size, 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org count, 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org hwtnl->api_pv, 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org hwtnl->hw_pv, 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &gen_prim, 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &gen_size, 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &gen_nr, 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &gen_func ); 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (gen_type == U_TRANSLATE_MEMCPY) { 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* No need for translation, just pass through to hardware: 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return svga_hwtnl_simple_draw_range_elements( hwtnl, index_buffer, 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org index_size, 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org index_bias, 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org min_index, 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org max_index, 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gen_prim, start, count ); 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *gen_buf = NULL; 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Need to allocate a new index buffer and run the translate 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * func to populate it. Could potentially cache this translated 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * index buffer with the original to avoid future 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * re-translations. Not much point if we're just accelerating 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GL though, as index buffers are typically used only once 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * there. 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = translate_indices( hwtnl, 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org index_buffer, 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org start * index_size, 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gen_nr, 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gen_size, 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gen_func, 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &gen_buf ); 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ret != PIPE_OK) 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto done; 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = svga_hwtnl_simple_draw_range_elements( hwtnl, 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gen_buf, 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gen_size, 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org index_bias, 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org min_index, 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org max_index, 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gen_prim, 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gen_nr ); 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ret != PIPE_OK) 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto done; 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org done: 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (gen_buf) 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference( &gen_buf, NULL ); 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ret; 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 258