r300g: do not reallocate r300_vertex_info and r300_rs_block all the time

This commit is contained in:
Marek Olšák 2009-11-20 04:52:49 +01:00 committed by Corbin Simpson
parent 3a2cd66af8
commit 44c0aaf990
2 changed files with 22 additions and 26 deletions

View file

@ -69,6 +69,7 @@ static void r300_destroy_context(struct pipe_context* context)
FREE(r300->blend_color_state);
FREE(r300->rs_block);
FREE(r300->scissor_state);
FREE(r300->vertex_info);
FREE(r300->viewport_state);
FREE(r300);
}
@ -152,6 +153,7 @@ struct pipe_context* r300_create_context(struct pipe_screen* screen,
r300->blend_color_state = CALLOC_STRUCT(r300_blend_color_state);
r300->rs_block = CALLOC_STRUCT(r300_rs_block);
r300->scissor_state = CALLOC_STRUCT(r300_scissor_state);
r300->vertex_info = CALLOC_STRUCT(r300_vertex_info);
r300->viewport_state = CALLOC_STRUCT(r300_viewport_state);
/* Open up the OQ BO. */

View file

@ -63,10 +63,9 @@ int r300_shader_key_compare(void* key1, void* key2) {
/* Set up the vs_output_tab and routes. */
static void r300_vs_output_tab_routes(struct r300_context* r300,
struct r300_vertex_info* vformat,
int* vs_output_tab)
{
struct vertex_info* vinfo = &vformat->vinfo;
struct vertex_info* vinfo = &r300->vertex_info->vinfo;
boolean pos = FALSE, psize = FALSE, fog = FALSE;
int i, texs = 0, cols = 0;
struct tgsi_shader_info* info = &r300->fs->info;
@ -185,9 +184,9 @@ static void r300_vs_output_tab_routes(struct r300_context* r300,
}
/* Update the PSC tables. */
static void r300_vertex_psc(struct r300_context* r300,
struct r300_vertex_info* vformat)
static void r300_vertex_psc(struct r300_context* r300)
{
struct r300_vertex_info *vformat = r300->vertex_info;
uint16_t type, swizzle;
enum pipe_format format;
unsigned i;
@ -229,9 +228,9 @@ static void r300_vertex_psc(struct r300_context* r300,
/* Update the PSC tables for SW TCL, using Draw. */
static void r300_swtcl_vertex_psc(struct r300_context* r300,
struct r300_vertex_info* vformat,
int* vs_output_tab)
{
struct r300_vertex_info *vformat = r300->vertex_info;
struct vertex_info* vinfo = &vformat->vinfo;
uint16_t type, swizzle;
enum pipe_format format;
@ -283,9 +282,9 @@ static void r300_swtcl_vertex_psc(struct r300_context* r300,
/* Set up the RS block. This is the part of the chipset that actually does
* the rasterization of vertices into fragments. This is also the part of the
* chipset that locks up if any part of it is even slightly wrong. */
static void r300_update_rs_block(struct r300_context* r300,
struct r300_rs_block* rs)
static void r300_update_rs_block(struct r300_context* r300)
{
struct r300_rs_block* rs = r300->rs_block;
struct tgsi_shader_info* info = &r300->fs->info;
int col_count = 0, fp_offset = 0, i, tex_count = 0;
int rs_tex_comp = 0;
@ -392,14 +391,9 @@ static void r300_update_rs_block(struct r300_context* r300,
static void r300_update_derived_shader_state(struct r300_context* r300)
{
struct r300_screen* r300screen = r300_screen(r300->context.screen);
struct r300_vertex_info* vformat;
struct r300_rs_block* rs_block;
int vs_output_tab[16];
int i;
for (i = 0; i < 16; i++) {
vs_output_tab[i] = -1;
}
/*
struct r300_shader_key* key;
@ -427,25 +421,25 @@ static void r300_update_derived_shader_state(struct r300_context* r300)
(void*)key, (void*)value);
} */
/* XXX This will be refactored ASAP. */
vformat = CALLOC_STRUCT(r300_vertex_info);
rs_block = CALLOC_STRUCT(r300_rs_block);
/* Reset structures */
memset(r300->rs_block, 0, sizeof(struct r300_rs_block));
memset(r300->vertex_info, 0, sizeof(struct r300_vertex_info));
r300_vs_output_tab_routes(r300, vformat, vs_output_tab);
if (r300screen->caps->has_tcl) {
r300_vertex_psc(r300, vformat);
} else {
r300_swtcl_vertex_psc(r300, vformat, vs_output_tab);
for (i = 0; i < 16; i++) {
vs_output_tab[i] = -1;
}
r300_update_rs_block(r300, rs_block);
/* Update states */
r300_vs_output_tab_routes(r300, vs_output_tab);
FREE(r300->vertex_info);
FREE(r300->rs_block);
if (r300screen->caps->has_tcl) {
r300_vertex_psc(r300);
} else {
r300_swtcl_vertex_psc(r300, vs_output_tab);
}
r300_update_rs_block(r300);
r300->vertex_info = vformat;
r300->rs_block = rs_block;
r300->dirty_state |= R300_NEW_RS_BLOCK;
}