mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-02-02 21:50:34 +01:00
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:
parent
5c6ea462be
commit
45d79af644
1 changed files with 4 additions and 37 deletions
|
|
@ -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));
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue