diff options
Diffstat (limited to 'src/gallium')
-rw-r--r-- | src/gallium/drivers/r600/Makefile.sources | 1 | ||||
-rw-r--r-- | src/gallium/drivers/r600/r600_pipe.h | 5 | ||||
-rw-r--r-- | src/gallium/drivers/r600/r600_state_common.c | 28 | ||||
-rw-r--r-- | src/gallium/drivers/r600/r600_translate.c | 53 |
4 files changed, 22 insertions, 65 deletions
diff --git a/src/gallium/drivers/r600/Makefile.sources b/src/gallium/drivers/r600/Makefile.sources index 50546e6fb2f..0885ae5ce1f 100644 --- a/src/gallium/drivers/r600/Makefile.sources +++ b/src/gallium/drivers/r600/Makefile.sources @@ -13,7 +13,6 @@ C_SOURCES = \ evergreen_hw_context.c \ evergreen_state.c \ eg_asm.c \ - r600_translate.c \ r600_state_common.c \ evergreen_compute.c \ evergreen_compute_internal.c \ diff --git a/src/gallium/drivers/r600/r600_pipe.h b/src/gallium/drivers/r600/r600_pipe.h index ef2b946a00c..bf3d0bd778d 100644 --- a/src/gallium/drivers/r600/r600_pipe.h +++ b/src/gallium/drivers/r600/r600_pipe.h @@ -635,11 +635,6 @@ struct pipe_surface *r600_create_surface_custom(struct pipe_context *pipe, const struct pipe_surface *templ, unsigned width, unsigned height); -/* r600_translate.c */ -void r600_translate_index_buffer(struct r600_context *r600, - struct pipe_index_buffer *ib, - unsigned count); - /* r600_state_common.c */ void r600_init_common_state_functions(struct r600_context *rctx); void r600_emit_cso_state(struct r600_context *rctx, struct r600_atom *atom); diff --git a/src/gallium/drivers/r600/r600_state_common.c b/src/gallium/drivers/r600/r600_state_common.c index 3d58addc62b..df8a3f5d232 100644 --- a/src/gallium/drivers/r600/r600_state_common.c +++ b/src/gallium/drivers/r600/r600_state_common.c @@ -28,6 +28,7 @@ #include "r600d.h" #include "util/u_draw_quad.h" +#include "util/u_index_modify.h" #include "util/u_upload_mgr.h" #include "tgsi/tgsi_parse.h" #include <byteswap.h> @@ -1125,7 +1126,6 @@ static void r600_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info struct r600_block *dirty_block = NULL, *next_block = NULL; struct radeon_winsys_cs *cs = rctx->cs; uint64_t va; - uint8_t *ptr; if (!info.count && (info.indexed || !info.count_from_stream_output)) { assert(0); @@ -1146,13 +1146,29 @@ static void r600_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info ib.index_size = rctx->index_buffer.index_size; ib.offset = rctx->index_buffer.offset + info.start * ib.index_size; - /* Translate or upload, if needed. */ - r600_translate_index_buffer(rctx, &ib, info.count); + /* Translate 8-bit indices to 16-bit. */ + if (ib.index_size == 1) { + struct pipe_resource *out_buffer = NULL; + unsigned out_offset; + void *ptr; - ptr = (uint8_t*)ib.user_buffer; - if (!ib.buffer && ptr) { + u_upload_alloc(rctx->uploader, 0, info.count * 2, + &out_offset, &out_buffer, &ptr); + + util_shorten_ubyte_elts_to_userptr( + &rctx->context, &ib, 0, ib.offset, info.count, ptr); + + pipe_resource_reference(&ib.buffer, NULL); + ib.user_buffer = NULL; + ib.buffer = out_buffer; + ib.offset = out_offset; + ib.index_size = 2; + } + + /* Upload the index buffer. */ + if (ib.user_buffer) { u_upload_data(rctx->uploader, 0, info.count * ib.index_size, - ptr, &ib.offset, &ib.buffer); + ib.user_buffer, &ib.offset, &ib.buffer); } } else { info.index_bias = info.start; diff --git a/src/gallium/drivers/r600/r600_translate.c b/src/gallium/drivers/r600/r600_translate.c deleted file mode 100644 index c054c865e02..00000000000 --- a/src/gallium/drivers/r600/r600_translate.c +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright 2010 Red Hat Inc. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * on the rights to use, copy, modify, merge, publish, distribute, sub - * license, and/or sell copies of the Software, and to permit persons to whom - * the Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL - * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, - * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR - * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE - * USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * Authors: Dave Airlie <[email protected]> - */ - -#include "r600_pipe.h" -#include "util/u_index_modify.h" -#include "util/u_upload_mgr.h" - - -void r600_translate_index_buffer(struct r600_context *r600, - struct pipe_index_buffer *ib, - unsigned count) -{ - struct pipe_resource *out_buffer = NULL; - unsigned out_offset; - void *ptr; - - switch (ib->index_size) { - case 1: - u_upload_alloc(r600->uploader, 0, count * 2, - &out_offset, &out_buffer, &ptr); - - util_shorten_ubyte_elts_to_userptr( - &r600->context, ib, 0, ib->offset, count, ptr); - - pipe_resource_reference(&ib->buffer, NULL); - ib->buffer = out_buffer; - ib->offset = out_offset; - ib->index_size = 2; - break; - } -} |