diff options
author | Xiang, Haihao <haihao.xiang@intel.com> | 2010-03-31 13:51:22 +0800 |
---|---|---|
committer | Xiang, Haihao <haihao.xiang@intel.com> | 2010-03-31 13:52:30 +0800 |
commit | f578063d4a1db156ef10f6bab3565f37cb7a5bd5 (patch) | |
tree | 4b831759d2b05a0b232ac41b17dafdd2de11ae2f /i965_drv_video | |
parent | a49d6614edf1a01bf0b4241fd6e0e746fba88ce9 (diff) | |
download | libva-f578063d4a1db156ef10f6bab3565f37cb7a5bd5.tar.gz |
i965_drv_video: move DMV buffer to private data
Diffstat (limited to 'i965_drv_video')
-rw-r--r-- | i965_drv_video/i965_avc_bsd.c | 74 | ||||
-rw-r--r-- | i965_drv_video/i965_avc_bsd.h | 7 | ||||
-rw-r--r-- | i965_drv_video/i965_drv_video.c | 22 | ||||
-rw-r--r-- | i965_drv_video/i965_drv_video.h | 5 |
4 files changed, 80 insertions, 28 deletions
diff --git a/i965_drv_video/i965_avc_bsd.c b/i965_drv_video/i965_avc_bsd.c index 84739e9..d9a45b7 100644 --- a/i965_drv_video/i965_avc_bsd.c +++ b/i965_drv_video/i965_avc_bsd.c @@ -26,6 +26,7 @@ * */ #include <stdio.h> +#include <stdlib.h> #include <string.h> #include <assert.h> @@ -40,6 +41,49 @@ #include "i965_media_h264.h" #include "i965_media.h" +static void +i965_avc_bsd_free_private_surface_data(void **data) +{ + struct i965_avc_bsd_surface *avc_bsd_surface = *data; + + if (!avc_bsd_surface) + return; + + dri_bo_unreference(avc_bsd_surface->direct_mv_wr_top_bo); + avc_bsd_surface->direct_mv_wr_top_bo = NULL; + dri_bo_unreference(avc_bsd_surface->direct_mv_wr_bottom_bo); + avc_bsd_surface->direct_mv_wr_bottom_bo = NULL; + free(avc_bsd_surface); + *data = NULL; +} + +static void +i965_avc_bsd_initialize_private_surface_data(VADriverContextP ctx, struct object_surface *obj_surface) +{ + struct i965_driver_data *i965 = i965_driver_data(ctx); + struct i965_avc_bsd_surface *avc_bsd_surface = obj_surface->private_data; + + obj_surface->free_private_data = i965_avc_bsd_free_private_surface_data; + + if (!avc_bsd_surface) { + avc_bsd_surface = calloc(sizeof(struct i965_avc_bsd_surface), 1); + + avc_bsd_surface->direct_mv_wr_top_bo = dri_bo_alloc(i965->intel.bufmgr, + "direct mv wr top", + 0x90000, + 64); + assert(avc_bsd_surface->direct_mv_wr_top_bo); + avc_bsd_surface->direct_mv_wr_bottom_bo = dri_bo_alloc(i965->intel.bufmgr, + "direct mv wr bottom", + 0x90000, + 64); + assert(avc_bsd_surface->direct_mv_wr_bottom_bo); + obj_surface->private_data = avc_bsd_surface; + } + + avc_bsd_surface->direct_mv_flag = -1; +} + static void i965_bsd_ind_obj_base_address(VADriverContextP ctx, struct decode_state *decode_state) { @@ -367,6 +411,7 @@ i965_avc_bsd_buf_base_state(VADriverContextP ctx, struct decode_state *decode_st VAPictureParameterBufferH264 *pic_param; VAPictureH264 *va_pic; struct object_surface *obj_surface; + struct i965_avc_bsd_surface *avc_bsd_surface; assert(decode_state->pic_param && decode_state->pic_param->buffer); pic_param = (VAPictureParameterBufferH264 *)decode_state->pic_param->buffer; @@ -399,17 +444,20 @@ i965_avc_bsd_buf_base_state(VADriverContextP ctx, struct decode_state *decode_st if (!(va_pic->flags & VA_PICTURE_H264_INVALID)) { obj_surface = SURFACE(va_pic->picture_id); assert(obj_surface); - OUT_BCS_RELOC(ctx, obj_surface->direct_mv_wr_top_bo, + avc_bsd_surface = obj_surface->private_data; + assert(avc_bsd_surface); + assert(avc_bsd_surface->direct_mv_flag != -1); + + OUT_BCS_RELOC(ctx, avc_bsd_surface->direct_mv_wr_top_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0); - if (pic_param->pic_fields.bits.field_pic_flag && - !pic_param->seq_fields.bits.direct_8x8_inference_flag) - OUT_BCS_RELOC(ctx, obj_surface->direct_mv_wr_bottom_bo, + if (avc_bsd_surface->direct_mv_flag == 1) + OUT_BCS_RELOC(ctx, avc_bsd_surface->direct_mv_wr_bottom_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0); - else - OUT_BCS_RELOC(ctx, obj_surface->direct_mv_wr_top_bo, + else + OUT_BCS_RELOC(ctx, avc_bsd_surface->direct_mv_wr_top_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0); } else { @@ -422,17 +470,21 @@ i965_avc_bsd_buf_base_state(VADriverContextP ctx, struct decode_state *decode_st assert(!(va_pic->flags & VA_PICTURE_H264_INVALID)); obj_surface = SURFACE(va_pic->picture_id); assert(obj_surface); - OUT_BCS_RELOC(ctx, obj_surface->direct_mv_wr_top_bo, + i965_avc_bsd_initialize_private_surface_data(ctx, obj_surface); + avc_bsd_surface = obj_surface->private_data; + avc_bsd_surface->direct_mv_flag = (pic_param->pic_fields.bits.field_pic_flag && + !pic_param->seq_fields.bits.direct_8x8_inference_flag); + + OUT_BCS_RELOC(ctx, avc_bsd_surface->direct_mv_wr_top_bo, I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION, 0); - if (pic_param->pic_fields.bits.field_pic_flag && - !pic_param->seq_fields.bits.direct_8x8_inference_flag) - OUT_BCS_RELOC(ctx, obj_surface->direct_mv_wr_bottom_bo, + if (avc_bsd_surface->direct_mv_flag == 1) + OUT_BCS_RELOC(ctx, avc_bsd_surface->direct_mv_wr_bottom_bo, I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION, 0); else - OUT_BCS_RELOC(ctx, obj_surface->direct_mv_wr_top_bo, + OUT_BCS_RELOC(ctx, avc_bsd_surface->direct_mv_wr_top_bo, I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION, 0); diff --git a/i965_drv_video/i965_avc_bsd.h b/i965_drv_video/i965_avc_bsd.h index 7c373f3..7f39ba5 100644 --- a/i965_drv_video/i965_avc_bsd.h +++ b/i965_drv_video/i965_avc_bsd.h @@ -29,6 +29,13 @@ #ifndef __I965_AVC_BSD_H__ #define __I965_AVC_BSD_H__ +struct i965_avc_bsd_surface +{ + dri_bo *direct_mv_wr_top_bo; + dri_bo *direct_mv_wr_bottom_bo; + int direct_mv_flag; +}; + struct i965_avc_bsd_context { struct { diff --git a/i965_drv_video/i965_drv_video.c b/i965_drv_video/i965_drv_video.c index 5033fe8..e0b5ee4 100644 --- a/i965_drv_video/i965_drv_video.c +++ b/i965_drv_video/i965_drv_video.c @@ -326,10 +326,12 @@ i965_destroy_surface(struct object_heap *heap, struct object_base *obj) dri_bo_unreference(obj_surface->bo); obj_surface->bo = NULL; - dri_bo_unreference(obj_surface->direct_mv_wr_top_bo); - obj_surface->direct_mv_wr_top_bo = NULL; - dri_bo_unreference(obj_surface->direct_mv_wr_bottom_bo); - obj_surface->direct_mv_wr_bottom_bo = NULL; + + if (obj_surface->free_private_data != NULL) { + obj_surface->free_private_data(&obj_surface->private_data); + obj_surface->private_data = NULL; + } + object_heap_free(heap, obj); } @@ -370,16 +372,8 @@ i965_CreateSurfaces(VADriverContextP ctx, obj_surface->size, 64); assert(obj_surface->bo); - obj_surface->direct_mv_wr_top_bo = dri_bo_alloc(i965->intel.bufmgr, - "direct mv wr top", - 0x90000, - 64); - assert(obj_surface->direct_mv_wr_top_bo); - obj_surface->direct_mv_wr_bottom_bo = dri_bo_alloc(i965->intel.bufmgr, - "direct mv wr bottom", - 0x90000, - 64); - assert(obj_surface->direct_mv_wr_bottom_bo); + obj_surface->private_data = NULL; + obj_surface->free_private_data = NULL; } /* Error recovery */ diff --git a/i965_drv_video/i965_drv_video.h b/i965_drv_video/i965_drv_video.h index 605b386..b7e02a5 100644 --- a/i965_drv_video/i965_drv_video.h +++ b/i965_drv_video/i965_drv_video.h @@ -97,9 +97,8 @@ struct object_surface int height; int size; dri_bo *bo; - /* FIXME: only for H.264 */ - dri_bo *direct_mv_wr_top_bo; - dri_bo *direct_mv_wr_bottom_bo; + void (*free_private_data)(void **data); + void *private_data; }; struct object_buffer |