diff options
author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2010-03-02 21:53:18 +0100 |
---|---|---|
committer | Carl Worth <cworth@cworth.org> | 2010-03-04 09:38:37 -0800 |
commit | 3203c66fbf04c55adba760e97c9fa1feb9e55f8d (patch) | |
tree | 76537f0ba9a7a40c038e2e4b17ffc66d06ce3dcf /src/xvmc | |
parent | d30decae6a9db585f2d2589ae2c3d9e1f9acd33d (diff) |
i915 XvMC: switch load_indirect_render_emit to batchbuffer macros
Like with one_time_state_emit, this preps for relocatable bo's.
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Reviewed-by: Carl Worth <cworth@cworth.org>
Diffstat (limited to 'src/xvmc')
-rw-r--r-- | src/xvmc/i915_xvmc.c | 72 |
1 files changed, 23 insertions, 49 deletions
diff --git a/src/xvmc/i915_xvmc.c b/src/xvmc/i915_xvmc.c index 673d3d68..1e256b51 100644 --- a/src/xvmc/i915_xvmc.c +++ b/src/xvmc/i915_xvmc.c @@ -85,15 +85,6 @@ static void i915_inst_texld(unsigned int *inst, *inst = T2_MBZ; } -static void i915_emit_batch(void *data, int size, int flag) -{ - intelBatchbufferData(data, size, flag); -} - -/* load indirect buffer for mc rendering */ -static uint32_t *mc_render_load_indirect; -static int mc_render_load_indirect_size; - static void i915_mc_one_time_context_init(XvMCContext * context) { unsigned int dest, src0, src1, src2; @@ -663,60 +654,45 @@ static void i915_flush(int map, int render) intelBatchbufferData(&mi_flush, sizeof(mi_flush), 0); } -static void i915_mc_load_indirect_render_init(XvMCContext * context) +static void i915_mc_load_indirect_render_emit(XvMCContext * context) { i915XvMCContext *pI915XvMC = (i915XvMCContext *) context->privData; sis_state *sis; msb_state *msb; - struct i915_3dstate_load_indirect *load_indirect; int mem_select; + uint32_t load_indirect, buffer_address; + BATCH_LOCALS; - mc_render_load_indirect_size = sizeof(*load_indirect) + sizeof(*sis) - + sizeof(*msb); - mc_render_load_indirect = calloc(1, mc_render_load_indirect_size); - - load_indirect = - (struct i915_3dstate_load_indirect *)mc_render_load_indirect; - load_indirect->dw0.type = CMD_3D; - load_indirect->dw0.opcode = OPC_3DSTATE_LOAD_INDIRECT; - load_indirect->dw0.block_mask = BLOCK_SIS | BLOCK_MSB; - load_indirect->dw0.length = (mc_render_load_indirect_size >> 2) - 2; + BEGIN_BATCH(5); + load_indirect = OP_3D_LOAD_INDIRECT; + load_indirect |= (BLOCK_SIS | BLOCK_MSB) << BLOCK_MASK_SHIFT; + load_indirect |= 5 - 2; /* length */ if (pI915XvMC->deviceID == PCI_CHIP_I915_G || pI915XvMC->deviceID == PCI_CHIP_I915_GM) - mem_select = 0; - else - mem_select = 1; - - load_indirect->dw0.mem_select = mem_select; + mem_select = 0; /* use physical address */ + else { + load_indirect |= OP_3D_LOAD_INDIRECT_GFX_ADDR; + mem_select = 1; /* use gfx address */ + } + OUT_BATCH(load_indirect); /* Static Indirect state buffer (dest buffer info) */ - sis = (sis_state *) (++load_indirect); - sis->dw0.valid = 1; - sis->dw0.force = 1; - sis->dw1.length = 16; /* 4 * 3 + 2 + 3 - 1 */ - if (mem_select) - sis->dw0.buffer_address = (pI915XvMC->sis.offset >> 2); + buffer_address = pI915XvMC->sis.offset; else - sis->dw0.buffer_address = (pI915XvMC->sis.bus_addr >> 2); + buffer_address = pI915XvMC->sis.bus_addr; + OUT_BATCH(buffer_address | STATE_VALID | STATE_FORCE); + OUT_BATCH(16); /* 4 * 3 + 2 + 3 - 1 */ /* Map state buffer (reference buffer info) */ - msb = (msb_state *) (++sis); - msb->dw0.valid = 1; - msb->dw0.force = 1; - msb->dw1.length = 23; /* 3 * 8 - 1 */ - if (mem_select) - msb->dw0.buffer_address = (pI915XvMC->msb.offset >> 2); + buffer_address = pI915XvMC->msb.offset; else - msb->dw0.buffer_address = (pI915XvMC->msb.bus_addr >> 2); -} - -static void i915_mc_load_indirect_render_emit(void) -{ - i915_emit_batch(mc_render_load_indirect, mc_render_load_indirect_size, - 0); + buffer_address = pI915XvMC->msb.bus_addr; + OUT_BATCH(buffer_address | STATE_VALID | STATE_FORCE); + OUT_BATCH(23); /* 3 * 8 - 1 */ + ADVANCE_BATCH(); } static void i915_mc_mpeg_set_origin(XvMCContext * context, XvMCMacroBlock * mb) @@ -1021,7 +997,6 @@ static Status i915_xvmc_mc_create_context(Display * display, i915_mc_map_state_init(context); - i915_mc_load_indirect_render_init(context); return Success; unmap_buffers: @@ -1044,7 +1019,6 @@ static int i915_xvmc_mc_destroy_context(Display * display, /* Pass Control to the X server to destroy the drm_context_t */ i915_release_resource(display, context); - free(mc_render_load_indirect); return Success; } @@ -1294,7 +1268,7 @@ static int i915_xvmc_mc_render_surface(Display * display, XvMCContext * context, /* setup reference surfaces */ i915_mc_map_state_set(context, privPast, privFuture); - i915_mc_load_indirect_render_emit(); + i915_mc_load_indirect_render_emit(context); i915_mc_mpeg_set_origin(context, ¯oblock_array->macro_blocks |