util: reference surfaces and sampler views in blitter when saving them
Ooops. This should possibly fix some bugs...
This commit is contained in:
parent
7e1ce791c7
commit
0b50fcbd55
|
@ -302,6 +302,7 @@ static void blitter_restore_CSOs(struct blitter_context_priv *ctx)
|
||||||
*/
|
*/
|
||||||
if (ctx->blitter.saved_fb_state.nr_cbufs != ~0) {
|
if (ctx->blitter.saved_fb_state.nr_cbufs != ~0) {
|
||||||
pipe->set_framebuffer_state(pipe, &ctx->blitter.saved_fb_state);
|
pipe->set_framebuffer_state(pipe, &ctx->blitter.saved_fb_state);
|
||||||
|
util_assign_framebuffer_state(&ctx->blitter.saved_fb_state, NULL);
|
||||||
ctx->blitter.saved_fb_state.nr_cbufs = ~0;
|
ctx->blitter.saved_fb_state.nr_cbufs = ~0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -316,6 +317,11 @@ static void blitter_restore_CSOs(struct blitter_context_priv *ctx)
|
||||||
pipe->set_fragment_sampler_views(pipe,
|
pipe->set_fragment_sampler_views(pipe,
|
||||||
ctx->blitter.saved_num_sampler_views,
|
ctx->blitter.saved_num_sampler_views,
|
||||||
ctx->blitter.saved_sampler_views);
|
ctx->blitter.saved_sampler_views);
|
||||||
|
|
||||||
|
for (i = 0; i < ctx->blitter.saved_num_sampler_views; i++)
|
||||||
|
pipe_sampler_view_reference(&ctx->blitter.saved_sampler_views[i],
|
||||||
|
NULL);
|
||||||
|
|
||||||
ctx->blitter.saved_num_sampler_views = ~0;
|
ctx->blitter.saved_num_sampler_views = ~0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -208,11 +208,45 @@ void util_blitter_save_vertex_shader(struct blitter_context *blitter,
|
||||||
blitter->saved_vs = vs;
|
blitter->saved_vs = vs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* XXX This should probably be moved elsewhere. */
|
||||||
|
static INLINE
|
||||||
|
void util_assign_framebuffer_state(struct pipe_framebuffer_state *dst,
|
||||||
|
const struct pipe_framebuffer_state *src)
|
||||||
|
{
|
||||||
|
unsigned i;
|
||||||
|
|
||||||
|
if (src) {
|
||||||
|
/* Reference all surfaces. */
|
||||||
|
for (i = 0; i < src->nr_cbufs; i++) {
|
||||||
|
pipe_surface_reference(&dst->cbufs[i], src->cbufs[i]);
|
||||||
|
}
|
||||||
|
for (; i < dst->nr_cbufs; i++) {
|
||||||
|
pipe_surface_reference(&dst->cbufs[i], NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
pipe_surface_reference(&dst->zsbuf, src->zsbuf);
|
||||||
|
|
||||||
|
dst->nr_cbufs = src->nr_cbufs;
|
||||||
|
dst->width = src->width;
|
||||||
|
dst->height = src->height;
|
||||||
|
} else {
|
||||||
|
/* Set all surfaces to NULL. */
|
||||||
|
for (i = 0; i < dst->nr_cbufs; i++) {
|
||||||
|
pipe_surface_reference(&dst->cbufs[i], NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
pipe_surface_reference(&dst->zsbuf, NULL);
|
||||||
|
|
||||||
|
dst->nr_cbufs = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static INLINE
|
static INLINE
|
||||||
void util_blitter_save_framebuffer(struct blitter_context *blitter,
|
void util_blitter_save_framebuffer(struct blitter_context *blitter,
|
||||||
struct pipe_framebuffer_state *state)
|
const struct pipe_framebuffer_state *state)
|
||||||
{
|
{
|
||||||
blitter->saved_fb_state = *state;
|
blitter->saved_fb_state.nr_cbufs = 0; /* It's ~0 now, meaning it's unsaved. */
|
||||||
|
util_assign_framebuffer_state(&blitter->saved_fb_state, state);
|
||||||
}
|
}
|
||||||
|
|
||||||
static INLINE
|
static INLINE
|
||||||
|
@ -247,12 +281,13 @@ util_blitter_save_fragment_sampler_views(struct blitter_context *blitter,
|
||||||
int num_views,
|
int num_views,
|
||||||
struct pipe_sampler_view **views)
|
struct pipe_sampler_view **views)
|
||||||
{
|
{
|
||||||
|
unsigned i;
|
||||||
assert(num_views <= Elements(blitter->saved_sampler_views));
|
assert(num_views <= Elements(blitter->saved_sampler_views));
|
||||||
|
|
||||||
blitter->saved_num_sampler_views = num_views;
|
blitter->saved_num_sampler_views = num_views;
|
||||||
memcpy(blitter->saved_sampler_views,
|
for (i = 0; i < num_views; i++)
|
||||||
views,
|
pipe_sampler_view_reference(&blitter->saved_sampler_views[i],
|
||||||
num_views * sizeof(struct pipe_sampler_view *));
|
views[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static INLINE void
|
static INLINE void
|
||||||
|
|
|
@ -46,10 +46,7 @@ static void r300_release_referenced_objects(struct r300_context *r300)
|
||||||
unsigned i;
|
unsigned i;
|
||||||
|
|
||||||
/* Framebuffer state. */
|
/* Framebuffer state. */
|
||||||
for (i = 0; i < fb->nr_cbufs; i++) {
|
util_assign_framebuffer_state(fb, NULL);
|
||||||
pipe_surface_reference(&fb->cbufs[i], NULL);
|
|
||||||
}
|
|
||||||
pipe_surface_reference(&fb->zsbuf, NULL);
|
|
||||||
|
|
||||||
/* Textures. */
|
/* Textures. */
|
||||||
for (i = 0; i < textures->sampler_view_count; i++)
|
for (i = 0; i < textures->sampler_view_count; i++)
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
|
|
||||||
#include "draw/draw_context.h"
|
#include "draw/draw_context.h"
|
||||||
|
|
||||||
|
#include "util/u_blitter.h"
|
||||||
#include "util/u_math.h"
|
#include "util/u_math.h"
|
||||||
#include "util/u_memory.h"
|
#include "util/u_memory.h"
|
||||||
#include "util/u_pack_color.h"
|
#include "util/u_pack_color.h"
|
||||||
|
@ -659,24 +660,6 @@ static void r300_print_fb_surf_info(struct pipe_surface *surf, unsigned index,
|
||||||
tex->last_level, util_format_short_name(tex->format));
|
tex->last_level, util_format_short_name(tex->format));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void copy_framebuffer_state(struct pipe_framebuffer_state *dst,
|
|
||||||
const struct pipe_framebuffer_state *src)
|
|
||||||
{
|
|
||||||
unsigned i;
|
|
||||||
|
|
||||||
for (i = 0; i < src->nr_cbufs; i++) {
|
|
||||||
pipe_surface_reference(&dst->cbufs[i], src->cbufs[i]);
|
|
||||||
}
|
|
||||||
for (; i < dst->nr_cbufs; i++) {
|
|
||||||
pipe_surface_reference(&dst->cbufs[i], NULL);
|
|
||||||
}
|
|
||||||
pipe_surface_reference(&dst->zsbuf, src->zsbuf);
|
|
||||||
|
|
||||||
dst->nr_cbufs = src->nr_cbufs;
|
|
||||||
dst->width = src->width;
|
|
||||||
dst->height = src->height;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
r300_set_framebuffer_state(struct pipe_context* pipe,
|
r300_set_framebuffer_state(struct pipe_context* pipe,
|
||||||
const struct pipe_framebuffer_state* state)
|
const struct pipe_framebuffer_state* state)
|
||||||
|
@ -723,7 +706,7 @@ static void
|
||||||
/* The tiling flags are dependent on the surface miplevel, unfortunately. */
|
/* The tiling flags are dependent on the surface miplevel, unfortunately. */
|
||||||
r300_fb_set_tiling_flags(r300, r300->fb_state.state, state);
|
r300_fb_set_tiling_flags(r300, r300->fb_state.state, state);
|
||||||
|
|
||||||
copy_framebuffer_state(r300->fb_state.state, state);
|
util_assign_framebuffer_state(r300->fb_state.state, state);
|
||||||
|
|
||||||
r300->fb_state.size =
|
r300->fb_state.size =
|
||||||
2 +
|
2 +
|
||||||
|
|
Loading…
Reference in New Issue