X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fr300%2Fr300_emit.c;h=19acdaba621bbc834fdc4c0d3d79cf0af14032ec;hb=24ceef7a6969ccb2243e7bb32f86d6429d9689b9;hp=b337cd960361dbe4e0111a7b9365d9d2d356740a;hpb=abc2f29dd2baa9c8aa672f07a1500e579364ab29;p=mesa.git diff --git a/src/gallium/drivers/r300/r300_emit.c b/src/gallium/drivers/r300/r300_emit.c index b337cd96036..19acdaba621 100644 --- a/src/gallium/drivers/r300/r300_emit.c +++ b/src/gallium/drivers/r300/r300_emit.c @@ -137,60 +137,41 @@ void r300_emit_dsa_state(struct r300_context* r300, unsigned size, void* state) END_CS; } -static const float * get_shader_constant( +static const float * get_rc_constant_state( struct r300_context * r300, - struct rc_constant * constant, - struct r300_constant_buffer * externals) + struct rc_constant * constant) { struct r300_viewport_state* viewport = r300->viewport_state.state; struct r300_textures_state* texstate = r300->textures_state.state; static float vec[4] = { 0.0, 0.0, 0.0, 1.0 }; struct pipe_resource *tex; - switch(constant->Type) { - case RC_CONSTANT_EXTERNAL: - return externals->constants[constant->u.External]; - - case RC_CONSTANT_IMMEDIATE: - return constant->u.Immediate; - - case RC_CONSTANT_STATE: - switch (constant->u.State[0]) { - /* Factor for converting rectangle coords to - * normalized coords. Should only show up on non-r500. */ - case RC_STATE_R300_TEXRECT_FACTOR: - tex = texstate->sampler_views[constant->u.State[1]]->base.texture; - vec[0] = 1.0 / tex->width0; - vec[1] = 1.0 / tex->height0; - break; - - /* Texture compare-fail value. Shouldn't ever show up, but if - * it does, we'll be ready. */ - case RC_STATE_SHADOW_AMBIENT: - vec[3] = 0; - break; - - case RC_STATE_R300_VIEWPORT_SCALE: - vec[0] = viewport->xscale; - vec[1] = viewport->yscale; - vec[2] = viewport->zscale; - break; - - case RC_STATE_R300_VIEWPORT_OFFSET: - vec[0] = viewport->xoffset; - vec[1] = viewport->yoffset; - vec[2] = viewport->zoffset; - break; - - default: - fprintf(stderr, "r300: Implementation error: " - "Unknown RC_CONSTANT type %d\n", constant->u.State[0]); - } + assert(constant->Type == RC_CONSTANT_STATE); + + switch (constant->u.State[0]) { + /* Factor for converting rectangle coords to + * normalized coords. Should only show up on non-r500. */ + case RC_STATE_R300_TEXRECT_FACTOR: + tex = texstate->sampler_views[constant->u.State[1]]->base.texture; + vec[0] = 1.0 / tex->width0; + vec[1] = 1.0 / tex->height0; + break; + + case RC_STATE_R300_VIEWPORT_SCALE: + vec[0] = viewport->xscale; + vec[1] = viewport->yscale; + vec[2] = viewport->zscale; + break; + + case RC_STATE_R300_VIEWPORT_OFFSET: + vec[0] = viewport->xoffset; + vec[1] = viewport->yoffset; + vec[2] = viewport->zoffset; break; default: fprintf(stderr, "r300: Implementation error: " - "Unhandled constant type %d\n", constant->Type); + "Unknown RC_CONSTANT type %d\n", constant->u.State[0]); } /* This should either be (0, 0, 0, 1), which should be a relatively safe @@ -346,11 +327,11 @@ void r300_emit_fs_rc_constant_state(struct r300_context* r300, unsigned size, vo if (count == 0) return; - BEGIN_CS(count * 5); + BEGIN_CS(size); for(i = first; i < end; ++i) { if (constants->Constants[i].Type == RC_CONSTANT_STATE) { - const float *data = get_shader_constant(r300, - &constants->Constants[i], 0); + const float *data = + get_rc_constant_state(r300, &constants->Constants[i]); OUT_CS_REG_SEQ(R300_PFS_PARAM_0_X + i * 16, 4); OUT_CS(pack_float24(data[0])); @@ -439,7 +420,7 @@ void r500_emit_fs_constants(struct r300_context* r300, unsigned size, void *stat if (count == 0) return; - BEGIN_CS(count * 4 + 3); + BEGIN_CS(size); OUT_CS_REG(R500_GA_US_VECTOR_INDEX, R500_GA_US_VECTOR_INDEX_TYPE_CONST); OUT_CS_ONE_REG(R500_GA_US_VECTOR_DATA, count * 4); for(i = 0; i < count; ++i) { @@ -468,11 +449,11 @@ void r500_emit_fs_rc_constant_state(struct r300_context* r300, unsigned size, vo if (count == 0) return; - BEGIN_CS(count * 7); + BEGIN_CS(size); for(i = first; i < end; ++i) { if (constants->Constants[i].Type == RC_CONSTANT_STATE) { - const float *data = get_shader_constant(r300, - &constants->Constants[i], 0); + const float *data = + get_rc_constant_state(r300, &constants->Constants[i]); OUT_CS_REG(R500_GA_US_VECTOR_INDEX, R500_GA_US_VECTOR_INDEX_TYPE_CONST | @@ -570,7 +551,7 @@ void r300_emit_fb_state(struct r300_context* r300, unsigned size, void* state) END_CS; } -void r300_emit_query_start(struct r300_context *r300) +void r300_emit_query_start(struct r300_context *r300, unsigned size, void*state) { struct r300_query *query = r300->query_current; CS_LOCALS(r300); @@ -578,7 +559,7 @@ void r300_emit_query_start(struct r300_context *r300) if (!query) return; - BEGIN_CS(4); + BEGIN_CS(size); if (r300->screen->caps.family == CHIP_FAMILY_RV530) { OUT_CS_REG(RV530_FG_ZBREG_DEST, RV530_FG_ZBREG_DEST_PIPE_SELECT_ALL); } else { @@ -1025,21 +1006,25 @@ void r300_emit_vs_state(struct r300_context* r300, unsigned size, void* state) END_CS; } -void r300_emit_vs_constant_buffer(struct r300_context* r300, - struct rc_constant_list* constants) +void r300_emit_vs_constants(struct r300_context* r300, + unsigned size, void *state) { unsigned i; - unsigned count = ((struct r300_vertex_shader*)r300->vs_state.state)->externals_count; + unsigned count = + ((struct r300_vertex_shader*)r300->vs_state.state)->externals_count; + struct r300_constant_buffer *buf = (struct r300_constant_buffer*)state; CS_LOCALS(r300); - BEGIN_CS(count * 4 + 3); + if (!count) + return; + + BEGIN_CS(size); OUT_CS_REG(R300_VAP_PVS_VECTOR_INDX_REG, (r300->screen->caps.is_r500 ? R500_PVS_CONST_START : R300_PVS_CONST_START)); OUT_CS_ONE_REG(R300_VAP_PVS_UPLOAD_DATA, count * 4); for (i = 0; i < count; i++) { - const float *data = - r300->shader_constants[PIPE_SHADER_VERTEX].constants[i]; + const float *data = buf->constants[i]; OUT_CS_32F(data[0]); OUT_CS_32F(data[1]); OUT_CS_32F(data[2]); @@ -1145,7 +1130,7 @@ validate: } } /* ...occlusion query buffer... */ - if (r300->dirty_state & R300_NEW_QUERY) { + if (r300->query_start.dirty) { if (!r300_add_buffer(r300->rws, r300->oqbo, 0, RADEON_GEM_DOMAIN_GTT)) { r300->context.flush(&r300->context, 0, NULL); @@ -1198,14 +1183,11 @@ unsigned r300_get_num_dirty_dwords(struct r300_context *r300) unsigned dwords = 0; foreach(atom, &r300->atom_list) { - if (atom->dirty || atom->always_dirty) { + if (atom->dirty) { dwords += atom->size; } } - /* XXX This is the compensation for the non-atomized states. */ - dwords += 1024; - return dwords; } @@ -1215,26 +1197,13 @@ void r300_emit_dirty_state(struct r300_context* r300) struct r300_screen* r300screen = r300->screen; struct r300_atom* atom; - if (r300->dirty_state & R300_NEW_QUERY) { - r300_emit_query_start(r300); - r300->dirty_state &= ~R300_NEW_QUERY; - } - foreach(atom, &r300->atom_list) { - if (atom->dirty || atom->always_dirty) { + if (atom->dirty) { atom->emit(r300, atom->size, atom->state); atom->dirty = FALSE; } } - if (r300->dirty_state & R300_NEW_VERTEX_SHADER_CONSTANTS) { - struct r300_vertex_shader* vs = r300->vs_state.state; - if (vs->code.constants.Count) { - r300_emit_vs_constant_buffer(r300, &vs->code.constants); - } - r300->dirty_state &= ~R300_NEW_VERTEX_SHADER_CONSTANTS; - } - /* Emit the VBO for SWTCL. */ if (!r300screen->caps.has_tcl) { r300_emit_vertex_buffer(r300);