X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fr300%2Fr300_state.c;h=1d78134de6dc6a88ad574af0372a5b29bb27583f;hb=d6408372eb359d972614838f838776f1695e3c99;hp=2de0fd6b7f988d2f9270997371179c791dfb9cf0;hpb=53228fe2a8dafe102a3d764de97ee963ecfb4508;p=mesa.git diff --git a/src/gallium/drivers/r300/r300_state.c b/src/gallium/drivers/r300/r300_state.c index 2de0fd6b7f9..1d78134de6d 100644 --- a/src/gallium/drivers/r300/r300_state.c +++ b/src/gallium/drivers/r300/r300_state.c @@ -579,16 +579,17 @@ static void r300_set_blend_color(struct pipe_context* pipe, struct r300_blend_color_state *state = (struct r300_blend_color_state*)r300->blend_color_state.state; struct pipe_blend_color c; - enum pipe_format format = fb->nr_cbufs ? fb->cbufs[0]->format : 0; + struct pipe_surface *cb; float tmp; CB_LOCALS; state->state = *color; /* Save it, so that we can reuse it in set_fb_state */ c = *color; + cb = fb->nr_cbufs ? r300_get_nonnull_cb(fb, 0) : NULL; /* The blend color is dependent on the colorbuffer format. */ - if (fb->nr_cbufs) { - switch (format) { + if (cb) { + switch (cb->format) { case PIPE_FORMAT_R8_UNORM: case PIPE_FORMAT_L8_UNORM: case PIPE_FORMAT_I8_UNORM: @@ -623,7 +624,7 @@ static void r300_set_blend_color(struct pipe_context* pipe, BEGIN_CB(state->cb, 3); OUT_CB_REG_SEQ(R500_RB3D_CONSTANT_COLOR_AR, 2); - switch (format) { + switch (cb ? cb->format : 0) { case PIPE_FORMAT_R16G16B16A16_FLOAT: case PIPE_FORMAT_R16G16B16X16_FLOAT: OUT_CB(util_float_to_half(c.color[2]) | @@ -645,7 +646,7 @@ static void r300_set_blend_color(struct pipe_context* pipe, util_pack_color(c.color, PIPE_FORMAT_B8G8R8A8_UNORM, &uc); BEGIN_CB(state->cb, 2); - OUT_CB_REG(R300_RB3D_BLEND_COLOR, uc.ui); + OUT_CB_REG(R300_RB3D_BLEND_COLOR, uc.ui[0]); END_CB; } @@ -843,8 +844,8 @@ static void r300_tex_set_tiling_flags(struct r300_context *r300, tex->tex.macrotile[level]) { r300->rws->buffer_set_tiling(tex->buf, r300->cs, tex->tex.microtile, tex->tex.macrotile[level], - 0, 0, 0, 0, 0, - tex->tex.stride_in_bytes[0]); + 0, 0, 0, 0, 0, 0, 0, + tex->tex.stride_in_bytes[0], false); tex->surface_level = level; } @@ -858,6 +859,9 @@ static void r300_fb_set_tiling_flags(struct r300_context *r300, /* Set tiling flags for new surfaces. */ for (i = 0; i < state->nr_cbufs; i++) { + if (!state->cbufs[i]) + continue; + r300_tex_set_tiling_flags(r300, r300_resource(state->cbufs[i]->texture), state->cbufs[i]->u.tex.level); @@ -938,36 +942,13 @@ void r300_mark_fb_state_dirty(struct r300_context *r300, /* The size of the rest of atoms stays the same. */ } -static unsigned r300_get_num_samples(struct r300_context *r300) -{ - struct pipe_framebuffer_state* fb = - (struct pipe_framebuffer_state*)r300->fb_state.state; - unsigned i, num_samples; - - if (!fb->nr_cbufs && !fb->zsbuf) - return 1; - - num_samples = 6; - - for (i = 0; i < fb->nr_cbufs; i++) - num_samples = MIN2(num_samples, fb->cbufs[i]->texture->nr_samples); - - if (fb->zsbuf) - num_samples = MIN2(num_samples, fb->zsbuf->texture->nr_samples); - - if (!num_samples) - num_samples = 1; - - return num_samples; -} - static void r300_set_framebuffer_state(struct pipe_context* pipe, const struct pipe_framebuffer_state* state) { struct r300_context* r300 = r300_context(pipe); struct r300_aa_state *aa = (struct r300_aa_state*)r300->aa_state.state; - struct pipe_framebuffer_state *old_state = r300->fb_state.state; + struct pipe_framebuffer_state *current_state = r300->fb_state.state; unsigned max_width, max_height, i; uint32_t zbuffer_bpp = 0; boolean unlock_zbuffer = FALSE; @@ -986,17 +967,17 @@ r300_set_framebuffer_state(struct pipe_context* pipe, return; } - if (old_state->zsbuf && r300->zmask_in_use && !r300->locked_zbuffer) { + if (current_state->zsbuf && r300->zmask_in_use && !r300->locked_zbuffer) { /* There is a zmask in use, what are we gonna do? */ if (state->zsbuf) { - if (!pipe_surface_equal(old_state->zsbuf, state->zsbuf)) { + if (!pipe_surface_equal(current_state->zsbuf, state->zsbuf)) { /* Decompress the currently bound zbuffer before we bind another one. */ r300_decompress_zmask(r300); r300->hiz_in_use = FALSE; } } else { /* We don't bind another zbuffer, so lock the current one. */ - pipe_surface_reference(&r300->locked_zbuffer, old_state->zsbuf); + pipe_surface_reference(&r300->locked_zbuffer, current_state->zsbuf); } } else if (r300->locked_zbuffer) { /* We have a locked zbuffer now, what are we gonna do? */ @@ -1014,9 +995,20 @@ r300_set_framebuffer_state(struct pipe_context* pipe, } assert(state->zsbuf || (r300->locked_zbuffer && !unlock_zbuffer) || !r300->zmask_in_use); + /* If zsbuf is set from NULL to non-NULL or vice versa.. */ + if (!!current_state->zsbuf != !!state->zsbuf) { + r300_mark_atom_dirty(r300, &r300->dsa_state); + } + + util_copy_framebuffer_state(r300->fb_state.state, state); + + /* Remove trailing NULL colorbuffers. */ + while (current_state->nr_cbufs && !current_state->cbufs[current_state->nr_cbufs-1]) + current_state->nr_cbufs--; + /* Set whether CMASK can be used. */ r300->cmask_in_use = - state->nr_cbufs == 1 && + state->nr_cbufs == 1 && state->cbufs[0] && r300->screen->cmask_resource == state->cbufs[0]->texture; /* Need to reset clamping or colormask. */ @@ -1025,11 +1017,6 @@ r300_set_framebuffer_state(struct pipe_context* pipe, /* Re-swizzle the blend color. */ r300_set_blend_color(pipe, &((struct r300_blend_color_state*)r300->blend_color_state.state)->state); - /* If zsbuf is set from NULL to non-NULL or vice versa.. */ - if (!!old_state->zsbuf != !!state->zsbuf) { - r300_mark_atom_dirty(r300, &r300->dsa_state); - } - if (r300->screen->info.drm_minor < 12) { /* The tiling flags are dependent on the surface miplevel, unfortunately. * This workarounds a bad design decision in old kernels which were @@ -1037,8 +1024,6 @@ r300_set_framebuffer_state(struct pipe_context* pipe, r300_fb_set_tiling_flags(r300, state); } - util_copy_framebuffer_state(r300->fb_state.state, state); - if (unlock_zbuffer) { pipe_surface_reference(&r300->locked_zbuffer, NULL); } @@ -1064,7 +1049,7 @@ r300_set_framebuffer_state(struct pipe_context* pipe, } } - r300->num_samples = r300_get_num_samples(r300); + r300->num_samples = util_framebuffer_get_num_samples(state); /* Set up AA config. */ if (r300->num_samples > 1) { @@ -1089,7 +1074,8 @@ r300_set_framebuffer_state(struct pipe_context* pipe, if (DBG_ON(r300, DBG_FB)) { fprintf(stderr, "r300: set_framebuffer_state:\n"); for (i = 0; i < state->nr_cbufs; i++) { - r300_print_fb_surf_info(state->cbufs[i], i, "CB"); + if (state->cbufs[i]) + r300_print_fb_surf_info(state->cbufs[i], i, "CB"); } if (state->zsbuf) { r300_print_fb_surf_info(state->zsbuf, 0, "ZB"); @@ -1139,7 +1125,7 @@ static void r300_bind_fs_state(struct pipe_context* pipe, void* shader) struct r300_context* r300 = r300_context(pipe); struct r300_fragment_shader* fs = (struct r300_fragment_shader*)shader; - if (fs == NULL) { + if (!fs) { r300->fs.state = NULL; return; } @@ -1170,7 +1156,6 @@ static void r300_delete_fs_state(struct pipe_context* pipe, void* shader) static void r300_set_polygon_stipple(struct pipe_context* pipe, const struct pipe_poly_stipple* state) { - /* XXX no idea how to set this up, but not terribly important */ } /* Create a new rasterizer state based on the CSO rasterizer state. @@ -1333,8 +1318,7 @@ static void* r300_create_rs_state(struct pipe_context* pipe, if (r300_screen(pipe->screen)->caps.has_tcl) { vap_clip_cntl = (state->clip_plane_enable & 63) | - R300_PS_UCP_MODE_CLIP_AS_TRIFAN | - (state->depth_clip ? 0 : R300_CLIP_DISABLE); + R300_PS_UCP_MODE_CLIP_AS_TRIFAN; } else { vap_clip_cntl = R300_CLIP_DISABLE; } @@ -1405,6 +1389,7 @@ static void r300_bind_rs_state(struct pipe_context* pipe, void* state) boolean last_two_sided_color = r300->two_sided_color; boolean last_msaa_enable = r300->msaa_enable; boolean last_flatshade = r300->flatshade; + boolean last_clip_halfz = r300->clip_halfz; if (r300->draw && rs) { draw_set_rasterizer_state(r300->draw, &rs->rs_draw, state); @@ -1416,12 +1401,14 @@ static void r300_bind_rs_state(struct pipe_context* pipe, void* state) r300->two_sided_color = rs->rs.light_twoside; r300->msaa_enable = rs->rs.multisample; r300->flatshade = rs->rs.flatshade; + r300->clip_halfz = rs->rs.clip_halfz; } else { r300->polygon_offset_enabled = FALSE; r300->sprite_coord_enable = 0; r300->two_sided_color = FALSE; r300->msaa_enable = FALSE; r300->flatshade = FALSE; + r300->clip_halfz = FALSE; } UPDATE_STATE(state, r300->rs_state); @@ -1443,6 +1430,10 @@ static void r300_bind_rs_state(struct pipe_context* pipe, void* state) r300->fs_status = FRAGMENT_SHADER_MAYBE_DIRTY; } } + + if (r300->screen->caps.has_tcl && last_clip_halfz != r300->clip_halfz) { + r300_mark_atom_dirty(r300, &r300->vs_state); + } } /* Free rasterizer state. */ @@ -1524,7 +1515,8 @@ static void* } static void r300_bind_sampler_states(struct pipe_context* pipe, - unsigned count, + unsigned shader, + unsigned start, unsigned count, void** states) { struct r300_context* r300 = r300_context(pipe); @@ -1532,9 +1524,13 @@ static void r300_bind_sampler_states(struct pipe_context* pipe, (struct r300_textures_state*)r300->textures_state.state; unsigned tex_units = r300->screen->caps.num_tex_units; - if (count > tex_units) { - return; - } + assert(start == 0); + + if (shader != PIPE_SHADER_FRAGMENT) + return; + + if (count > tex_units) + return; memcpy(state->sampler_states, states, sizeof(void*) * count); state->sampler_state_count = count; @@ -1542,12 +1538,6 @@ static void r300_bind_sampler_states(struct pipe_context* pipe, r300_mark_atom_dirty(r300, &r300->textures_state); } -static void r300_lacks_vertex_textures(struct pipe_context* pipe, - unsigned count, - void** states) -{ -} - static void r300_delete_sampler_state(struct pipe_context* pipe, void* state) { FREE(state); @@ -1578,9 +1568,9 @@ static uint32_t r300_assign_texture_cache_region(unsigned index, unsigned num) return R300_TX_CACHE(num + index); } -static void r300_set_fragment_sampler_views(struct pipe_context* pipe, - unsigned count, - struct pipe_sampler_view** views) +static void r300_set_sampler_views(struct pipe_context* pipe, unsigned shader, + unsigned start, unsigned count, + struct pipe_sampler_view** views) { struct r300_context* r300 = r300_context(pipe); struct r300_textures_state* state = @@ -1590,6 +1580,11 @@ static void r300_set_fragment_sampler_views(struct pipe_context* pipe, unsigned tex_units = r300->screen->caps.num_tex_units; boolean dirty_tex = FALSE; + if (shader != PIPE_SHADER_FRAGMENT) + return; + + assert(start == 0); /* non-zero not handled yet */ + if (count > tex_units) { return; } @@ -1722,8 +1717,10 @@ static void r300_set_sample_mask(struct pipe_context *pipe, r300_mark_atom_dirty(r300, &r300->sample_mask); } -static void r300_set_scissor_state(struct pipe_context* pipe, - const struct pipe_scissor_state* state) +static void r300_set_scissor_states(struct pipe_context* pipe, + unsigned start_slot, + unsigned num_scissors, + const struct pipe_scissor_state* state) { struct r300_context* r300 = r300_context(pipe); @@ -1733,8 +1730,10 @@ static void r300_set_scissor_state(struct pipe_context* pipe, r300_mark_atom_dirty(r300, &r300->scissor_state); } -static void r300_set_viewport_state(struct pipe_context* pipe, - const struct pipe_viewport_state* state) +static void r300_set_viewport_states(struct pipe_context* pipe, + unsigned start_slot, + unsigned num_viewports, + const struct pipe_viewport_state* state) { struct r300_context* r300 = r300_context(pipe); struct r300_viewport_state* viewport = @@ -1743,7 +1742,7 @@ static void r300_set_viewport_state(struct pipe_context* pipe, r300->viewport = *state; if (r300->draw) { - draw_set_viewport_state(r300->draw, state); + draw_set_viewport_states(r300->draw, start_slot, num_viewports, state); viewport->vte_control = R300_VTX_XY_FMT | R300_VTX_Z_FMT; return; } @@ -1821,10 +1820,10 @@ static void r300_set_vertex_buffers_swtcl(struct pipe_context* pipe, for (i = 0; i < count; i++) { if (buffers[i].user_buffer) { draw_set_mapped_vertex_buffer(r300->draw, start_slot + i, - buffers[i].user_buffer); + buffers[i].user_buffer, ~0); } else if (buffers[i].buffer) { draw_set_mapped_vertex_buffer(r300->draw, start_slot + i, - r300_resource(buffers[i].buffer)->malloced_buffer); + r300_resource(buffers[i].buffer)->malloced_buffer, ~0); } } } @@ -1856,7 +1855,7 @@ static void r300_set_index_buffer_swtcl(struct pipe_context* pipe, } draw_set_indexes(r300->draw, (const ubyte *) buf + ib->offset, - ib->index_size); + ib->index_size, ~0); } } @@ -1951,7 +1950,7 @@ static void r300_bind_vertex_elements_state(struct pipe_context *pipe, struct r300_context *r300 = r300_context(pipe); struct r300_vertex_element_state *velems = state; - if (velems == NULL) { + if (!velems) { return; } @@ -1997,7 +1996,7 @@ static void r300_bind_vs_state(struct pipe_context* pipe, void* shader) struct r300_context* r300 = r300_context(pipe); struct r300_vertex_shader* vs = (struct r300_vertex_shader*)shader; - if (vs == NULL) { + if (!vs) { r300->vs_state.state = NULL; return; } @@ -2122,6 +2121,10 @@ static void r300_texture_barrier(struct pipe_context *pipe) r300_mark_atom_dirty(r300, &r300->texture_cache_inval); } +static void r300_memory_barrier(struct pipe_context *pipe, unsigned flags) +{ +} + void r300_init_state_functions(struct r300_context* r300) { r300->context.create_blend_state = r300_create_blend_state; @@ -2154,17 +2157,16 @@ void r300_init_state_functions(struct r300_context* r300) r300->context.delete_rasterizer_state = r300_delete_rs_state; r300->context.create_sampler_state = r300_create_sampler_state; - r300->context.bind_fragment_sampler_states = r300_bind_sampler_states; - r300->context.bind_vertex_sampler_states = r300_lacks_vertex_textures; + r300->context.bind_sampler_states = r300_bind_sampler_states; r300->context.delete_sampler_state = r300_delete_sampler_state; - r300->context.set_fragment_sampler_views = r300_set_fragment_sampler_views; + r300->context.set_sampler_views = r300_set_sampler_views; r300->context.create_sampler_view = r300_create_sampler_view; r300->context.sampler_view_destroy = r300_sampler_view_destroy; - r300->context.set_scissor_state = r300_set_scissor_state; + r300->context.set_scissor_states = r300_set_scissor_states; - r300->context.set_viewport_state = r300_set_viewport_state; + r300->context.set_viewport_states = r300_set_viewport_states; if (r300->screen->caps.has_tcl) { r300->context.set_vertex_buffers = r300_set_vertex_buffers_hwtcl; @@ -2183,4 +2185,5 @@ void r300_init_state_functions(struct r300_context* r300) r300->context.delete_vs_state = r300_delete_vs_state; r300->context.texture_barrier = r300_texture_barrier; + r300->context.memory_barrier = r300_memory_barrier; }