r300g: Move TCL bypass switch to main context.
This commit is contained in:
parent
47f59cfc8e
commit
8ca491386d
|
@ -71,11 +71,6 @@ struct r300_rs_state {
|
||||||
/* Draw-specific rasterizer state */
|
/* Draw-specific rasterizer state */
|
||||||
struct pipe_rasterizer_state rs;
|
struct pipe_rasterizer_state rs;
|
||||||
|
|
||||||
/* Whether or not to enable the VTE. This is referenced at the very
|
|
||||||
* last moment during emission of VTE state, to decide whether or not
|
|
||||||
* the VTE should be used for transformation. */
|
|
||||||
boolean enable_vte;
|
|
||||||
|
|
||||||
uint32_t vap_control_status; /* R300_VAP_CNTL_STATUS: 0x2140 */
|
uint32_t vap_control_status; /* R300_VAP_CNTL_STATUS: 0x2140 */
|
||||||
uint32_t point_size; /* R300_GA_POINT_SIZE: 0x421c */
|
uint32_t point_size; /* R300_GA_POINT_SIZE: 0x421c */
|
||||||
uint32_t point_minmax; /* R300_GA_POINT_MINMAX: 0x4230 */
|
uint32_t point_minmax; /* R300_GA_POINT_MINMAX: 0x4230 */
|
||||||
|
@ -322,6 +317,8 @@ struct r300_context {
|
||||||
uint32_t dirty_state;
|
uint32_t dirty_state;
|
||||||
/* Flag indicating whether or not the HW is dirty. */
|
/* Flag indicating whether or not the HW is dirty. */
|
||||||
uint32_t dirty_hw;
|
uint32_t dirty_hw;
|
||||||
|
/* Whether the TCL engine should be in bypass mode. */
|
||||||
|
boolean tcl_bypass;
|
||||||
|
|
||||||
/** Combination of DBG_xxx flags */
|
/** Combination of DBG_xxx flags */
|
||||||
unsigned debug;
|
unsigned debug;
|
||||||
|
|
|
@ -147,7 +147,6 @@ static const float * get_shader_constant(
|
||||||
{
|
{
|
||||||
struct r300_viewport_state* viewport =
|
struct r300_viewport_state* viewport =
|
||||||
(struct r300_viewport_state*)r300->viewport_state.state;
|
(struct r300_viewport_state*)r300->viewport_state.state;
|
||||||
boolean vte_enabled = viewport->vte_control & ~R300_VTX_W0_FMT;
|
|
||||||
static float vec[4] = { 0.0, 0.0, 0.0, 1.0 };
|
static float vec[4] = { 0.0, 0.0, 0.0, 1.0 };
|
||||||
struct pipe_texture *tex;
|
struct pipe_texture *tex;
|
||||||
|
|
||||||
|
@ -176,25 +175,22 @@ static const float * get_shader_constant(
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RC_STATE_R300_VIEWPORT_SCALE:
|
case RC_STATE_R300_VIEWPORT_SCALE:
|
||||||
/* XXX argfl stop crossing state */
|
if (r300->tcl_bypass) {
|
||||||
if (vte_enabled) {
|
|
||||||
vec[0] = viewport->xscale;
|
|
||||||
vec[1] = viewport->yscale;
|
|
||||||
vec[2] = viewport->zscale;
|
|
||||||
} else {
|
|
||||||
vec[0] = 1;
|
vec[0] = 1;
|
||||||
vec[1] = 1;
|
vec[1] = 1;
|
||||||
vec[2] = 1;
|
vec[2] = 1;
|
||||||
|
} else {
|
||||||
|
vec[0] = viewport->xscale;
|
||||||
|
vec[1] = viewport->yscale;
|
||||||
|
vec[2] = viewport->zscale;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RC_STATE_R300_VIEWPORT_OFFSET:
|
case RC_STATE_R300_VIEWPORT_OFFSET:
|
||||||
if (vte_enabled) {
|
if (!r300->tcl_bypass) {
|
||||||
vec[0] = viewport->xoffset;
|
vec[0] = viewport->xoffset;
|
||||||
vec[1] = viewport->yoffset;
|
vec[1] = viewport->yoffset;
|
||||||
vec[2] = viewport->zoffset;
|
vec[2] = viewport->zoffset;
|
||||||
} else {
|
|
||||||
/* Zeros. */
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -923,22 +919,22 @@ void r300_emit_viewport_state(struct r300_context* r300, void* state)
|
||||||
struct r300_viewport_state* viewport = (struct r300_viewport_state*)state;
|
struct r300_viewport_state* viewport = (struct r300_viewport_state*)state;
|
||||||
CS_LOCALS(r300);
|
CS_LOCALS(r300);
|
||||||
|
|
||||||
BEGIN_CS(9);
|
if (r300->tcl_bypass) {
|
||||||
OUT_CS_REG_SEQ(R300_SE_VPORT_XSCALE, 6);
|
BEGIN_CS(2);
|
||||||
OUT_CS_32F(viewport->xscale);
|
|
||||||
OUT_CS_32F(viewport->xoffset);
|
|
||||||
OUT_CS_32F(viewport->yscale);
|
|
||||||
OUT_CS_32F(viewport->yoffset);
|
|
||||||
OUT_CS_32F(viewport->zscale);
|
|
||||||
OUT_CS_32F(viewport->zoffset);
|
|
||||||
|
|
||||||
/* XXX words still fail me. */
|
|
||||||
if (((struct r300_rs_state*)r300->rs_state.state)->enable_vte) {
|
|
||||||
OUT_CS_REG(R300_VAP_VTE_CNTL, viewport->vte_control);
|
|
||||||
} else {
|
|
||||||
OUT_CS_REG(R300_VAP_VTE_CNTL, 0);
|
OUT_CS_REG(R300_VAP_VTE_CNTL, 0);
|
||||||
|
END_CS;
|
||||||
|
} else {
|
||||||
|
BEGIN_CS(9);
|
||||||
|
OUT_CS_REG_SEQ(R300_SE_VPORT_XSCALE, 6);
|
||||||
|
OUT_CS_32F(viewport->xscale);
|
||||||
|
OUT_CS_32F(viewport->xoffset);
|
||||||
|
OUT_CS_32F(viewport->yscale);
|
||||||
|
OUT_CS_32F(viewport->yoffset);
|
||||||
|
OUT_CS_32F(viewport->zscale);
|
||||||
|
OUT_CS_32F(viewport->zoffset);
|
||||||
|
OUT_CS_REG(R300_VAP_VTE_CNTL, viewport->vte_control);
|
||||||
|
END_CS;
|
||||||
}
|
}
|
||||||
END_CS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void r300_emit_texture_count(struct r300_context* r300)
|
void r300_emit_texture_count(struct r300_context* r300)
|
||||||
|
|
|
@ -605,8 +605,6 @@ static void* r300_create_rs_state(struct pipe_context* pipe,
|
||||||
/* Copy rasterizer state for Draw. */
|
/* Copy rasterizer state for Draw. */
|
||||||
rs->rs = *state;
|
rs->rs = *state;
|
||||||
|
|
||||||
rs->enable_vte = !state->bypass_vs_clip_and_viewport;
|
|
||||||
|
|
||||||
#ifdef PIPE_ARCH_LITTLE_ENDIAN
|
#ifdef PIPE_ARCH_LITTLE_ENDIAN
|
||||||
rs->vap_control_status = R300_VC_NO_SWAP;
|
rs->vap_control_status = R300_VC_NO_SWAP;
|
||||||
#else
|
#else
|
||||||
|
@ -722,9 +720,12 @@ static void r300_bind_rs_state(struct pipe_context* pipe, void* state)
|
||||||
draw_set_rasterizer_state(r300->draw, &rs->rs);
|
draw_set_rasterizer_state(r300->draw, &rs->rs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
r300->tcl_bypass = rs->rs.bypass_vs_clip_and_viewport;
|
||||||
|
|
||||||
r300->rs_state.state = rs;
|
r300->rs_state.state = rs;
|
||||||
r300->rs_state.dirty = TRUE;
|
r300->rs_state.dirty = TRUE;
|
||||||
r300->viewport_state.dirty = TRUE; /* XXX */
|
/* XXX Why is this still needed, dammit!? */
|
||||||
|
r300->viewport_state.dirty = TRUE;
|
||||||
|
|
||||||
/* XXX Clean these up when we move to atom emits */
|
/* XXX Clean these up when we move to atom emits */
|
||||||
r300->dirty_state |= R300_NEW_RS_BLOCK;
|
r300->dirty_state |= R300_NEW_RS_BLOCK;
|
||||||
|
|
|
@ -139,10 +139,10 @@ static void r300_vertex_psc(struct r300_context* r300)
|
||||||
|
|
||||||
/* If TCL is bypassed, map vertex streams to equivalent VS output
|
/* If TCL is bypassed, map vertex streams to equivalent VS output
|
||||||
* locations. */
|
* locations. */
|
||||||
if (((struct r300_rs_state*)r300->rs_state.state)->enable_vte) {
|
if (r300->tcl_bypass) {
|
||||||
stream_tab = identity;
|
|
||||||
} else {
|
|
||||||
stream_tab = r300->vs->stream_loc_notcl;
|
stream_tab = r300->vs->stream_loc_notcl;
|
||||||
|
} else {
|
||||||
|
stream_tab = identity;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Vertex shaders have no semantics on their inputs,
|
/* Vertex shaders have no semantics on their inputs,
|
||||||
|
@ -556,9 +556,10 @@ static void r300_update_ztop(struct r300_context* r300)
|
||||||
|
|
||||||
void r300_update_derived_state(struct r300_context* r300)
|
void r300_update_derived_state(struct r300_context* r300)
|
||||||
{
|
{
|
||||||
|
/* XXX */
|
||||||
if (r300->dirty_state &
|
if (r300->dirty_state &
|
||||||
(R300_NEW_FRAGMENT_SHADER | R300_NEW_VERTEX_SHADER |
|
(R300_NEW_FRAGMENT_SHADER | R300_NEW_VERTEX_SHADER |
|
||||||
R300_NEW_VERTEX_FORMAT)) {
|
R300_NEW_VERTEX_FORMAT) || r300->rs_state.dirty) {
|
||||||
r300_update_derived_shader_state(r300);
|
r300_update_derived_shader_state(r300);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue