[SCM] intel-vaapi-driver/upstream: Imported Upstream version 1.0.16
mfv-guest at users.alioth.debian.org
mfv-guest at users.alioth.debian.org
Fri Mar 16 15:25:19 UTC 2012
The following commit has been merged in the upstream branch:
commit 51e85274e11bead87c1d6300a0e4143745dc3a6f
Author: Matteo F. Vescovi <mfv.debian at gmail.com>
Date: Fri Mar 16 16:23:08 2012 +0100
Imported Upstream version 1.0.16
diff --git a/NEWS b/NEWS
index f0244ad..f166182 100644
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,15 @@
-libva-driver-intel NEWS -- summary of changes. 2011-10-28
+libva-driver-intel NEWS -- summary of changes. 2012-02-14
Copyright (C) 2009-2011 Intel Corporation
+Version 1.0.16 - 14.Feb.2012
+* Fix VC-1 bitplane buffer size (SNB, IVB)
+* Fix VC-1 motion vector modes for Ivy Bridge
+* Fix MFX_QM_STATE for H.264 flat scaling lists (IVB)
+* Fix and simplify AVC_REF_IDX_STATE setup (ILK, SNB, IVB)
+* Fix memory leak of encoder buffers
+* Fix check for internal VA surface format prior to rendering
+* Add support for B43 chipset (Alexander Inyukhin)
+
Version 1.0.15 - 28.Oct.2011
* Add auto-generated Debian packaging
* Fix VC-1 decoding (TTFRM packing)
diff --git a/configure.ac b/configure.ac
index 06c67b1..04528a2 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,7 +1,7 @@
# intel-driver package version number
m4_define([intel_driver_major_version], [1])
m4_define([intel_driver_minor_version], [0])
-m4_define([intel_driver_micro_version], [15])
+m4_define([intel_driver_micro_version], [16])
m4_define([intel_driver_pre_version], [0])
m4_define([intel_driver_version],
[intel_driver_major_version.intel_driver_minor_version.intel_driver_micro_version])
diff --git a/src/Makefile.am b/src/Makefile.am
index 7a8de4d..1e4bbf2 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -54,6 +54,7 @@ source_c = \
i965_avc_bsd.c \
i965_avc_hw_scoreboard.c\
i965_avc_ildb.c \
+ i965_decoder_utils.c \
i965_drv_video.c \
i965_encoder.c \
i965_media.c \
@@ -76,6 +77,8 @@ source_h = \
i965_avc_bsd.h \
i965_avc_hw_scoreboard.h\
i965_avc_ildb.h \
+ i965_decoder.h \
+ i965_decoder_utils.h \
i965_defines.h \
i965_drv_video.h \
i965_encoder.h \
diff --git a/src/gen6_mfd.c b/src/gen6_mfd.c
index 92cbce9..2ffcbe2 100644
--- a/src/gen6_mfd.c
+++ b/src/gen6_mfd.c
@@ -31,13 +31,12 @@
#include <string.h>
#include <assert.h>
-#include <va/va_backend.h>
-
#include "intel_batchbuffer.h"
#include "intel_driver.h"
#include "i965_defines.h"
#include "i965_drv_video.h"
+#include "i965_decoder_utils.h"
#include "gen6_mfd.h"
@@ -783,81 +782,17 @@ gen6_mfd_avc_phantom_slice_state(VADriverContextP ctx,
ADVANCE_BCS_BATCH(batch);
}
-static void
+static inline void
gen6_mfd_avc_ref_idx_state(VADriverContextP ctx,
VAPictureParameterBufferH264 *pic_param,
VASliceParameterBufferH264 *slice_param,
struct gen6_mfd_context *gen6_mfd_context)
{
- struct intel_batchbuffer *batch = gen6_mfd_context->base.batch;
- int i, j, num_ref_list;
- struct {
- unsigned char bottom_idc:1;
- unsigned char frame_store_index:4;
- unsigned char field_picture:1;
- unsigned char long_term:1;
- unsigned char non_exist:1;
- } refs[32];
-
- if (slice_param->slice_type == SLICE_TYPE_I ||
- slice_param->slice_type == SLICE_TYPE_SI)
- return;
-
- if (slice_param->slice_type == SLICE_TYPE_P ||
- slice_param->slice_type == SLICE_TYPE_SP) {
- num_ref_list = 1;
- } else {
- num_ref_list = 2;
- }
-
- for (i = 0; i < num_ref_list; i++) {
- VAPictureH264 *va_pic;
-
- if (i == 0) {
- va_pic = slice_param->RefPicList0;
- } else {
- va_pic = slice_param->RefPicList1;
- }
-
- BEGIN_BCS_BATCH(batch, 10);
- OUT_BCS_BATCH(batch, MFX_AVC_REF_IDX_STATE | (10 - 2));
- OUT_BCS_BATCH(batch, i);
-
- for (j = 0; j < 32; j++) {
- if (va_pic->flags & VA_PICTURE_H264_INVALID) {
- refs[j].non_exist = 1;
- refs[j].long_term = 1;
- refs[j].field_picture = 1;
- refs[j].frame_store_index = 0xf;
- refs[j].bottom_idc = 1;
- } else {
- int frame_idx;
-
- for (frame_idx = 0; frame_idx < ARRAY_ELEMS(gen6_mfd_context->reference_surface); frame_idx++) {
- if (gen6_mfd_context->reference_surface[frame_idx].surface_id != VA_INVALID_ID &&
- va_pic->picture_id == gen6_mfd_context->reference_surface[frame_idx].surface_id) {
- assert(frame_idx == gen6_mfd_context->reference_surface[frame_idx].frame_store_id);
- break;
- }
- }
-
- assert(frame_idx < ARRAY_ELEMS(gen6_mfd_context->reference_surface));
-
- refs[j].non_exist = 0;
- refs[j].long_term = !!(va_pic->flags & VA_PICTURE_H264_LONG_TERM_REFERENCE);
- refs[j].field_picture = !!(va_pic->flags &
- (VA_PICTURE_H264_TOP_FIELD |
- VA_PICTURE_H264_BOTTOM_FIELD));
- refs[j].frame_store_index = frame_idx;
- refs[j].bottom_idc = !!(va_pic->flags & VA_PICTURE_H264_BOTTOM_FIELD);
- }
-
- va_pic++;
- }
-
- intel_batchbuffer_data(batch, refs, sizeof(refs));
- ADVANCE_BCS_BATCH(batch);
- }
+ gen6_send_avc_ref_idx_state(
+ gen6_mfd_context->base.batch,
+ slice_param,
+ gen6_mfd_context->reference_surface
+ );
}
static void
@@ -1567,7 +1502,7 @@ gen6_mfd_vc1_decode_init(VADriverContextP ctx,
bo = dri_bo_alloc(i965->intel.bufmgr,
"VC-1 Bitplane",
- bitplane_width * bitplane_width,
+ bitplane_width * height_in_mbs,
0x1000);
assert(bo);
gen6_mfd_context->bitplane_read_buffer.bo = bo;
@@ -2034,7 +1969,7 @@ gen6_mfd_decode_picture(VADriverContextP ctx,
{
struct gen6_mfd_context *gen6_mfd_context = (struct gen6_mfd_context *)hw_context;
- struct decode_state *decode_state = &codec_state->dec;
+ struct decode_state *decode_state = &codec_state->decode;
assert(gen6_mfd_context);
diff --git a/src/gen6_mfd.h b/src/gen6_mfd.h
index 46bb0e4..bf06a00 100644
--- a/src/gen6_mfd.h
+++ b/src/gen6_mfd.h
@@ -33,6 +33,7 @@
#include <drm.h>
#include <i915_drm.h>
#include <intel_bufmgr.h>
+#include "i965_decoder.h"
struct gen6_avc_surface
{
@@ -58,7 +59,6 @@ struct gen6_vc1_surface
int picture_type;
};
-#define MAX_MFX_REFERENCE_SURFACES 16
struct hw_context;
struct gen6_mfd_context
@@ -69,45 +69,14 @@ struct gen6_mfd_context
VAIQMatrixBufferMPEG2 mpeg2;
} iq_matrix;
- struct {
- VASurfaceID surface_id;
- int frame_store_id;
- } reference_surface[MAX_MFX_REFERENCE_SURFACES];
-
- struct {
- dri_bo *bo;
- int valid;
- } post_deblocking_output;
-
- struct {
- dri_bo *bo;
- int valid;
- } pre_deblocking_output;
-
- struct {
- dri_bo *bo;
- int valid;
- } intra_row_store_scratch_buffer;
-
- struct {
- dri_bo *bo;
- int valid;
- } deblocking_filter_row_store_scratch_buffer;
-
- struct {
- dri_bo *bo;
- int valid;
- } bsd_mpc_row_store_scratch_buffer;
-
- struct {
- dri_bo *bo;
- int valid;
- } mpr_row_store_scratch_buffer;
-
- struct {
- dri_bo *bo;
- int valid;
- } bitplane_read_buffer;
+ GenFrameStore reference_surface[MAX_GEN_REFERENCE_FRAMES];
+ GenBuffer post_deblocking_output;
+ GenBuffer pre_deblocking_output;
+ GenBuffer intra_row_store_scratch_buffer;
+ GenBuffer deblocking_filter_row_store_scratch_buffer;
+ GenBuffer bsd_mpc_row_store_scratch_buffer;
+ GenBuffer mpr_row_store_scratch_buffer;
+ GenBuffer bitplane_read_buffer;
};
#endif /* _GEN6_MFD_H_ */
diff --git a/src/gen6_vme.c b/src/gen6_vme.c
index 09a042f..2ffbd43 100644
--- a/src/gen6_vme.c
+++ b/src/gen6_vme.c
@@ -30,8 +30,6 @@
#include <string.h>
#include <assert.h>
-#include <va/va_backend.h>
-
#include "intel_batchbuffer.h"
#include "intel_driver.h"
diff --git a/src/gen7_mfd.c b/src/gen7_mfd.c
index 9308999..2995fe8 100644
--- a/src/gen7_mfd.c
+++ b/src/gen7_mfd.c
@@ -31,13 +31,12 @@
#include <string.h>
#include <assert.h>
-#include <va/va_backend.h>
-
#include "intel_batchbuffer.h"
#include "intel_driver.h"
#include "i965_defines.h"
#include "i965_drv_video.h"
+#include "i965_decoder_utils.h"
#include "gen7_mfd.h"
@@ -456,7 +455,6 @@ gen7_mfd_avc_img_state(VADriverContextP ctx,
struct gen7_mfd_context *gen7_mfd_context)
{
struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
- int qm_present_flag;
int img_struct;
int mbaff_frame_flag;
unsigned int width_in_mbs, height_in_mbs;
@@ -466,11 +464,6 @@ gen7_mfd_avc_img_state(VADriverContextP ctx,
pic_param = (VAPictureParameterBufferH264 *)decode_state->pic_param->buffer;
assert(!(pic_param->CurrPic.flags & VA_PICTURE_H264_INVALID));
- if (decode_state->iq_matrix && decode_state->iq_matrix->buffer)
- qm_present_flag = 1;
- else
- qm_present_flag = 0; /* built-in QM matrices */
-
if (pic_param->CurrPic.flags & VA_PICTURE_H264_TOP_FIELD)
img_struct = 1;
else if (pic_param->CurrPic.flags & VA_PICTURE_H264_BOTTOM_FIELD)
@@ -549,10 +542,10 @@ gen7_mfd_avc_qm_state(VADriverContextP ctx,
VAIQMatrixBufferH264 *iq_matrix;
VAPictureParameterBufferH264 *pic_param;
- if (!decode_state->iq_matrix || !decode_state->iq_matrix->buffer)
- return;
-
- iq_matrix = (VAIQMatrixBufferH264 *)decode_state->iq_matrix->buffer;
+ if (decode_state->iq_matrix && decode_state->iq_matrix->buffer)
+ iq_matrix = (VAIQMatrixBufferH264 *)decode_state->iq_matrix->buffer;
+ else
+ iq_matrix = &gen7_mfd_context->iq_matrix.h264;
assert(decode_state->pic_param && decode_state->pic_param->buffer);
pic_param = (VAPictureParameterBufferH264 *)decode_state->pic_param->buffer;
@@ -752,81 +745,17 @@ gen7_mfd_avc_slice_state(VADriverContextP ctx,
ADVANCE_BCS_BATCH(batch);
}
-static void
+static inline void
gen7_mfd_avc_ref_idx_state(VADriverContextP ctx,
VAPictureParameterBufferH264 *pic_param,
VASliceParameterBufferH264 *slice_param,
struct gen7_mfd_context *gen7_mfd_context)
{
- struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
- int i, j, num_ref_list;
- struct {
- unsigned char bottom_idc:1;
- unsigned char frame_store_index:4;
- unsigned char field_picture:1;
- unsigned char long_term:1;
- unsigned char non_exist:1;
- } refs[32];
-
- if (slice_param->slice_type == SLICE_TYPE_I ||
- slice_param->slice_type == SLICE_TYPE_SI)
- return;
-
- if (slice_param->slice_type == SLICE_TYPE_P ||
- slice_param->slice_type == SLICE_TYPE_SP) {
- num_ref_list = 1;
- } else {
- num_ref_list = 2;
- }
-
- for (i = 0; i < num_ref_list; i++) {
- VAPictureH264 *va_pic;
-
- if (i == 0) {
- va_pic = slice_param->RefPicList0;
- } else {
- va_pic = slice_param->RefPicList1;
- }
-
- BEGIN_BCS_BATCH(batch, 10);
- OUT_BCS_BATCH(batch, MFX_AVC_REF_IDX_STATE | (10 - 2));
- OUT_BCS_BATCH(batch, i);
-
- for (j = 0; j < 32; j++) {
- if (va_pic->flags & VA_PICTURE_H264_INVALID) {
- refs[j].non_exist = 1;
- refs[j].long_term = 1;
- refs[j].field_picture = 1;
- refs[j].frame_store_index = 0xf;
- refs[j].bottom_idc = 1;
- } else {
- int frame_idx;
-
- for (frame_idx = 0; frame_idx < ARRAY_ELEMS(gen7_mfd_context->reference_surface); frame_idx++) {
- if (gen7_mfd_context->reference_surface[frame_idx].surface_id != VA_INVALID_ID &&
- va_pic->picture_id == gen7_mfd_context->reference_surface[frame_idx].surface_id) {
- assert(frame_idx == gen7_mfd_context->reference_surface[frame_idx].frame_store_id);
- break;
- }
- }
-
- assert(frame_idx < ARRAY_ELEMS(gen7_mfd_context->reference_surface));
-
- refs[j].non_exist = 0;
- refs[j].long_term = !!(va_pic->flags & VA_PICTURE_H264_LONG_TERM_REFERENCE);
- refs[j].field_picture = !!(va_pic->flags &
- (VA_PICTURE_H264_TOP_FIELD |
- VA_PICTURE_H264_BOTTOM_FIELD));
- refs[j].frame_store_index = frame_idx;
- refs[j].bottom_idc = !!(va_pic->flags & VA_PICTURE_H264_BOTTOM_FIELD);
- }
-
- va_pic++;
- }
-
- intel_batchbuffer_data(batch, refs, sizeof(refs));
- ADVANCE_BCS_BATCH(batch);
- }
+ gen6_send_avc_ref_idx_state(
+ gen7_mfd_context->base.batch,
+ slice_param,
+ gen7_mfd_context->reference_surface
+ );
}
static void
@@ -942,6 +871,16 @@ gen7_mfd_avc_bsd_object(VADriverContextP ctx,
ADVANCE_BCS_BATCH(batch);
}
+static inline void
+gen7_mfd_avc_context_init(
+ VADriverContextP ctx,
+ struct gen7_mfd_context *gen7_mfd_context
+)
+{
+ /* Initialize flat scaling lists */
+ avc_gen_default_iq_matrix(&gen7_mfd_context->iq_matrix.h264);
+}
+
static void
gen7_mfd_avc_decode_init(VADriverContextP ctx,
struct decode_state *decode_state,
@@ -1522,7 +1461,7 @@ gen7_mfd_vc1_decode_init(VADriverContextP ctx,
bo = dri_bo_alloc(i965->intel.bufmgr,
"VC-1 Bitplane",
- bitplane_width * bitplane_width,
+ bitplane_width * height_in_mbs,
0x1000);
assert(bo);
gen7_mfd_context->bitplane_read_buffer.bo = bo;
@@ -1716,13 +1655,13 @@ gen7_mfd_vc1_pic_state(VADriverContextP ctx,
if (pic_param->mv_fields.bits.mv_mode == VAMvMode1MvHalfPelBilinear ||
(pic_param->mv_fields.bits.mv_mode == VAMvModeIntensityCompensation &&
pic_param->mv_fields.bits.mv_mode2 == VAMvMode1MvHalfPelBilinear))
- interpolation_mode = 8; /* Half-pel bilinear */
+ interpolation_mode = 9; /* Half-pel bilinear */
else if (pic_param->mv_fields.bits.mv_mode == VAMvMode1MvHalfPel ||
(pic_param->mv_fields.bits.mv_mode == VAMvModeIntensityCompensation &&
pic_param->mv_fields.bits.mv_mode2 == VAMvMode1MvHalfPel))
- interpolation_mode = 0; /* Half-pel bicubic */
+ interpolation_mode = 1; /* Half-pel bicubic */
else
- interpolation_mode = 1; /* Quarter-pel bicubic */
+ interpolation_mode = 0; /* Quarter-pel bicubic */
BEGIN_BCS_BATCH(batch, 6);
OUT_BCS_BATCH(batch, MFD_VC1_LONG_PIC_STATE | (6 - 2));
@@ -1988,7 +1927,7 @@ gen7_mfd_decode_picture(VADriverContextP ctx,
{
struct gen7_mfd_context *gen7_mfd_context = (struct gen7_mfd_context *)hw_context;
- struct decode_state *decode_state = &codec_state->dec;
+ struct decode_state *decode_state = &codec_state->decode;
assert(gen7_mfd_context);
@@ -2062,5 +2001,14 @@ gen7_dec_hw_context_init(VADriverContextP ctx, VAProfile profile)
gen7_mfd_context->reference_surface[i].frame_store_id = -1;
}
+ switch (profile) {
+ case VAProfileH264Baseline:
+ case VAProfileH264Main:
+ case VAProfileH264High:
+ gen7_mfd_avc_context_init(ctx, gen7_mfd_context);
+ break;
+ default:
+ break;
+ }
return (struct hw_context *)gen7_mfd_context;
}
diff --git a/src/gen7_mfd.h b/src/gen7_mfd.h
index 088dbda..e4a7327 100644
--- a/src/gen7_mfd.h
+++ b/src/gen7_mfd.h
@@ -33,6 +33,7 @@
#include <drm.h>
#include <i915_drm.h>
#include <intel_bufmgr.h>
+#include "i965_decoder.h"
struct gen7_avc_surface
{
@@ -58,7 +59,6 @@ struct gen7_vc1_surface
int picture_type;
};
-#define MAX_MFX_REFERENCE_SURFACES 16
struct hw_context;
struct gen7_mfd_context
@@ -67,47 +67,17 @@ struct gen7_mfd_context
union {
VAIQMatrixBufferMPEG2 mpeg2;
+ VAIQMatrixBufferH264 h264; /* flat scaling lists (default) */
} iq_matrix;
- struct {
- VASurfaceID surface_id;
- int frame_store_id;
- } reference_surface[MAX_MFX_REFERENCE_SURFACES];
-
- struct {
- dri_bo *bo;
- int valid;
- } post_deblocking_output;
-
- struct {
- dri_bo *bo;
- int valid;
- } pre_deblocking_output;
-
- struct {
- dri_bo *bo;
- int valid;
- } intra_row_store_scratch_buffer;
-
- struct {
- dri_bo *bo;
- int valid;
- } deblocking_filter_row_store_scratch_buffer;
-
- struct {
- dri_bo *bo;
- int valid;
- } bsd_mpc_row_store_scratch_buffer;
-
- struct {
- dri_bo *bo;
- int valid;
- } mpr_row_store_scratch_buffer;
-
- struct {
- dri_bo *bo;
- int valid;
- } bitplane_read_buffer;
+ GenFrameStore reference_surface[MAX_GEN_REFERENCE_FRAMES];
+ GenBuffer post_deblocking_output;
+ GenBuffer pre_deblocking_output;
+ GenBuffer intra_row_store_scratch_buffer;
+ GenBuffer deblocking_filter_row_store_scratch_buffer;
+ GenBuffer bsd_mpc_row_store_scratch_buffer;
+ GenBuffer mpr_row_store_scratch_buffer;
+ GenBuffer bitplane_read_buffer;
};
#endif /* _GEN7_MFD_H_ */
diff --git a/src/i965_avc_bsd.c b/src/i965_avc_bsd.c
index 9fa9649..6f133a3 100644
--- a/src/i965_avc_bsd.c
+++ b/src/i965_avc_bsd.c
@@ -38,6 +38,7 @@
#include "i965_avc_bsd.h"
#include "i965_media_h264.h"
#include "i965_media.h"
+#include "i965_decoder_utils.h"
static void
i965_avc_bsd_free_avc_bsd_surface(void **data)
@@ -259,13 +260,7 @@ i965_avc_bsd_slice_state(VADriverContextP ctx,
{
struct intel_batchbuffer *batch = i965_h264_context->batch;
int present_flag, cmd_len, list, j;
- struct {
- unsigned char bottom_idc:1;
- unsigned char frame_store_index:4;
- unsigned char field_picture:1;
- unsigned char long_term:1;
- unsigned char non_exist:1;
- } refs[32];
+ uint8_t ref_idx_state[32];
char weightoffsets[32 * 6];
/* don't issue SLICE_STATE for intra-prediction decoding */
@@ -302,53 +297,28 @@ i965_avc_bsd_slice_state(VADriverContextP ctx,
OUT_BCS_BATCH(batch, present_flag);
for (list = 0; list < 2; list++) {
- int flag;
+ int flag, num_va_pics;
VAPictureH264 *va_pic;
if (list == 0) {
- flag = PRESENT_REF_LIST0;
- va_pic = slice_param->RefPicList0;
+ flag = PRESENT_REF_LIST0;
+ va_pic = slice_param->RefPicList0;
+ num_va_pics = slice_param->num_ref_idx_l0_active_minus1 + 1;
} else {
- flag = PRESENT_REF_LIST1;
- va_pic = slice_param->RefPicList1;
+ flag = PRESENT_REF_LIST1;
+ va_pic = slice_param->RefPicList1;
+ num_va_pics = slice_param->num_ref_idx_l1_active_minus1 + 1;
}
if (!(present_flag & flag))
continue;
- for (j = 0; j < 32; j++) {
- if (va_pic->flags & VA_PICTURE_H264_INVALID) {
- refs[j].non_exist = 1;
- refs[j].long_term = 1;
- refs[j].field_picture = 1;
- refs[j].frame_store_index = 0xf;
- refs[j].bottom_idc = 1;
- } else {
- int frame_idx;
-
- for (frame_idx = 0; frame_idx < ARRAY_ELEMS(i965_h264_context->fsid_list); frame_idx++) {
- if (i965_h264_context->fsid_list[frame_idx].surface_id != VA_INVALID_ID &&
- va_pic->picture_id == i965_h264_context->fsid_list[frame_idx].surface_id) {
- assert(frame_idx == i965_h264_context->fsid_list[frame_idx].frame_store_id);
- break;
- }
- }
-
- assert(frame_idx < ARRAY_ELEMS(i965_h264_context->fsid_list));
-
- refs[j].non_exist = 0;
- refs[j].long_term = !!(va_pic->flags & VA_PICTURE_H264_LONG_TERM_REFERENCE);
- refs[j].field_picture = !!(va_pic->flags &
- (VA_PICTURE_H264_TOP_FIELD |
- VA_PICTURE_H264_BOTTOM_FIELD));
- refs[j].frame_store_index = frame_idx;
- refs[j].bottom_idc = !!(va_pic->flags & VA_PICTURE_H264_BOTTOM_FIELD);
- }
-
- va_pic++;
- }
-
- intel_batchbuffer_data(batch, refs, sizeof(refs));
+ gen5_fill_avc_ref_idx_state(
+ ref_idx_state,
+ va_pic, num_va_pics,
+ i965_h264_context->fsid_list
+ );
+ intel_batchbuffer_data(batch, ref_idx_state, sizeof(ref_idx_state));
}
i965_h264_context->weight128_luma_l0 = 0;
diff --git a/src/i965_encoder.h b/src/i965_decoder.h
similarity index 70%
copy from src/i965_encoder.h
copy to src/i965_decoder.h
index 555efe3..0e69e14 100644
--- a/src/i965_encoder.h
+++ b/src/i965_decoder.h
@@ -1,5 +1,5 @@
/*
- * Copyright © 2010 Intel Corporation
+ * Copyright (C) 2012 Intel Corporation
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the
@@ -20,32 +20,27 @@
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors:
- * Zhou chang <chang.zhou at intel.com>
- *
*/
-#ifndef _I965_ENCODER_H_
-#define _I965_ENCODER_H_
+#ifndef I965_DECODER_H
+#define I965_DECODER_H
-#include <xf86drm.h>
-#include <drm.h>
-#include <i915_drm.h>
+#include <stdint.h>
+#include <va/va.h>
#include <intel_bufmgr.h>
-#include "i965_structs.h"
-#include "i965_drv_video.h"
-#include "gen6_vme.h"
-#include "gen6_mfc.h"
+#define MAX_GEN_REFERENCE_FRAMES 16
-struct gen6_encoder_context
-{
- struct hw_context base;
- struct gen6_vme_context vme_context;
- struct gen6_mfc_context mfc_context;
+typedef struct gen_frame_store GenFrameStore;
+struct gen_frame_store {
+ VASurfaceID surface_id;
+ int frame_store_id;
};
-#endif /* _I965_ENCODER_H_ */
-
+typedef struct gen_buffer GenBuffer;
+struct gen_buffer {
+ dri_bo *bo;
+ int valid;
+};
+#endif /* I965_DECODER_H */
diff --git a/src/i965_decoder_utils.c b/src/i965_decoder_utils.c
new file mode 100644
index 0000000..d4400c5
--- /dev/null
+++ b/src/i965_decoder_utils.c
@@ -0,0 +1,142 @@
+/*
+ * Copyright (C) 2006-2012 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#include <assert.h>
+#include <stddef.h>
+#include <string.h>
+#include "intel_batchbuffer.h"
+#include "i965_decoder_utils.h"
+#include "i965_defines.h"
+
+/* Generate flat scaling matrices for H.264 decoding */
+void
+avc_gen_default_iq_matrix(VAIQMatrixBufferH264 *iq_matrix)
+{
+ /* Flat_4x4_16 */
+ memset(&iq_matrix->ScalingList4x4, 16, sizeof(iq_matrix->ScalingList4x4));
+
+ /* Flat_8x8_16 */
+ memset(&iq_matrix->ScalingList8x8, 16, sizeof(iq_matrix->ScalingList8x8));
+}
+
+static inline uint8_t
+get_ref_idx_state_1(const VAPictureH264 *va_pic, unsigned int frame_store_id)
+{
+ const unsigned int is_long_term =
+ !!(va_pic->flags & VA_PICTURE_H264_LONG_TERM_REFERENCE);
+ const unsigned int is_top_field =
+ !!(va_pic->flags & VA_PICTURE_H264_TOP_FIELD);
+ const unsigned int is_bottom_field =
+ !!(va_pic->flags & VA_PICTURE_H264_BOTTOM_FIELD);
+
+ return ((is_long_term << 6) |
+ ((is_top_field ^ is_bottom_field ^ 1) << 5) |
+ (frame_store_id << 1) |
+ ((is_top_field ^ 1) & is_bottom_field));
+}
+
+/* Fill in Reference List Entries (Gen5+: ILK, SNB, IVB) */
+void
+gen5_fill_avc_ref_idx_state(
+ uint8_t state[32],
+ const VAPictureH264 ref_list[32],
+ unsigned int ref_list_count,
+ const GenFrameStore frame_store[MAX_GEN_REFERENCE_FRAMES]
+)
+{
+ unsigned int i, n, frame_idx;
+
+ for (i = 0, n = 0; i < ref_list_count; i++) {
+ const VAPictureH264 * const va_pic = &ref_list[i];
+
+ if (va_pic->flags & VA_PICTURE_H264_INVALID)
+ continue;
+
+ for (frame_idx = 0; frame_idx < MAX_GEN_REFERENCE_FRAMES; frame_idx++) {
+ const GenFrameStore * const fs = &frame_store[frame_idx];
+ if (fs->surface_id != VA_INVALID_ID &&
+ fs->surface_id == va_pic->picture_id) {
+ assert(frame_idx == fs->frame_store_id);
+ break;
+ }
+ }
+ assert(frame_idx < MAX_GEN_REFERENCE_FRAMES);
+ state[n++] = get_ref_idx_state_1(va_pic, frame_idx);
+ }
+
+ for (; n < 32; n++)
+ state[n] = 0xff;
+}
+
+/* Emit Reference List Entries (Gen6+: SNB, IVB) */
+static void
+gen6_send_avc_ref_idx_state_1(
+ struct intel_batchbuffer *batch,
+ unsigned int list,
+ const VAPictureH264 *ref_list,
+ unsigned int ref_list_count,
+ const GenFrameStore frame_store[MAX_GEN_REFERENCE_FRAMES]
+)
+{
+ uint8_t ref_idx_state[32];
+
+ BEGIN_BCS_BATCH(batch, 10);
+ OUT_BCS_BATCH(batch, MFX_AVC_REF_IDX_STATE | (10 - 2));
+ OUT_BCS_BATCH(batch, list);
+ gen5_fill_avc_ref_idx_state(
+ ref_idx_state,
+ ref_list, ref_list_count,
+ frame_store
+ );
+ intel_batchbuffer_data(batch, ref_idx_state, sizeof(ref_idx_state));
+ ADVANCE_BCS_BATCH(batch);
+}
+
+void
+gen6_send_avc_ref_idx_state(
+ struct intel_batchbuffer *batch,
+ const VASliceParameterBufferH264 *slice_param,
+ const GenFrameStore frame_store[MAX_GEN_REFERENCE_FRAMES]
+)
+{
+ if (slice_param->slice_type == SLICE_TYPE_I ||
+ slice_param->slice_type == SLICE_TYPE_SI)
+ return;
+
+ /* RefPicList0 */
+ gen6_send_avc_ref_idx_state_1(
+ batch, 0,
+ slice_param->RefPicList0, slice_param->num_ref_idx_l0_active_minus1 + 1,
+ frame_store
+ );
+
+ if (slice_param->slice_type != SLICE_TYPE_B)
+ return;
+
+ /* RefPicList1 */
+ gen6_send_avc_ref_idx_state_1(
+ batch, 1,
+ slice_param->RefPicList1, slice_param->num_ref_idx_l1_active_minus1 + 1,
+ frame_store
+ );
+}
diff --git a/src/shaders/render/exa_wm_src_affine.g7a b/src/i965_decoder_utils.h
similarity index 60%
copy from src/shaders/render/exa_wm_src_affine.g7a
copy to src/i965_decoder_utils.h
index a786bc0..bf9be84 100644
--- a/src/shaders/render/exa_wm_src_affine.g7a
+++ b/src/i965_decoder_utils.h
@@ -1,5 +1,5 @@
/*
- * Copyright © 2010 Intel Corporation
+ * Copyright (C) 2006-2012 Intel Corporation
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@@ -17,31 +17,32 @@
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- *
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
*/
-/*
- * Fragment to compute src u/v values
- */
-include(`exa_wm.g4i')
+#ifndef I965_DECODER_UTILS_H
+#define I965_DECODER_UTILS_H
-define(`ul', `g66')
-define(`uh', `g67')
-define(`vl', `g68')
-define(`vh', `g69')
+#include "i965_decoder.h"
+#include "intel_batchbuffer.h"
-define(`bl', `g2.0<8,8,1>F')
-define(`bh', `g4.0<8,8,1>F')
+void
+avc_gen_default_iq_matrix(VAIQMatrixBufferH264 *iq_matrix);
-define(`a0_a_x',`g7.0<0,1,0>F')
-define(`a0_a_y',`g7.16<0,1,0>F')
+void
+gen5_fill_avc_ref_idx_state(
+ uint8_t state[32],
+ const VAPictureH264 ref_list[32],
+ unsigned int ref_list_count,
+ const GenFrameStore frame_store[MAX_GEN_REFERENCE_FRAMES]
+);
-/* U */
-pln (8) ul<1>F a0_a_x bl { align1 }; /* pixel 0-7 */
-pln (8) uh<1>F a0_a_x bh { align1 }; /* pixel 8-15 */
+void
+gen6_send_avc_ref_idx_state(
+ struct intel_batchbuffer *batch,
+ const VASliceParameterBufferH264 *slice_param,
+ const GenFrameStore frame_store[MAX_GEN_REFERENCE_FRAMES]
+);
-/* V */
-pln (8) vl<1>F a0_a_y bl { align1 }; /* pixel 0-7 */
-pln (8) vh<1>F a0_a_y bh { align1 }; /* pixel 8-15 */
+#endif /* I965_DECODER_UTILS_H */
diff --git a/src/i965_drv_video.c b/src/i965_drv_video.c
index 4ba1aa6..e1e81c7 100644
--- a/src/i965_drv_video.c
+++ b/src/i965_drv_video.c
@@ -771,25 +771,30 @@ i965_destroy_context(struct object_heap *heap, struct object_base *obj)
}
if (obj_context->codec_type == CODEC_ENC) {
- assert(obj_context->codec_state.enc.num_slice_params <= obj_context->codec_state.enc.max_slice_params);
- i965_release_buffer_store(&obj_context->codec_state.enc.pic_param);
- i965_release_buffer_store(&obj_context->codec_state.enc.seq_param);
+ assert(obj_context->codec_state.encode.num_slice_params <= obj_context->codec_state.encode.max_slice_params);
+ i965_release_buffer_store(&obj_context->codec_state.encode.pic_param);
+ i965_release_buffer_store(&obj_context->codec_state.encode.seq_param);
+
+ for (i = 0; i < obj_context->codec_state.encode.num_slice_params; i++)
+ i965_release_buffer_store(&obj_context->codec_state.encode.slice_params[i]);
+
+ free(obj_context->codec_state.encode.slice_params);
} else {
- assert(obj_context->codec_state.dec.num_slice_params <= obj_context->codec_state.dec.max_slice_params);
- assert(obj_context->codec_state.dec.num_slice_datas <= obj_context->codec_state.dec.max_slice_datas);
+ assert(obj_context->codec_state.decode.num_slice_params <= obj_context->codec_state.decode.max_slice_params);
+ assert(obj_context->codec_state.decode.num_slice_datas <= obj_context->codec_state.decode.max_slice_datas);
- i965_release_buffer_store(&obj_context->codec_state.dec.pic_param);
- i965_release_buffer_store(&obj_context->codec_state.dec.iq_matrix);
- i965_release_buffer_store(&obj_context->codec_state.dec.bit_plane);
+ i965_release_buffer_store(&obj_context->codec_state.decode.pic_param);
+ i965_release_buffer_store(&obj_context->codec_state.decode.iq_matrix);
+ i965_release_buffer_store(&obj_context->codec_state.decode.bit_plane);
- for (i = 0; i < obj_context->codec_state.dec.num_slice_params; i++)
- i965_release_buffer_store(&obj_context->codec_state.dec.slice_params[i]);
+ for (i = 0; i < obj_context->codec_state.decode.num_slice_params; i++)
+ i965_release_buffer_store(&obj_context->codec_state.decode.slice_params[i]);
- for (i = 0; i < obj_context->codec_state.dec.num_slice_datas; i++)
- i965_release_buffer_store(&obj_context->codec_state.dec.slice_datas[i]);
+ for (i = 0; i < obj_context->codec_state.decode.num_slice_datas; i++)
+ i965_release_buffer_store(&obj_context->codec_state.decode.slice_datas[i]);
- free(obj_context->codec_state.dec.slice_params);
- free(obj_context->codec_state.dec.slice_datas);
+ free(obj_context->codec_state.decode.slice_params);
+ free(obj_context->codec_state.decode.slice_datas);
}
free(obj_context->render_targets);
@@ -867,23 +872,23 @@ i965_CreateContext(VADriverContextP ctx,
if (VA_STATUS_SUCCESS == vaStatus) {
if (VAEntrypointEncSlice == obj_config->entrypoint ) { /*encode routin only*/
obj_context->codec_type = CODEC_ENC;
- memset(&obj_context->codec_state.enc, 0, sizeof(obj_context->codec_state.enc));
- obj_context->codec_state.enc.current_render_target = VA_INVALID_ID;
- obj_context->codec_state.enc.max_slice_params = NUM_SLICES;
- obj_context->codec_state.enc.slice_params = calloc(obj_context->codec_state.enc.max_slice_params,
- sizeof(*obj_context->codec_state.enc.slice_params));
+ memset(&obj_context->codec_state.encode, 0, sizeof(obj_context->codec_state.encode));
+ obj_context->codec_state.encode.current_render_target = VA_INVALID_ID;
+ obj_context->codec_state.encode.max_slice_params = NUM_SLICES;
+ obj_context->codec_state.encode.slice_params = calloc(obj_context->codec_state.encode.max_slice_params,
+ sizeof(*obj_context->codec_state.encode.slice_params));
assert(i965->codec_info->enc_hw_context_init);
obj_context->hw_context = i965->codec_info->enc_hw_context_init(ctx, obj_config->profile);
} else {
obj_context->codec_type = CODEC_DEC;
- memset(&obj_context->codec_state.dec, 0, sizeof(obj_context->codec_state.dec));
- obj_context->codec_state.dec.current_render_target = -1;
- obj_context->codec_state.dec.max_slice_params = NUM_SLICES;
- obj_context->codec_state.dec.max_slice_datas = NUM_SLICES;
- obj_context->codec_state.dec.slice_params = calloc(obj_context->codec_state.dec.max_slice_params,
- sizeof(*obj_context->codec_state.dec.slice_params));
- obj_context->codec_state.dec.slice_datas = calloc(obj_context->codec_state.dec.max_slice_datas,
- sizeof(*obj_context->codec_state.dec.slice_datas));
+ memset(&obj_context->codec_state.decode, 0, sizeof(obj_context->codec_state.decode));
+ obj_context->codec_state.decode.current_render_target = -1;
+ obj_context->codec_state.decode.max_slice_params = NUM_SLICES;
+ obj_context->codec_state.decode.max_slice_datas = NUM_SLICES;
+ obj_context->codec_state.decode.slice_params = calloc(obj_context->codec_state.decode.max_slice_params,
+ sizeof(*obj_context->codec_state.decode.slice_params));
+ obj_context->codec_state.decode.slice_datas = calloc(obj_context->codec_state.decode.max_slice_datas,
+ sizeof(*obj_context->codec_state.decode.slice_datas));
assert(i965->codec_info->dec_hw_context_init);
obj_context->hw_context = i965->codec_info->dec_hw_context_init(ctx, obj_config->profile);
@@ -1150,6 +1155,7 @@ i965_BeginPicture(VADriverContextP ctx,
struct object_config *obj_config;
VAContextID config;
VAStatus vaStatus;
+ int i;
assert(obj_context);
assert(obj_surface);
@@ -1182,102 +1188,79 @@ i965_BeginPicture(VADriverContextP ctx,
break;
}
- if (obj_context->codec_type == CODEC_ENC)
- obj_context->codec_state.enc.current_render_target = render_target; /*This is input new frame*/
- else
- obj_context->codec_state.dec.current_render_target = render_target;
-
- return vaStatus;
-}
-
-static VAStatus
-i965_render_picture_parameter_buffer(VADriverContextP ctx,
- struct object_context *obj_context,
- struct object_buffer *obj_buffer)
-{
- assert(obj_buffer->buffer_store->bo == NULL);
- assert(obj_buffer->buffer_store->buffer);
- i965_release_buffer_store(&obj_context->codec_state.dec.pic_param);
- i965_reference_buffer_store(&obj_context->codec_state.dec.pic_param,
- obj_buffer->buffer_store);
-
- return VA_STATUS_SUCCESS;
-}
-
-static VAStatus
-i965_render_iq_matrix_buffer(VADriverContextP ctx,
- struct object_context *obj_context,
- struct object_buffer *obj_buffer)
-{
- assert(obj_buffer->buffer_store->bo == NULL);
- assert(obj_buffer->buffer_store->buffer);
- i965_release_buffer_store(&obj_context->codec_state.dec.iq_matrix);
- i965_reference_buffer_store(&obj_context->codec_state.dec.iq_matrix,
- obj_buffer->buffer_store);
+ if (obj_context->codec_type == CODEC_ENC) {
+ i965_release_buffer_store(&obj_context->codec_state.encode.pic_param);
+ i965_release_buffer_store(&obj_context->codec_state.encode.seq_param);
- return VA_STATUS_SUCCESS;
-}
+ for (i = 0; i < obj_context->codec_state.encode.num_slice_params; i++) {
+ i965_release_buffer_store(&obj_context->codec_state.encode.slice_params[i]);
+ }
-static VAStatus
-i965_render_bit_plane_buffer(VADriverContextP ctx,
- struct object_context *obj_context,
- struct object_buffer *obj_buffer)
-{
- assert(obj_buffer->buffer_store->bo == NULL);
- assert(obj_buffer->buffer_store->buffer);
- i965_release_buffer_store(&obj_context->codec_state.dec.bit_plane);
- i965_reference_buffer_store(&obj_context->codec_state.dec.bit_plane,
- obj_buffer->buffer_store);
-
- return VA_STATUS_SUCCESS;
-}
+ obj_context->codec_state.encode.num_slice_params = 0;
+ obj_context->codec_state.encode.current_render_target = render_target; /*This is input new frame*/
+ } else {
+ obj_context->codec_state.decode.current_render_target = render_target;
+ i965_release_buffer_store(&obj_context->codec_state.decode.pic_param);
+ i965_release_buffer_store(&obj_context->codec_state.decode.iq_matrix);
+ i965_release_buffer_store(&obj_context->codec_state.decode.bit_plane);
+
+ for (i = 0; i < obj_context->codec_state.decode.num_slice_params; i++) {
+ i965_release_buffer_store(&obj_context->codec_state.decode.slice_params[i]);
+ i965_release_buffer_store(&obj_context->codec_state.decode.slice_datas[i]);
+ }
-static VAStatus
-i965_render_slice_parameter_buffer(VADriverContextP ctx,
- struct object_context *obj_context,
- struct object_buffer *obj_buffer)
-{
- assert(obj_buffer->buffer_store->bo == NULL);
- assert(obj_buffer->buffer_store->buffer);
-
- if (obj_context->codec_state.dec.num_slice_params == obj_context->codec_state.dec.max_slice_params) {
- obj_context->codec_state.dec.slice_params = realloc(obj_context->codec_state.dec.slice_params,
- (obj_context->codec_state.dec.max_slice_params + NUM_SLICES) * sizeof(*obj_context->codec_state.dec.slice_params));
- memset(obj_context->codec_state.dec.slice_params + obj_context->codec_state.dec.max_slice_params, 0, NUM_SLICES * sizeof(*obj_context->codec_state.dec.slice_params));
- obj_context->codec_state.dec.max_slice_params += NUM_SLICES;
+ obj_context->codec_state.decode.num_slice_params = 0;
+ obj_context->codec_state.decode.num_slice_datas = 0;
}
-
- i965_release_buffer_store(&obj_context->codec_state.dec.slice_params[obj_context->codec_state.dec.num_slice_params]);
- i965_reference_buffer_store(&obj_context->codec_state.dec.slice_params[obj_context->codec_state.dec.num_slice_params],
- obj_buffer->buffer_store);
- obj_context->codec_state.dec.num_slice_params++;
-
- return VA_STATUS_SUCCESS;
-}
-static VAStatus
-i965_render_slice_data_buffer(VADriverContextP ctx,
- struct object_context *obj_context,
- struct object_buffer *obj_buffer)
-{
- assert(obj_buffer->buffer_store->buffer == NULL);
- assert(obj_buffer->buffer_store->bo);
-
- if (obj_context->codec_state.dec.num_slice_datas == obj_context->codec_state.dec.max_slice_datas) {
- obj_context->codec_state.dec.slice_datas = realloc(obj_context->codec_state.dec.slice_datas,
- (obj_context->codec_state.dec.max_slice_datas + NUM_SLICES) * sizeof(*obj_context->codec_state.dec.slice_datas));
- memset(obj_context->codec_state.dec.slice_datas + obj_context->codec_state.dec.max_slice_datas, 0, NUM_SLICES * sizeof(*obj_context->codec_state.dec.slice_datas));
- obj_context->codec_state.dec.max_slice_datas += NUM_SLICES;
- }
-
- i965_release_buffer_store(&obj_context->codec_state.dec.slice_datas[obj_context->codec_state.dec.num_slice_datas]);
- i965_reference_buffer_store(&obj_context->codec_state.dec.slice_datas[obj_context->codec_state.dec.num_slice_datas],
- obj_buffer->buffer_store);
- obj_context->codec_state.dec.num_slice_datas++;
-
- return VA_STATUS_SUCCESS;
+ return vaStatus;
}
+#define I965_RENDER_BUFFER(category, name) i965_render_##category##_##name##_buffer(ctx, obj_context, obj_buffer)
+
+#define DEF_RENDER_SINGLE_BUFFER_FUNC(category, name, member) \
+ static VAStatus \
+ i965_render_##category##_##name##_buffer(VADriverContextP ctx, \
+ struct object_context *obj_context, \
+ struct object_buffer *obj_buffer) \
+ { \
+ struct category##_state *category = &obj_context->codec_state.category; \
+ assert(obj_buffer->buffer_store->bo == NULL); \
+ assert(obj_buffer->buffer_store->buffer); \
+ i965_release_buffer_store(&category->member); \
+ i965_reference_buffer_store(&category->member, obj_buffer->buffer_store); \
+ return VA_STATUS_SUCCESS; \
+ }
+
+#define DEF_RENDER_MULTI_BUFFER_FUNC(category, name, member) \
+ static VAStatus \
+ i965_render_##category##_##name##_buffer(VADriverContextP ctx, \
+ struct object_context *obj_context, \
+ struct object_buffer *obj_buffer) \
+ { \
+ struct category##_state *category = &obj_context->codec_state.category; \
+ if (category->num_##member == category->max_##member) { \
+ category->member = realloc(category->member, (category->max_##member + NUM_SLICES) * sizeof(*category->member)); \
+ memset(category->member + category->max_##member, 0, NUM_SLICES * sizeof(*category->member)); \
+ category->max_##member += NUM_SLICES; \
+ } \
+ i965_release_buffer_store(&category->member[category->num_##member]); \
+ i965_reference_buffer_store(&category->member[category->num_##member], obj_buffer->buffer_store); \
+ category->num_##member++; \
+ return VA_STATUS_SUCCESS; \
+ }
+
+#define I965_RENDER_DECODE_BUFFER(name) I965_RENDER_BUFFER(decode, name)
+
+#define DEF_RENDER_DECODE_SINGLE_BUFFER_FUNC(name, member) DEF_RENDER_SINGLE_BUFFER_FUNC(decode, name, member)
+DEF_RENDER_DECODE_SINGLE_BUFFER_FUNC(picture_parameter, pic_param)
+DEF_RENDER_DECODE_SINGLE_BUFFER_FUNC(iq_matrix, iq_matrix)
+DEF_RENDER_DECODE_SINGLE_BUFFER_FUNC(bit_plane, bit_plane)
+
+#define DEF_RENDER_DECODE_MULTI_BUFFER_FUNC(name, member) DEF_RENDER_MULTI_BUFFER_FUNC(decode, name, member)
+DEF_RENDER_DECODE_MULTI_BUFFER_FUNC(slice_parameter, slice_params)
+DEF_RENDER_DECODE_MULTI_BUFFER_FUNC(slice_data, slice_datas)
+
static VAStatus
i965_decoder_render_picture(VADriverContextP ctx,
VAContextID context,
@@ -1295,23 +1278,23 @@ i965_decoder_render_picture(VADriverContextP ctx,
switch (obj_buffer->type) {
case VAPictureParameterBufferType:
- vaStatus = i965_render_picture_parameter_buffer(ctx, obj_context, obj_buffer);
+ vaStatus = I965_RENDER_DECODE_BUFFER(picture_parameter);
break;
case VAIQMatrixBufferType:
- vaStatus = i965_render_iq_matrix_buffer(ctx, obj_context, obj_buffer);
+ vaStatus = I965_RENDER_DECODE_BUFFER(iq_matrix);
break;
case VABitPlaneBufferType:
- vaStatus = i965_render_bit_plane_buffer(ctx, obj_context, obj_buffer);
+ vaStatus = I965_RENDER_DECODE_BUFFER(bit_plane);
break;
case VASliceParameterBufferType:
- vaStatus = i965_render_slice_parameter_buffer(ctx, obj_context, obj_buffer);
+ vaStatus = I965_RENDER_DECODE_BUFFER(slice_parameter);
break;
case VASliceDataBufferType:
- vaStatus = i965_render_slice_data_buffer(ctx, obj_context, obj_buffer);
+ vaStatus = I965_RENDER_DECODE_BUFFER(slice_data);
break;
default:
@@ -1323,96 +1306,17 @@ i965_decoder_render_picture(VADriverContextP ctx,
return vaStatus;
}
-static VAStatus
-i965_encoder_render_squence_parameter_buffer(VADriverContextP ctx,
- struct object_context *obj_context,
- struct object_buffer *obj_buffer)
-{
- assert(obj_buffer->buffer_store->bo == NULL);
- assert(obj_buffer->buffer_store->buffer);
- i965_release_buffer_store(&obj_context->codec_state.enc.seq_param);
- i965_reference_buffer_store(&obj_context->codec_state.enc.seq_param,
- obj_buffer->buffer_store);
-
- return VA_STATUS_SUCCESS;
-}
-
-
-static VAStatus
-i965_encoder_render_picture_parameter_buffer(VADriverContextP ctx,
- struct object_context *obj_context,
- struct object_buffer *obj_buffer)
-{
- assert(obj_buffer->buffer_store->bo == NULL);
- assert(obj_buffer->buffer_store->buffer);
- i965_release_buffer_store(&obj_context->codec_state.enc.pic_param);
- i965_reference_buffer_store(&obj_context->codec_state.enc.pic_param,
- obj_buffer->buffer_store);
-
- return VA_STATUS_SUCCESS;
-}
-
-static VAStatus
-i965_encoder_render_slice_parameter_buffer(VADriverContextP ctx,
- struct object_context *obj_context,
- struct object_buffer *obj_buffer)
-{
- if (obj_context->codec_state.enc.num_slice_params == obj_context->codec_state.enc.max_slice_params) {
- obj_context->codec_state.enc.slice_params = realloc(obj_context->codec_state.enc.slice_params,
- (obj_context->codec_state.enc.max_slice_params + NUM_SLICES) * sizeof(*obj_context->codec_state.enc.slice_params));
- memset(obj_context->codec_state.enc.slice_params + obj_context->codec_state.enc.max_slice_params, 0, NUM_SLICES * sizeof(*obj_context->codec_state.enc.slice_params));
- obj_context->codec_state.enc.max_slice_params += NUM_SLICES;
- }
-
- i965_release_buffer_store(&obj_context->codec_state.enc.slice_params[obj_context->codec_state.enc.num_slice_params]);
- i965_reference_buffer_store(&obj_context->codec_state.enc.slice_params[obj_context->codec_state.enc.num_slice_params],
- obj_buffer->buffer_store);
- obj_context->codec_state.enc.num_slice_params++;
-
- return VA_STATUS_SUCCESS;
-}
-
-static VAStatus
-i965_encoder_render_picture_control_buffer(VADriverContextP ctx,
- struct object_context *obj_context,
- struct object_buffer *obj_buffer)
-{
- assert(obj_buffer->buffer_store->bo == NULL);
- assert(obj_buffer->buffer_store->buffer);
- i965_release_buffer_store(&obj_context->codec_state.enc.pic_control);
- i965_reference_buffer_store(&obj_context->codec_state.enc.pic_control,
- obj_buffer->buffer_store);
+#define I965_RENDER_ENCODE_BUFFER(name) I965_RENDER_BUFFER(encode, name)
- return VA_STATUS_SUCCESS;
-}
+#define DEF_RENDER_ENCODE_SINGLE_BUFFER_FUNC(name, member) DEF_RENDER_SINGLE_BUFFER_FUNC(encode, name, member)
+DEF_RENDER_ENCODE_SINGLE_BUFFER_FUNC(sequence_parameter, seq_param)
+DEF_RENDER_ENCODE_SINGLE_BUFFER_FUNC(picture_parameter, pic_param)
+DEF_RENDER_ENCODE_SINGLE_BUFFER_FUNC(picture_control, pic_control)
+DEF_RENDER_ENCODE_SINGLE_BUFFER_FUNC(qmatrix, q_matrix)
+DEF_RENDER_ENCODE_SINGLE_BUFFER_FUNC(iqmatrix, iq_matrix)
-static VAStatus
-i965_encoder_render_qmatrix_buffer(VADriverContextP ctx,
- struct object_context *obj_context,
- struct object_buffer *obj_buffer)
-{
- assert(obj_buffer->buffer_store->bo == NULL);
- assert(obj_buffer->buffer_store->buffer);
- i965_release_buffer_store(&obj_context->codec_state.enc.q_matrix);
- i965_reference_buffer_store(&obj_context->codec_state.enc.iq_matrix,
- obj_buffer->buffer_store);
-
- return VA_STATUS_SUCCESS;
-}
-
-static VAStatus
-i965_encoder_render_iqmatrix_buffer(VADriverContextP ctx,
- struct object_context *obj_context,
- struct object_buffer *obj_buffer)
-{
- assert(obj_buffer->buffer_store->bo == NULL);
- assert(obj_buffer->buffer_store->buffer);
- i965_release_buffer_store(&obj_context->codec_state.enc.iq_matrix);
- i965_reference_buffer_store(&obj_context->codec_state.enc.iq_matrix,
- obj_buffer->buffer_store);
-
- return VA_STATUS_SUCCESS;
-}
+#define DEF_RENDER_ENCODE_MULTI_BUFFER_FUNC(name, member) DEF_RENDER_MULTI_BUFFER_FUNC(encode, name, member)
+DEF_RENDER_ENCODE_MULTI_BUFFER_FUNC(slice_parameter, slice_params)
static VAStatus
i965_encoder_render_picture(VADriverContextP ctx,
@@ -1431,27 +1335,27 @@ i965_encoder_render_picture(VADriverContextP ctx,
switch (obj_buffer->type) {
case VAEncSequenceParameterBufferType:
- vaStatus = i965_encoder_render_squence_parameter_buffer(ctx, obj_context, obj_buffer);
+ vaStatus = I965_RENDER_ENCODE_BUFFER(sequence_parameter);
break;
case VAEncPictureParameterBufferType:
- vaStatus = i965_encoder_render_picture_parameter_buffer(ctx, obj_context, obj_buffer);
+ vaStatus = I965_RENDER_ENCODE_BUFFER(picture_parameter);
break;
case VAEncSliceParameterBufferType:
- vaStatus = i965_encoder_render_slice_parameter_buffer(ctx, obj_context, obj_buffer);
+ vaStatus = I965_RENDER_ENCODE_BUFFER(slice_parameter);
break;
case VAPictureParameterBufferType:
- vaStatus = i965_encoder_render_picture_control_buffer(ctx, obj_context, obj_buffer);
+ vaStatus = I965_RENDER_ENCODE_BUFFER(picture_control);
break;
case VAQMatrixBufferType:
- vaStatus = i965_encoder_render_qmatrix_buffer(ctx, obj_context, obj_buffer);
+ vaStatus = I965_RENDER_ENCODE_BUFFER(qmatrix);
break;
case VAIQMatrixBufferType:
- vaStatus = i965_encoder_render_iqmatrix_buffer(ctx, obj_context, obj_buffer);
+ vaStatus = I965_RENDER_ENCODE_BUFFER(iqmatrix);
break;
default:
@@ -1498,7 +1402,6 @@ i965_EndPicture(VADriverContextP ctx, VAContextID context)
struct object_context *obj_context = CONTEXT(context);
struct object_config *obj_config;
VAContextID config;
- int i;
assert(obj_context);
config = obj_context->config_id;
@@ -1508,42 +1411,19 @@ i965_EndPicture(VADriverContextP ctx, VAContextID context)
if (obj_context->codec_type == CODEC_ENC) {
assert(VAEntrypointEncSlice == obj_config->entrypoint);
- assert(obj_context->codec_state.enc.pic_param);
- assert(obj_context->codec_state.enc.seq_param);
- assert(obj_context->codec_state.enc.num_slice_params >= 1);
+ assert(obj_context->codec_state.encode.pic_param);
+ assert(obj_context->codec_state.encode.seq_param);
+ assert(obj_context->codec_state.encode.num_slice_params >= 1);
} else {
- assert(obj_context->codec_state.dec.pic_param);
- assert(obj_context->codec_state.dec.num_slice_params >= 1);
- assert(obj_context->codec_state.dec.num_slice_datas >= 1);
- assert(obj_context->codec_state.dec.num_slice_params == obj_context->codec_state.dec.num_slice_datas);
+ assert(obj_context->codec_state.decode.pic_param);
+ assert(obj_context->codec_state.decode.num_slice_params >= 1);
+ assert(obj_context->codec_state.decode.num_slice_datas >= 1);
+ assert(obj_context->codec_state.decode.num_slice_params == obj_context->codec_state.decode.num_slice_datas);
}
assert(obj_context->hw_context->run);
obj_context->hw_context->run(ctx, obj_config->profile, &obj_context->codec_state, obj_context->hw_context);
- if (obj_context->codec_type == CODEC_ENC) {
- obj_context->codec_state.enc.current_render_target = VA_INVALID_SURFACE;
- obj_context->codec_state.enc.num_slice_params = 0;
- i965_release_buffer_store(&obj_context->codec_state.enc.pic_param);
- i965_release_buffer_store(&obj_context->codec_state.enc.seq_param);
-
- for (i = 0; i < obj_context->codec_state.enc.num_slice_params; i++) {
- i965_release_buffer_store(&obj_context->codec_state.enc.slice_params[i]);
- }
- } else {
- obj_context->codec_state.dec.current_render_target = -1;
- i965_release_buffer_store(&obj_context->codec_state.dec.pic_param);
- i965_release_buffer_store(&obj_context->codec_state.dec.iq_matrix);
- i965_release_buffer_store(&obj_context->codec_state.dec.bit_plane);
-
- for (i = 0; i < obj_context->codec_state.dec.num_slice_params; i++) {
- i965_release_buffer_store(&obj_context->codec_state.dec.slice_params[i]);
- i965_release_buffer_store(&obj_context->codec_state.dec.slice_datas[i]);
- }
- obj_context->codec_state.dec.num_slice_params = 0;
- obj_context->codec_state.dec.num_slice_datas = 0;
- }
-
return VA_STATUS_SUCCESS;
}
diff --git a/src/i965_drv_video.h b/src/i965_drv_video.h
index ac77b19..67ca6f6 100644
--- a/src/i965_drv_video.h
+++ b/src/i965_drv_video.h
@@ -107,8 +107,8 @@ struct encode_state
union codec_state
{
- struct decode_state dec;
- struct encode_state enc;
+ struct decode_state decode;
+ struct encode_state encode;
};
struct hw_context
diff --git a/src/i965_encoder.c b/src/i965_encoder.c
index 0b1efef..c58eb21 100644
--- a/src/i965_encoder.c
+++ b/src/i965_encoder.c
@@ -31,8 +31,6 @@
#include <string.h>
#include <assert.h>
-#include <va/va_backend.h>
-
#include "intel_batchbuffer.h"
#include "intel_driver.h"
@@ -47,7 +45,7 @@ gen6_encoder_end_picture(VADriverContextP ctx,
struct hw_context *hw_context)
{
struct gen6_encoder_context *gen6_encoder_context = (struct gen6_encoder_context *)hw_context;
- struct encode_state *encode_state = &codec_state->enc;
+ struct encode_state *encode_state = &codec_state->encode;
VAStatus vaStatus;
vaStatus = gen6_vme_pipeline(ctx, profile, encode_state, gen6_encoder_context);
diff --git a/src/i965_media.c b/src/i965_media.c
index d6a56d2..f43feed 100644
--- a/src/i965_media.c
+++ b/src/i965_media.c
@@ -32,8 +32,6 @@
#include <string.h>
#include <assert.h>
-#include <va/va_backend.h>
-
#include "intel_batchbuffer.h"
#include "intel_driver.h"
#include "i965_defines.h"
@@ -277,7 +275,7 @@ i965_media_decode_picture(VADriverContextP ctx,
struct hw_context *hw_context)
{
struct i965_media_context *media_context = (struct i965_media_context *)hw_context;
- struct decode_state *decode_state = &codec_state->dec;
+ struct decode_state *decode_state = &codec_state->decode;
i965_media_decode_init(ctx, profile, decode_state, media_context);
assert(media_context->media_states_setup);
diff --git a/src/i965_media_h264.h b/src/i965_media_h264.h
index 8a8dc8e..490213c 100644
--- a/src/i965_media_h264.h
+++ b/src/i965_media_h264.h
@@ -4,6 +4,7 @@
#include "i965_avc_bsd.h"
#include "i965_avc_hw_scoreboard.h"
#include "i965_avc_ildb.h"
+#include "i965_decoder.h"
struct decode_state;
struct i965_media_context;
@@ -60,10 +61,7 @@ struct i965_h264_context
struct i965_avc_hw_scoreboard_context avc_hw_scoreboard_context;
struct i965_avc_ildb_context avc_ildb_context;
- struct {
- VASurfaceID surface_id;
- int frame_store_id;
- } fsid_list[16];
+ GenFrameStore fsid_list[MAX_GEN_REFERENCE_FRAMES];
struct i965_kernel avc_kernels[NUM_H264_AVC_KERNELS];
struct intel_batchbuffer *batch;
diff --git a/src/i965_media_mpeg2.c b/src/i965_media_mpeg2.c
index 15edc5b..1d87d9b 100644
--- a/src/i965_media_mpeg2.c
+++ b/src/i965_media_mpeg2.c
@@ -32,8 +32,6 @@
#include <string.h>
#include <assert.h>
-#include <va/va_backend.h>
-
#include "intel_batchbuffer.h"
#include "intel_driver.h"
#include "i965_defines.h"
diff --git a/src/i965_post_processing.c b/src/i965_post_processing.c
index 4201d09..090403c 100644
--- a/src/i965_post_processing.c
+++ b/src/i965_post_processing.c
@@ -31,8 +31,6 @@
#include <string.h>
#include <assert.h>
-#include <va/va_backend.h>
-
#include "intel_batchbuffer.h"
#include "intel_driver.h"
#include "i965_defines.h"
diff --git a/src/i965_render.c b/src/i965_render.c
index ad8de1e..0fa76d2 100644
--- a/src/i965_render.c
+++ b/src/i965_render.c
@@ -36,7 +36,6 @@
#include <string.h>
#include <assert.h>
-#include <va/va_backend.h>
#include <va/va_dricommon.h>
#include "intel_batchbuffer.h"
@@ -975,26 +974,24 @@ i965_render_upload_vertex(
}
static void
-i965_render_upload_constants(VADriverContextP ctx)
+i965_render_upload_constants(VADriverContextP ctx,
+ VASurfaceID surface)
{
struct i965_driver_data *i965 = i965_driver_data(ctx);
struct i965_render_state *render_state = &i965->render_state;
unsigned short *constant_buffer;
-
- if (render_state->curbe.upload)
- return;
+ struct object_surface *obj_surface = SURFACE(surface);
dri_bo_map(render_state->curbe.bo, 1);
assert(render_state->curbe.bo->virtual);
constant_buffer = render_state->curbe.bo->virtual;
- if (render_state->interleaved_uv)
+ if (obj_surface->fourcc == VA_FOURCC('N','V','1','2'))
*constant_buffer = 1;
else
*constant_buffer = 0;
dri_bo_unmap(render_state->curbe.bo);
- render_state->curbe.upload = 1;
}
static void
@@ -1014,7 +1011,7 @@ i965_surface_render_state_setup(
i965_render_cc_viewport(ctx);
i965_render_cc_unit(ctx);
i965_render_upload_vertex(ctx, surface, src_rect, dst_rect);
- i965_render_upload_constants(ctx);
+ i965_render_upload_constants(ctx, surface);
}
static void
i965_subpic_render_state_setup(
@@ -1696,7 +1693,7 @@ gen6_render_setup_states(
gen6_render_color_calc_state(ctx);
gen6_render_blend_state(ctx);
gen6_render_depth_stencil_state(ctx);
- i965_render_upload_constants(ctx);
+ i965_render_upload_constants(ctx, surface);
i965_render_upload_vertex(ctx, surface, src_rect, dst_rect);
}
@@ -2288,7 +2285,7 @@ gen7_render_setup_states(
gen7_render_color_calc_state(ctx);
gen7_render_blend_state(ctx);
gen7_render_depth_stencil_state(ctx);
- i965_render_upload_constants(ctx);
+ i965_render_upload_constants(ctx, surface);
i965_render_upload_vertex(ctx, surface, src_rect, dst_rect);
}
@@ -2984,7 +2981,6 @@ i965_render_init(VADriverContextP ctx)
"constant buffer",
4096, 64);
assert(render_state->curbe.bo);
- render_state->curbe.upload = 0;
return True;
}
diff --git a/src/i965_render.h b/src/i965_render.h
index a5034d9..96a1512 100644
--- a/src/i965_render.h
+++ b/src/i965_render.h
@@ -67,7 +67,6 @@ struct i965_render_state
struct {
dri_bo *bo;
- int upload;
} curbe;
unsigned short interleaved_uv;
diff --git a/src/intel_batchbuffer.c b/src/intel_batchbuffer.c
index f310793..0b52281 100644
--- a/src/intel_batchbuffer.c
+++ b/src/intel_batchbuffer.c
@@ -29,8 +29,6 @@
#include <string.h>
#include <assert.h>
-#include <va/va_backend.h>
-
#include "intel_batchbuffer.h"
static void
diff --git a/src/intel_driver.h b/src/intel_driver.h
index e31360d..0ffb3a5 100644
--- a/src/intel_driver.h
+++ b/src/intel_driver.h
@@ -1,6 +1,7 @@
#ifndef _INTEL_DRIVER_H_
#define _INTEL_DRIVER_H_
+#include <stddef.h>
#include <pthread.h>
#include <signal.h>
@@ -63,6 +64,10 @@ struct intel_batchbuffer;
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define ARRAY_ELEMS(a) (sizeof(a) / sizeof((a)[0]))
+#define Bool int
+#define True 1
+#define False 0
+
#define SET_BLOCKED_SIGSET() do { \
sigset_t bl_mask; \
sigfillset(&bl_mask); \
@@ -138,6 +143,8 @@ struct intel_region
#define PCI_CHIP_Q45_G 0x2E12
#define PCI_CHIP_G45_G 0x2E22
#define PCI_CHIP_G41_G 0x2E32
+#define PCI_CHIP_B43_G 0x2E42
+#define PCI_CHIP_B43_G1 0x2E92
#define PCI_CHIP_IRONLAKE_D_G 0x0042
#define PCI_CHIP_IRONLAKE_M_G 0x0046
@@ -161,7 +168,10 @@ struct intel_region
#define IS_G45(devid) (devid == PCI_CHIP_IGD_E_G || \
devid == PCI_CHIP_Q45_G || \
devid == PCI_CHIP_G45_G || \
- devid == PCI_CHIP_G41_G)
+ devid == PCI_CHIP_G41_G || \
+ devid == PCI_CHIP_B43_G || \
+ devid == PCI_CHIP_B43_G1)
+
#define IS_GM45(devid) (devid == PCI_CHIP_GM45_GM)
#define IS_G4X(devid) (IS_G45(devid) || IS_GM45(devid))
--
intel-vaapi-driver packaging
More information about the pkg-multimedia-commits
mailing list