X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fgallium%2Fdrivers%2Fr300%2Fr300_blit.c;h=85c2c1490167cfc8fcc7730364229342748d0758;hb=01e5a73b57fc262b0cd8b829d81b52af5a063751;hp=b7ad6b2020608169d2939ef541537aa1945e3585;hpb=275c4bd3643d773210780cb8d578ca84f2604684;p=mesa.git diff --git a/src/gallium/drivers/r300/r300_blit.c b/src/gallium/drivers/r300/r300_blit.c index b7ad6b20206..85c2c149016 100644 --- a/src/gallium/drivers/r300/r300_blit.c +++ b/src/gallium/drivers/r300/r300_blit.c @@ -32,11 +32,14 @@ static void r300_blitter_save_states(struct r300_context* r300) util_blitter_save_depth_stencil_alpha(r300->blitter, r300->dsa_state.state); util_blitter_save_stencil_ref(r300->blitter, &(r300->stencil_ref)); 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.state); util_blitter_save_vertex_shader(r300->blitter, r300->vs_state.state); util_blitter_save_viewport(r300->blitter, &r300->viewport); util_blitter_save_clip(r300->blitter, &r300->clip); util_blitter_save_vertex_elements(r300->blitter, r300->velems); + /* XXX this crashes the driver + util_blitter_save_vertex_buffers(r300->blitter, r300->vertex_buffer_count, + r300->vertex_buffer); */ } /* Clear currently bound buffers. */ @@ -56,21 +59,10 @@ void r300_clear(struct pipe_context* pipe, * 2) ZB_DEPTHCLEARVALUE is used to clear a zbuffer and Z Mask must be * equal to 0. * - * 3) RB3D_COLOR_CLEAR_VALUE is used to clear a colorbuffer and - * RB3D_COLOR_CHANNEL_MASK must be equal to 0. - * - * 4) ZB_CB_CLEAR can be used to make the ZB units help in clearing - * the colorbuffer. The color clear value is supplied through both - * RB3D_COLOR_CLEAR_VALUE and ZB_DEPTHCLEARVALUE, and the colorbuffer - * must be set in ZB_DEPTHOFFSET and ZB_DEPTHPITCH in addition to - * RB3D_COLOROFFSET and RB3D_COLORPITCH. It's obvious that the zbuffer - * will not be cleared and multiple render targets cannot be cleared - * this way either. - * - * 5) For 16-bit integer buffering, compression causes a hung with one or + * 3) For 16-bit integer buffering, compression causes a hung with one or * two samples and should not be used. * - * 6) Fastfill must not be used if reading of compressed Z data is disabled + * 4) Fastfill must not be used if reading of compressed Z data is disabled * and writing of compressed Z data is enabled (RD/WR_COMP_ENABLE), * i.e. it cannot be used to compress the zbuffer. * (what the hell does that mean and how does it fit in clearing @@ -111,11 +103,12 @@ static void r300_hw_copy(struct pipe_context* pipe, util_blitter_save_framebuffer(r300->blitter, r300->fb_state.state); util_blitter_save_fragment_sampler_states( - r300->blitter, state->sampler_count, (void**)state->sampler_states); + r300->blitter, state->sampler_state_count, + (void**)state->sampler_states); - util_blitter_save_fragment_sampler_textures( - r300->blitter, state->texture_count, - (struct pipe_texture**)state->textures); + util_blitter_save_fragment_sampler_views( + r300->blitter, state->sampler_view_count, + (struct pipe_sampler_view**)state->sampler_views); /* Do a copy */ util_blitter_copy(r300->blitter, @@ -133,12 +126,19 @@ void r300_surface_copy(struct pipe_context* pipe, enum pipe_format old_format = dst->texture->format; enum pipe_format new_format = old_format; - assert(dst->texture->format == src->texture->format); + if (dst->texture->format != src->texture->format) { + debug_printf("r300: Implementation error: Format mismatch in %s\n" + " : src: %s dst: %s\n", __FUNCTION__, + util_format_short_name(src->texture->format), + util_format_short_name(dst->texture->format)); + debug_assert(0); + } if (!pipe->screen->is_format_supported(pipe->screen, old_format, src->texture->target, - PIPE_TEXTURE_USAGE_RENDER_TARGET | - PIPE_TEXTURE_USAGE_SAMPLER, 0)) { + PIPE_BIND_RENDER_TARGET | + PIPE_BIND_SAMPLER_VIEW, 0) && + util_format_is_plain(old_format)) { switch (util_format_get_blocksize(old_format)) { case 1: new_format = PIPE_FORMAT_I8_UNORM; @@ -149,10 +149,13 @@ void r300_surface_copy(struct pipe_context* pipe, case 4: new_format = PIPE_FORMAT_B8G8R8A8_UNORM; break; + case 8: + new_format = PIPE_FORMAT_R16G16B16A16_UNORM; + break; default: debug_printf("r300: surface_copy: Unhandled format: %s. Falling back to software.\n" "r300: surface_copy: Software fallback doesn't work for tiled textures.\n", - util_format_name(old_format)); + util_format_short_name(old_format)); } }