[Intel-gfx] [PATCH] XvMC: enable XvMC/XvMC-VLD on IGDNG

Xiang, Haihao haihao.xiang at intel.com
Mon Jul 20 22:39:42 CEST 2009


---
 src/i830_hwmc.c     |    2 +-
 src/i965_hwmc.c     |    1 +
 src/i965_hwmc.h     |    1 +
 src/xvmc/xvmc_vld.c |  137 ++++++++++++++++++++++++++++++++++++++++++++-------
 4 files changed, 122 insertions(+), 19 deletions(-)

diff --git a/src/i830_hwmc.c b/src/i830_hwmc.c
index dee17ca..790d719 100644
--- a/src/i830_hwmc.c
+++ b/src/i830_hwmc.c
@@ -62,7 +62,7 @@ Bool intel_xvmc_probe(ScrnInfoPtr pScrn)
     if (IS_I9XX(pI830)) {
 	if (IS_I915(pI830))
 	    ret = intel_xvmc_set_driver(&i915_xvmc_driver);
-	else if (IS_G4X(pI830))
+	else if (IS_G4X(pI830) || IS_IGDNG(pI830))
 	    ret = intel_xvmc_set_driver(&vld_xvmc_driver);
 	else
 	    ret = intel_xvmc_set_driver(&i965_xvmc_driver);
diff --git a/src/i965_hwmc.c b/src/i965_hwmc.c
index 7163330..e7b5de1 100644
--- a/src/i965_hwmc.c
+++ b/src/i965_hwmc.c
@@ -73,6 +73,7 @@ static int create_context(ScrnInfoPtr pScrn,
 
     private_context->is_g4x = IS_G4X(I830);
     private_context->is_965_q = IS_965_Q(I830);
+    private_context->is_igdng = IS_IGDNG(I830);
     private_context->comm.kernel_exec_fencing = I830->kernel_exec_fencing;
     private_context->comm.type = xvmc_driver->flag;
 
diff --git a/src/i965_hwmc.h b/src/i965_hwmc.h
index fb61516..12d977b 100644
--- a/src/i965_hwmc.h
+++ b/src/i965_hwmc.h
@@ -24,4 +24,5 @@ struct i965_xvmc_context {
     struct 	i965_xvmc_surface *surfaces[I965_MAX_SURFACES];
     unsigned    int is_g4x:1;
     unsigned    int is_965_q:1;
+    unsigned    int is_igdng:1;   
 };
diff --git a/src/xvmc/xvmc_vld.c b/src/xvmc/xvmc_vld.c
index a2c2c15..d964fc1 100644
--- a/src/xvmc/xvmc_vld.c
+++ b/src/xvmc/xvmc_vld.c
@@ -111,6 +111,32 @@ static uint32_t field_f_b_kernel[][4] = {
    #include "shader/vld/field_f_b.g4b"
 };
 
+/* on IGDNG */
+static uint32_t lib_kernel_gen5[][4] = {
+   #include "shader/vld/lib.g4b.gen5"
+};
+static uint32_t ipicture_kernel_gen5[][4] = {
+   #include "shader/vld/ipicture.g4b.gen5"
+};
+static uint32_t frame_forward_kernel_gen5[][4] = {
+   #include "shader/vld/frame_forward.g4b.gen5"
+};
+static uint32_t frame_backward_kernel_gen5[][4] = {
+   #include "shader/vld/frame_backward.g4b.gen5"
+};
+static uint32_t frame_f_b_kernel_gen5[][4] = {
+   #include "shader/vld/frame_f_b.g4b.gen5"
+};
+static uint32_t field_forward_kernel_gen5[][4] = {
+   #include "shader/vld/field_forward.g4b.gen5"
+};
+static uint32_t field_backward_kernel_gen5[][4] = {
+   #include "shader/vld/field_backward.g4b.gen5"
+};
+static uint32_t field_f_b_kernel_gen5[][4] = {
+   #include "shader/vld/field_f_b.g4b.gen5"
+};
+
 /*kernels for mc mode*/
 static uint32_t lib_kernel_idct[][4] = {
    #include "shader/mc/lib_igd.g4b"
@@ -137,10 +163,37 @@ static uint32_t field_f_b_kernel_idct[][4] = {
    #include "shader/mc/field_f_b_igd.g4b"
 };
 
+/* on IGDNG */
+static uint32_t lib_kernel_idct_gen5[][4] = {
+   #include "shader/mc/lib_igd.g4b.gen5"
+};
+static uint32_t ipicture_kernel_idct_gen5[][4] = {
+   #include "shader/mc/ipicture_igd.g4b.gen5"
+};
+static uint32_t frame_forward_kernel_idct_gen5[][4] = {
+   #include "shader/mc/frame_forward_igd.g4b.gen5"
+};
+static uint32_t frame_backward_kernel_idct_gen5[][4] = {
+   #include "shader/mc/frame_backward_igd.g4b.gen5"
+};
+static uint32_t frame_f_b_kernel_idct_gen5[][4] = {
+   #include "shader/mc/frame_f_b_igd.g4b.gen5"
+};
+static uint32_t field_forward_kernel_idct_gen5[][4] = {
+   #include "shader/mc/field_forward_igd.g4b.gen5"
+};
+static uint32_t field_backward_kernel_idct_gen5[][4] = {
+   #include "shader/mc/field_backward_igd.g4b.gen5"
+};
+static uint32_t field_f_b_kernel_idct_gen5[][4] = {
+   #include "shader/mc/field_f_b_igd.g4b.gen5"
+};
+
 struct media_kernel {
    uint32_t (*bin)[4];
    int size;
-}media_kernels[] = {
+};
+static struct media_kernel media_kernels[] = {
 	/*kernels for vld mode*/
     {ipicture_kernel, sizeof(ipicture_kernel)},
     {frame_forward_kernel, sizeof(frame_forward_kernel)},
@@ -161,6 +214,27 @@ struct media_kernel {
     {lib_kernel_idct, sizeof(lib_kernel_idct)}
 };
 
+static struct media_kernel media_gen5_kernels[] = {
+	/*kernels for vld mode*/
+    {ipicture_kernel_gen5, sizeof(ipicture_kernel_gen5)},
+    {frame_forward_kernel_gen5, sizeof(frame_forward_kernel_gen5)},
+    {frame_backward_kernel_gen5, sizeof(frame_backward_kernel_gen5)},
+    {frame_f_b_kernel_gen5, sizeof(frame_f_b_kernel_gen5)},
+    {field_forward_kernel_gen5, sizeof(field_forward_kernel_gen5)},
+    {field_backward_kernel_gen5, sizeof(field_backward_kernel_gen5)},
+    {field_f_b_kernel_gen5, sizeof(field_f_b_kernel_gen5)},
+    {lib_kernel_gen5, sizeof(lib_kernel_gen5)},
+	/*kernels for mc mode*/
+    {ipicture_kernel_idct_gen5, sizeof(ipicture_kernel_idct_gen5)},
+    {frame_forward_kernel_idct_gen5, sizeof(frame_forward_kernel_idct_gen5)},
+    {frame_backward_kernel_idct_gen5, sizeof(frame_backward_kernel_idct_gen5)},
+    {frame_f_b_kernel_idct_gen5, sizeof(frame_f_b_kernel_idct_gen5)},
+    {field_forward_kernel_idct_gen5, sizeof(field_forward_kernel_idct_gen5)},
+    {field_backward_kernel_idct_gen5, sizeof(field_backward_kernel_idct_gen5)},
+    {field_f_b_kernel_idct_gen5, sizeof(field_f_b_kernel_idct_gen5)},
+    {lib_kernel_idct_gen5, sizeof(lib_kernel_idct_gen5)}
+};
+
 #define MEDIA_KERNEL_NUM (sizeof(media_kernels)/sizeof(media_kernels[0]))
 
 struct media_kernel_obj {
@@ -346,21 +420,33 @@ static Status interface_descriptor()
     return Success;
 }
 
-static int setup_media_kernels()
+static int setup_media_kernels(struct i965_xvmc_context *i965_ctx)
 {
     int i;
 
+    assert(MEDIA_KERNEL_NUM == sizeof(media_gen5_kernels) / sizeof(media_gen5_kernels[0]));
+
     for (i = 0; i < MEDIA_KERNEL_NUM; i++) {
-        media_state.vfe_state.interface.kernels[i].bo =
+        if (i965_ctx->is_igdng)
+            media_state.vfe_state.interface.kernels[i].bo =
 		drm_intel_bo_alloc(xvmc_driver->bufmgr, "kernel",
-			media_kernels[i].size, 0x1000);
+                                   media_gen5_kernels[i].size, 0x1000);
+        else
+            media_state.vfe_state.interface.kernels[i].bo = 
+                drm_intel_bo_alloc(xvmc_driver->bufmgr, "kernels",
+                                   media_kernels[i].size, 0x1000);
+
         if (!media_state.vfe_state.interface.kernels[i].bo)
             goto out;
     }
 
     for (i = 0; i < MEDIA_KERNEL_NUM; i++) {
         dri_bo *bo = media_state.vfe_state.interface.kernels[i].bo;
-        drm_intel_bo_subdata(bo, 0, media_kernels[i].size, media_kernels[i].bin);
+
+        if (i965_ctx->is_igdng)
+            drm_intel_bo_subdata(bo, 0, media_gen5_kernels[i].size, media_gen5_kernels[i].bin);
+        else
+            drm_intel_bo_subdata(bo, 0, media_kernels[i].size, media_kernels[i].bin);
     }
     return 0;
 out:
@@ -433,7 +519,7 @@ static Status create_context(Display *display, XvMCContext *context,
     if (alloc_object(&media_state))
         return BadAlloc;
 
-    if (setup_media_kernels())
+    if (setup_media_kernels(i965_ctx))
         return BadAlloc;
     return Success;
 }
@@ -658,19 +744,32 @@ static Status put_slice(Display *display, XvMCContext *context,
     return Success;
 }
 
-static void state_base_address()
+static void state_base_address(struct i965_xvmc_context *i965_ctx)
 {
     BATCH_LOCALS;
-    BEGIN_BATCH(6);
-    OUT_BATCH(BRW_STATE_BASE_ADDRESS|4);
-    OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
-    OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
-    OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
-    OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
-    OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
-    ADVANCE_BATCH();
-}
 
+    if (i965_ctx->is_igdng) {
+        BEGIN_BATCH(8);
+        OUT_BATCH(BRW_STATE_BASE_ADDRESS|6);
+        OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
+        OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
+        OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
+        OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
+        OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
+        OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
+        OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
+        ADVANCE_BATCH();
+    } else {
+        BEGIN_BATCH(6);
+        OUT_BATCH(BRW_STATE_BASE_ADDRESS|4);
+        OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
+        OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
+        OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
+        OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
+        OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
+        ADVANCE_BATCH();
+    }
+}
 static void pipeline_select()
 {
     BATCH_LOCALS;
@@ -834,7 +933,7 @@ static Status put_slice2(Display *display, XvMCContext *context,
 
     intel_ctx = intel_xvmc_find_context(context->context_id);
     LOCK_HARDWARE(intel_ctx->hw_context);
-    state_base_address();
+    state_base_address(i965_ctx);
     pipeline_select();
     media_state_pointers(VFE_VLD_MODE);
     urb_layout();	
@@ -884,6 +983,7 @@ static Status render_surface(Display *display,
     unsigned short *block_ptr;
     int i, j;
     int block_offset = 0;
+    struct i965_xvmc_context *i965_ctx;
 
     intel_ctx = intel_xvmc_find_context(context->context_id);
     if (!intel_ctx) {
@@ -891,6 +991,7 @@ static Status render_surface(Display *display,
 	return BadValue;
     }
 
+    i965_ctx = (struct i965_xvmc_context *)context->privData;
     priv_target = target_surface->privData;
     priv_past = past_surface?past_surface->privData:NULL;
     priv_future = future_surface?future_surface->privData:NULL;
@@ -975,7 +1076,7 @@ static Status render_surface(Display *display,
     }
 
     LOCK_HARDWARE(intel_ctx->hw_context);
-    state_base_address();
+    state_base_address(i965_ctx);
     flush();	
     pipeline_select();
     urb_layout();	
-- 
1.5.6.3




More information about the Intel-gfx mailing list