r300g: fix segfault when resizing a DRI2 framebuffer

Resetting tiling flags might happen after a texture is destroyed...
Looking at the kernel sources, we don't actually need to reset the tiling
flags.
This commit is contained in:
Marek Olšák 2010-05-02 01:55:44 +02:00
parent 5c6ea462be
commit 45d79af644

View file

@ -538,46 +538,12 @@ static void r300_set_stencil_ref(struct pipe_context* pipe,
}
/* This switcheroo is needed just because of goddamned MACRO_SWITCH. */
static void r300_fb_update_tiling_flags(struct r300_context *r300,
static void r300_fb_set_tiling_flags(struct r300_context *r300,
const struct pipe_framebuffer_state *old_state,
const struct pipe_framebuffer_state *new_state)
{
struct r300_texture *tex;
unsigned i, j, level;
/* Reset tiling flags for old surfaces to default values. */
for (i = 0; i < old_state->nr_cbufs; i++) {
for (j = 0; j < new_state->nr_cbufs; j++) {
if (old_state->cbufs[i]->texture == new_state->cbufs[j]->texture) {
break;
}
}
/* If not binding the surface again... */
if (j != new_state->nr_cbufs) {
continue;
}
tex = r300_texture(old_state->cbufs[i]->texture);
if (tex) {
r300->rws->buffer_set_tiling(r300->rws, tex->buffer,
tex->pitch[0],
tex->microtile,
tex->macrotile);
}
}
if (old_state->zsbuf &&
(!new_state->zsbuf ||
old_state->zsbuf->texture != new_state->zsbuf->texture)) {
tex = r300_texture(old_state->zsbuf->texture);
if (tex) {
r300->rws->buffer_set_tiling(r300->rws, tex->buffer,
tex->pitch[0],
tex->microtile,
tex->macrotile);
}
}
unsigned i, level;
/* Set tiling flags for new surfaces. */
for (i = 0; i < new_state->nr_cbufs; i++) {
@ -644,7 +610,8 @@ static void
r300->dsa_state.dirty = TRUE;
}
r300_fb_update_tiling_flags(r300, r300->fb_state.state, state);
/* The tiling flags are dependent on the surface miplevel, unfortunately. */
r300_fb_set_tiling_flags(r300, r300->fb_state.state, state);
memcpy(r300->fb_state.state, state, sizeof(struct pipe_framebuffer_state));