summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXiang, Haihao <haihao.xiang@intel.com>2011-05-10 12:52:05 +0800
committerXiang, Haihao <haihao.xiang@intel.com>2011-05-10 14:17:20 +0800
commit778d7e31f0c271ccfc016e29cd24ae915402f415 (patch)
treecae62abc7b2d19ae3c7b586df51306c31358e2a6
parentca5f60f09de929888c79758d357661923edd21cb (diff)
i965_drv_video: store kernel info in the corresponding context
-rw-r--r--i965_drv_video/gen6_vme.c10
-rw-r--r--i965_drv_video/gen6_vme.h4
-rw-r--r--i965_drv_video/i965_avc_hw_scoreboard.c4
-rw-r--r--i965_drv_video/i965_avc_ildb.c6
-rw-r--r--i965_drv_video/i965_drv_video.h5
-rw-r--r--i965_drv_video/i965_media_h264.c66
-rw-r--r--i965_drv_video/i965_media_h264.h4
-rw-r--r--i965_drv_video/i965_media_mpeg2.c63
-rw-r--r--i965_drv_video/i965_media_mpeg2.h7
-rw-r--r--i965_drv_video/i965_post_processing.c103
-rw-r--r--i965_drv_video/i965_post_processing.h13
-rw-r--r--i965_drv_video/i965_render.c28
-rw-r--r--i965_drv_video/i965_render.h7
13 files changed, 166 insertions, 154 deletions
diff --git a/i965_drv_video/gen6_vme.c b/i965_drv_video/gen6_vme.c
index e68a98e..1273ff7 100644
--- a/i965_drv_video/gen6_vme.c
+++ b/i965_drv_video/gen6_vme.c
@@ -74,8 +74,6 @@ static struct i965_kernel gen6_vme_kernels[] = {
}
};
-#define GEN6_VME_KERNEL_NUMBER ARRAY_ELEMS(gen6_vme_kernels)
-
static void
gen6_vme_set_common_surface_tiling(struct i965_surface_state *ss, unsigned int tiling)
{
@@ -358,7 +356,7 @@ static VAStatus gen6_vme_interface_setup(VADriverContextP ctx,
for (i = 0; i < GEN6_VME_KERNEL_NUMBER; i++) {
struct i965_kernel *kernel;
- kernel = &gen6_vme_kernels[i];
+ kernel = &vme_context->vme_kernels[i];
assert(sizeof(*desc) == 32);
/*Setup the descritor table*/
memset(desc, 0, sizeof(*desc));
@@ -708,9 +706,11 @@ Bool gen6_vme_context_init(VADriverContextP ctx, struct gen6_vme_context *vme_co
struct i965_driver_data *i965 = i965_driver_data(ctx);
int i;
+ memcpy(vme_context->vme_kernels, gen6_vme_kernels, sizeof(vme_context->vme_kernels));
+
for (i = 0; i < GEN6_VME_KERNEL_NUMBER; i++) {
/*Load kernel into GPU memory*/
- struct i965_kernel *kernel = &gen6_vme_kernels[i];
+ struct i965_kernel *kernel = &vme_context->vme_kernels[i];
kernel->bo = dri_bo_alloc(i965->intel.bufmgr,
kernel->name,
@@ -749,7 +749,7 @@ Bool gen6_vme_context_destroy(struct gen6_vme_context *vme_context)
for (i = 0; i < GEN6_VME_KERNEL_NUMBER; i++) {
/*Load kernel into GPU memory*/
- struct i965_kernel *kernel = &gen6_vme_kernels[i];
+ struct i965_kernel *kernel = &vme_context->vme_kernels[i];
dri_bo_unreference(kernel->bo);
kernel->bo = NULL;
diff --git a/i965_drv_video/gen6_vme.h b/i965_drv_video/gen6_vme.h
index a63bc18..71b14c1 100644
--- a/i965_drv_video/gen6_vme.h
+++ b/i965_drv_video/gen6_vme.h
@@ -38,6 +38,8 @@
#define MAX_INTERFACE_DESC_GEN6 32
#define MAX_MEDIA_SURFACES_GEN6 34
+#define GEN6_VME_KERNEL_NUMBER 2
+
struct encode_state;
struct gen6_encoder_context;
@@ -77,6 +79,8 @@ struct gen6_vme_context
unsigned int size_block; /* in bytes */
unsigned int pitch;
} vme_output;
+
+ struct i965_kernel vme_kernels[GEN6_VME_KERNEL_NUMBER];
};
VAStatus gen6_vme_pipeline(VADriverContextP ctx,
diff --git a/i965_drv_video/i965_avc_hw_scoreboard.c b/i965_drv_video/i965_avc_hw_scoreboard.c
index 633e4b9..9e2263f 100644
--- a/i965_drv_video/i965_avc_hw_scoreboard.c
+++ b/i965_drv_video/i965_avc_hw_scoreboard.c
@@ -41,8 +41,6 @@
#include "i965_media_h264.h"
#include "i965_media.h"
-extern struct i965_kernel *h264_avc_kernels;
-
/* On Ironlake */
#include "shaders/h264/mc/export.inc.gen5"
@@ -335,7 +333,7 @@ i965_avc_hw_scoreboard(VADriverContextP ctx, struct decode_state *decode_state,
avc_hw_scoreboard_context->surface.total_mbs = i965_h264_context->avc_it_command_mb_info.mbs * 2;
dri_bo_unreference(avc_hw_scoreboard_context->hw_kernel.bo);
- avc_hw_scoreboard_context->hw_kernel.bo = h264_avc_kernels[H264_AVC_COMBINED].bo;
+ avc_hw_scoreboard_context->hw_kernel.bo = i965_h264_context->avc_kernels[H264_AVC_COMBINED].bo;
assert(avc_hw_scoreboard_context->hw_kernel.bo != NULL);
dri_bo_reference(avc_hw_scoreboard_context->hw_kernel.bo);
diff --git a/i965_drv_video/i965_avc_ildb.c b/i965_drv_video/i965_avc_ildb.c
index 19146ac..739e0cf 100644
--- a/i965_drv_video/i965_avc_ildb.c
+++ b/i965_drv_video/i965_avc_ildb.c
@@ -123,8 +123,6 @@ struct avc_ildb_root_input
unsigned int pad3;
};
-extern struct i965_kernel *h264_avc_kernels;
-
#define NUM_AVC_ILDB_INTERFACES ARRAY_ELEMS(avc_ildb_kernel_offset_gen4)
static unsigned long *avc_ildb_kernel_offset = NULL;
@@ -278,7 +276,7 @@ i965_avc_ildb_interface_descriptor_table(VADriverContextP ctx, struct i965_h264_
int kernel_offset = avc_ildb_kernel_offset[i];
memset(desc, 0, sizeof(*desc));
desc->desc0.grf_reg_blocks = 7;
- desc->desc0.kernel_start_pointer = (h264_avc_kernels[H264_AVC_COMBINED].bo->offset + kernel_offset) >> 6; /* reloc */
+ desc->desc0.kernel_start_pointer = (i965_h264_context->avc_kernels[H264_AVC_COMBINED].bo->offset + kernel_offset) >> 6; /* reloc */
desc->desc1.const_urb_entry_read_offset = 0;
desc->desc1.const_urb_entry_read_len = ((i == AVC_ILDB_ROOT_Y_ILDB_FRAME ||
i == AVC_ILDB_ROOT_Y_ILDB_FIELD ||
@@ -291,7 +289,7 @@ i965_avc_ildb_interface_descriptor_table(VADriverContextP ctx, struct i965_h264_
I915_GEM_DOMAIN_INSTRUCTION, 0,
desc->desc0.grf_reg_blocks + kernel_offset,
i * sizeof(*desc) + offsetof(struct i965_interface_descriptor, desc0),
- h264_avc_kernels[H264_AVC_COMBINED].bo);
+ i965_h264_context->avc_kernels[H264_AVC_COMBINED].bo);
dri_bo_emit_reloc(bo,
I915_GEM_DOMAIN_INSTRUCTION, 0,
diff --git a/i965_drv_video/i965_drv_video.h b/i965_drv_video/i965_drv_video.h
index 2db1b3a..abf16dc 100644
--- a/i965_drv_video/i965_drv_video.h
+++ b/i965_drv_video/i965_drv_video.h
@@ -37,8 +37,6 @@
#include "intel_driver.h"
-#include "i965_render.h"
-
#define I965_MAX_PROFILES 11
#define I965_MAX_ENTRYPOINTS 5
#define I965_MAX_CONFIG_ATTRIBUTES 10
@@ -204,6 +202,9 @@ struct hw_codec_info
struct hw_context *(*enc_hw_context_init)(VADriverContextP, VAProfile);
};
+
+#include "i965_render.h"
+
struct i965_driver_data
{
struct intel_driver_data intel;
diff --git a/i965_drv_video/i965_media_h264.c b/i965_drv_video/i965_media_h264.c
index 1620877..2298361 100644
--- a/i965_drv_video/i965_media_h264.c
+++ b/i965_drv_video/i965_media_h264.c
@@ -275,9 +275,6 @@ static struct i965_kernel h264_avc_kernels_gen5[] = {
}
};
-#define NUM_H264_AVC_KERNELS (sizeof(h264_avc_kernels_gen4) / sizeof(h264_avc_kernels_gen4[0]))
-struct i965_kernel *h264_avc_kernels = NULL;
-
#define NUM_AVC_MC_INTERFACES (sizeof(avc_mc_kernel_offset_gen4) / sizeof(avc_mc_kernel_offset_gen4[0]))
static unsigned long *avc_mc_kernel_offset = NULL;
@@ -448,6 +445,7 @@ i965_media_h264_binding_table(VADriverContextP ctx, struct i965_media_context *m
static void
i965_media_h264_interface_descriptor_remap_table(VADriverContextP ctx, struct i965_media_context *media_context)
{
+ struct i965_h264_context *i965_h264_context = (struct i965_h264_context *)media_context->private_context;
struct i965_interface_descriptor *desc;
int i;
dri_bo *bo;
@@ -461,7 +459,7 @@ i965_media_h264_interface_descriptor_remap_table(VADriverContextP ctx, struct i9
int kernel_offset = avc_mc_kernel_offset[i];
memset(desc, 0, sizeof(*desc));
desc->desc0.grf_reg_blocks = 7;
- desc->desc0.kernel_start_pointer = (h264_avc_kernels[H264_AVC_COMBINED].bo->offset + kernel_offset) >> 6; /* reloc */
+ desc->desc0.kernel_start_pointer = (i965_h264_context->avc_kernels[H264_AVC_COMBINED].bo->offset + kernel_offset) >> 6; /* reloc */
desc->desc1.const_urb_entry_read_offset = 0;
desc->desc1.const_urb_entry_read_len = 2;
desc->desc3.binding_table_entry_count = 0;
@@ -472,7 +470,7 @@ i965_media_h264_interface_descriptor_remap_table(VADriverContextP ctx, struct i9
I915_GEM_DOMAIN_INSTRUCTION, 0,
desc->desc0.grf_reg_blocks + kernel_offset,
i * sizeof(*desc) + offsetof(struct i965_interface_descriptor, desc0),
- h264_avc_kernels[H264_AVC_COMBINED].bo);
+ i965_h264_context->avc_kernels[H264_AVC_COMBINED].bo);
dri_bo_emit_reloc(bo,
I915_GEM_DOMAIN_INSTRUCTION, 0,
@@ -758,15 +756,16 @@ i965_media_h264_free_private_context(void **data)
dri_bo_unreference(i965_h264_context->avc_it_command_mb_info.bo);
dri_bo_unreference(i965_h264_context->avc_it_data.bo);
dri_bo_unreference(i965_h264_context->avc_ildb_data.bo);
- free(i965_h264_context);
- *data = NULL;
for (i = 0; i < NUM_H264_AVC_KERNELS; i++) {
- struct i965_kernel *kernel = &h264_avc_kernels[i];
+ struct i965_kernel *kernel = &i965_h264_context->avc_kernels[i];
dri_bo_unreference(kernel->bo);
kernel->bo = NULL;
}
+
+ free(i965_h264_context);
+ *data = NULL;
}
void
@@ -850,34 +849,31 @@ i965_media_h264_dec_context_init(VADriverContextP ctx, struct i965_media_context
i965_h264_context = calloc(1, sizeof(struct i965_h264_context));
/* kernel */
- if (h264_avc_kernels == NULL) {
- assert(NUM_H264_AVC_KERNELS == (sizeof(h264_avc_kernels_gen5) /
- sizeof(h264_avc_kernels_gen5[0])));
- assert(NUM_AVC_MC_INTERFACES == (sizeof(avc_mc_kernel_offset_gen5) /
- sizeof(avc_mc_kernel_offset_gen5[0])));
-
- if (IS_IRONLAKE(i965->intel.device_id)) {
- h264_avc_kernels = h264_avc_kernels_gen5;
- avc_mc_kernel_offset = avc_mc_kernel_offset_gen5;
- intra_kernel_header = &intra_kernel_header_gen5;
- i965_h264_context->use_avc_hw_scoreboard = 1;
- i965_h264_context->use_hw_w128 = 1;
- } else {
- h264_avc_kernels = h264_avc_kernels_gen4;
- avc_mc_kernel_offset = avc_mc_kernel_offset_gen4;
- intra_kernel_header = &intra_kernel_header_gen4;
- i965_h264_context->use_avc_hw_scoreboard = 0;
- i965_h264_context->use_hw_w128 = 0;
- }
+ assert(NUM_H264_AVC_KERNELS == (sizeof(h264_avc_kernels_gen5) /
+ sizeof(h264_avc_kernels_gen5[0])));
+ assert(NUM_AVC_MC_INTERFACES == (sizeof(avc_mc_kernel_offset_gen5) /
+ sizeof(avc_mc_kernel_offset_gen5[0])));
+ if (IS_IRONLAKE(i965->intel.device_id)) {
+ memcpy(i965_h264_context->avc_kernels, h264_avc_kernels_gen5, sizeof(i965_h264_context->avc_kernels));
+ avc_mc_kernel_offset = avc_mc_kernel_offset_gen5;
+ intra_kernel_header = &intra_kernel_header_gen5;
+ i965_h264_context->use_avc_hw_scoreboard = 1;
+ i965_h264_context->use_hw_w128 = 1;
+ } else {
+ memcpy(i965_h264_context->avc_kernels, h264_avc_kernels_gen4, sizeof(i965_h264_context->avc_kernels));
+ avc_mc_kernel_offset = avc_mc_kernel_offset_gen4;
+ intra_kernel_header = &intra_kernel_header_gen4;
+ i965_h264_context->use_avc_hw_scoreboard = 0;
+ i965_h264_context->use_hw_w128 = 0;
+ }
- for (i = 0; i < NUM_H264_AVC_KERNELS; i++) {
- struct i965_kernel *kernel = &h264_avc_kernels[i];
- kernel->bo = dri_bo_alloc(i965->intel.bufmgr,
- kernel->name,
- kernel->size, 0x1000);
- assert(kernel->bo);
- dri_bo_subdata(kernel->bo, 0, kernel->size, kernel->bin);
- }
+ for (i = 0; i < NUM_H264_AVC_KERNELS; i++) {
+ struct i965_kernel *kernel = &i965_h264_context->avc_kernels[i];
+ kernel->bo = dri_bo_alloc(i965->intel.bufmgr,
+ kernel->name,
+ kernel->size, 0x1000);
+ assert(kernel->bo);
+ dri_bo_subdata(kernel->bo, 0, kernel->size, kernel->bin);
}
for (i = 0; i < 16; i++) {
diff --git a/i965_drv_video/i965_media_h264.h b/i965_drv_video/i965_media_h264.h
index 3af7e8d..ba5b649 100644
--- a/i965_drv_video/i965_media_h264.h
+++ b/i965_drv_video/i965_media_h264.h
@@ -20,6 +20,8 @@ enum {
H264_AVC_NULL
};
+#define NUM_H264_AVC_KERNELS 2
+
struct i965_h264_context
{
struct {
@@ -62,6 +64,8 @@ struct i965_h264_context
VASurfaceID surface_id;
int frame_store_id;
} fsid_list[16];
+
+ struct i965_kernel avc_kernels[NUM_H264_AVC_KERNELS];
};
void i965_media_h264_decode_init(VADriverContextP ctx, struct decode_state *decode_state, struct i965_media_context *media_context);
diff --git a/i965_drv_video/i965_media_mpeg2.c b/i965_drv_video/i965_media_mpeg2.c
index b44e27e..406ace4 100644
--- a/i965_drv_video/i965_media_mpeg2.c
+++ b/i965_drv_video/i965_media_mpeg2.c
@@ -27,6 +27,7 @@
*
*/
+#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
@@ -450,10 +451,6 @@ static struct i965_kernel mpeg2_vld_kernels_gen5[] = {
}
};
-static struct i965_kernel *mpeg2_vld_kernels = NULL;
-
-#define NUM_MPEG2_VLD_KERNELS (sizeof(mpeg2_vld_kernels_gen4)/sizeof(mpeg2_vld_kernels_gen4[0]))
-
static void
i965_media_mpeg2_surface_state(VADriverContextP ctx,
int index,
@@ -702,6 +699,7 @@ i965_media_mpeg2_vfe_state(VADriverContextP ctx, struct i965_media_context *medi
static void
i965_media_mpeg2_interface_descriptor_remap_table(VADriverContextP ctx, struct i965_media_context *media_context)
{
+ struct i965_mpeg2_context *i965_mpeg2_context = (struct i965_mpeg2_context *)media_context->private_context;
struct i965_interface_descriptor *desc;
int i;
dri_bo *bo;
@@ -714,7 +712,7 @@ i965_media_mpeg2_interface_descriptor_remap_table(VADriverContextP ctx, struct i
for (i = 0; i < NUM_MPEG2_VLD_KERNELS; i++) {
memset(desc, 0, sizeof(*desc));
desc->desc0.grf_reg_blocks = 15;
- desc->desc0.kernel_start_pointer = mpeg2_vld_kernels[i].bo->offset >> 6; /* reloc */
+ desc->desc0.kernel_start_pointer = i965_mpeg2_context->vld_kernels[i].bo->offset >> 6; /* reloc */
desc->desc1.const_urb_entry_read_offset = 0;
desc->desc1.const_urb_entry_read_len = 30;
desc->desc3.binding_table_entry_count = 0;
@@ -725,7 +723,7 @@ i965_media_mpeg2_interface_descriptor_remap_table(VADriverContextP ctx, struct i
I915_GEM_DOMAIN_INSTRUCTION, 0,
desc->desc0.grf_reg_blocks,
i * sizeof(*desc) + offsetof(struct i965_interface_descriptor, desc0),
- mpeg2_vld_kernels[i].bo);
+ i965_mpeg2_context->vld_kernels[i].bo);
dri_bo_emit_reloc(bo,
I915_GEM_DOMAIN_INSTRUCTION, 0,
@@ -809,6 +807,7 @@ i965_media_mpeg2_upload_constants(VADriverContextP ctx,
struct decode_state *decode_state,
struct i965_media_context *media_context)
{
+ struct i965_mpeg2_context *i965_mpeg2_context = (struct i965_mpeg2_context *)media_context->private_context;
int i, j;
unsigned char *constant_buffer;
unsigned char *qmx;
@@ -854,12 +853,12 @@ i965_media_mpeg2_upload_constants(VADriverContextP ctx,
lib_reloc_offset = 128 + sizeof(idct_table);
lib_reloc = (unsigned int *)(constant_buffer + lib_reloc_offset);
for (i = 0; i < 8; i++) {
- lib_reloc[i] = mpeg2_vld_kernels[LIB_INTERFACE].bo->offset;
+ lib_reloc[i] = i965_mpeg2_context->vld_kernels[LIB_INTERFACE].bo->offset;
dri_bo_emit_reloc(media_context->curbe.bo,
I915_GEM_DOMAIN_INSTRUCTION, 0,
0,
lib_reloc_offset + i * sizeof(unsigned int),
- mpeg2_vld_kernels[LIB_INTERFACE].bo);
+ i965_mpeg2_context->vld_kernels[LIB_INTERFACE].bo);
}
dri_bo_unmap(media_context->curbe.bo);
@@ -916,16 +915,21 @@ i965_media_mpeg2_objects(VADriverContextP ctx,
static void
i965_media_mpeg2_free_private_context(void **data)
{
+ struct i965_mpeg2_context *i965_mpeg2_context = *data;
int i;
+ if (i965_mpeg2_context == NULL)
+ return;
+
for (i = 0; i < NUM_MPEG2_VLD_KERNELS; i++) {
- struct i965_kernel *kernel = &mpeg2_vld_kernels[i];
+ struct i965_kernel *kernel = &i965_mpeg2_context->vld_kernels[i];
dri_bo_unreference(kernel->bo);
kernel->bo = NULL;
}
- mpeg2_vld_kernels = NULL;
+ free(i965_mpeg2_context);
+ *data = NULL;
}
void
@@ -952,27 +956,30 @@ void
i965_media_mpeg2_dec_context_init(VADriverContextP ctx, struct i965_media_context *media_context)
{
struct i965_driver_data *i965 = i965_driver_data(ctx);
+ struct i965_mpeg2_context *i965_mpeg2_context;
int i;
+ i965_mpeg2_context = calloc(1, sizeof(struct i965_mpeg2_context));
+
/* kernel */
- if (mpeg2_vld_kernels == NULL) {
- assert(NUM_MPEG2_VLD_KERNELS == (sizeof(mpeg2_vld_kernels_gen5) /
- sizeof(mpeg2_vld_kernels_gen5[0])));
- assert(NUM_MPEG2_VLD_KERNELS <= MAX_INTERFACE_DESC);
-
- if (IS_IRONLAKE(i965->intel.device_id))
- mpeg2_vld_kernels = mpeg2_vld_kernels_gen5;
- else
- mpeg2_vld_kernels = mpeg2_vld_kernels_gen4;
-
- for (i = 0; i < NUM_MPEG2_VLD_KERNELS; i++) {
- struct i965_kernel *kernel = &mpeg2_vld_kernels[i];
- kernel->bo = dri_bo_alloc(i965->intel.bufmgr,
- kernel->name,
- kernel->size, 64);
- assert(kernel->bo);
- dri_bo_subdata(kernel->bo, 0, kernel->size, kernel->bin);
- }
+ assert(NUM_MPEG2_VLD_KERNELS == (sizeof(mpeg2_vld_kernels_gen4) /
+ sizeof(mpeg2_vld_kernels_gen4[0])));
+ assert(NUM_MPEG2_VLD_KERNELS == (sizeof(mpeg2_vld_kernels_gen5) /
+ sizeof(mpeg2_vld_kernels_gen5[0])));
+ assert(NUM_MPEG2_VLD_KERNELS <= MAX_INTERFACE_DESC);
+
+ if (IS_IRONLAKE(i965->intel.device_id))
+ memcpy(i965_mpeg2_context->vld_kernels, mpeg2_vld_kernels_gen5, sizeof(i965_mpeg2_context->vld_kernels));
+ else
+ memcpy(i965_mpeg2_context->vld_kernels, mpeg2_vld_kernels_gen4, sizeof(i965_mpeg2_context->vld_kernels));
+
+ for (i = 0; i < NUM_MPEG2_VLD_KERNELS; i++) {
+ struct i965_kernel *kernel = &i965_mpeg2_context->vld_kernels[i];
+ kernel->bo = dri_bo_alloc(i965->intel.bufmgr,
+ kernel->name,
+ kernel->size, 64);
+ assert(kernel->bo);
+ dri_bo_subdata(kernel->bo, 0, kernel->size, kernel->bin);
}
/* URB */
diff --git a/i965_drv_video/i965_media_mpeg2.h b/i965_drv_video/i965_media_mpeg2.h
index 7da9b78..40d91f1 100644
--- a/i965_drv_video/i965_media_mpeg2.h
+++ b/i965_drv_video/i965_media_mpeg2.h
@@ -38,6 +38,13 @@
struct decode_state;
struct i965_media_context;
+#define NUM_MPEG2_VLD_KERNELS 15
+
+struct i965_mpeg2_context
+{
+ struct i965_kernel vld_kernels[NUM_MPEG2_VLD_KERNELS];
+};
+
void i965_media_mpeg2_decode_init(VADriverContextP ctx, struct decode_state * decode_state, struct i965_media_context *media_context);
void i965_media_mpeg2_dec_context_init(VADriverContextP ctx, struct i965_media_context *media_context);
diff --git a/i965_drv_video/i965_post_processing.c b/i965_drv_video/i965_post_processing.c
index 4dba0c6..25c27ce 100644
--- a/i965_drv_video/i965_post_processing.c
+++ b/i965_drv_video/i965_post_processing.c
@@ -37,24 +37,13 @@
#include "intel_driver.h"
#include "i965_defines.h"
#include "i965_structs.h"
-
+#include "i965_drv_video.h"
#include "i965_post_processing.h"
#include "i965_render.h"
-#include "i965_drv_video.h"
#define HAS_PP(ctx) (IS_IRONLAKE((ctx)->intel.device_id) || \
IS_GEN6((ctx)->intel.device_id))
-struct pp_module
-{
- struct i965_kernel kernel;
-
- /* others */
- void (*initialize)(VADriverContextP ctx, VASurfaceID surface, int input,
- unsigned short srcw, unsigned short srch,
- unsigned short destw, unsigned short desth);
-};
-
static const uint32_t pp_null_gen5[][4] = {
#include "shaders/post_processing/null.g4b.gen5"
};
@@ -235,10 +224,6 @@ static struct pp_module pp_modules_gen6[] = {
},
};
-#define NUM_PP_MODULES ARRAY_ELEMS(pp_modules_gen5)
-
-static struct pp_module *pp_modules = NULL;
-
struct pp_static_parameter
{
struct {
@@ -503,7 +488,7 @@ ironlake_pp_interface_descriptor_table(struct i965_post_processing_context *pp_c
desc = bo->virtual;
memset(desc, 0, sizeof(*desc));
desc->desc0.grf_reg_blocks = 10;
- desc->desc0.kernel_start_pointer = pp_modules[pp_index].kernel.bo->offset >> 6; /* reloc */
+ desc->desc0.kernel_start_pointer = pp_context->pp_modules[pp_index].kernel.bo->offset >> 6; /* reloc */
desc->desc1.const_urb_entry_read_offset = 0;
desc->desc1.const_urb_entry_read_len = 4; /* grf 1-4 */
desc->desc2.sampler_state_pointer = pp_context->sampler_state_table.bo->offset >> 5;
@@ -516,7 +501,7 @@ ironlake_pp_interface_descriptor_table(struct i965_post_processing_context *pp_c
I915_GEM_DOMAIN_INSTRUCTION, 0,
desc->desc0.grf_reg_blocks,
offsetof(struct i965_interface_descriptor, desc0),
- pp_modules[pp_index].kernel.bo);
+ pp_context->pp_modules[pp_index].kernel.bo);
dri_bo_emit_reloc(bo,
I915_GEM_DOMAIN_INSTRUCTION, 0,
@@ -2036,9 +2021,8 @@ ironlake_pp_initialize(VADriverContextP ctx,
memset(&pp_static_parameter, 0, sizeof(pp_static_parameter));
memset(&pp_inline_parameter, 0, sizeof(pp_inline_parameter));
assert(pp_index >= PP_NULL && pp_index < NUM_PP_MODULES);
- assert(pp_modules);
pp_context->current_pp = pp_index;
- pp_module = &pp_modules[pp_index];
+ pp_module = &pp_context->pp_modules[pp_index];
if (pp_module->initialize)
pp_module->initialize(ctx, surface, input, srcw, srch, destw, desth);
@@ -2157,9 +2141,8 @@ gen6_pp_initialize(VADriverContextP ctx,
memset(&pp_static_parameter, 0, sizeof(pp_static_parameter));
memset(&pp_inline_parameter, 0, sizeof(pp_inline_parameter));
assert(pp_index >= PP_NULL && pp_index < NUM_PP_MODULES);
- assert(pp_modules);
pp_context->current_pp = pp_index;
- pp_module = &pp_modules[pp_index];
+ pp_module = &pp_context->pp_modules[pp_index];
if (pp_module->initialize)
pp_module->initialize(ctx, surface, input, srcw, srch, destw, desth);
@@ -2207,7 +2190,7 @@ gen6_pp_interface_descriptor_table(struct i965_post_processing_context *pp_conte
desc = bo->virtual;
memset(desc, 0, sizeof(*desc));
desc->desc0.kernel_start_pointer =
- pp_modules[pp_index].kernel.bo->offset >> 6; /* reloc */
+ pp_context->pp_modules[pp_index].kernel.bo->offset >> 6; /* reloc */
desc->desc1.single_program_flow = 1;
desc->desc1.floating_point_mode = FLOATING_POINT_IEEE_754;
desc->desc2.sampler_count = 1; /* 1 - 4 samplers used */
@@ -2223,7 +2206,7 @@ gen6_pp_interface_descriptor_table(struct i965_post_processing_context *pp_conte
I915_GEM_DOMAIN_INSTRUCTION, 0,
0,
offsetof(struct gen6_interface_descriptor_data, desc0),
- pp_modules[pp_index].kernel.bo);
+ pp_context->pp_modules[pp_index].kernel.bo);
dri_bo_emit_reloc(bo,
I915_GEM_DOMAIN_INSTRUCTION, 0,
@@ -2517,17 +2500,17 @@ i965_post_processing_terminate(VADriverContextP ctx)
dri_bo_unreference(pp_context->stmm.bo);
pp_context->stmm.bo = NULL;
+ for (i = 0; i < NUM_PP_MODULES; i++) {
+ struct pp_module *pp_module = &pp_context->pp_modules[i];
+
+ dri_bo_unreference(pp_module->kernel.bo);
+ pp_module->kernel.bo = NULL;
+ }
+
free(pp_context);
}
i965->pp_context = NULL;
-
- for (i = 0; i < NUM_PP_MODULES && pp_modules; i++) {
- struct pp_module *pp_module = &pp_modules[i];
-
- dri_bo_unreference(pp_module->kernel.bo);
- pp_module->kernel.bo = NULL;
- }
}
return True;
@@ -2544,36 +2527,36 @@ i965_post_processing_init(VADriverContextP ctx)
if (pp_context == NULL) {
pp_context = calloc(1, sizeof(*pp_context));
i965->pp_context = pp_context;
- }
- pp_context->urb.size = URB_SIZE((&i965->intel));
- pp_context->urb.num_vfe_entries = 32;
- pp_context->urb.size_vfe_entry = 1; /* in 512 bits unit */
- pp_context->urb.num_cs_entries = 1;
- pp_context->urb.size_cs_entry = 2; /* in 512 bits unit */
- pp_context->urb.vfe_start = 0;
- pp_context->urb.cs_start = pp_context->urb.vfe_start +
- pp_context->urb.num_vfe_entries * pp_context->urb.size_vfe_entry;
- assert(pp_context->urb.cs_start +
- pp_context->urb.num_cs_entries * pp_context->urb.size_cs_entry <= URB_SIZE((&i965->intel)));
-
- assert(NUM_PP_MODULES == ARRAY_ELEMS(pp_modules_gen6));
-
- if (IS_GEN6(i965->intel.device_id))
- pp_modules = pp_modules_gen6;
- else if (IS_IRONLAKE(i965->intel.device_id)) {
- pp_modules = pp_modules_gen5;
- }
-
- for (i = 0; i < NUM_PP_MODULES && pp_modules; i++) {
- struct pp_module *pp_module = &pp_modules[i];
- dri_bo_unreference(pp_module->kernel.bo);
- pp_module->kernel.bo = dri_bo_alloc(i965->intel.bufmgr,
- pp_module->kernel.name,
- pp_module->kernel.size,
- 4096);
- assert(pp_module->kernel.bo);
- dri_bo_subdata(pp_module->kernel.bo, 0, pp_module->kernel.size, pp_module->kernel.bin);
+ pp_context->urb.size = URB_SIZE((&i965->intel));
+ pp_context->urb.num_vfe_entries = 32;
+ pp_context->urb.size_vfe_entry = 1; /* in 512 bits unit */
+ pp_context->urb.num_cs_entries = 1;
+ pp_context->urb.size_cs_entry = 2; /* in 512 bits unit */
+ pp_context->urb.vfe_start = 0;
+ pp_context->urb.cs_start = pp_context->urb.vfe_start +
+ pp_context->urb.num_vfe_entries * pp_context->urb.size_vfe_entry;
+ assert(pp_context->urb.cs_start +
+ pp_context->urb.num_cs_entries * pp_context->urb.size_cs_entry <= URB_SIZE((&i965->intel)));
+
+ assert(NUM_PP_MODULES == ARRAY_ELEMS(pp_modules_gen5));
+ assert(NUM_PP_MODULES == ARRAY_ELEMS(pp_modules_gen6));
+
+ if (IS_GEN6(i965->intel.device_id))
+ memcpy(pp_context->pp_modules, pp_modules_gen6, sizeof(pp_context->pp_modules));
+ else if (IS_IRONLAKE(i965->intel.device_id))
+ memcpy(pp_context->pp_modules, pp_modules_gen5, sizeof(pp_context->pp_modules));
+
+ for (i = 0; i < NUM_PP_MODULES; i++) {
+ struct pp_module *pp_module = &pp_context->pp_modules[i];
+ dri_bo_unreference(pp_module->kernel.bo);
+ pp_module->kernel.bo = dri_bo_alloc(i965->intel.bufmgr,
+ pp_module->kernel.name,
+ pp_module->kernel.size,
+ 4096);
+ assert(pp_module->kernel.bo);
+ dri_bo_subdata(pp_module->kernel.bo, 0, pp_module->kernel.size, pp_module->kernel.bin);
+ }
}
}
diff --git a/i965_drv_video/i965_post_processing.h b/i965_drv_video/i965_post_processing.h
index fa2d701..bfbe448 100644
--- a/i965_drv_video/i965_post_processing.h
+++ b/i965_drv_video/i965_post_processing.h
@@ -43,6 +43,8 @@ enum
PP_NV12_DNDI,
};
+#define NUM_PP_MODULES 5
+
struct pp_load_save_context
{
int dest_w;
@@ -70,9 +72,20 @@ struct pp_dndi_context
};
+struct pp_module
+{
+ struct i965_kernel kernel;
+
+ /* others */
+ void (*initialize)(VADriverContextP ctx, VASurfaceID surface, int input,
+ unsigned short srcw, unsigned short srch,
+ unsigned short destw, unsigned short desth);
+};
+
struct i965_post_processing_context
{
int current_pp;
+ struct pp_module pp_modules[NUM_PP_MODULES];
struct {
dri_bo *bo;
diff --git a/i965_drv_video/i965_render.c b/i965_drv_video/i965_render.c
index 7794303..c04b72c 100644
--- a/i965_drv_video/i965_render.c
+++ b/i965_drv_video/i965_render.c
@@ -213,10 +213,6 @@ static struct i965_kernel render_kernels_gen6[] = {
}
};
-static struct i965_kernel *render_kernels = NULL;
-
-#define NUM_RENDER_KERNEL (sizeof(render_kernels_gen4)/sizeof(render_kernels_gen4[0]))
-
#define URB_VS_ENTRIES 8
#define URB_VS_ENTRY_SIZE 1
@@ -269,7 +265,7 @@ i965_render_sf_unit(VADriverContextP ctx)
memset(sf_state, 0, sizeof(*sf_state));
sf_state->thread0.grf_reg_count = I965_GRF_BLOCKS(SF_KERNEL_NUM_GRF);
- sf_state->thread0.kernel_start_pointer = render_kernels[SF_KERNEL].bo->offset >> 6;
+ sf_state->thread0.kernel_start_pointer = render_state->render_kernels[SF_KERNEL].bo->offset >> 6;
sf_state->sf1.single_program_flow = 1; /* XXX */
sf_state->sf1.binding_table_entry_count = 0;
@@ -308,7 +304,7 @@ i965_render_sf_unit(VADriverContextP ctx)
I915_GEM_DOMAIN_INSTRUCTION, 0,
sf_state->thread0.grf_reg_count << 1,
offsetof(struct i965_sf_unit_state, thread0),
- render_kernels[SF_KERNEL].bo);
+ render_state->render_kernels[SF_KERNEL].bo);
dri_bo_unmap(render_state->sf.state);
}
@@ -354,7 +350,7 @@ i965_subpic_render_wm_unit(VADriverContextP ctx)
memset(wm_state, 0, sizeof(*wm_state));
wm_state->thread0.grf_reg_count = I965_GRF_BLOCKS(PS_KERNEL_NUM_GRF);
- wm_state->thread0.kernel_start_pointer = render_kernels[PS_SUBPIC_KERNEL].bo->offset >> 6;
+ wm_state->thread0.kernel_start_pointer = render_state->render_kernels[PS_SUBPIC_KERNEL].bo->offset >> 6;
wm_state->thread1.single_program_flow = 1; /* XXX */
@@ -392,7 +388,7 @@ i965_subpic_render_wm_unit(VADriverContextP ctx)
I915_GEM_DOMAIN_INSTRUCTION, 0,
wm_state->thread0.grf_reg_count << 1,
offsetof(struct i965_wm_unit_state, thread0),
- render_kernels[PS_SUBPIC_KERNEL].bo);
+ render_state->render_kernels[PS_SUBPIC_KERNEL].bo);
dri_bo_emit_reloc(render_state->wm.state,
I915_GEM_DOMAIN_INSTRUCTION, 0,
@@ -419,7 +415,7 @@ i965_render_wm_unit(VADriverContextP ctx)
memset(wm_state, 0, sizeof(*wm_state));
wm_state->thread0.grf_reg_count = I965_GRF_BLOCKS(PS_KERNEL_NUM_GRF);
- wm_state->thread0.kernel_start_pointer = render_kernels[PS_KERNEL].bo->offset >> 6;
+ wm_state->thread0.kernel_start_pointer = render_state->render_kernels[PS_KERNEL].bo->offset >> 6;
wm_state->thread1.single_program_flow = 1; /* XXX */
@@ -457,7 +453,7 @@ i965_render_wm_unit(VADriverContextP ctx)
I915_GEM_DOMAIN_INSTRUCTION, 0,
wm_state->thread0.grf_reg_count << 1,
offsetof(struct i965_wm_unit_state, thread0),
- render_kernels[PS_KERNEL].bo);
+ render_state->render_kernels[PS_KERNEL].bo);
dri_bo_emit_reloc(render_state->wm.state,
I915_GEM_DOMAIN_INSTRUCTION, 0,
@@ -1821,7 +1817,7 @@ gen6_emit_wm_state(VADriverContextP ctx, int kernel)
OUT_BATCH(ctx, 0);
OUT_BATCH(ctx, GEN6_3DSTATE_WM | (9 - 2));
- OUT_RELOC(ctx, render_kernels[kernel].bo,
+ OUT_RELOC(ctx, render_state->render_kernels[kernel].bo,
I915_GEM_DOMAIN_INSTRUCTION, 0,
0);
OUT_BATCH(ctx, (1 << GEN6_3DSTATE_WM_SAMPLER_COUNT_SHITF) |
@@ -2088,14 +2084,14 @@ i965_render_init(VADriverContextP ctx)
sizeof(render_kernels_gen6[0])));
if (IS_GEN6(i965->intel.device_id))
- render_kernels = render_kernels_gen6;
+ memcpy(render_state->render_kernels, render_kernels_gen6, sizeof(render_state->render_kernels));
else if (IS_IRONLAKE(i965->intel.device_id))
- render_kernels = render_kernels_gen5;
+ memcpy(render_state->render_kernels, render_kernels_gen5, sizeof(render_state->render_kernels));
else
- render_kernels = render_kernels_gen4;
+ memcpy(render_state->render_kernels, render_kernels_gen4, sizeof(render_state->render_kernels));
for (i = 0; i < NUM_RENDER_KERNEL; i++) {
- struct i965_kernel *kernel = &render_kernels[i];
+ struct i965_kernel *kernel = &render_state->render_kernels[i];
if (!kernel->size)
continue;
@@ -2128,7 +2124,7 @@ i965_render_terminate(VADriverContextP ctx)
render_state->curbe.bo = NULL;
for (i = 0; i < NUM_RENDER_KERNEL; i++) {
- struct i965_kernel *kernel = &render_kernels[i];
+ struct i965_kernel *kernel = &render_state->render_kernels[i];
dri_bo_unreference(kernel->bo);
kernel->bo = NULL;
diff --git a/i965_drv_video/i965_render.h b/i965_drv_video/i965_render.h
index dc7bcc2..fd4be8f 100644
--- a/i965_drv_video/i965_render.h
+++ b/i965_drv_video/i965_render.h
@@ -31,8 +31,12 @@
#define MAX_SAMPLERS 16
#define MAX_RENDER_SURFACES (MAX_SAMPLERS + 1)
+#define NUM_RENDER_KERNEL 3
+
#include "i965_post_processing.h"
+struct i965_kernel;
+
struct i965_render_state
{
struct {
@@ -71,7 +75,8 @@ struct i965_render_state
struct intel_region *draw_region;
int pp_flag; /* 0: disable, 1: enable */
- struct i965_post_processing_context pp_context;
+
+ struct i965_kernel render_kernels[3];
};
Bool i965_render_init(VADriverContextP ctx);