parent
d9de848de1
commit
46fafdd455
|
@ -29,7 +29,7 @@ static void r300_blitter_save_states(struct r300_context* r300)
|
||||||
{
|
{
|
||||||
util_blitter_save_blend(r300->blitter, r300->blend_state.state);
|
util_blitter_save_blend(r300->blitter, r300->blend_state.state);
|
||||||
util_blitter_save_depth_stencil_alpha(r300->blitter, r300->dsa_state.state);
|
util_blitter_save_depth_stencil_alpha(r300->blitter, r300->dsa_state.state);
|
||||||
util_blitter_save_rasterizer(r300->blitter, r300->rs_state);
|
util_blitter_save_rasterizer(r300->blitter, r300->rs_state.state);
|
||||||
util_blitter_save_fragment_shader(r300->blitter, r300->fs);
|
util_blitter_save_fragment_shader(r300->blitter, r300->fs);
|
||||||
util_blitter_save_vertex_shader(r300->blitter, r300->vs);
|
util_blitter_save_vertex_shader(r300->blitter, r300->vs);
|
||||||
}
|
}
|
||||||
|
|
|
@ -124,6 +124,7 @@ static void r300_setup_atoms(struct r300_context* r300)
|
||||||
R300_INIT_ATOM(blend_color);
|
R300_INIT_ATOM(blend_color);
|
||||||
R300_INIT_ATOM(clip);
|
R300_INIT_ATOM(clip);
|
||||||
R300_INIT_ATOM(dsa);
|
R300_INIT_ATOM(dsa);
|
||||||
|
R300_INIT_ATOM(rs);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct pipe_context* r300_create_context(struct pipe_screen* screen,
|
struct pipe_context* r300_create_context(struct pipe_screen* screen,
|
||||||
|
|
|
@ -147,7 +147,6 @@ struct r300_ztop_state {
|
||||||
#define R300_NEW_FRAMEBUFFERS 0x00000010
|
#define R300_NEW_FRAMEBUFFERS 0x00000010
|
||||||
#define R300_NEW_FRAGMENT_SHADER 0x00000020
|
#define R300_NEW_FRAGMENT_SHADER 0x00000020
|
||||||
#define R300_NEW_FRAGMENT_SHADER_CONSTANTS 0x00000040
|
#define R300_NEW_FRAGMENT_SHADER_CONSTANTS 0x00000040
|
||||||
#define R300_NEW_RASTERIZER 0x00000080
|
|
||||||
#define R300_NEW_RS_BLOCK 0x00000100
|
#define R300_NEW_RS_BLOCK 0x00000100
|
||||||
#define R300_NEW_SAMPLER 0x00000200
|
#define R300_NEW_SAMPLER 0x00000200
|
||||||
#define R300_ANY_NEW_SAMPLERS 0x0001fe00
|
#define R300_ANY_NEW_SAMPLERS 0x0001fe00
|
||||||
|
@ -295,7 +294,7 @@ struct r300_context {
|
||||||
/* Framebuffer state. We currently don't need our own version of this. */
|
/* Framebuffer state. We currently don't need our own version of this. */
|
||||||
struct pipe_framebuffer_state framebuffer_state;
|
struct pipe_framebuffer_state framebuffer_state;
|
||||||
/* Rasterizer state. */
|
/* Rasterizer state. */
|
||||||
struct r300_rs_state* rs_state;
|
struct r300_atom rs_state;
|
||||||
/* RS block state. */
|
/* RS block state. */
|
||||||
struct r300_rs_block* rs_block;
|
struct r300_rs_block* rs_block;
|
||||||
/* Sampler states. */
|
/* Sampler states. */
|
||||||
|
|
|
@ -145,6 +145,9 @@ static const float * get_shader_constant(
|
||||||
struct rc_constant * constant,
|
struct rc_constant * constant,
|
||||||
struct r300_constant_buffer * externals)
|
struct r300_constant_buffer * externals)
|
||||||
{
|
{
|
||||||
|
struct r300_viewport_state* viewport =
|
||||||
|
(struct r300_viewport_state*)r300->viewport_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;
|
||||||
|
|
||||||
|
@ -167,16 +170,17 @@ static const float * get_shader_constant(
|
||||||
|
|
||||||
/* Texture compare-fail value. */
|
/* Texture compare-fail value. */
|
||||||
/* XXX Since Gallium doesn't support GL_ARB_shadow_ambient,
|
/* XXX Since Gallium doesn't support GL_ARB_shadow_ambient,
|
||||||
* this is always (0,0,0,0). */
|
* this is always (0,0,0,0), right? */
|
||||||
case RC_STATE_SHADOW_AMBIENT:
|
case RC_STATE_SHADOW_AMBIENT:
|
||||||
vec[3] = 0;
|
vec[3] = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RC_STATE_R300_VIEWPORT_SCALE:
|
case RC_STATE_R300_VIEWPORT_SCALE:
|
||||||
if (r300->rs_state->enable_vte) {
|
/* XXX argfl stop crossing state */
|
||||||
vec[0] = r300->viewport_state->xscale;
|
if (vte_enabled) {
|
||||||
vec[1] = r300->viewport_state->yscale;
|
vec[0] = viewport->xscale;
|
||||||
vec[2] = r300->viewport_state->zscale;
|
vec[1] = viewport->yscale;
|
||||||
|
vec[2] = viewport->zscale;
|
||||||
} else {
|
} else {
|
||||||
vec[0] = 1;
|
vec[0] = 1;
|
||||||
vec[1] = 1;
|
vec[1] = 1;
|
||||||
|
@ -185,10 +189,10 @@ static const float * get_shader_constant(
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RC_STATE_R300_VIEWPORT_OFFSET:
|
case RC_STATE_R300_VIEWPORT_OFFSET:
|
||||||
if (r300->rs_state->enable_vte) {
|
if (vte_enabled) {
|
||||||
vec[0] = r300->viewport_state->xoffset;
|
vec[0] = viewport->xoffset;
|
||||||
vec[1] = r300->viewport_state->yoffset;
|
vec[1] = viewport->yoffset;
|
||||||
vec[2] = r300->viewport_state->zoffset;
|
vec[2] = viewport->zoffset;
|
||||||
} else {
|
} else {
|
||||||
/* Zeros. */
|
/* Zeros. */
|
||||||
}
|
}
|
||||||
|
@ -576,8 +580,9 @@ void r300_emit_query_end(struct r300_context* r300)
|
||||||
r300_emit_query_finish(r300, query);
|
r300_emit_query_finish(r300, query);
|
||||||
}
|
}
|
||||||
|
|
||||||
void r300_emit_rs_state(struct r300_context* r300, struct r300_rs_state* rs)
|
void r300_emit_rs_state(struct r300_context* r300, void* state)
|
||||||
{
|
{
|
||||||
|
struct r300_rs_state* rs = (struct r300_rs_state*)state;
|
||||||
CS_LOCALS(r300);
|
CS_LOCALS(r300);
|
||||||
|
|
||||||
BEGIN_CS(22);
|
BEGIN_CS(22);
|
||||||
|
@ -655,7 +660,8 @@ static void r300_emit_scissor_regs(struct r300_context* r300,
|
||||||
void r300_emit_scissor_state(struct r300_context* r300,
|
void r300_emit_scissor_state(struct r300_context* r300,
|
||||||
struct r300_scissor_state* scissor)
|
struct r300_scissor_state* scissor)
|
||||||
{
|
{
|
||||||
if (r300->rs_state->rs.scissor) {
|
/* XXX argfl! */
|
||||||
|
if (((struct r300_rs_state*)r300->rs_state.state)->rs.scissor) {
|
||||||
r300_emit_scissor_regs(r300, &scissor->scissor);
|
r300_emit_scissor_regs(r300, &scissor->scissor);
|
||||||
} else {
|
} else {
|
||||||
r300_emit_scissor_regs(r300, &scissor->framebuffer);
|
r300_emit_scissor_regs(r300, &scissor->framebuffer);
|
||||||
|
@ -926,7 +932,8 @@ void r300_emit_viewport_state(struct r300_context* r300,
|
||||||
OUT_CS_32F(viewport->zscale);
|
OUT_CS_32F(viewport->zscale);
|
||||||
OUT_CS_32F(viewport->zoffset);
|
OUT_CS_32F(viewport->zoffset);
|
||||||
|
|
||||||
if (r300->rs_state->enable_vte) {
|
/* XXX words fail me. */
|
||||||
|
if (((struct r300_rs_state*)r300->rs_state.state)->enable_vte) {
|
||||||
OUT_CS_REG(R300_VAP_VTE_CNTL, viewport->vte_control);
|
OUT_CS_REG(R300_VAP_VTE_CNTL, viewport->vte_control);
|
||||||
} else {
|
} else {
|
||||||
OUT_CS_REG(R300_VAP_VTE_CNTL, 0);
|
OUT_CS_REG(R300_VAP_VTE_CNTL, 0);
|
||||||
|
@ -1100,11 +1107,6 @@ validate:
|
||||||
r300->dirty_state &= ~R300_NEW_FRAMEBUFFERS;
|
r300->dirty_state &= ~R300_NEW_FRAMEBUFFERS;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (r300->dirty_state & R300_NEW_RASTERIZER) {
|
|
||||||
r300_emit_rs_state(r300, r300->rs_state);
|
|
||||||
r300->dirty_state &= ~R300_NEW_RASTERIZER;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (r300->dirty_state & R300_NEW_RS_BLOCK) {
|
if (r300->dirty_state & R300_NEW_RS_BLOCK) {
|
||||||
r300_emit_rs_block_state(r300, r300->rs_block);
|
r300_emit_rs_block_state(r300, r300->rs_block);
|
||||||
r300->dirty_state &= ~R300_NEW_RS_BLOCK;
|
r300->dirty_state &= ~R300_NEW_RS_BLOCK;
|
||||||
|
|
|
@ -59,7 +59,7 @@ void r300_emit_query_begin(struct r300_context* r300,
|
||||||
|
|
||||||
void r300_emit_query_end(struct r300_context* r300);
|
void r300_emit_query_end(struct r300_context* r300);
|
||||||
|
|
||||||
void r300_emit_rs_state(struct r300_context* r300, struct r300_rs_state* rs);
|
void r300_emit_rs_state(struct r300_context* r300, void* state);
|
||||||
|
|
||||||
void r300_emit_rs_block_state(struct r300_context* r300,
|
void r300_emit_rs_block_state(struct r300_context* r300,
|
||||||
struct r300_rs_block* rs);
|
struct r300_rs_block* rs);
|
||||||
|
|
|
@ -71,14 +71,15 @@ uint32_t r300_translate_primitive(unsigned prim)
|
||||||
|
|
||||||
static boolean r300_nothing_to_draw(struct r300_context *r300)
|
static boolean r300_nothing_to_draw(struct r300_context *r300)
|
||||||
{
|
{
|
||||||
return r300->rs_state->rs.scissor &&
|
return ((struct r300_rs_state*)r300->rs_state.state)->rs.scissor &&
|
||||||
r300->scissor_state->scissor.empty_area;
|
r300->scissor_state->scissor.empty_area;
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint32_t r300_provoking_vertex_fixes(struct r300_context *r300,
|
static uint32_t r300_provoking_vertex_fixes(struct r300_context *r300,
|
||||||
unsigned mode)
|
unsigned mode)
|
||||||
{
|
{
|
||||||
uint32_t color_control = r300->rs_state->color_control;
|
struct r300_rs_state* rs = (struct r300_rs_state*)r300->rs_state.state;
|
||||||
|
uint32_t color_control = rs->color_control;
|
||||||
|
|
||||||
/* By default (see r300_state.c:r300_create_rs_state) color_control is
|
/* By default (see r300_state.c:r300_create_rs_state) color_control is
|
||||||
* initialized to provoking the first vertex.
|
* initialized to provoking the first vertex.
|
||||||
|
@ -98,7 +99,7 @@ static uint32_t r300_provoking_vertex_fixes(struct r300_context *r300,
|
||||||
* ~ C.
|
* ~ C.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (r300->rs_state->rs.flatshade_first) {
|
if (rs->rs.flatshade_first) {
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
case PIPE_PRIM_TRIANGLE_FAN:
|
case PIPE_PRIM_TRIANGLE_FAN:
|
||||||
color_control |= R300_GA_COLOR_CONTROL_PROVOKING_VERTEX_SECOND;
|
color_control |= R300_GA_COLOR_CONTROL_PROVOKING_VERTEX_SECOND;
|
||||||
|
|
|
@ -519,7 +519,8 @@ static void
|
||||||
r300_screen(r300->context.screen)->caps->is_r500);
|
r300_screen(r300->context.screen)->caps->is_r500);
|
||||||
|
|
||||||
/* Don't rely on the order of states being set for the first time. */
|
/* Don't rely on the order of states being set for the first time. */
|
||||||
if (!r300->rs_state || !r300->rs_state->rs.scissor) {
|
/* XXX ( >&) */
|
||||||
|
if (!r300->rs_state.state) {
|
||||||
r300->dirty_state |= R300_NEW_SCISSOR;
|
r300->dirty_state |= R300_NEW_SCISSOR;
|
||||||
}
|
}
|
||||||
r300->dirty_state |= R300_NEW_FRAMEBUFFERS;
|
r300->dirty_state |= R300_NEW_FRAMEBUFFERS;
|
||||||
|
@ -721,9 +722,10 @@ 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->rs_state = rs;
|
r300->rs_state.state = rs;
|
||||||
|
r300->rs_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_RASTERIZER;
|
|
||||||
r300->dirty_state |= R300_NEW_RS_BLOCK;
|
r300->dirty_state |= R300_NEW_RS_BLOCK;
|
||||||
r300->dirty_state |= R300_NEW_SCISSOR;
|
r300->dirty_state |= R300_NEW_SCISSOR;
|
||||||
r300->dirty_state |= R300_NEW_VIEWPORT;
|
r300->dirty_state |= R300_NEW_VIEWPORT;
|
||||||
|
@ -868,10 +870,7 @@ static void r300_set_scissor_state(struct pipe_context* pipe,
|
||||||
r300_set_scissor_regs(state, &r300->scissor_state->scissor,
|
r300_set_scissor_regs(state, &r300->scissor_state->scissor,
|
||||||
r300_screen(r300->context.screen)->caps->is_r500);
|
r300_screen(r300->context.screen)->caps->is_r500);
|
||||||
|
|
||||||
/* Don't rely on the order of states being set for the first time. */
|
r300->dirty_state |= R300_NEW_SCISSOR;
|
||||||
if (!r300->rs_state || r300->rs_state->rs.scissor) {
|
|
||||||
r300->dirty_state |= R300_NEW_SCISSOR;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void r300_set_viewport_state(struct pipe_context* pipe,
|
static void r300_set_viewport_state(struct pipe_context* pipe,
|
||||||
|
|
|
@ -139,7 +139,7 @@ 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 (r300->rs_state->enable_vte) {
|
if (((struct r300_rs_state*)r300->rs_state.state)->enable_vte) {
|
||||||
stream_tab = identity;
|
stream_tab = identity;
|
||||||
} else {
|
} else {
|
||||||
stream_tab = r300->vs->stream_loc_notcl;
|
stream_tab = r300->vs->stream_loc_notcl;
|
||||||
|
|
Loading…
Reference in New Issue