summaryrefslogtreecommitdiff
path: root/src/i965_gpe_utils.c
diff options
context:
space:
mode:
authorZhao Yakui <yakui.zhao@intel.com>2014-03-12 13:56:13 +0800
committerXiang, Haihao <haihao.xiang@intel.com>2014-12-14 00:26:32 +0800
commit030f48af1ea3160894db798093559e0fdc4ba079 (patch)
treeced673f53757db7aa0bd33c8ac11587f35203410 /src/i965_gpe_utils.c
parenta5893c06d26d8e4435813ba0fd0e0c5f046c328e (diff)
Media/SKL: Follow the spec to update the STATE_BASE_ADDRESS command for media pipeline
Signed-off-by: Zhao Yakui <yakui.zhao@intel.com> (cherry picked from commit b660c288f963dd2a2bb1951feeb8161483c2faf2)
Diffstat (limited to 'src/i965_gpe_utils.c')
-rw-r--r--src/i965_gpe_utils.c63
1 files changed, 62 insertions, 1 deletions
diff --git a/src/i965_gpe_utils.c b/src/i965_gpe_utils.c
index 0126587..ad744da 100644
--- a/src/i965_gpe_utils.c
+++ b/src/i965_gpe_utils.c
@@ -1207,6 +1207,67 @@ gen8_gpe_load_kernels(VADriverContextP ctx,
return;
}
+static void
+gen9_gpe_state_base_address(VADriverContextP ctx,
+ struct i965_gpe_context *gpe_context,
+ struct intel_batchbuffer *batch)
+{
+ BEGIN_BATCH(batch, 19);
+
+ OUT_BATCH(batch, CMD_STATE_BASE_ADDRESS | (19 - 2));
+
+ OUT_BATCH(batch, 0 | BASE_ADDRESS_MODIFY); //General State Base Address
+ OUT_BATCH(batch, 0);
+ OUT_BATCH(batch, 0);
+
+ /*DW4 Surface state base address */
+ OUT_RELOC(batch, gpe_context->surface_state_binding_table.bo, I915_GEM_DOMAIN_INSTRUCTION, 0, BASE_ADDRESS_MODIFY); /* Surface state base address */
+ OUT_BATCH(batch, 0);
+
+ /*DW6. Dynamic state base address */
+ if (gpe_context->dynamic_state.bo)
+ OUT_RELOC(batch, gpe_context->dynamic_state.bo,
+ I915_GEM_DOMAIN_RENDER | I915_GEM_DOMAIN_SAMPLER,
+ 0, BASE_ADDRESS_MODIFY);
+ else
+ OUT_BATCH(batch, 0 | BASE_ADDRESS_MODIFY);
+
+ OUT_BATCH(batch, 0);
+
+ /*DW8. Indirect Object base address */
+ if (gpe_context->indirect_state.bo)
+ OUT_RELOC(batch, gpe_context->indirect_state.bo,
+ I915_GEM_DOMAIN_SAMPLER,
+ 0, BASE_ADDRESS_MODIFY);
+ else
+ OUT_BATCH(batch, 0 | BASE_ADDRESS_MODIFY);
+
+ OUT_BATCH(batch, 0);
+
+ /*DW10. Instruct base address */
+ if (gpe_context->instruction_state.bo)
+ OUT_RELOC(batch, gpe_context->instruction_state.bo,
+ I915_GEM_DOMAIN_INSTRUCTION,
+ 0, BASE_ADDRESS_MODIFY);
+ else
+ OUT_BATCH(batch, 0 | BASE_ADDRESS_MODIFY);
+
+ OUT_BATCH(batch, 0);
+
+ /* DW12. Size limitation */
+ OUT_BATCH(batch, 0xFFFFF000 | BASE_ADDRESS_MODIFY); //General State Access Upper Bound
+ OUT_BATCH(batch, 0xFFFFF000 | BASE_ADDRESS_MODIFY); //Dynamic State Access Upper Bound
+ OUT_BATCH(batch, 0xFFFFF000 | BASE_ADDRESS_MODIFY); //Indirect Object Access Upper Bound
+ OUT_BATCH(batch, 0xFFFFF000 | BASE_ADDRESS_MODIFY); //Instruction Access Upper Bound
+
+ /* the bindless surface state address */
+ OUT_BATCH(batch, 0 | BASE_ADDRESS_MODIFY);
+ OUT_BATCH(batch, 0);
+ OUT_BATCH(batch, 0xFFFFF000);
+
+ ADVANCE_BATCH(batch);
+}
+
void
gen9_gpe_pipeline_setup(VADriverContextP ctx,
struct i965_gpe_context *gpe_context,
@@ -1215,7 +1276,7 @@ gen9_gpe_pipeline_setup(VADriverContextP ctx,
intel_batchbuffer_emit_mi_flush(batch);
i965_gpe_select(ctx, gpe_context, batch);
- gen8_gpe_state_base_address(ctx, gpe_context, batch);
+ gen9_gpe_state_base_address(ctx, gpe_context, batch);
gen8_gpe_vfe_state(ctx, gpe_context, batch);
gen8_gpe_curbe_load(ctx, gpe_context, batch);
gen8_gpe_idrt(ctx, gpe_context, batch);