[g3dvl] keep a pointer in idct buffer to idct object

So we always know to which idct object a buffer belongs
This commit is contained in:
Christian König 2011-07-13 15:01:40 +02:00
parent 5e5d7acc2f
commit 7c48575402
3 changed files with 26 additions and 20 deletions

View File

@ -791,6 +791,8 @@ vl_idct_init_buffer(struct vl_idct *idct, struct vl_idct_buffer *buffer,
memset(buffer, 0, sizeof(struct vl_idct_buffer)); memset(buffer, 0, sizeof(struct vl_idct_buffer));
buffer->idct = idct;
pipe_sampler_view_reference(&buffer->sampler_views.individual.matrix, idct->matrix); pipe_sampler_view_reference(&buffer->sampler_views.individual.matrix, idct->matrix);
pipe_sampler_view_reference(&buffer->sampler_views.individual.source, source); pipe_sampler_view_reference(&buffer->sampler_views.individual.source, source);
pipe_sampler_view_reference(&buffer->sampler_views.individual.transpose, idct->transpose); pipe_sampler_view_reference(&buffer->sampler_views.individual.transpose, idct->transpose);
@ -806,22 +808,24 @@ vl_idct_init_buffer(struct vl_idct *idct, struct vl_idct_buffer *buffer,
} }
void void
vl_idct_cleanup_buffer(struct vl_idct *idct, struct vl_idct_buffer *buffer) vl_idct_cleanup_buffer(struct vl_idct_buffer *buffer)
{ {
assert(idct && buffer); assert(buffer);
cleanup_source(idct, buffer); cleanup_source(buffer->idct, buffer);
cleanup_intermediate(idct, buffer); cleanup_intermediate(buffer->idct, buffer);
pipe_sampler_view_reference(&buffer->sampler_views.individual.matrix, NULL); pipe_sampler_view_reference(&buffer->sampler_views.individual.matrix, NULL);
pipe_sampler_view_reference(&buffer->sampler_views.individual.transpose, NULL); pipe_sampler_view_reference(&buffer->sampler_views.individual.transpose, NULL);
} }
void void
vl_idct_flush(struct vl_idct *idct, struct vl_idct_buffer *buffer, unsigned num_instances) vl_idct_flush(struct vl_idct_buffer *buffer, unsigned num_instances)
{ {
assert(idct); struct vl_idct *idct;
assert(buffer); assert(buffer);
idct = buffer->idct;
idct->pipe->bind_rasterizer_state(idct->pipe, idct->rs_state); idct->pipe->bind_rasterizer_state(idct->pipe, idct->rs_state);
idct->pipe->bind_blend_state(idct->pipe, idct->blend); idct->pipe->bind_blend_state(idct->pipe, idct->blend);
@ -844,14 +848,13 @@ vl_idct_flush(struct vl_idct *idct, struct vl_idct_buffer *buffer, unsigned num_
} }
void void
vl_idct_prepare_stage2(struct vl_idct *idct, struct vl_idct_buffer *buffer) vl_idct_prepare_stage2(struct vl_idct_buffer *buffer)
{ {
assert(idct);
assert(buffer); assert(buffer);
/* second stage */ /* second stage */
idct->pipe->bind_rasterizer_state(idct->pipe, idct->rs_state); buffer->idct->pipe->bind_rasterizer_state(buffer->idct->pipe, buffer->idct->rs_state);
idct->pipe->bind_fragment_sampler_states(idct->pipe, 2, idct->samplers); buffer->idct->pipe->bind_fragment_sampler_states(buffer->idct->pipe, 2, buffer->idct->samplers);
idct->pipe->set_fragment_sampler_views(idct->pipe, 2, buffer->sampler_views.stage[1]); buffer->idct->pipe->set_fragment_sampler_views(buffer->idct->pipe, 2, buffer->sampler_views.stage[1]);
} }

View File

@ -58,6 +58,8 @@ struct vl_idct
/* a set of buffers to work with */ /* a set of buffers to work with */
struct vl_idct_buffer struct vl_idct_buffer
{ {
struct vl_idct *idct;
struct pipe_viewport_state viewport_mismatch; struct pipe_viewport_state viewport_mismatch;
struct pipe_viewport_state viewport; struct pipe_viewport_state viewport;
@ -107,13 +109,13 @@ vl_idct_init_buffer(struct vl_idct *idct, struct vl_idct_buffer *buffer,
/* cleanup a buffer of an idct instance */ /* cleanup a buffer of an idct instance */
void void
vl_idct_cleanup_buffer(struct vl_idct *idct, struct vl_idct_buffer *buffer); vl_idct_cleanup_buffer(struct vl_idct_buffer *buffer);
/* flush the buffer and start rendering, vertex buffers needs to be setup before calling this */ /* flush the buffer and start rendering, vertex buffers needs to be setup before calling this */
void void
vl_idct_flush(struct vl_idct *idct, struct vl_idct_buffer *buffer, unsigned num_verts); vl_idct_flush(struct vl_idct_buffer *buffer, unsigned num_verts);
void void
vl_idct_prepare_stage2(struct vl_idct *idct, struct vl_idct_buffer *buffer); vl_idct_prepare_stage2(struct vl_idct_buffer *buffer);
#endif #endif

View File

@ -177,7 +177,7 @@ init_idct_buffer(struct vl_mpeg12_buffer *buffer)
error_plane: error_plane:
for (; i > 0; --i) for (; i > 0; --i)
vl_idct_cleanup_buffer(i == 1 ? &dec->idct_c : &dec->idct_y, &buffer->idct[i - 1]); vl_idct_cleanup_buffer(&buffer->idct[i - 1]);
error_mc_source_sv: error_mc_source_sv:
error_source_sv: error_source_sv:
@ -188,14 +188,15 @@ static void
cleanup_idct_buffer(struct vl_mpeg12_buffer *buf) cleanup_idct_buffer(struct vl_mpeg12_buffer *buf)
{ {
struct vl_mpeg12_decoder *dec; struct vl_mpeg12_decoder *dec;
unsigned i;
assert(buf); assert(buf);
dec = (struct vl_mpeg12_decoder*)buf->base.decoder; dec = (struct vl_mpeg12_decoder*)buf->base.decoder;
assert(dec); assert(dec);
vl_idct_cleanup_buffer(&dec->idct_y, &buf->idct[0]); for (i = 0; i < 3; ++i)
vl_idct_cleanup_buffer(&dec->idct_c, &buf->idct[1]); vl_idct_cleanup_buffer(&buf->idct[0]);
vl_idct_cleanup_buffer(&dec->idct_c, &buf->idct[2]);
} }
static bool static bool
@ -574,7 +575,7 @@ vl_mpeg12_decoder_flush_buffer(struct pipe_video_decode_buffer *buffer,
vl_zscan_render(&buf->zscan[i] , num_ycbcr_blocks[i]); vl_zscan_render(&buf->zscan[i] , num_ycbcr_blocks[i]);
if (dec->base.entrypoint <= PIPE_VIDEO_ENTRYPOINT_IDCT) if (dec->base.entrypoint <= PIPE_VIDEO_ENTRYPOINT_IDCT)
vl_idct_flush(i == 0 ? &dec->idct_y : &dec->idct_c, &buf->idct[i], num_ycbcr_blocks[i]); vl_idct_flush(&buf->idct[i], num_ycbcr_blocks[i]);
} }
mc_source_sv = dec->mc_source->get_sampler_view_planes(dec->mc_source); mc_source_sv = dec->mc_source->get_sampler_view_planes(dec->mc_source);
@ -589,7 +590,7 @@ vl_mpeg12_decoder_flush_buffer(struct pipe_video_decode_buffer *buffer,
dec->base.context->set_vertex_buffers(dec->base.context, 3, vb); dec->base.context->set_vertex_buffers(dec->base.context, 3, vb);
if (dec->base.entrypoint <= PIPE_VIDEO_ENTRYPOINT_IDCT) if (dec->base.entrypoint <= PIPE_VIDEO_ENTRYPOINT_IDCT)
vl_idct_prepare_stage2(component == 0 ? &dec->idct_y : &dec->idct_c, &buf->idct[component]); vl_idct_prepare_stage2(&buf->idct[component]);
else { else {
dec->base.context->set_fragment_sampler_views(dec->base.context, 1, &mc_source_sv[component]); dec->base.context->set_fragment_sampler_views(dec->base.context, 1, &mc_source_sv[component]);
dec->base.context->bind_fragment_sampler_states(dec->base.context, 1, &dec->sampler_ycbcr); dec->base.context->bind_fragment_sampler_states(dec->base.context, 1, &dec->sampler_ycbcr);