diff options
Diffstat (limited to 'src/gallium/drivers/r300/r300_state.c')
-rw-r--r-- | src/gallium/drivers/r300/r300_state.c | 41 |
1 files changed, 33 insertions, 8 deletions
diff --git a/src/gallium/drivers/r300/r300_state.c b/src/gallium/drivers/r300/r300_state.c index d07e90860c2..5fe9285a4b2 100644 --- a/src/gallium/drivers/r300/r300_state.c +++ b/src/gallium/drivers/r300/r300_state.c @@ -493,6 +493,8 @@ static void const struct pipe_framebuffer_state* state) { struct r300_context* r300 = r300_context(pipe); + struct r300_screen* r300screen = r300_screen(pipe->screen); + unsigned max_width, max_height; uint32_t zbuffer_bpp = 0; r300->fb_state.size = (10 * state->nr_cbufs) + @@ -505,6 +507,20 @@ static void return; } + if (r300screen->caps->is_r500) { + max_width = max_height = 4096; + } else if (r300screen->caps->is_r400) { + max_width = max_height = 4021; + } else { + max_width = max_height = 2560; + } + + if (state->width > max_width || state->height > max_height) { + debug_printf("r300: Implementation error: Render targets are too " + "big in %s, refusing to bind framebuffer state!\n", __FUNCTION__); + return; + } + if (r300->draw) { draw_flush(r300->draw); } @@ -607,6 +623,7 @@ static void r300_set_polygon_stipple(struct pipe_context* pipe, static void* r300_create_rs_state(struct pipe_context* pipe, const struct pipe_rasterizer_state* state) { + struct r300_screen* r300screen = r300_screen(pipe->screen); struct r300_rs_state* rs = CALLOC_STRUCT(r300_rs_state); /* Copy rasterizer state for Draw. */ @@ -621,20 +638,28 @@ static void* r300_create_rs_state(struct pipe_context* pipe, /* If bypassing TCL, or if no TCL engine is present, turn off the HW TCL. * Else, enable HW TCL and force Draw's TCL off. */ if (state->bypass_vs_clip_and_viewport || - !r300_screen(pipe->screen)->caps->has_tcl) { + !r300screen->caps->has_tcl) { rs->vap_control_status |= R300_VAP_TCL_BYPASS; } rs->point_size = pack_float_16_6x(state->point_size) | (pack_float_16_6x(state->point_size) << R300_POINTSIZE_X_SHIFT); - /* set hw limits - clamping done by state tracker in vs or point_size - XXX always need to emit this? */ - rs->point_minmax = - ((int)(0.0 * 6.0) << - R300_GA_POINT_MINMAX_MIN_SHIFT) | - ((int)(4096.0 * 6.0) << - R300_GA_POINT_MINMAX_MAX_SHIFT); + /* Point minimum and maximum sizes. This register has to be emitted, + * and it'd be a step backwards to put it in invariant state. */ + if (r300screen->caps->is_r500) { + rs->point_minmax = + ((int)(0.0 * 6.0) << R300_GA_POINT_MINMAX_MIN_SHIFT) | + ((int)(4096.0 * 6.0) << R300_GA_POINT_MINMAX_MAX_SHIFT); + } else if (r300screen->caps->is_r500) { + rs->point_minmax = + ((int)(0.0 * 6.0) << R300_GA_POINT_MINMAX_MIN_SHIFT) | + ((int)(4021.0 * 6.0) << R300_GA_POINT_MINMAX_MAX_SHIFT); + } else { + rs->point_minmax = + ((int)(0.0 * 6.0) << R300_GA_POINT_MINMAX_MIN_SHIFT) | + ((int)(2560.0 * 6.0) << R300_GA_POINT_MINMAX_MAX_SHIFT); + } rs->line_control = pack_float_16_6x(state->line_width) | R300_GA_LINE_CNTL_END_TYPE_COMP; |