You won't be missed, functionality folded into picture_desc and decode.. Signed-off-by: Maarten Lankhorst <m.b.lankho...@gmail.com> --- src/gallium/auxiliary/vl/vl_mpeg12_bitstream.c | 4 +- src/gallium/auxiliary/vl/vl_mpeg12_decoder.c | 68 ++++++++----------- src/gallium/drivers/nouveau/nouveau_video.c | 26 ++------ src/gallium/include/pipe/p_video_decoder.h | 21 +----- src/gallium/include/pipe/p_video_state.h | 15 +--- src/gallium/state_trackers/vdpau/decode.c | 86 ++++++++++------------- src/gallium/state_trackers/xorg/xvmc/surface.c | 19 ++---- 7 files changed, 85 insertions(+), 154 deletions(-)
diff --git a/src/gallium/auxiliary/vl/vl_mpeg12_bitstream.c b/src/gallium/auxiliary/vl/vl_mpeg12_bitstream.c index 936cf2c..b586a00 100644 --- a/src/gallium/auxiliary/vl/vl_mpeg12_bitstream.c +++ b/src/gallium/auxiliary/vl/vl_mpeg12_bitstream.c @@ -823,7 +823,7 @@ decode_slice(struct vl_mpg12_bs *bs) inc += vl_vlc_get_vlclbf(&bs->vlc, tbl_B1, 11); if (x != -1) { mb.num_skipped_macroblocks = inc - 1; - bs->decoder->decode_macroblock(bs->decoder, &mb.base, 1); + bs->decoder->decode_macroblock(bs->decoder, NULL, &mb.base, 1); } mb.x = x += inc; @@ -927,7 +927,7 @@ decode_slice(struct vl_mpg12_bs *bs) } while (vl_vlc_bits_left(&bs->vlc) && vl_vlc_peekbits(&bs->vlc, 23)); mb.num_skipped_macroblocks = 0; - bs->decoder->decode_macroblock(bs->decoder, &mb.base, 1); + bs->decoder->decode_macroblock(bs->decoder, NULL, &mb.base, 1); return true; } diff --git a/src/gallium/auxiliary/vl/vl_mpeg12_decoder.c b/src/gallium/auxiliary/vl/vl_mpeg12_decoder.c index 32501e0..18ba12d 100644 --- a/src/gallium/auxiliary/vl/vl_mpeg12_decoder.c +++ b/src/gallium/auxiliary/vl/vl_mpeg12_decoder.c @@ -507,24 +507,38 @@ vl_mpeg12_set_picture_parameters(struct pipe_video_decoder *decoder, { struct vl_mpeg12_decoder *dec = (struct vl_mpeg12_decoder *)decoder; struct pipe_mpeg12_picture_desc *pic = (struct pipe_mpeg12_picture_desc *)picture; + struct pipe_sampler_view **sv; + struct vl_video_buffer *ref; + int i = 0, j; assert(dec && pic); dec->picture_desc = *pic; -} + assert(2 <= VL_MAX_REF_FRAMES); -static void -vl_mpeg12_set_quant_matrix(struct pipe_video_decoder *decoder, - const struct pipe_quant_matrix *matrix) -{ - struct vl_mpeg12_decoder *dec = (struct vl_mpeg12_decoder *)decoder; - const struct pipe_mpeg12_quant_matrix *m = (const struct pipe_mpeg12_quant_matrix *)matrix; + ref = (struct vl_video_buffer *)pic->ref_forward; + if (ref) { + sv = ref->get_sampler_view_planes(&ref->base); + for (j = 0; j < VL_MAX_PLANES; ++j) + pipe_sampler_view_reference(&dec->ref_frames[i][j], sv[j]); + i++; + } + ref = (struct vl_video_buffer *)pic->ref_backward; + if (ref) { + sv = ref->get_sampler_view_planes(&ref->base); + for (j = 0; j < VL_MAX_PLANES; ++j) + pipe_sampler_view_reference(&dec->ref_frames[i][j], sv[j]); + i++; + } - assert(dec); - assert(matrix->codec == PIPE_VIDEO_CODEC_MPEG12); + for (; i < VL_MAX_REF_FRAMES; ++i) + for (j = 0; j < VL_MAX_PLANES; ++j) + pipe_sampler_view_reference(&dec->ref_frames[i][j], NULL); - memcpy(dec->intra_matrix, m->intra_matrix, 64); - memcpy(dec->non_intra_matrix, m->non_intra_matrix, 64); + if (dec->base.entrypoint <= PIPE_VIDEO_ENTRYPOINT_BITSTREAM) { + memcpy(dec->intra_matrix, pic->intra_matrix, 64); + memcpy(dec->non_intra_matrix, pic->non_intra_matrix, 64); + } } static void @@ -543,30 +557,6 @@ vl_mpeg12_set_decode_target(struct pipe_video_decoder *decoder, } static void -vl_mpeg12_set_reference_frames(struct pipe_video_decoder *decoder, - struct pipe_video_buffer **ref_frames, - unsigned num_ref_frames) -{ - struct vl_mpeg12_decoder *dec = (struct vl_mpeg12_decoder *)decoder; - struct pipe_sampler_view **sv; - unsigned i,j; - - assert(dec); - assert(num_ref_frames <= VL_MAX_REF_FRAMES); - - for (i = 0; i < num_ref_frames; ++i) { - struct vl_video_buffer *ref = (struct vl_video_buffer *)ref_frames[i]; - sv = ref->get_sampler_view_planes(&ref->base); - for (j = 0; j < VL_MAX_PLANES; ++j) - pipe_sampler_view_reference(&dec->ref_frames[i][j], sv[j]); - } - - for (; i < VL_MAX_REF_FRAMES; ++i) - for (j = 0; j < VL_MAX_PLANES; ++j) - pipe_sampler_view_reference(&dec->ref_frames[i][j], NULL); -} - -static void vl_mpeg12_begin_frame(struct pipe_video_decoder *decoder) { struct vl_mpeg12_decoder *dec = (struct vl_mpeg12_decoder *)decoder; @@ -626,6 +616,7 @@ vl_mpeg12_begin_frame(struct pipe_video_decoder *decoder) static void vl_mpeg12_decode_macroblock(struct pipe_video_decoder *decoder, + struct pipe_video_buffer *target, const struct pipe_macroblock *macroblocks, unsigned num_macroblocks) { @@ -640,6 +631,8 @@ vl_mpeg12_decode_macroblock(struct pipe_video_decoder *decoder, buf = dec->current_buffer; assert(buf); + if (target) + vl_mpeg12_set_decode_target(&dec->base, target); for (; num_macroblocks > 0; --num_macroblocks) { unsigned mb_addr = mb->y * dec->width_in_macroblocks + mb->x; @@ -693,6 +686,7 @@ vl_mpeg12_decode_macroblock(struct pipe_video_decoder *decoder, static void vl_mpeg12_decode_bitstream(struct pipe_video_decoder *decoder, + struct pipe_video_buffer *target, unsigned num_bytes, const void *data) { struct vl_mpeg12_decoder *dec = (struct vl_mpeg12_decoder *)decoder; @@ -701,6 +695,7 @@ vl_mpeg12_decode_bitstream(struct pipe_video_decoder *decoder, unsigned i; assert(dec && dec->current_buffer); + vl_mpeg12_set_decode_target(&dec->base, target); buf = dec->current_buffer; assert(buf); @@ -1066,9 +1061,6 @@ vl_create_mpeg12_decoder(struct pipe_context *context, dec->base.destroy_buffer = vl_mpeg12_destroy_buffer; dec->base.set_decode_buffer = vl_mpeg12_set_decode_buffer; dec->base.set_picture_parameters = vl_mpeg12_set_picture_parameters; - dec->base.set_quant_matrix = vl_mpeg12_set_quant_matrix; - dec->base.set_decode_target = vl_mpeg12_set_decode_target; - dec->base.set_reference_frames = vl_mpeg12_set_reference_frames; dec->base.begin_frame = vl_mpeg12_begin_frame; dec->base.decode_macroblock = vl_mpeg12_decode_macroblock; dec->base.decode_bitstream = vl_mpeg12_decode_bitstream; diff --git a/src/gallium/drivers/nouveau/nouveau_video.c b/src/gallium/drivers/nouveau/nouveau_video.c index fb3c49a..879f569 100644 --- a/src/gallium/drivers/nouveau/nouveau_video.c +++ b/src/gallium/drivers/nouveau/nouveau_video.c @@ -431,36 +431,24 @@ nouveau_decoder_set_picture_parameters(struct pipe_video_decoder *decoder, struct pipe_mpeg12_picture_desc *desc; desc = (struct pipe_mpeg12_picture_desc *)picture_desc; dec->picture_structure = desc->picture_structure; -} -static void -nouveau_decoder_set_reference_frames(struct pipe_video_decoder *decoder, - struct pipe_video_buffer **buffers, - unsigned count) -{ - struct nouveau_decoder *dec = (struct nouveau_decoder *)decoder; - if (count >= 1 && buffers[0]) - dec->past = nouveau_decoder_surface_index(dec, buffers[0]); - if (count >= 2 && buffers[1]) - dec->future = nouveau_decoder_surface_index(dec, buffers[1]); -} + if (desc->ref_backward) + dec->past = nouveau_decoder_surface_index(dec, desc->ref_backward); + if (desc->ref_forward) + dec->future = nouveau_decoder_surface_index(dec, desc->ref_forward); -static void -nouveau_decoder_set_decode_target(struct pipe_video_decoder *decoder, - struct pipe_video_buffer *buffer) -{ - struct nouveau_decoder *dec = (struct nouveau_decoder *)decoder; - dec->current = nouveau_decoder_surface_index(dec, buffer); } static void nouveau_decoder_decode_macroblock(struct pipe_video_decoder *decoder, + struct pipe_video_buffer *target, const struct pipe_macroblock *pipe_mb, unsigned num_macroblocks) { struct nouveau_decoder *dec = (struct nouveau_decoder *)decoder; const struct pipe_mpeg12_macroblock *mb; unsigned i; + dec->current = nouveau_decoder_surface_index(dec, target); assert(dec->current < 8); if (nouveau_vpe_init(dec)) return; @@ -573,9 +561,7 @@ nouveau_create_decoder(struct pipe_context *context, dec->base.destroy = nouveau_decoder_destroy; dec->base.begin_frame = nouveau_decoder_begin_frame; dec->base.end_frame = nouveau_decoder_end_frame; - dec->base.set_decode_target = nouveau_decoder_set_decode_target; dec->base.set_picture_parameters = nouveau_decoder_set_picture_parameters; - dec->base.set_reference_frames = nouveau_decoder_set_reference_frames; dec->base.decode_macroblock = nouveau_decoder_decode_macroblock; dec->base.flush = nouveau_decoder_flush; dec->screen = screen; diff --git a/src/gallium/include/pipe/p_video_decoder.h b/src/gallium/include/pipe/p_video_decoder.h index 5bd6664..7596ead 100644 --- a/src/gallium/include/pipe/p_video_decoder.h +++ b/src/gallium/include/pipe/p_video_decoder.h @@ -82,25 +82,6 @@ struct pipe_video_decoder struct pipe_picture_desc *picture); /** - * set the quantification matrixes - */ - void (*set_quant_matrix)(struct pipe_video_decoder *decoder, - const struct pipe_quant_matrix *matrix); - - /** - * set target where video data is decoded to - */ - void (*set_decode_target)(struct pipe_video_decoder *decoder, - struct pipe_video_buffer *target); - - /** - * set reference frames for motion compensation - */ - void (*set_reference_frames)(struct pipe_video_decoder *decoder, - struct pipe_video_buffer **ref_frames, - unsigned num_ref_frames); - - /** * start decoding of a new frame */ void (*begin_frame)(struct pipe_video_decoder *decoder); @@ -109,6 +90,7 @@ struct pipe_video_decoder * decode a macroblock */ void (*decode_macroblock)(struct pipe_video_decoder *decoder, + struct pipe_video_buffer *target, const struct pipe_macroblock *macroblocks, unsigned num_macroblocks); @@ -116,6 +98,7 @@ struct pipe_video_decoder * decode a bitstream */ void (*decode_bitstream)(struct pipe_video_decoder *decoder, + struct pipe_video_buffer *target, unsigned num_bytes, const void *data); /** diff --git a/src/gallium/include/pipe/p_video_state.h b/src/gallium/include/pipe/p_video_state.h index 9a70eb7..0650b19 100644 --- a/src/gallium/include/pipe/p_video_state.h +++ b/src/gallium/include/pipe/p_video_state.h @@ -124,6 +124,7 @@ struct pipe_macroblock struct pipe_mpeg12_picture_desc { struct pipe_picture_desc base; + struct pipe_video_buffer *ref_forward, *ref_backward; unsigned picture_coding_type; unsigned picture_structure; @@ -138,12 +139,6 @@ struct pipe_mpeg12_picture_desc unsigned full_pel_forward_vector; unsigned full_pel_backward_vector; unsigned num_slices; -}; - -struct pipe_mpeg12_quant_matrix -{ - struct pipe_quant_matrix base; - const uint8_t *intra_matrix; const uint8_t *non_intra_matrix; }; @@ -191,6 +186,7 @@ struct pipe_mpeg12_macroblock struct pipe_mpeg4_picture_desc { struct pipe_picture_desc base; + struct pipe_video_buffer *ref_forward, *ref_backward; int32_t trd[2]; int32_t trb[2]; uint16_t vop_time_increment_resolution; @@ -205,12 +201,6 @@ struct pipe_mpeg4_picture_desc uint8_t rounding_control; uint8_t alternate_vertical_scan_flag; uint8_t top_field_first; -}; - -struct pipe_mpeg4_quant_matrix -{ - struct pipe_quant_matrix base; - const uint8_t *intra_matrix; const uint8_t *non_intra_matrix; }; @@ -218,6 +208,7 @@ struct pipe_mpeg4_quant_matrix struct pipe_vc1_picture_desc { struct pipe_picture_desc base; + struct pipe_video_buffer *ref_forward, *ref_backward; uint32_t slice_count; uint8_t picture_type; uint8_t frame_coding_mode; diff --git a/src/gallium/state_trackers/vdpau/decode.c b/src/gallium/state_trackers/vdpau/decode.c index 47212e3..4286e8c 100644 --- a/src/gallium/state_trackers/vdpau/decode.c +++ b/src/gallium/state_trackers/vdpau/decode.c @@ -205,33 +205,29 @@ vlVdpDecoderRenderMpeg12(struct pipe_video_decoder *decoder, VdpPictureInfoMPEG1Or2 *picture_info) { struct pipe_mpeg12_picture_desc picture; - struct pipe_mpeg12_quant_matrix quant; - struct pipe_video_buffer *ref_frames[2]; - unsigned i; VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoding MPEG12\n"); - i = 0; + memset(&picture, 0, sizeof(picture)); + picture.base.profile = decoder->profile; /* if surfaces equals VDP_STATUS_INVALID_HANDLE, they are not used */ if (picture_info->forward_reference != VDP_INVALID_HANDLE) { - ref_frames[i] = ((vlVdpSurface *)vlGetDataHTAB(picture_info->forward_reference))->video_buffer; - if (!ref_frames[i]) + picture.ref_forward = ((vlVdpSurface *)vlGetDataHTAB(picture_info->forward_reference))->video_buffer; + if (!picture.ref_forward) return VDP_STATUS_INVALID_HANDLE; - ++i; } + else + picture.ref_forward = NULL; if (picture_info->backward_reference != VDP_INVALID_HANDLE) { - ref_frames[i] = ((vlVdpSurface *)vlGetDataHTAB(picture_info->backward_reference))->video_buffer; - if (!ref_frames[i]) + picture.ref_backward = ((vlVdpSurface *)vlGetDataHTAB(picture_info->backward_reference))->video_buffer; + if (!picture.ref_backward) return VDP_STATUS_INVALID_HANDLE; - ++i; } + else + picture.ref_backward = NULL; - decoder->set_reference_frames(decoder, ref_frames, i); - - memset(&picture, 0, sizeof(picture)); - picture.base.profile = decoder->profile; picture.picture_coding_type = picture_info->picture_coding_type; picture.picture_structure = picture_info->picture_structure; picture.frame_pred_frame_dct = picture_info->frame_pred_frame_dct; @@ -248,15 +244,10 @@ vlVdpDecoderRenderMpeg12(struct pipe_video_decoder *decoder, picture.top_field_first = picture_info->top_field_first; picture.full_pel_forward_vector = picture_info->full_pel_forward_vector; picture.full_pel_backward_vector = picture_info->full_pel_backward_vector; + picture.intra_matrix = picture_info->intra_quantizer_matrix; + picture.non_intra_matrix = picture_info->non_intra_quantizer_matrix; decoder->set_picture_parameters(decoder, &picture.base); - - memset(&quant, 0, sizeof(quant)); - quant.base.codec = PIPE_VIDEO_CODEC_MPEG12; - quant.intra_matrix = picture_info->intra_quantizer_matrix; - quant.non_intra_matrix = picture_info->non_intra_quantizer_matrix; - - decoder->set_quant_matrix(decoder, &quant.base); return VDP_STATUS_OK; } @@ -268,28 +259,28 @@ vlVdpDecoderRenderMpeg4(struct pipe_video_decoder *decoder, VdpPictureInfoMPEG4Part2 *picture_info) { struct pipe_mpeg4_picture_desc picture; - struct pipe_mpeg4_quant_matrix quant; - struct pipe_video_buffer *ref_frames[2] = {}; unsigned i; VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoding MPEG4\n"); - /* if surfaces equals VDP_STATUS_INVALID_HANDLE, they are not used */ + memset(&picture, 0, sizeof(picture)); + picture.base.profile = decoder->profile; if (picture_info->forward_reference != VDP_INVALID_HANDLE) { - ref_frames[0] = ((vlVdpSurface *)vlGetDataHTAB(picture_info->forward_reference))->video_buffer; - if (!ref_frames[0]) + picture.ref_forward = ((vlVdpSurface *)vlGetDataHTAB(picture_info->forward_reference))->video_buffer; + if (!picture.ref_forward) return VDP_STATUS_INVALID_HANDLE; } + else + picture.ref_forward = NULL; if (picture_info->backward_reference != VDP_INVALID_HANDLE) { - ref_frames[1] = ((vlVdpSurface *)vlGetDataHTAB(picture_info->backward_reference))->video_buffer; - if (!ref_frames[1]) + picture.ref_backward = ((vlVdpSurface *)vlGetDataHTAB(picture_info->backward_reference))->video_buffer; + if (!picture.ref_backward) return VDP_STATUS_INVALID_HANDLE; } - decoder->set_reference_frames(decoder, ref_frames, 2); + else + picture.ref_backward = NULL; - memset(&picture, 0, sizeof(picture)); - picture.base.profile = decoder->profile; for (i = 0; i < 2; ++i) { picture.trd[i] = picture_info->trd[i]; picture.trb[i] = picture_info->trb[i]; @@ -306,13 +297,9 @@ vlVdpDecoderRenderMpeg4(struct pipe_video_decoder *decoder, picture.rounding_control = picture_info->rounding_control; picture.alternate_vertical_scan_flag = picture_info->alternate_vertical_scan_flag; picture.top_field_first = picture_info->top_field_first; + picture.intra_matrix = picture_info->intra_quantizer_matrix; + picture.non_intra_matrix = picture_info->non_intra_quantizer_matrix; decoder->set_picture_parameters(decoder, &picture.base); - - memset(&quant, 0, sizeof(quant)); - quant.base.codec = PIPE_VIDEO_CODEC_MPEG4; - quant.intra_matrix = picture_info->intra_quantizer_matrix; - quant.non_intra_matrix = picture_info->non_intra_quantizer_matrix; - decoder->set_quant_matrix(decoder, &quant.base); return VDP_STATUS_OK; } @@ -322,26 +309,27 @@ vlVdpDecoderRenderVC1(struct pipe_video_decoder *decoder, { struct pipe_vc1_picture_desc picture; struct pipe_video_buffer *ref_frames[2] = {}; - unsigned i; VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoding VC-1\n"); - /* if surfaces equals VDP_STATUS_INVALID_HANDLE, they are not used */ + memset(&picture, 0, sizeof(picture)); + picture.base.profile = decoder->profile; if (picture_info->forward_reference != VDP_INVALID_HANDLE) { - ref_frames[0] = ((vlVdpSurface *)vlGetDataHTAB(picture_info->forward_reference))->video_buffer; - if (!ref_frames[0]) + picture.ref_forward = ((vlVdpSurface *)vlGetDataHTAB(picture_info->forward_reference))->video_buffer; + if (!picture.ref_forward) return VDP_STATUS_INVALID_HANDLE; } + else + picture.ref_forward = NULL; if (picture_info->backward_reference != VDP_INVALID_HANDLE) { - ref_frames[1] = ((vlVdpSurface *)vlGetDataHTAB(picture_info->backward_reference))->video_buffer; - if (!ref_frames[1]) + picture.ref_backward = ((vlVdpSurface *)vlGetDataHTAB(picture_info->backward_reference))->video_buffer; + if (!picture.ref_backward) return VDP_STATUS_INVALID_HANDLE; } - decoder->set_reference_frames(decoder, ref_frames, 2); + else + picture.ref_backward = NULL; - memset(&picture, 0, sizeof(picture)); - picture.base.profile = decoder->profile; picture.slice_count = picture_info->slice_count; picture.picture_type = picture_info->picture_type; picture.frame_coding_mode = picture_info->frame_coding_mode; @@ -416,7 +404,6 @@ vlVdpDecoderRender(VdpDecoder decoder, vldecoder->cur_buffer %= vldecoder->num_buffers; dec->set_decode_buffer(dec, vldecoder->buffers[vldecoder->cur_buffer]); - dec->set_decode_target(dec, vlsurf->video_buffer); switch (u_reduce_video_profile(dec->profile)) { case PIPE_VIDEO_CODEC_MPEG12: @@ -436,8 +423,9 @@ vlVdpDecoderRender(VdpDecoder decoder, dec->begin_frame(dec); for (i = 0; i < bitstream_buffer_count; ++i) - dec->decode_bitstream(dec, bitstream_buffers[i].bitstream_bytes, - bitstream_buffers[i].bitstream); + dec->decode_bitstream(dec, vlsurf->video_buffer, + bitstream_buffers[i].bitstream_bytes, + bitstream_buffers[i].bitstream); dec->end_frame(dec); return ret; } diff --git a/src/gallium/state_trackers/xorg/xvmc/surface.c b/src/gallium/state_trackers/xorg/xvmc/surface.c index e6c5a89..ffdac3d 100644 --- a/src/gallium/state_trackers/xorg/xvmc/surface.c +++ b/src/gallium/state_trackers/xorg/xvmc/surface.c @@ -100,13 +100,10 @@ static void SetDecoderStatus(XvMCSurfacePrivate *surface) { struct pipe_video_decoder *decoder; - struct pipe_video_buffer *ref_frames[2]; struct pipe_mpeg12_picture_desc desc = { { PIPE_VIDEO_PROFILE_MPEG1} }; XvMCContextPrivate *context_priv; - unsigned i, num_refs = 0; - desc.picture_structure = surface->picture_structure; assert(surface); @@ -116,17 +113,11 @@ SetDecoderStatus(XvMCSurfacePrivate *surface) if (surface->decode_buffer) decoder->set_decode_buffer(decoder, surface->decode_buffer); - decoder->set_decode_target(decoder, surface->video_buffer); - - for (i = 0; i < 2; ++i) { - if (surface->ref[i]) { - XvMCSurfacePrivate *ref = surface->ref[i]->privData; - if (ref) - ref_frames[num_refs++] = ref->video_buffer; - } - } - decoder->set_reference_frames(decoder, ref_frames, num_refs); + if (surface->ref[0]) + desc.ref_forward = ((XvMCSurfacePrivate*)surface->ref[0]->privData)->video_buffer; + if (surface->ref[1]) + desc.ref_backward = ((XvMCSurfacePrivate*)surface->ref[1]->privData)->video_buffer; decoder->set_picture_parameters(context_priv->decoder, &desc.base); } @@ -301,7 +292,7 @@ Status XvMCRenderSurface(Display *dpy, XvMCContext *context, unsigned int pictur MacroBlocksToPipe(context_priv, target_surface_priv, picture_structure, xvmc_mb, blocks, mb, num_macroblocks); - context_priv->decoder->decode_macroblock(context_priv->decoder, &mb[0].base, num_macroblocks); + context_priv->decoder->decode_macroblock(context_priv->decoder, target_surface_priv->video_buffer, &mb[0].base, num_macroblocks); XVMC_MSG(XVMC_TRACE, "[XvMC] Submitted surface %p for rendering.\n", target_surface); -- 1.7.7.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev