r300g: Atomize viewport.

Goddammit, some of these hax are really annoying.
This commit is contained in:
Corbin Simpson
2010-01-10 18:07:28 -08:00
parent e7d760ff09
commit 47f59cfc8e
5 changed files with 26 additions and 30 deletions
+3 -2
View File
@@ -75,7 +75,7 @@ static void r300_destroy_context(struct pipe_context* context)
FREE(r300->rs_block);
FREE(r300->scissor_state);
FREE(r300->vertex_info);
FREE(r300->viewport_state);
FREE(r300->viewport_state.state);
FREE(r300->ztop_state.state);
FREE(r300);
}
@@ -125,6 +125,7 @@ static void r300_setup_atoms(struct r300_context* r300)
R300_INIT_ATOM(clip);
R300_INIT_ATOM(dsa);
R300_INIT_ATOM(rs);
R300_INIT_ATOM(viewport);
}
struct pipe_context* r300_create_context(struct pipe_screen* screen,
@@ -182,7 +183,7 @@ struct pipe_context* r300_create_context(struct pipe_screen* screen,
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);
r300->viewport_state.state = CALLOC_STRUCT(r300_viewport_state);
r300->ztop_state.state = CALLOC_STRUCT(r300_ztop_state);
/* Open up the OQ BO. */
+1 -2
View File
@@ -156,7 +156,6 @@ struct r300_ztop_state {
#define R300_NEW_VERTEX_FORMAT 0x04000000
#define R300_NEW_VERTEX_SHADER 0x08000000
#define R300_NEW_VERTEX_SHADER_CONSTANTS 0x10000000
#define R300_NEW_VIEWPORT 0x20000000
#define R300_NEW_QUERY 0x40000000
#define R300_NEW_KITCHEN_SINK 0x7fffffff
@@ -308,7 +307,7 @@ struct r300_context {
/* Vertex shader. */
struct r300_vertex_shader* vs;
/* Viewport state. */
struct r300_viewport_state* viewport_state;
struct r300_atom viewport_state;
/* ZTOP state. */
struct r300_atom ztop_state;
+4 -9
View File
@@ -146,7 +146,7 @@ static const float * get_shader_constant(
struct r300_constant_buffer * externals)
{
struct r300_viewport_state* viewport =
(struct r300_viewport_state*)r300->viewport_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 };
struct pipe_texture *tex;
@@ -918,9 +918,9 @@ void r300_emit_vs_constant_buffer(struct r300_context* r300,
END_CS;
}
void r300_emit_viewport_state(struct r300_context* r300,
struct r300_viewport_state* viewport)
void r300_emit_viewport_state(struct r300_context* r300, void* state)
{
struct r300_viewport_state* viewport = (struct r300_viewport_state*)state;
CS_LOCALS(r300);
BEGIN_CS(9);
@@ -932,7 +932,7 @@ void r300_emit_viewport_state(struct r300_context* r300,
OUT_CS_32F(viewport->zscale);
OUT_CS_32F(viewport->zoffset);
/* XXX words fail me. */
/* 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 {
@@ -1138,11 +1138,6 @@ validate:
r300->dirty_state &= ~(R300_ANY_NEW_SAMPLERS | R300_ANY_NEW_TEXTURES);
}
if (r300->dirty_state & R300_NEW_VIEWPORT) {
r300_emit_viewport_state(r300, r300->viewport_state);
r300->dirty_state &= ~R300_NEW_VIEWPORT;
}
if (dirty_tex) {
r300_flush_textures(r300);
}
+1 -2
View File
@@ -85,8 +85,7 @@ void r300_emit_vs_constant_buffer(struct r300_context* r300,
void r300_emit_vertex_shader(struct r300_context* r300,
struct r300_vertex_shader* vs);
void r300_emit_viewport_state(struct r300_context* r300,
struct r300_viewport_state* viewport);
void r300_emit_viewport_state(struct r300_context* r300, void* state);
void r300_emit_texture_count(struct r300_context* r300);
+17 -15
View File
@@ -724,11 +724,11 @@ static void r300_bind_rs_state(struct pipe_context* pipe, void* state)
r300->rs_state.state = rs;
r300->rs_state.dirty = TRUE;
r300->viewport_state.dirty = TRUE; /* XXX */
/* XXX Clean these up when we move to atom emits */
r300->dirty_state |= R300_NEW_RS_BLOCK;
r300->dirty_state |= R300_NEW_SCISSOR;
r300->dirty_state |= R300_NEW_VIEWPORT;
if (r300->fs && r300->fs->inputs.wpos != ATTR_UNUSED) {
r300->dirty_state |= R300_NEW_FRAGMENT_SHADER_CONSTANTS;
}
@@ -877,36 +877,38 @@ static void r300_set_viewport_state(struct pipe_context* pipe,
const struct pipe_viewport_state* state)
{
struct r300_context* r300 = r300_context(pipe);
struct r300_viewport_state* viewport =
(struct r300_viewport_state*)r300->viewport_state.state;
/* Do the transform in HW. */
r300->viewport_state->vte_control = R300_VTX_W0_FMT;
viewport->vte_control = R300_VTX_W0_FMT;
if (state->scale[0] != 1.0f) {
r300->viewport_state->xscale = state->scale[0];
r300->viewport_state->vte_control |= R300_VPORT_X_SCALE_ENA;
viewport->xscale = state->scale[0];
viewport->vte_control |= R300_VPORT_X_SCALE_ENA;
}
if (state->scale[1] != 1.0f) {
r300->viewport_state->yscale = state->scale[1];
r300->viewport_state->vte_control |= R300_VPORT_Y_SCALE_ENA;
viewport->yscale = state->scale[1];
viewport->vte_control |= R300_VPORT_Y_SCALE_ENA;
}
if (state->scale[2] != 1.0f) {
r300->viewport_state->zscale = state->scale[2];
r300->viewport_state->vte_control |= R300_VPORT_Z_SCALE_ENA;
viewport->zscale = state->scale[2];
viewport->vte_control |= R300_VPORT_Z_SCALE_ENA;
}
if (state->translate[0] != 0.0f) {
r300->viewport_state->xoffset = state->translate[0];
r300->viewport_state->vte_control |= R300_VPORT_X_OFFSET_ENA;
viewport->xoffset = state->translate[0];
viewport->vte_control |= R300_VPORT_X_OFFSET_ENA;
}
if (state->translate[1] != 0.0f) {
r300->viewport_state->yoffset = state->translate[1];
r300->viewport_state->vte_control |= R300_VPORT_Y_OFFSET_ENA;
viewport->yoffset = state->translate[1];
viewport->vte_control |= R300_VPORT_Y_OFFSET_ENA;
}
if (state->translate[2] != 0.0f) {
r300->viewport_state->zoffset = state->translate[2];
r300->viewport_state->vte_control |= R300_VPORT_Z_OFFSET_ENA;
viewport->zoffset = state->translate[2];
viewport->vte_control |= R300_VPORT_Z_OFFSET_ENA;
}
r300->dirty_state |= R300_NEW_VIEWPORT;
r300->viewport_state.dirty = TRUE;
if (r300->fs && r300->fs->inputs.wpos != ATTR_UNUSED) {
r300->dirty_state |= R300_NEW_FRAGMENT_SHADER_CONSTANTS;
}