@@ -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 \ |
@@ -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); |
@@ -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; |
@@ -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 <airlied@redhat.com> | |||
*/ | |||
#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; | |||
} | |||
} |