Пример #1
0
static void evergreen_cs_set_vertex_buffer(
	struct r600_context * rctx,
	unsigned vb_index,
	unsigned offset,
	struct pipe_resource * buffer)
{
	struct r600_vertexbuf_state *state = &rctx->cs_vertex_buffer_state;
	struct pipe_vertex_buffer *vb = &state->vb[vb_index];
	vb->stride = 1;
	vb->buffer_offset = offset;
	vb->buffer = buffer;
	vb->user_buffer = NULL;

	rctx->flags |= rctx->has_vertex_cache ? R600_CONTEXT_VTX_FLUSH : R600_CONTEXT_TEX_FLUSH;
	state->enabled_mask |= 1 << vb_index;
	state->dirty_mask |= 1 << vb_index;
	r600_atom_dirty(rctx, &state->atom);
}
Пример #2
0
void r600_blit_uncompress_depth(struct pipe_context *ctx,
                                struct r600_texture *texture,
                                struct r600_texture *staging,
                                unsigned first_level, unsigned last_level,
                                unsigned first_layer, unsigned last_layer,
                                unsigned first_sample, unsigned last_sample)
{
    struct r600_context *rctx = (struct r600_context *)ctx;
    unsigned layer, level, sample, checked_last_layer, max_layer, max_sample;
    struct r600_texture *flushed_depth_texture = staging ?
                staging : texture->flushed_depth_texture;
    const struct util_format_description *desc =
        util_format_description(texture->resource.b.b.format);
    float depth;

    if (!staging && !texture->dirty_db_mask)
        return;

    if (rctx->family == CHIP_RV610 || rctx->family == CHIP_RV630 ||
            rctx->family == CHIP_RV620 || rctx->family == CHIP_RV635)
        depth = 0.0f;
    else
        depth = 1.0f;

    /* Enable decompression in DB_RENDER_CONTROL */
    rctx->db_misc_state.flush_depthstencil_through_cb = true;
    rctx->db_misc_state.copy_depth = util_format_has_depth(desc);
    rctx->db_misc_state.copy_stencil = util_format_has_stencil(desc);
    rctx->db_misc_state.copy_sample = first_sample;
    r600_atom_dirty(rctx, &rctx->db_misc_state.atom);

    max_sample = u_max_sample(&texture->resource.b.b);

    for (level = first_level; level <= last_level; level++) {
        if (!staging && !(texture->dirty_db_mask & (1 << level)))
            continue;

        /* The smaller the mipmap level, the less layers there are
         * as far as 3D textures are concerned. */
        max_layer = u_max_layer(&texture->resource.b.b, level);
        checked_last_layer = last_layer < max_layer ? last_layer : max_layer;

        for (layer = first_layer; layer <= checked_last_layer; layer++) {
            for (sample = first_sample; sample <= last_sample; sample++) {
                struct pipe_surface *zsurf, *cbsurf, surf_tmpl;

                if (sample != rctx->db_misc_state.copy_sample) {
                    rctx->db_misc_state.copy_sample = sample;
                    r600_atom_dirty(rctx, &rctx->db_misc_state.atom);
                }

                surf_tmpl.format = texture->resource.b.b.format;
                surf_tmpl.u.tex.level = level;
                surf_tmpl.u.tex.first_layer = layer;
                surf_tmpl.u.tex.last_layer = layer;
                surf_tmpl.usage = PIPE_BIND_DEPTH_STENCIL;

                zsurf = ctx->create_surface(ctx, &texture->resource.b.b, &surf_tmpl);

                surf_tmpl.format = flushed_depth_texture->resource.b.b.format;
                surf_tmpl.u.tex.level = level;
                surf_tmpl.u.tex.first_layer = layer;
                surf_tmpl.u.tex.last_layer = layer;
                surf_tmpl.usage = PIPE_BIND_RENDER_TARGET;
                cbsurf = ctx->create_surface(ctx,
                                             &flushed_depth_texture->resource.b.b, &surf_tmpl);

                r600_blitter_begin(ctx, R600_DECOMPRESS);
                util_blitter_custom_depth_stencil(rctx->blitter, zsurf, cbsurf, 1 << sample,
                                                  rctx->custom_dsa_flush, depth);
                r600_blitter_end(ctx);

                pipe_surface_reference(&zsurf, NULL);
                pipe_surface_reference(&cbsurf, NULL);
            }
        }

        /* The texture will always be dirty if some layers or samples aren't flushed.
         * I don't think this case occurs often though. */
        if (!staging &&
                first_layer == 0 && last_layer == max_layer &&
                first_sample == 0 && last_sample == max_sample) {
            texture->dirty_db_mask &= ~(1 << level);
        }
    }

    /* reenable compression in DB_RENDER_CONTROL */
    rctx->db_misc_state.flush_depthstencil_through_cb = false;
    r600_atom_dirty(rctx, &rctx->db_misc_state.atom);
}